Statistics
| Branch: | Tag: | Revision:

root / pithos / backends / tests.py @ 58a6c894

History | View | Annotate | Download (17.3 kB)

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