Statistics
| Branch: | Tag: | Revision:

root / pithos / backends / tests.py @ 5bd53e3b

History | View | Annotate | Download (18.3 kB)

1
# Copyright 2011 GRNET S.A. All rights reserved.
2
# 
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
# 
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
# 
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.
15
# 
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.
28
# 
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.
33

    
34
import unittest
35
import os
36
import types
37
import json
38

    
39
from hashfilerback import HashFilerBack as TheBackend
40
#from simple import SimpleBackend as TheBackend
41

    
42

    
43
class TestAccount(unittest.TestCase):
44
    def setUp(self):
45
        self.basepath = './test/content'
46
        self.b = TheBackend(self.basepath)
47
        self.account = 'test'
48
    
49
    def tearDown(self):
50
        containers = [x[0] for x in self.b.list_containers('test', self.account)]
51
        for container in containers:
52
            try:
53
                self.b.delete_container('test', self.account, container)
54
            except IndexError:
55
                # container not empty
56
                for obj in [x[0] for x in self.b.list_objects('test', self.account, container)]:
57
                    self.b.delete_object('test', self.account, container, obj)
58
                self.b.delete_container('test', self.account, container)
59
    
60
    def test_list_containers(self):
61
        l1 = ['images', 'movies', 'documents', 'backups']
62
        for item in l1:
63
            self.b.put_container('test', self.account, item)
64
        l2 = [x[0] for x in self.b.list_containers('test', self.account)]
65
        l1.sort()
66
        self.assertEquals(l1, l2)
67
    
68
    def test_list_containers_with_limit_marker(self):
69
        l1 = ['apples', 'bananas', 'kiwis', 'oranges', 'pears']
70
        for item in l1:
71
            self.b.put_container('test', self.account, item)
72
        l2 = [x[0] for x in self.b.list_containers('test', self.account, limit=2)]
73
        self.assertEquals(len(l2), 2)
74
        self.assertEquals(l1[:2], l2)
75
    
76
        l2 = [x[0] for x in self.b.list_containers('test', self.account, limit=2, marker='bananas')]
77
        self.assertTrue(len(l2) <= 2)
78
        self.assertEquals(l1[2:4], l2)
79

    
80
        l2 = [x[0] for x in self.b.list_containers('test', self.account, limit=2, marker='oranges')]
81
        self.assertTrue(len(l2) <= 2)
82
        self.assertEquals(l1[4:], l2)
83
    
84
    def test_get_account_meta(self):
85
        meta = {
86
            "name": "test",
87
            "username": "aaitest@uth.gr",
88
            "email": "aaitest@uth.gr",
89
            "fileroot": "http://hostname/gss/rest/aaitest@uth.gr/files",
90
            "trash": "http://hostname/gss/rest/aaitest@uth.gr/trash",
91
            "shared": "http://hostname/gss/rest/aaitest@uth.gr/shared",
92
            "others": "http://hostname/gss/rest/aaitest@uth.gr/others",
93
            "tags": "http://hostname/gss/rest/aaitest@uth.gr/tags",
94
            "groups": "http://hostname/gss/rest/aaitest@uth.gr/groups",
95
            "creationDate": 1223372769275,
96
            "modificationDate": 1223372769275,
97
            "lastLogin": 1223372769275}
98
        self.b.update_account_meta('test', self.account, meta)
99
        d = self.b.get_account_meta('test', self.account)
100
        for k,v in meta.iteritems():
101
            self.assertEquals(unicode(v), d[k])
102
    
103
    def test_get_non_existing_account_meta(self):
104
        meta = self.b.get_account_meta('account1', 'account1')
105
        self.assertEquals(meta, {'name': 'account1', 'count': 0, 'bytes': 0})
106
    
107
    def test_update_account_meta(self):
108
        meta = {
109
            "name": "test",
110
            "username": "aaitest@uth.gr",
111
            "email": "aaitest@uth.gr",
112
            "fileroot": "http://hostname/gss/rest/aaitest@uth.gr/files",
113
            "trash": "http://hostname/gss/rest/aaitest@uth.gr/trash",
114
            "shared": "http://hostname/gss/rest/aaitest@uth.gr/shared",
115
            "others": "http://hostname/gss/rest/aaitest@uth.gr/others",
116
            "tags": "http://hostname/gss/rest/aaitest@uth.gr/tags",
117
            "groups": "http://hostname/gss/rest/aaitest@uth.gr/groups",
118
            "creationDate": 1223372769275,
119
            "modificationDate": 1223372769275,
120
            "lastLogin": 1223372769275}
121
        self.b.update_account_meta('test', self.account, meta)
122
        p = os.path.join(self.basepath, self.account)
123
        
124
        db_meta = self.b.get_account_meta('test', self.account)
125
        for k,v in meta.iteritems():
126
            self.assertTrue(k in db_meta)
127
            db_value = db_meta[k]
128
            self.assertEquals(unicode(v), db_value)
129

    
130
class TestContainer(unittest.TestCase):
131
    def setUp(self):
132
        self.basepath = './test/content'
133
        self.b = TheBackend(self.basepath)
134
        self.account = 'test'
135
    
136
    def tearDown(self):
137
        containers = [x[0] for x in self.b.list_containers('test', self.account)]
138
        for container in containers:
139
            try:
140
                self.b.delete_container('test', self.account, container)
141
            except IndexError: # container not empty
142
                for obj in [x[0] for x in self.b.list_objects('test', self.account, container)]:
143
                    self.b.delete_object('test', self.account, container, obj)
144
                self.b.delete_container('test', self.account, container)
145
    
146
    def test_list_non_existing_account_objects(self):
147
        self.assertRaises(NameError, self.b.list_objects, 'test', 'test', 'container1')
148
    
149
    def test_list_objects(self):
150
        self.b.put_container('test', self.account, 'container1')
151
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1')]
152
        self.assertEquals(len([]), len(objects))
153
        l = [
154
            {'name':'kate_beckinsale.jpg'},
155
            {'name':'How To Win Friends And Influence People.pdf'},
156
            {'name':'moms_birthday.jpg'},
157
            {'name':'poodle_strut.mov'},
158
            {'name':'Disturbed - Down With The Sickness.mp3'},
159
            {'name':'army_of_darkness.avi'},
160
            {'name':'the_mad.avi'}
161
        ]
162
        for item in l:
163
            self.b.update_object_hashmap('test', self.account, 'container1', item['name'], 0, [])
164
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1')]
165
        self.assertEquals(len(l), len(objects))
166
    
167
    def test_list_objects_with_limit_marker(self):
168
        self.b.put_container('test', self.account, 'container1')
169
        l = ['gala', 'grannysmith', 'honeycrisp', 'jonagold', 'reddelicious']
170
        for item in l:
171
            self.b.update_object_hashmap('test', self.account, 'container1', item, 0, [])
172
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', limit=2)]
173
        self.assertEquals(l[:2], objects)
174
        
175
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', limit=2, marker='grannysmith')]
176
        self.assertEquals(l[2:4], objects)
177
        
178
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', limit=2, marker='jonagold')]
179
        self.assertEquals(l[4:], objects)
180
    
181
    def test_list_pseudo_hierarchical_folders(self):
182
        self.b.put_container('test', self.account, 'container1')
183
        l = ['photos/animals/dogs/poodle.jpg',
184
             'photos/animals/dogs/terrier.jpg',
185
             'photos/animals/cats/persian.jpg',
186
             'photos/animals/cats/siamese.jpg',
187
             'photos/plants/fern.jpg',
188
             'photos/plants/rose.jpg',
189
             'photos/me.jpg'
190
             ]
191
        for item in l:
192
            self.b.update_object_hashmap('test', self.account, 'container1', item, 0, [])
193
        
194
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', prefix='photos/', delimiter='/')]
195
        self.assertEquals(['photos/animals/', 'photos/me.jpg', 'photos/plants/'], objects)
196
        
197
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container1', prefix='photos/animals/', delimiter='/')]
198
        self.assertEquals(['photos/animals/cats/', 'photos/animals/dogs/'], objects)
199
        
200
        self.b.put_container('test', self.account, 'container2')
201
        l = ['photos/photo1', 'photos/photo2', 'movieobject', 'videos', 'videos/movieobj4']
202
        for item in l:
203
            self.b.update_object_hashmap('test', self.account, 'container2', item, 0, [])
204
        objects = [x[0] for x in self.b.list_objects('test', self.account, 'container2', delimiter='/')]
205
        self.assertEquals(['movieobject', 'photos/', 'videos', 'videos/'], objects)
206
    
207
    def test_put_container(self):
208
        cname = 'container1'
209
        self.b.put_container('test', self.account, cname)
210
        self.assertTrue(cname in [x[0] for x in self.b.list_containers('test', self.account)])
211
    
212
    def test_put_container_twice(self):
213
        cname = 'container1'
214
        self.b.put_container('test', self.account, cname)
215
        self.assertRaises(NameError, self.b.put_container, 'test', self.account, cname)
216
    
217
    def test_delete_container(self):
218
        cname = 'container1'
219
        self.b.put_container('test', self.account, cname)
220
        self.b.delete_container('test', self.account, cname)
221
        self.assertTrue(cname not in [x[0] for x in self.b.list_containers('test', self.account)])
222
    
223
    def test_delete_non_exisitng_container(self):
224
        cname = 'container1'
225
        self.assertRaises(NameError, self.b.delete_container, 'test', self.account, cname)
226
    
227
    def test_delete_non_empty_container(self):
228
        cname = 'container1'
229
        self.b.put_container('test', self.account, cname)
230
        self.b.update_object_hashmap('test', self.account, cname, 'object1', 0, [])
231
        self.assertRaises(IndexError, self.b.delete_container, 'test', self.account, cname)
232
    
233
    def test_get_container_meta(self):
234
        cname = 'container1'
235
        self.b.put_container('test', self.account, cname)
236
        meta = self.b.get_container_meta('test', self.account, cname)
237
        self.assertEquals(meta['count'], 0)
238
        
239
        l = ['photos/photo1', 'photos/photo2', 'movieobject', 'videos/movieobj4']
240
        for item in l:
241
            self.b.update_object_hashmap('test', self.account, cname, item, 0, [])
242
        meta = self.b.get_container_meta('test', self.account, cname)
243
        self.assertEquals(meta['count'], 4)
244

    
245
class TestObject(unittest.TestCase):
246
    def setUp(self):
247
        self.basepath = './test/content'
248
        self.b = TheBackend(self.basepath)
249
        self.account = 'test'
250
    
251
    def tearDown(self):
252
        containers = [x[0] for x in self.b.list_containers('test', self.account)]
253
        for container in containers:
254
            try:
255
                self.b.delete_container('test', self.account, container)
256
            except IndexError: # container not empty
257
                for obj in [x[0] for x in self.b.list_objects('test', self.account, container)]:
258
                    self.b.delete_object('test', self.account, container, obj)
259
                self.b.delete_container('test', self.account, container)
260
    
261
    def test_get_non_existing_object(self):
262
        cname = 'container1'
263
        self.b.put_container('test', self.account, cname)
264
        self.assertRaises(NameError, self.b.get_object_hashmap, 'test', self.account, 'cname', 'testobj')
265
        self.assertRaises(NameError, self.b.get_object_hashmap, 'test', self.account, cname, 'testobj')
266
    
267
    def test_get_object(self):
268
        cname = 'container1'
269
        self.b.put_container('test', self.account, cname)
270
        input = {'name':'kate_beckinsale.jpg'}
271
        data = json.dumps(input)
272
        hash = self.b.put_block(data)
273
        self.b.update_object_hashmap('test', self.account, cname, input['name'], len(data), [hash])
274
        size, hashmap = self.b.get_object_hashmap('test', self.account, cname, 'kate_beckinsale.jpg')
275
        self.assertEquals(len(data), size)
276
        self.assertEquals(hash, hashmap[0])
277
        self.assertEquals(input, json.loads(self.b.get_block(hash)))
278
    
279
#     def test_update_object(self):
280
#         cname = 'container1'
281
#         self.b.put_container('test', self.account, cname)
282
#         input = {'name':'kate_beckinsale.jpg'}
283
#         self.b.update_object('test', self.account, cname, input['name'], json.dumps(input))
284
#         meta = self.b.get_object_meta('test', self.account, cname, input['name'])
285
    
286
    def test_copy_object(self):
287
        src_cname = 'container1'
288
        src_obj = 'photos/me.jpg'
289
        dest_cname = 'container2'
290
        dest_obj = 'photos/personal/myself.jpg'
291
        
292
        # non existing source account
293
        self.assertRaises(NameError,
294
                          self.b.copy_object,
295
                          'test',
296
                          'test',
297
                          src_cname,
298
                          src_obj,
299
                          dest_cname,
300
                          dest_obj)
301
        # non existing source container
302
        self.assertRaises(NameError,
303
                          self.b.copy_object,
304
                          'test',
305
                          self.account,
306
                          src_cname,
307
                          src_obj,
308
                          dest_cname,
309
                          dest_obj)
310
        
311
        self.b.put_container('test', self.account, src_cname)
312
        # non existing source object
313
        self.assertRaises(NameError,
314
                          self.b.copy_object,
315
                          'test',
316
                          self.account,
317
                          src_cname,
318
                          src_obj,
319
                          dest_cname,
320
                          dest_obj)
321
        
322
        self.b.update_object_hashmap('test', self.account, src_cname, src_obj, 0, [])
323
        # non existing destination container
324
        self.assertRaises(NameError,
325
                          self.b.copy_object,
326
                          'test',
327
                          self.account,
328
                          src_cname,
329
                          src_obj,
330
                          dest_cname,
331
                          dest_obj)
332
        
333
        self.b.put_container('test', self.account, dest_cname)
334
        self.b.update_object_meta('test', self.account, src_cname, src_obj, {'tag':'sfsfssf'})
335
        self.b.copy_object('test', self.account, src_cname, src_obj, dest_cname, dest_obj)
336
        self.assertTrue(dest_obj in [x[0] for x in self.b.list_objects('test',
337
                                                                        self.account,
338
                                                                        dest_cname,
339
                                                                        prefix='photos/personal/',
340
                                                                        delimiter='/')])
341
        # TODO: test metadata changes
342
        meta_tag = self.b.get_object_meta('test', self.account, dest_cname, dest_obj)['tag']
343
        self.assertEquals(meta_tag, unicode('sfsfssf'))
344
    
345
    def test_delete_non_existing_object(self):
346
        cname = 'container1'
347
        self.b.put_container('test', self.account, cname)
348
        name = 'kate_beckinsale.jpg'
349
        self.assertRaises(NameError, self.b.delete_object, 'test', self.account, cname, name)
350
    
351
    def test_delete_object(self):
352
        cname = 'container1'
353
        self.b.put_container('test', self.account, cname)
354
        name = 'kate_beckinsale.jpg'
355
        self.b.update_object_hashmap('test', self.account, cname, name, 0, [])
356
        self.assertTrue(name in [x[0] for x in self.b.list_objects('test', self.account, cname)])
357
        
358
        self.b.delete_object('test', self.account, cname, name)
359
        self.assertTrue(name not in [x[0] for x in self.b.list_objects('test', self.account, cname)])
360
        self.assertRaises(NameError, self.b.delete_object, 'test', self.account, cname, name)
361
    
362
    def test_get_non_existing_object_meta(self):
363
        cname = 'container1'
364
        self.b.put_container('test', self.account, cname)
365
        name = 'kate_beckinsale.jpg'
366
        self.assertRaises(NameError, self.b.get_object_meta, 'test', self.account, cname, name)
367
    
368
    def test_get_update_object_meta(self):
369
        cname = 'container1'
370
        self.b.put_container('test', self.account, cname)
371
        name = 'kate_beckinsale.jpg'
372
        self.b.update_object_hashmap('test', self.account, cname, name, 0, [])
373
        
374
        m1 = {'X-Object-Meta-Meat': 'Bacon',
375
             'X-Object-Meta-Fruit': 'Bacon',
376
             'X-Object-Meta-Dairy': 'Bacon'}
377
        self.b.update_object_meta('test', self.account, cname, name, m1)
378
        meta = self.b.get_object_meta('test', self.account, cname, name)
379
        for k,v in m1.iteritems():
380
            self.assertTrue(k in meta)
381
            self.assertEquals(unicode(v), meta[k])
382
        
383
        m2 = {'X-Object-Meta-Meat': 'Bacon',
384
             'X-Object-Meta-Fruit': 'Bacon',
385
             'X-Object-Meta-Veggie': 'Bacon',
386
             'X-Object-Meta-Dairy': 'Chicken'}
387
        self.b.update_object_meta('test', self.account, cname, name, m2)
388
        meta = self.b.get_object_meta('test', self.account, cname, name)
389
        m1.update(m2)
390
        for k,v in m1.iteritems():
391
            self.assertTrue(k in meta)
392
            self.assertEquals(unicode(v), meta[k])
393
    
394
    def test_update_non_existing_object_meta(self):
395
        cname = 'container1'
396
        self.b.put_container('test', self.account, cname)
397
        name = 'kate_beckinsale.jpg'
398
        self.assertRaises(NameError, self.b.update_object_meta, 'test', self.account, cname, name, {})
399

    
400
if __name__ == "__main__":
401
    unittest.main()