10
"""Get the fd of a file.
11
We need this so that the tests can be executed from within
12
the test directory as well as from the source tree root"""
14
fd = os.open("test/%s" % name, os.O_RDONLY)
19
fd = os.open("%s" % name, os.O_RDONLY)
22
def get_tmp_copy_file_fd(name, flags = os.O_RDONLY):
23
"""Get the fd of a temporary file which is a copy of the specified
26
(tmp_fd, tmp_path) = tempfile.mkstemp();
31
shutil.copyfile("test/%s" % name, tmp_path)
37
shutil.copyfile(name, tmp_path)
39
fd = os.open(tmp_path, flags)
43
class DataObjectFileTests(unittest.TestCase):
46
fd = get_file_fd("data_object_test_file.bin")
48
(err, self.obj) = data_object_file_new(fd)
51
if self.obj is not None:
52
data_object_free(self.obj)
55
"Create a file data object"
57
self.assert_(self.obj is not None)
59
self.assertEqual(data_object_get_size(self.obj)[1], 10)
61
def testGetData(self):
62
"Get data from a file data object"
64
(err, buf) = data_object_get_data(self.obj, 0, 10, DATA_OBJECT_READ)
65
self.assertEqual(err, 0)
66
self.assertEqual(len(buf), 10)
68
expected_data = "1234567890"
70
for i in range(len(buf)):
71
self.assertEqual(buf[i], expected_data[i])
73
(err, buf) = data_object_get_data(self.obj, 5, 5, DATA_OBJECT_READ)
74
self.assertEqual(err, 0)
75
self.assertEqual(len(buf), 5)
77
for i in range(len(buf)):
78
self.assertEqual(buf[i], expected_data[5 + i])
80
(err, buf) = data_object_get_data(self.obj, 0, 0, DATA_OBJECT_READ)
81
self.assertEqual(err, 0)
82
self.assertEqual(len(buf), 0)
84
def testGetDataInvalid(self):
85
"Try to get data from invalid offsets"
87
(err, buf) = data_object_get_data(self.obj, -1, 10, DATA_OBJECT_READ)
88
self.assertNotEqual(err, 0)
90
(err, buf) = data_object_get_data(self.obj, 5, 10, DATA_OBJECT_READ)
91
self.assertNotEqual(err, 0)
93
(err, buf) = data_object_get_data(self.obj, 10, 0, DATA_OBJECT_READ)
94
self.assertNotEqual(err, 0)
96
def testGetDataLarge(self):
97
"Get data from a large file data object"
99
# Create the file data object
101
fd = get_file_fd("data_object_test_file_large.bin")
103
print "Warning: Not running data_object_file_tests.testGetDataLarge "\
104
"because the file data_object_test_file_large.bin was not found."
107
# Get the expected digest
109
f = os.fdopen(get_file_fd("data_object_test_file_large.md5"))
110
expected_digest = f.readline().strip()
112
print "Warning: Not running data_object_file_tests.testGetDataLarge "\
113
"because the file data_object_test_file_large.md5 was not found."
117
(err, dobj) = data_object_file_new(fd)
118
self.assertEqual(err, 0)
120
(err, size) = data_object_get_size(dobj)
121
self.assertEqual(err, 0)
126
# Read the file and update the digest
127
while bytes_left > 0:
128
(err, buf) = data_object_get_data(dobj, size - bytes_left,
129
bytes_left, DATA_OBJECT_READ)
131
self.assertEqual(err, 0)
135
bytes_left = bytes_left - len(buf)
137
digest = hash.hexdigest()
139
# Compare our hash digest with the precomputed one
140
self.assertEqual(digest, expected_digest)
142
data_object_free(dobj)
144
def testGetDataOverflow(self):
145
"Test boundary cases for get_data overflow"
147
# This one fails because of invalid range, not overflow
148
(err, buf) = data_object_get_data(self.obj, get_max_off_t(), 0,
150
self.assertEqual(err, errno.EINVAL)
152
# But this one fails because of overflow (overflow
153
# is checked before range)
154
(err, buf) = data_object_get_data(self.obj, get_max_off_t(), 2,
156
self.assertEqual(err, errno.EOVERFLOW)
158
def testCompare(self):
159
"Compare two data objects"
161
fd = get_file_fd("data_object_test_file.bin")
162
(err, obj1) = data_object_file_new(fd)
163
self.assertEqual(err, 0)
165
(err, result) = data_object_compare(self.obj, obj1)
166
self.assertEqual(err, 0)
167
self.assertEqual(result, 0)
169
data_object_free(obj1)
171
fd = get_file_fd("data_object_file_tests.py")
172
(err, obj1) = data_object_file_new(fd)
173
self.assertEqual(err, 0)
175
(err, result) = data_object_compare(self.obj, obj1)
176
self.assertEqual(err, 0)
177
self.assertEqual(result, 1)
179
# Compare a file object with a memory object
181
(err, obj2) = data_object_memory_new_ptr(0, get_max_size_t() - 1)
182
self.assertEqual(err, 0)
184
(err, result) = data_object_compare(obj1, obj2)
185
self.assertEqual(err, 0)
186
self.assertEqual(result, 1)
188
data_object_free(obj1)
189
data_object_free(obj2)
191
def testTempFile(self):
192
"Create a tempfile data object"
194
(fd1, fd1_path) = get_tmp_copy_file_fd("data_object_test_file.bin", os.O_RDWR)
195
(err, obj1) = data_object_tempfile_new(fd1, fd1_path)
196
self.assertEqual(err, 0)
198
# Read data from the file
199
(err, buf) = data_object_get_data(obj1, 0, 10, DATA_OBJECT_READ)
200
self.assertEqual(err, 0)
201
self.assertEqual(len(buf), 10)
203
expected_data = "1234567890"
205
for i in range(len(buf)):
206
self.assertEqual(buf[i], expected_data[i])
208
# Free the data object
209
data_object_free(obj1)
211
# Make sure that the temporary file has been deleted
212
self.assertEqual(os.path.exists(fd1_path), False)
215
if __name__ == '__main__':