Revision ae75584f pithos/api/tests.py
b/pithos/api/tests.py | ||
---|---|---|
1 |
#coding=utf8 |
|
2 |
|
|
1 | 3 |
# Copyright 2011 GRNET S.A. All rights reserved. |
2 | 4 |
# |
3 | 5 |
# Redistribution and use in source and binary forms, with or |
... | ... | |
56 | 58 |
DEFAULT_USER = 'test' |
57 | 59 |
DEFAULT_AUTH = '0000' |
58 | 60 |
|
61 |
OTHER_ACCOUNTS = { |
|
62 |
'0001': 'verigak', |
|
63 |
'0002': 'chazapis', |
|
64 |
'0003': 'gtsouk', |
|
65 |
'0004': 'papagian', |
|
66 |
'0005': 'louridas', |
|
67 |
'0006': 'chstath', |
|
68 |
'0007': 'pkanavos', |
|
69 |
'0008': 'mvasilak'} |
|
70 |
|
|
59 | 71 |
class BaseTestCase(unittest.TestCase): |
60 | 72 |
#TODO unauthorized request |
61 | 73 |
def setUp(self): |
... | ... | |
110 | 122 |
'name', |
111 | 123 |
'count', |
112 | 124 |
'bytes', |
113 |
'last_modified'), |
|
125 |
'last_modified', |
|
126 |
'x_container_policy_quota', |
|
127 |
'x_container_policy_versioning',), |
|
114 | 128 |
'object':( |
115 | 129 |
'name', |
116 | 130 |
'hash', |
... | ... | |
122 | 136 |
|
123 | 137 |
def tearDown(self): |
124 | 138 |
for c in self.client.list_containers(): |
125 |
for o in self.client.list_objects(c): |
|
126 |
self.client.delete_object(c, o) |
|
139 |
while True: |
|
140 |
#list objects returns at most 10000 objects |
|
141 |
#so repeat until there are no more objects |
|
142 |
objects = self.client.list_objects(c) |
|
143 |
if not objects: |
|
144 |
break |
|
145 |
for o in objects: |
|
146 |
self.client.delete_object(c, o) |
|
127 | 147 |
self.client.delete_container(c) |
128 | 148 |
|
129 | 149 |
def assert_status(self, status, codes): |
... | ... | |
134 | 154 |
l.append(codes) |
135 | 155 |
self.assertTrue(status in l) |
136 | 156 |
|
137 |
#def assert_list(self, path, entity, limit=10000, format='text', params=None, **headers): |
|
138 |
# status, headers, data = self.client.get(path, format=format, |
|
139 |
# headers=headers, params=params) |
|
140 |
# |
|
141 |
# self.assert_status(status, [200, 204, 304, 412]) |
|
142 |
# if format == 'text': |
|
143 |
# data = data.strip().split('\n') if data else [] |
|
144 |
# self.assertTrue(len(data) <= limit) |
|
145 |
# else: |
|
146 |
# exp_content_type = self.contentTypes[format] |
|
147 |
# self.assertEqual(headers['content_type'].find(exp_content_type), 0) |
|
148 |
# #self.assert_extended(data, format, entity, limit) |
|
149 |
# if format == 'json': |
|
150 |
# data = json.loads(data) if data else [] |
|
151 |
# elif format == 'xml': |
|
152 |
# data = minidom.parseString(data) |
|
153 |
# return status, headers, data |
|
154 |
|
|
155 | 157 |
#def assert_headers(self, headers, type, **exp_meta): |
156 | 158 |
# prefix = 'x-%s-meta-' %type |
157 | 159 |
# system_headers = [h for h in headers if not h.startswith(prefix)] |
... | ... | |
162 | 164 |
# k = k.split(prefix)[-1] |
163 | 165 |
# self.assertEqual(v, exp_meta[k]) |
164 | 166 |
|
165 |
def assert_extended(self, data, format, type, size): |
|
167 |
def assert_extended(self, data, format, type, size=10000):
|
|
166 | 168 |
if format == 'xml': |
167 | 169 |
self._assert_xml(data, type, size) |
168 | 170 |
elif format == 'json': |
... | ... | |
190 | 192 |
self.assertTrue(len(entities) <= size) |
191 | 193 |
for e in entities: |
192 | 194 |
for item in info: |
193 |
self.assertTrue(e.hasAttribute(item))
|
|
195 |
self.assertTrue(e.getElementsByTagName(item))
|
|
194 | 196 |
|
195 | 197 |
def assert_raises_fault(self, status, callableObj, *args, **kwargs): |
196 | 198 |
""" |
... | ... | |
198 | 200 |
when callableObj is called with the specific arguments |
199 | 201 |
""" |
200 | 202 |
try: |
201 |
callableObj(*args, **kwargs) |
|
203 |
r = callableObj(*args, **kwargs)
|
|
202 | 204 |
self.fail('Should never reach here') |
203 | 205 |
except Fault, f: |
204 | 206 |
self.failUnless(f.status == status) |
... | ... | |
244 | 246 |
args = {} |
245 | 247 |
args['etag'] = etag if etag else obj['hash'] |
246 | 248 |
|
247 |
guess = mimetypes.guess_type(name) |
|
248 |
type = type if type else guess[0] |
|
249 |
enc = enc if enc else guess[1] |
|
249 |
try: |
|
250 |
guess = mimetypes.guess_type(name) |
|
251 |
type = type if type else guess[0] |
|
252 |
enc = enc if enc else guess[1] |
|
253 |
except: |
|
254 |
pass |
|
250 | 255 |
args['content_type'] = type if type else 'plain/text' |
251 | 256 |
args['content_encoding'] = enc if enc else None |
252 | 257 |
|
... | ... | |
259 | 264 |
return obj |
260 | 265 |
except IOError: |
261 | 266 |
return |
267 |
class TopLevel(BaseTestCase): |
|
268 |
def test_list_shared_by_other(self): |
|
269 |
pass |
|
262 | 270 |
|
263 | 271 |
class AccountHead(BaseTestCase): |
264 | 272 |
def setUp(self): |
... | ... | |
333 | 341 |
meta = self.client.retrieve_account_metadata(restricted=True, |
334 | 342 |
until='kshfksfh') |
335 | 343 |
self.assertTrue('premium' in meta) |
336 |
|
|
344 |
|
|
337 | 345 |
class AccountGet(BaseTestCase): |
338 | 346 |
def setUp(self): |
339 | 347 |
BaseTestCase.setUp(self) |
... | ... | |
381 | 389 |
l = 2 |
382 | 390 |
m = 'oranges' |
383 | 391 |
xml = self.client.list_containers(limit=l, marker=m, format='xml') |
384 |
#self.assert_extended(xml, 'xml', 'container', l)
|
|
392 |
self.assert_extended(xml, 'xml', 'container', l) |
|
385 | 393 |
nodes = xml.getElementsByTagName('name') |
386 | 394 |
self.assertEqual(len(nodes), 1) |
387 | 395 |
self.assertEqual(nodes[0].childNodes[0].data, 'pears') |
... | ... | |
591 | 599 |
l.sort() |
592 | 600 |
self.assertEqual(objects, l) |
593 | 601 |
|
602 |
def test_list_objects_containing_slash(self): |
|
603 |
self.client.create_container('test') |
|
604 |
self.upload_random_data('test', '/objectname') |
|
605 |
|
|
606 |
objects = self.client.list_objects('test') |
|
607 |
self.assertEqual(objects, ['/objectname']) |
|
608 |
|
|
609 |
objects = self.client.list_objects('test', format='json') |
|
610 |
self.assertEqual(objects[0]['name'], '/objectname') |
|
611 |
|
|
612 |
objects = self.client.list_objects('test', format='xml') |
|
613 |
self.assert_extended(objects, 'xml', 'object') |
|
614 |
node_name = objects.getElementsByTagName('name')[0] |
|
615 |
self.assertEqual(node_name.firstChild.data, '/objectname') |
|
616 |
|
|
617 |
#objects = self.client.list_objects('test', prefix='/') |
|
618 |
#self.assertEqual(objects, ['/objectname']) |
|
619 |
# |
|
620 |
#objects = self.client.list_objects('test', path='/') |
|
621 |
#self.assertEqual(objects, ['/objectname']) |
|
622 |
# |
|
623 |
#objects = self.client.list_objects('test', prefix='/', delimiter='n') |
|
624 |
#self.assertEqual(objects, ['/object']) |
|
625 |
|
|
594 | 626 |
def test_list_objects_with_limit_marker(self): |
595 | 627 |
objects = self.client.list_objects(self.container[0], limit=2) |
596 | 628 |
l = [elem['name'] for elem in self.obj[:8]] |
... | ... | |
610 | 642 |
end = len(l) >= end and end or len(l) |
611 | 643 |
self.assertEqual(objects, l[start:end]) |
612 | 644 |
|
645 |
#takes too long |
|
646 |
#def test_list_limit_exceeds(self): |
|
647 |
# self.client.create_container('pithos') |
|
648 |
# |
|
649 |
# for i in range(10001): |
|
650 |
# self.client.create_zero_length_object('pithos', i) |
|
651 |
# |
|
652 |
# self.assertEqual(10000, len(self.client.list_objects('pithos'))) |
|
653 |
|
|
654 |
def test_list_empty_params(self): |
|
655 |
objects = self.client.get('/%s' % self.container[0])[2] |
|
656 |
if objects: |
|
657 |
objects = objects.strip().split('\n') |
|
658 |
self.assertEqual(objects, |
|
659 |
self.client.list_objects(self.container[0])) |
|
660 |
|
|
613 | 661 |
def test_list_pseudo_hierarchical_folders(self): |
614 | 662 |
objects = self.client.list_objects(self.container[1], prefix='photos', |
615 | 663 |
delimiter='/') |
... | ... | |
635 | 683 |
def test_extended_list_xml(self): |
636 | 684 |
xml = self.client.list_objects(self.container[1], format='xml', limit=4, |
637 | 685 |
prefix='photos', delimiter='/') |
686 |
self.assert_extended(xml, 'xml', 'object', size=4) |
|
638 | 687 |
dirs = xml.getElementsByTagName('subdir') |
639 | 688 |
self.assertEqual(len(dirs), 2) |
640 | 689 |
self.assertEqual(dirs[0].attributes['name'].value, 'photos/animals/') |
... | ... | |
1160 | 1209 |
#assert content-type |
1161 | 1210 |
self.assertEqual(h['content-type'], o['meta']['content_type']) |
1162 | 1211 |
|
1212 |
def test_maximum_upload_size_exceeds(self): |
|
1213 |
name = o_names[0] |
|
1214 |
meta = {'test':'test1'} |
|
1215 |
#upload 100MB |
|
1216 |
length=1024*1024*100 |
|
1217 |
self.assert_raises_fault(400, self.upload_random_data, self.container, |
|
1218 |
name, length, **meta) |
|
1219 |
|
|
1220 |
##d = get_random_data(length=1024*1024*100) |
|
1221 |
##self.client.create_object_using_chunks(self.container, name, StringIO(d)) |
|
1222 |
|
|
1223 |
|
|
1163 | 1224 |
def test_upload_with_name_containing_slash(self): |
1164 | 1225 |
name = '/%s' % o_names[0] |
1165 | 1226 |
meta = {'test':'test1'} |
... | ... | |
1191 | 1252 |
|
1192 | 1253 |
uploaded_data = self.client.retrieve_object(self.container, objname) |
1193 | 1254 |
self.assertEqual(data, uploaded_data) |
1194 |
|
|
1255 |
|
|
1256 |
def test_manifestation(self): |
|
1257 |
prefix = 'myobject/' |
|
1258 |
data = '' |
|
1259 |
for i in range(5): |
|
1260 |
part = '%s%d' %(prefix, i) |
|
1261 |
o = self.upload_random_data(self.container, part) |
|
1262 |
data += o['data'] |
|
1263 |
|
|
1264 |
manifest = '%s/%s' %(self.container, prefix) |
|
1265 |
self.client.create_manifestation(self.container, 'large-object', |
|
1266 |
manifest) |
|
1267 |
|
|
1268 |
self.assert_object_exists(self.container, 'large-object') |
|
1269 |
self.assertEqual(data, self.client.retrieve_object(self.container, |
|
1270 |
'large-object')) |
|
1271 |
|
|
1272 |
#wrong manifestation |
|
1273 |
self.client.create_manifestation(self.container, 'large-object', |
|
1274 |
'invalid') |
|
1275 |
|
|
1195 | 1276 |
class ObjectCopy(BaseTestCase): |
1196 | 1277 |
def setUp(self): |
1197 | 1278 |
BaseTestCase.setUp(self) |
... | ... | |
1201 | 1282 |
self.client.create_container(c) |
1202 | 1283 |
self.obj = self.upload_random_data(self.containers[0], o_names[0]) |
1203 | 1284 |
|
1285 |
def tearDown(self): |
|
1286 |
pass |
|
1287 |
|
|
1204 | 1288 |
def test_copy(self): |
1205 | 1289 |
with AssertMappingInvariant(self.client.retrieve_object_metadata, |
1206 | 1290 |
self.containers[0], self.obj['name']): |
... | ... | |
1259 | 1343 |
self.assert_raises_fault(404, self.client.copy_object, self.containers[1], |
1260 | 1344 |
self.obj['name'], self.containers[1], |
1261 | 1345 |
'testcopy', meta) |
1262 |
|
|
1263 | 1346 |
|
1264 | 1347 |
class ObjectMove(BaseTestCase): |
1265 | 1348 |
def setUp(self): |
... | ... | |
1426 | 1509 |
self.assert_raises_fault(404, self.client.delete_object, self.containers[1], |
1427 | 1510 |
self.obj['name']) |
1428 | 1511 |
|
1512 |
class ListSharing(BaseTestCase): |
|
1513 |
def setUp(self): |
|
1514 |
BaseTestCase.setUp(self) |
|
1515 |
self.client.create_container('c') |
|
1516 |
for i in range(2): |
|
1517 |
self.upload_random_data('c', 'o%s' %i) |
|
1518 |
accounts = OTHER_ACCOUNTS.copy() |
|
1519 |
self.o1_sharing_with = accounts.popitem() |
|
1520 |
self.o1_sharing = [self.o1_sharing_with[1]] |
|
1521 |
self.client.share_object('c', 'o1', self.o1_sharing, read=True) |
|
1522 |
|
|
1523 |
l = [] |
|
1524 |
for i in range(2): |
|
1525 |
l.append(accounts.popitem()) |
|
1526 |
#self.client.set_account_groups({'pithos-dev':'chazapis,verigak,papagian'}) |
|
1527 |
#self.o2_sharing = 'write=%s' % |
|
1528 |
#self.client.share_object('c', 'o2', self.o2_sharing) |
|
1529 |
|
|
1530 |
def test_listing(self): |
|
1531 |
self.other = Pithos_Client(DEFAULT_HOST, |
|
1532 |
self.o1_sharing_with[0], |
|
1533 |
self.o1_sharing_with[1], |
|
1534 |
DEFAULT_API) |
|
1535 |
self.assertTrue('test' in self.other.list_shared_by_others()) |
|
1536 |
|
|
1537 |
class TestGreek(BaseTestCase): |
|
1538 |
def tearDown(self): |
|
1539 |
pass |
|
1540 |
|
|
1541 |
def test_create_container(self): |
|
1542 |
self.client.create_container('φάκελος') |
|
1543 |
self.assert_container_exists('φάκελος') |
|
1544 |
|
|
1545 |
def test_create_object(self): |
|
1546 |
self.client.create_container('φάκελος') |
|
1547 |
self.upload_random_data('φάκελος', 'αντικείμενο') |
|
1548 |
|
|
1549 |
self.assert_object_exists('φάκελος', 'αντικείμενο') |
|
1550 |
|
|
1551 |
def test_copy_object(self): |
|
1552 |
self.client.create_container('φάκελος') |
|
1553 |
self.upload_random_data('φάκελος', 'αντικείμενο') |
|
1554 |
|
|
1555 |
self.client.create_container('αντίγραφα') |
|
1556 |
self.client.copy_object('φάκελος', 'αντικείμενο', 'αντίγραφα', |
|
1557 |
'αντικείμενο') |
|
1558 |
|
|
1559 |
self.assert_object_exists('αντίγραφα', 'αντικείμενο') |
|
1560 |
self.assert_object_exists('φάκελος', 'αντικείμενο') |
|
1561 |
|
|
1562 |
def test_move_object(self): |
|
1563 |
self.client.create_container('φάκελος') |
|
1564 |
self.upload_random_data('φάκελος', 'αντικείμενο') |
|
1565 |
|
|
1566 |
self.client.create_container('αντίγραφα') |
|
1567 |
self.client.copy_object('φάκελος', 'αντικείμενο', 'αντίγραφα', |
|
1568 |
'αντικείμενο') |
|
1569 |
|
|
1570 |
self.assert_object_exists('αντίγραφα', 'αντικείμενο') |
|
1571 |
self.assert_object_not_exists('φάκελος', 'αντικείμενο') |
|
1572 |
|
|
1573 |
def test_delete_object(self): |
|
1574 |
pass |
|
1575 |
|
|
1576 |
def test_delete_container(self): |
|
1577 |
pass |
|
1578 |
|
|
1579 |
def test_account_meta(self): |
|
1580 |
pass |
|
1581 |
|
|
1582 |
def test_container_meta(self): |
|
1583 |
pass |
|
1584 |
|
|
1585 |
def test_obejct_meta(self): |
|
1586 |
pass |
|
1587 |
|
|
1588 |
def test_list_meta_filtering(self): |
|
1589 |
pass |
|
1590 |
|
|
1591 |
def test_groups(self): |
|
1592 |
pass |
|
1593 |
|
|
1594 |
def test_permissions(self): |
|
1595 |
pass |
|
1596 |
|
|
1429 | 1597 |
class AssertMappingInvariant(object): |
1430 | 1598 |
def __init__(self, callable, *args, **kwargs): |
1431 | 1599 |
self.callable = callable |
Also available in: Unified diff