1 # Copyright 2011 GRNET S.A. All rights reserved.
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
7 # 1. Redistributions of source code must retain the above
8 # copyright notice, this list of conditions and the following
11 # 2. Redistributions in binary form must reproduce the above
12 # copyright notice, this list of conditions and the following
13 # disclaimer in the documentation and/or other materials
14 # provided with the distribution.
16 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
29 # The views and conclusions contained in the software and
30 # documentation are those of the authors and should not be
31 # interpreted as representing official policies, either expressed
32 # or implied, of GRNET S.A.
39 from simple import SimpleBackend
42 class TestAccount(unittest.TestCase):
44 self.basepath = './test/content'
45 self.b = SimpleBackend(self.basepath)
46 self.account = 'account1'
49 containers = [x[0] for x in self.b.list_containers('test', self.account)]
50 for container in containers:
52 self.b.delete_container('test', self.account, container)
55 for obj in [x[0] for x in self.b.list_objects('test', self.account, container)]:
56 self.b.delete_object('test', self.account, container, obj)
57 self.b.delete_container('test', self.account, container)
59 def test_list_containers(self):
60 l1 = ['images', 'movies', 'documents', 'backups']
62 self.b.put_container('test', self.account, item)
63 l2 = [x[0] for x in self.b.list_containers('test', self.account)]
65 self.assertEquals(l1, l2)
67 def test_list_containers_with_limit_marker(self):
68 l1 = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
70 self.b.put_container('test', self.account, item)
71 l2 = [x[0] for x in self.b.list_containers('test', self.account, limit=2)]
72 self.assertEquals(len(l2), 2)
73 self.assertEquals(l1[:2], l2)
75 l2 = [x[0] for x in self.b.list_containers('test', self.account, limit=2, marker='bananas')]
76 self.assertTrue(len(l2) <= 2)
77 self.assertEquals(l1[2:4], l2)
79 l2 = [x[0] for x in self.b.list_containers('test', self.account, limit=2, marker='oranges')]
80 self.assertTrue(len(l2) <= 2)
81 self.assertEquals(l1[4:], l2)
83 def test_get_account_meta(self):
86 "username": "aaitest@uth.gr",
87 "email": "aaitest@uth.gr",
88 "fileroot": "http://hostname/gss/rest/aaitest@uth.gr/files",
89 "trash": "http://hostname/gss/rest/aaitest@uth.gr/trash",
90 "shared": "http://hostname/gss/rest/aaitest@uth.gr/shared",
91 "others": "http://hostname/gss/rest/aaitest@uth.gr/others",
92 "tags": "http://hostname/gss/rest/aaitest@uth.gr/tags",
93 "groups": "http://hostname/gss/rest/aaitest@uth.gr/groups",
94 "creationDate": 1223372769275,
95 "modificationDate": 1223372769275,
96 "lastLogin": 1223372769275}
97 self.b.update_account_meta('test', self.account, meta)
98 d = self.b.get_account_meta('test', self.account)
99 for k,v in meta.iteritems():
100 self.assertEquals(unicode(v), d[k])
102 def test_get_non_existing_account_meta(self):
103 meta = self.b.get_account_meta('test', 'account2')
104 self.assertEquals(meta, {'name': 'account2', 'count': 0, 'bytes': 0})
106 def test_update_account_meta(self):
109 "username": "aaitest@uth.gr",
110 "email": "aaitest@uth.gr",
111 "fileroot": "http://hostname/gss/rest/aaitest@uth.gr/files",
112 "trash": "http://hostname/gss/rest/aaitest@uth.gr/trash",
113 "shared": "http://hostname/gss/rest/aaitest@uth.gr/shared",
114 "others": "http://hostname/gss/rest/aaitest@uth.gr/others",
115 "tags": "http://hostname/gss/rest/aaitest@uth.gr/tags",
116 "groups": "http://hostname/gss/rest/aaitest@uth.gr/groups",
117 "creationDate": 1223372769275,
118 "modificationDate": 1223372769275,
119 "lastLogin": 1223372769275}
120 self.b.update_account_meta('test', self.account, meta)
121 p = os.path.join(self.basepath, self.account)
123 db_meta = self.b.get_account_meta('test', self.account)
124 for k,v in meta.iteritems():
125 self.assertTrue(k in db_meta)
126 db_value = db_meta[k]
127 self.assertEquals(unicode(v), db_value)
129 class TestContainer(unittest.TestCase):
131 self.basepath = './test/content'
132 self.b = SimpleBackend(self.basepath)
133 self.account = 'account1'
136 containers = [x[0] for x in self.b.list_containers('test', self.account)]
137 for container in containers:
139 self.b.delete_container('test', self.account, container)
140 except IndexError: # container not empty
141 for obj in [x[0] for x in self.b.list_objects('test', self.account, container)]:
142 self.b.delete_object('test', self.account, container, obj)
143 self.b.delete_container('test', self.account, container)
145 def test_list_non_existing_account_objects(self):
146 self.assertRaises(NameError, self.b.list_objects, 'test', 'account2', 'container1')
148 def test_list_objects(self):
149 self.b.put_container('test', self.account, 'container1')
150 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1')]
151 self.assertEquals(len([]), len(objects))
153 {'name':'kate_beckinsale.jpg'},
154 {'name':'How To Win Friends And Influence People.pdf'},
155 {'name':'moms_birthday.jpg'},
156 {'name':'poodle_strut.mov'},
157 {'name':'Disturbed - Down With The Sickness.mp3'},
158 {'name':'army_of_darkness.avi'},
159 {'name':'the_mad.avi'}
162 self.b.update_object_hashmap('test', self.account, 'container1', item['name'], 0, [])
163 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1')]
164 self.assertEquals(len(l), len(objects))
166 def test_list_objects_with_limit_marker(self):
167 self.b.put_container('test', self.account, 'container1')
168 l = ['gala', 'grannysmith', 'honeycrisp', 'jonagold', 'reddelicious']
170 self.b.update_object_hashmap('test', self.account, 'container1', item, 0, [])
171 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', limit=2)]
172 self.assertEquals(l[:2], objects)
174 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', limit=2, marker='grannysmith')]
175 self.assertEquals(l[2:4], objects)
177 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', limit=2, marker='jonagold')]
178 self.assertEquals(l[4:], objects)
180 def test_list_pseudo_hierarchical_folders(self):
181 self.b.put_container('test', self.account, 'container1')
182 l = ['photos/animals/dogs/poodle.jpg',
183 'photos/animals/dogs/terrier.jpg',
184 'photos/animals/cats/persian.jpg',
185 'photos/animals/cats/siamese.jpg',
186 'photos/plants/fern.jpg',
187 'photos/plants/rose.jpg',
191 self.b.update_object_hashmap('test', self.account, 'container1', item, 0, [])
193 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', prefix='photos/', delimiter='/')]
194 self.assertEquals(['photos/animals/', 'photos/me.jpg', 'photos/plants/'], objects)
196 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', prefix='photos/animals/', delimiter='/')]
197 self.assertEquals(['photos/animals/cats/', 'photos/animals/dogs/'], objects)
199 self.b.put_container('test', self.account, 'container2')
200 l = ['photos/photo1', 'photos/photo2', 'movieobject', 'videos', 'videos/movieobj4']
202 self.b.update_object_hashmap('test', self.account, 'container2', item, 0, [])
203 objects = [x[0] for x in self.b.list_objects('test', self.account, 'container2', delimiter='/')]
204 self.assertEquals(['movieobject', 'photos/', 'videos', 'videos/'], objects)
206 def test_put_container(self):
208 self.b.put_container('test', self.account, cname)
209 self.assertTrue(cname in [x[0] for x in self.b.list_containers('test', self.account)])
211 def test_put_container_twice(self):
213 self.b.put_container('test', self.account, cname)
214 self.assertRaises(NameError, self.b.put_container, 'test', self.account, cname)
216 def test_delete_container(self):
218 self.b.put_container('test', self.account, cname)
219 self.b.delete_container('test', self.account, cname)
220 self.assertTrue(cname not in [x[0] for x in self.b.list_containers('test', self.account)])
222 def test_delete_non_exisitng_container(self):
224 self.assertRaises(NameError, self.b.delete_container, 'test', self.account, cname)
226 def test_delete_non_empty_container(self):
228 self.b.put_container('test', self.account, cname)
229 self.b.update_object_hashmap('test', self.account, cname, 'object1', 0, [])
230 self.assertRaises(IndexError, self.b.delete_container, 'test', self.account, cname)
232 def test_get_container_meta(self):
234 self.b.put_container('test', self.account, cname)
235 meta = self.b.get_container_meta('test', self.account, cname)
236 self.assertEquals(meta['count'], 0)
238 l = ['photos/photo1', 'photos/photo2', 'movieobject', 'videos/movieobj4']
240 self.b.update_object_hashmap('test', self.account, cname, item, 0, [])
241 meta = self.b.get_container_meta('test', self.account, cname)
242 self.assertEquals(meta['count'], 4)
244 class TestObject(unittest.TestCase):
246 self.basepath = './test/content'
247 self.b = SimpleBackend(self.basepath)
248 self.account = 'account1'
251 containers = [x[0] for x in self.b.list_containers('test', self.account)]
252 for container in containers:
254 self.b.delete_container('test', self.account, container)
255 except IndexError: # container not empty
256 for obj in [x[0] for x in self.b.list_objects('test', self.account, container)]:
257 self.b.delete_object('test', self.account, container, obj)
258 self.b.delete_container('test', self.account, container)
260 def test_get_non_existing_object(self):
262 self.b.put_container('test', self.account, cname)
263 self.assertRaises(NameError, self.b.get_object_hashmap, 'test', self.account, 'cname', 'testobj')
264 self.assertRaises(NameError, self.b.get_object_hashmap, 'test', self.account, cname, 'testobj')
266 def test_get_object(self):
268 self.b.put_container('test', self.account, cname)
269 input = {'name':'kate_beckinsale.jpg'}
270 data = json.dumps(input)
271 hash = self.b.put_block(data)
272 self.b.update_object_hashmap('test', self.account, cname, input['name'], len(data), [hash])
273 size, hashmap = self.b.get_object_hashmap('test', self.account, cname, 'kate_beckinsale.jpg')
274 self.assertEquals(len(data), size)
275 self.assertEquals(hash, hashmap[0])
276 self.assertEquals(input, json.loads(self.b.get_block(hash)))
278 # def test_update_object(self):
279 # cname = 'container1'
280 # self.b.put_container('test', self.account, cname)
281 # input = {'name':'kate_beckinsale.jpg'}
282 # self.b.update_object('test', self.account, cname, input['name'], json.dumps(input))
283 # meta = self.b.get_object_meta('test', self.account, cname, input['name'])
285 def test_copy_object(self):
286 src_cname = 'container1'
287 src_obj = 'photos/me.jpg'
288 dest_cname = 'container2'
289 dest_obj = 'photos/personal/myself.jpg'
291 # non existing source account
292 self.assertRaises(NameError,
300 # non existing source container
301 self.assertRaises(NameError,
310 self.b.put_container('test', self.account, src_cname)
311 # non existing source object
312 self.assertRaises(NameError,
321 self.b.update_object_hashmap('test', self.account, src_cname, src_obj, 0, [])
322 # non existing destination container
323 self.assertRaises(NameError,
332 self.b.put_container('test', self.account, dest_cname)
333 self.b.update_object_meta('test', self.account, src_cname, src_obj, {'tag':'sfsfssf'})
334 self.b.copy_object('test', self.account, src_cname, src_obj, dest_cname, dest_obj)
335 self.assertTrue(dest_obj in [x[0] for x in self.b.list_objects('test',
338 prefix='photos/personal/',
340 # TODO: test metadata changes
341 meta_tag = self.b.get_object_meta('test', self.account, dest_cname, dest_obj)['tag']
342 self.assertEquals(meta_tag, unicode('sfsfssf'))
344 def test_delete_non_existing_object(self):
346 self.b.put_container('test', self.account, cname)
347 name = 'kate_beckinsale.jpg'
348 self.assertRaises(NameError, self.b.delete_object, 'test', self.account, cname, name)
350 def test_delete_object(self):
352 self.b.put_container('test', self.account, cname)
353 name = 'kate_beckinsale.jpg'
354 self.b.update_object_hashmap('test', self.account, cname, name, 0, [])
355 self.assertTrue(name in [x[0] for x in self.b.list_objects('test', self.account, cname)])
357 self.b.delete_object('test', self.account, cname, name)
358 self.assertTrue(name not in [x[0] for x in self.b.list_objects('test', self.account, cname)])
359 self.assertRaises(NameError, self.b.delete_object, 'test', self.account, cname, name)
361 def test_get_non_existing_object_meta(self):
363 self.b.put_container('test', self.account, cname)
364 name = 'kate_beckinsale.jpg'
365 self.assertRaises(NameError, self.b.get_object_meta, 'test', self.account, cname, name)
367 def test_get_update_object_meta(self):
369 self.b.put_container('test', self.account, cname)
370 name = 'kate_beckinsale.jpg'
371 self.b.update_object_hashmap('test', self.account, cname, name, 0, [])
373 m1 = {'X-Object-Meta-Meat': 'Bacon',
374 'X-Object-Meta-Fruit': 'Bacon',
375 'X-Object-Meta-Dairy': 'Bacon'}
376 self.b.update_object_meta('test', self.account, cname, name, m1)
377 meta = self.b.get_object_meta('test', self.account, cname, name)
378 for k,v in m1.iteritems():
379 self.assertTrue(k in meta)
380 self.assertEquals(unicode(v), meta[k])
382 m2 = {'X-Object-Meta-Meat': 'Bacon',
383 'X-Object-Meta-Fruit': 'Bacon',
384 'X-Object-Meta-Veggie': 'Bacon',
385 'X-Object-Meta-Dairy': 'Chicken'}
386 self.b.update_object_meta('test', self.account, cname, name, m2)
387 meta = self.b.get_object_meta('test', self.account, cname, name)
389 for k,v in m1.iteritems():
390 self.assertTrue(k in meta)
391 self.assertEquals(unicode(v), meta[k])
393 def test_update_non_existing_object_meta(self):
395 self.b.put_container('test', self.account, cname)
396 name = 'kate_beckinsale.jpg'
397 self.assertRaises(NameError, self.b.update_object_meta, 'test', self.account, cname, name, {})
399 if __name__ == "__main__":