Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / swiss_army / tests.py @ 4a105ce2

History | View | Annotate | Download (15 kB)

1 94bff756 Sofia Papagiannaki
# Copyright 2011 GRNET S.A. All rights reserved.
2 94bff756 Sofia Papagiannaki
#
3 94bff756 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 94bff756 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 94bff756 Sofia Papagiannaki
# conditions are met:
6 94bff756 Sofia Papagiannaki
#
7 94bff756 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 94bff756 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 94bff756 Sofia Papagiannaki
#      disclaimer.
10 94bff756 Sofia Papagiannaki
#
11 94bff756 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 94bff756 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 94bff756 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 94bff756 Sofia Papagiannaki
#      provided with the distribution.
15 94bff756 Sofia Papagiannaki
#
16 94bff756 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 94bff756 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 94bff756 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 94bff756 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 94bff756 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 94bff756 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 94bff756 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 94bff756 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 94bff756 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 94bff756 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 94bff756 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 94bff756 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 94bff756 Sofia Papagiannaki
#
29 94bff756 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 94bff756 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 94bff756 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 94bff756 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 94bff756 Sofia Papagiannaki
34 94bff756 Sofia Papagiannaki
import unittest
35 94bff756 Sofia Papagiannaki
import uuid
36 94bff756 Sofia Papagiannaki
import random
37 94bff756 Sofia Papagiannaki
import string
38 94bff756 Sofia Papagiannaki
import os
39 94bff756 Sofia Papagiannaki
40 94bff756 Sofia Papagiannaki
from collections import defaultdict
41 94bff756 Sofia Papagiannaki
42 94bff756 Sofia Papagiannaki
from pithos.api.swiss_army import SwissArmy
43 94bff756 Sofia Papagiannaki
44 94bff756 Sofia Papagiannaki
45 94bff756 Sofia Papagiannaki
def get_random_data(length=500):
46 94bff756 Sofia Papagiannaki
    char_set = string.ascii_uppercase + string.digits
47 94bff756 Sofia Papagiannaki
    return ''.join(random.choice(char_set) for x in xrange(length))
48 94bff756 Sofia Papagiannaki
49 94bff756 Sofia Papagiannaki
50 94bff756 Sofia Papagiannaki
class SwissArmyTests(unittest.TestCase):
51 94bff756 Sofia Papagiannaki
    def setUp(self):
52 94bff756 Sofia Papagiannaki
        self.utils = SwissArmy()
53 94bff756 Sofia Papagiannaki
        self.accounts = ('account1', 'Account1', 'account2', 'account3')
54 94bff756 Sofia Papagiannaki
        for i in self.accounts:
55 94bff756 Sofia Papagiannaki
            self.utils.create_account(i)
56 94bff756 Sofia Papagiannaki
57 94bff756 Sofia Papagiannaki
    def tearDown(self):
58 94bff756 Sofia Papagiannaki
        for i in self.accounts:
59 94bff756 Sofia Papagiannaki
            self.utils._delete_account(i)
60 94bff756 Sofia Papagiannaki
        self.utils.cleanup()
61 94bff756 Sofia Papagiannaki
62 78348987 Sofia Papagiannaki
    def _verify_object(self, account, container, object, expected=None,
63 94bff756 Sofia Papagiannaki
                       strict=True):
64 78348987 Sofia Papagiannaki
        expected = expected or {}
65 94bff756 Sofia Papagiannaki
        self._verify_object_metadata(account, container, object,
66 94bff756 Sofia Papagiannaki
                                     expected.get('meta'))
67 94bff756 Sofia Papagiannaki
        self._verify_object_history(account, container, object,
68 94bff756 Sofia Papagiannaki
                                    expected.get('versions'),
69 94bff756 Sofia Papagiannaki
                                    strict=strict)
70 94bff756 Sofia Papagiannaki
        self._verify_object_permissions(account, container, object,
71 94bff756 Sofia Papagiannaki
                                        expected.get('permissions'))
72 94bff756 Sofia Papagiannaki
73 94bff756 Sofia Papagiannaki
    def _verify_object_metadata(self, account, container, object, expected):
74 94bff756 Sofia Papagiannaki
        object_meta = self.utils.backend.get_object_meta(
75 94bff756 Sofia Papagiannaki
            account, account, container, object, 'pithos')
76 94bff756 Sofia Papagiannaki
        for k in expected:
77 94bff756 Sofia Papagiannaki
            self.assertTrue(k in object_meta)
78 94bff756 Sofia Papagiannaki
            self.assertEquals(object_meta[k], expected[k])
79 94bff756 Sofia Papagiannaki
80 94bff756 Sofia Papagiannaki
    def _verify_object_history(self, account, container, object, expected,
81 94bff756 Sofia Papagiannaki
                               strict=True):
82 94bff756 Sofia Papagiannaki
        history = self.utils.list_past_versions(account, container, object)
83 94bff756 Sofia Papagiannaki
        if strict:
84 94bff756 Sofia Papagiannaki
            self.assertEquals(sorted(expected), history)
85 94bff756 Sofia Papagiannaki
        else:
86 94bff756 Sofia Papagiannaki
            self.assertTrue(set(expected) <= set(history))
87 94bff756 Sofia Papagiannaki
88 94bff756 Sofia Papagiannaki
    def _verify_object_permissions(self, account, container, object, expected):
89 94bff756 Sofia Papagiannaki
        expected = expected or {}
90 94bff756 Sofia Papagiannaki
        perms_tuple = self.utils.backend.get_object_permissions(
91 94bff756 Sofia Papagiannaki
            account, account, container, object)
92 94bff756 Sofia Papagiannaki
93 94bff756 Sofia Papagiannaki
        self.assertEqual(len(perms_tuple), 3)
94 94bff756 Sofia Papagiannaki
95 94bff756 Sofia Papagiannaki
        object_perms = perms_tuple[2]
96 94bff756 Sofia Papagiannaki
97 94bff756 Sofia Papagiannaki
        for k in expected:
98 94bff756 Sofia Papagiannaki
            self.assertTrue(set(expected.get(k)) <= set(object_perms.get(k)))
99 94bff756 Sofia Papagiannaki
100 94bff756 Sofia Papagiannaki
        for holder in expected.get('read', []):
101 94bff756 Sofia Papagiannaki
            if holder == '*':
102 94bff756 Sofia Papagiannaki
                continue
103 94bff756 Sofia Papagiannaki
            try:
104 94bff756 Sofia Papagiannaki
                # check first for a group permission
105 4a9e3f32 Sofia Papagiannaki
                owner, group = holder.split(':', 1)
106 94bff756 Sofia Papagiannaki
            except ValueError:
107 94bff756 Sofia Papagiannaki
                holders = [holder]
108 94bff756 Sofia Papagiannaki
            else:
109 94bff756 Sofia Papagiannaki
                holders = self.utils.backend.permissions.group_members(owner,
110 94bff756 Sofia Papagiannaki
                                                                       group)
111 94bff756 Sofia Papagiannaki
112 94bff756 Sofia Papagiannaki
            for h in holders:
113 94bff756 Sofia Papagiannaki
                try:
114 94bff756 Sofia Papagiannaki
                    self.utils.backend.get_object_meta(
115 94bff756 Sofia Papagiannaki
                        holder, account, container, object, 'pithos')
116 94bff756 Sofia Papagiannaki
                except Exception, e:
117 94bff756 Sofia Papagiannaki
                    self.fail(e)
118 94bff756 Sofia Papagiannaki
119 94bff756 Sofia Papagiannaki
    def test_existing_accounts(self):
120 94bff756 Sofia Papagiannaki
        accounts = self.utils.existing_accounts()
121 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(accounts), accounts)
122 94bff756 Sofia Papagiannaki
        self.assertTrue(set(['account1', 'account2']) <= set(accounts))
123 94bff756 Sofia Papagiannaki
124 94bff756 Sofia Papagiannaki
    def test_duplicate_accounts(self):
125 94bff756 Sofia Papagiannaki
        duplicates = self.utils.duplicate_accounts()
126 94bff756 Sofia Papagiannaki
        self.assertTrue(['Account1', 'account1'] in duplicates)
127 94bff756 Sofia Papagiannaki
128 94bff756 Sofia Papagiannaki
    def test_list_all_containers(self):
129 94bff756 Sofia Papagiannaki
        step = 10
130 94bff756 Sofia Papagiannaki
        containers = []
131 94bff756 Sofia Papagiannaki
        append = containers.append
132 94bff756 Sofia Papagiannaki
        for i in range(3 * step + 1):
133 94bff756 Sofia Papagiannaki
            while 1:
134 94bff756 Sofia Papagiannaki
                cname = unicode(uuid.uuid4())
135 94bff756 Sofia Papagiannaki
                if cname not in containers:
136 94bff756 Sofia Papagiannaki
                    append(cname)
137 94bff756 Sofia Papagiannaki
                    break
138 94bff756 Sofia Papagiannaki
            self.utils.backend.put_container('account1', 'account1', cname)
139 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(containers),
140 94bff756 Sofia Papagiannaki
                          self.utils.list_all_containers('account1',
141 94bff756 Sofia Papagiannaki
                                                         step=step))
142 94bff756 Sofia Papagiannaki
143 94bff756 Sofia Papagiannaki
    def test_list_all_container_objects(self):
144 94bff756 Sofia Papagiannaki
        containers = ('container1', 'container2')
145 94bff756 Sofia Papagiannaki
        objects = defaultdict(list)
146 94bff756 Sofia Papagiannaki
        for c in containers:
147 94bff756 Sofia Papagiannaki
            self.utils.backend.put_container('account1', 'account1', c)
148 94bff756 Sofia Papagiannaki
            step = 10
149 94bff756 Sofia Papagiannaki
            append = objects[c].append
150 94bff756 Sofia Papagiannaki
            content_type = 'application/octet-stream'
151 94bff756 Sofia Papagiannaki
            for i in range(3 * step + 1):
152 94bff756 Sofia Papagiannaki
                while 1:
153 94bff756 Sofia Papagiannaki
                    oname = unicode(uuid.uuid4())
154 94bff756 Sofia Papagiannaki
                    if oname not in objects:
155 94bff756 Sofia Papagiannaki
                        append(oname)
156 94bff756 Sofia Papagiannaki
                        break
157 94bff756 Sofia Papagiannaki
                data = get_random_data(int(random.random()))
158 94bff756 Sofia Papagiannaki
                self.utils.create_update_object('account1', c, oname,
159 94bff756 Sofia Papagiannaki
                                                content_type, data)
160 94bff756 Sofia Papagiannaki
161 94bff756 Sofia Papagiannaki
        (self.assertEquals(sorted(objects.get(c)),
162 94bff756 Sofia Papagiannaki
                           self.utils.list_all_container_objects('account1', c)
163 94bff756 Sofia Papagiannaki
                           ) for c in containers)
164 94bff756 Sofia Papagiannaki
165 94bff756 Sofia Papagiannaki
    def test_list_all_objects(self):
166 94bff756 Sofia Papagiannaki
        containers = ('container1', 'container2')
167 94bff756 Sofia Papagiannaki
        objects = []
168 94bff756 Sofia Papagiannaki
        append = objects.append
169 94bff756 Sofia Papagiannaki
        for c in containers:
170 94bff756 Sofia Papagiannaki
            self.utils.backend.put_container('account1', 'account1', c)
171 94bff756 Sofia Papagiannaki
            step = 10
172 94bff756 Sofia Papagiannaki
            content_type = 'application/octet-stream'
173 94bff756 Sofia Papagiannaki
            for i in range(3 * step + 1):
174 94bff756 Sofia Papagiannaki
                while 1:
175 94bff756 Sofia Papagiannaki
                    oname = unicode(uuid.uuid4())
176 94bff756 Sofia Papagiannaki
                    if oname not in objects:
177 94bff756 Sofia Papagiannaki
                        append(os.path.join(c, oname))
178 94bff756 Sofia Papagiannaki
                        break
179 94bff756 Sofia Papagiannaki
                data = get_random_data(int(random.random()))
180 94bff756 Sofia Papagiannaki
                self.utils.create_update_object('account1', c, oname,
181 94bff756 Sofia Papagiannaki
                                                content_type, data)
182 94bff756 Sofia Papagiannaki
183 94bff756 Sofia Papagiannaki
        self.assertEquals(len(objects),
184 94bff756 Sofia Papagiannaki
                          len(self.utils.list_all_objects('account1')))
185 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(objects),
186 94bff756 Sofia Papagiannaki
                          self.utils.list_all_objects('account1'))
187 94bff756 Sofia Papagiannaki
188 94bff756 Sofia Papagiannaki
    def test_list_past_versions(self):
189 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
190 94bff756 Sofia Papagiannaki
        versions = []
191 94bff756 Sofia Papagiannaki
        append = versions.append
192 94bff756 Sofia Papagiannaki
        for i in range(5):
193 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
194 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object('account1', 'container1',
195 94bff756 Sofia Papagiannaki
                                                   'object1',
196 94bff756 Sofia Papagiannaki
                                                   'application/octet-stream',
197 94bff756 Sofia Papagiannaki
                                                   data))
198 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(versions[:-1]),
199 94bff756 Sofia Papagiannaki
                          self.utils.list_past_versions('account1',
200 94bff756 Sofia Papagiannaki
                                                        'container1',
201 94bff756 Sofia Papagiannaki
                                                        'object1'))
202 94bff756 Sofia Papagiannaki
203 94bff756 Sofia Papagiannaki
    def test_move(self):
204 94bff756 Sofia Papagiannaki
        # create containers
205 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
206 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
207 94bff756 Sofia Papagiannaki
208 94bff756 Sofia Papagiannaki
        # add group
209 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
210 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
211 94bff756 Sofia Papagiannaki
212 94bff756 Sofia Papagiannaki
        # upload object and update it several times
213 94bff756 Sofia Papagiannaki
        versions = []
214 94bff756 Sofia Papagiannaki
        append = versions.append
215 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
216 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account1', 'account2', 'Account1:test'],
217 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
218 94bff756 Sofia Papagiannaki
        for i in range(5):
219 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
220 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object('Account1', 'container1',
221 94bff756 Sofia Papagiannaki
                                                   'object1',
222 94bff756 Sofia Papagiannaki
                                                   'application/octet-stream',
223 94bff756 Sofia Papagiannaki
                                                   data, meta, permissions))
224 94bff756 Sofia Papagiannaki
225 94bff756 Sofia Papagiannaki
        self.utils.move_object('Account1', 'container1', 'object1', 'account1',
226 94bff756 Sofia Papagiannaki
                               dry=False, silent=True)
227 94bff756 Sofia Papagiannaki
228 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
229 94bff756 Sofia Papagiannaki
                    'versions': versions[:-1],
230 94bff756 Sofia Papagiannaki
                    'permissions': permissions}
231 94bff756 Sofia Papagiannaki
        self._verify_object('account1', 'container1', 'object1', expected)
232 94bff756 Sofia Papagiannaki
233 94bff756 Sofia Papagiannaki
    def test_merge(self):
234 94bff756 Sofia Papagiannaki
        # create container
235 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container0')
236 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
237 94bff756 Sofia Papagiannaki
238 94bff756 Sofia Papagiannaki
        # add group
239 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
240 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
241 94bff756 Sofia Papagiannaki
242 94bff756 Sofia Papagiannaki
        # upload objects and update them several times
243 94bff756 Sofia Papagiannaki
        versions = defaultdict(list)
244 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
245 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account2', 'Account1:test'],
246 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
247 94bff756 Sofia Papagiannaki
248 94bff756 Sofia Papagiannaki
        for i in range(2):
249 94bff756 Sofia Papagiannaki
            container = 'container%s' % i
250 94bff756 Sofia Papagiannaki
            versions[container] = {}
251 94bff756 Sofia Papagiannaki
            for j in range(3):
252 94bff756 Sofia Papagiannaki
                object = 'object%s' % j
253 94bff756 Sofia Papagiannaki
                versions[container][object] = []
254 94bff756 Sofia Papagiannaki
                append = versions[container][object].append
255 94bff756 Sofia Papagiannaki
                for k in range(5):
256 94bff756 Sofia Papagiannaki
                    data = get_random_data(int(random.random()))
257 94bff756 Sofia Papagiannaki
                    append(self.utils.create_update_object(
258 94bff756 Sofia Papagiannaki
                        'Account1', container, object,
259 94bff756 Sofia Papagiannaki
                        'application/octet-stream', data, meta, permissions))
260 94bff756 Sofia Papagiannaki
261 94bff756 Sofia Papagiannaki
        self.utils.merge_account('Account1', 'account1', only_stats=False,
262 94bff756 Sofia Papagiannaki
                                 dry=False, silent=True)
263 94bff756 Sofia Papagiannaki
264 99c11993 Sofia Papagiannaki
        self.assertTrue('Account1' in self.utils.existing_accounts())
265 94bff756 Sofia Papagiannaki
        self.assertTrue('account1' in self.utils.existing_accounts())
266 94bff756 Sofia Papagiannaki
267 94bff756 Sofia Papagiannaki
        # assert container has been created
268 94bff756 Sofia Papagiannaki
        try:
269 94bff756 Sofia Papagiannaki
            self.utils.backend.get_container_meta('account1', 'account1',
270 94bff756 Sofia Papagiannaki
                                                  'container1', 'pithos')
271 94bff756 Sofia Papagiannaki
        except NameError, e:
272 94bff756 Sofia Papagiannaki
            self.fail(e)
273 94bff756 Sofia Papagiannaki
274 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
275 94bff756 Sofia Papagiannaki
                    'permissions': permissions}
276 94bff756 Sofia Papagiannaki
        for c, o_dict in versions.iteritems():
277 94bff756 Sofia Papagiannaki
            for o, versions in o_dict.iteritems():
278 94bff756 Sofia Papagiannaki
                expected['versions'] = versions[:-1]
279 94bff756 Sofia Papagiannaki
                self._verify_object('account1', c, o, expected)
280 94bff756 Sofia Papagiannaki
281 94bff756 Sofia Papagiannaki
    def test_merge_existing_dest_container(self):
282 94bff756 Sofia Papagiannaki
        # create container
283 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
284 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
285 94bff756 Sofia Papagiannaki
286 94bff756 Sofia Papagiannaki
        # add group
287 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
288 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
289 94bff756 Sofia Papagiannaki
290 94bff756 Sofia Papagiannaki
        # upload objects and update them several times
291 94bff756 Sofia Papagiannaki
        versions = defaultdict(list)
292 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
293 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account2', 'Account1:test'],
294 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
295 94bff756 Sofia Papagiannaki
296 94bff756 Sofia Papagiannaki
        versions = []
297 94bff756 Sofia Papagiannaki
        append = versions.append
298 94bff756 Sofia Papagiannaki
        for k in range(5):
299 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
300 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object(
301 94bff756 Sofia Papagiannaki
                'Account1', 'container1', 'object1',
302 94bff756 Sofia Papagiannaki
                'application/octet-stream', data, meta, permissions))
303 94bff756 Sofia Papagiannaki
304 94bff756 Sofia Papagiannaki
        self.utils.merge_account('Account1', 'account1', only_stats=False,
305 94bff756 Sofia Papagiannaki
                                 dry=False, silent=True)
306 94bff756 Sofia Papagiannaki
307 99c11993 Sofia Papagiannaki
        self.assertTrue('Account1' in self.utils.existing_accounts())
308 99c11993 Sofia Papagiannaki
        self.assertTrue('account1' in self.utils.existing_accounts())
309 94bff756 Sofia Papagiannaki
310 94bff756 Sofia Papagiannaki
        try:
311 94bff756 Sofia Papagiannaki
            self.utils.backend.get_container_meta('account1', 'account1',
312 94bff756 Sofia Papagiannaki
                                                  'container1', 'pithos')
313 94bff756 Sofia Papagiannaki
        except NameError, e:
314 94bff756 Sofia Papagiannaki
            self.fail(e)
315 94bff756 Sofia Papagiannaki
316 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
317 94bff756 Sofia Papagiannaki
                    'versions': versions[:-1],
318 94bff756 Sofia Papagiannaki
                    'permissions': permissions}
319 94bff756 Sofia Papagiannaki
        self._verify_object('account1', 'container1', 'object1', expected)
320 94bff756 Sofia Papagiannaki
321 94bff756 Sofia Papagiannaki
    def test_merge_existing_dest_object(self):
322 94bff756 Sofia Papagiannaki
        # create container
323 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
324 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
325 94bff756 Sofia Papagiannaki
326 94bff756 Sofia Papagiannaki
        # add group
327 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
328 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
329 94bff756 Sofia Papagiannaki
330 94bff756 Sofia Papagiannaki
        # upload objects and update them several times
331 94bff756 Sofia Papagiannaki
        versions = defaultdict(list)
332 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
333 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account2', 'Account1:test'],
334 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
335 94bff756 Sofia Papagiannaki
336 94bff756 Sofia Papagiannaki
        container = 'container1'
337 94bff756 Sofia Papagiannaki
        object = 'object1'
338 94bff756 Sofia Papagiannaki
        versions = []
339 94bff756 Sofia Papagiannaki
        append = versions.append
340 94bff756 Sofia Papagiannaki
        for k in range(5):
341 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
342 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object(
343 94bff756 Sofia Papagiannaki
                   'Account1', container, object,
344 94bff756 Sofia Papagiannaki
                   'application/octet-stream', data, meta, permissions))
345 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
346 94bff756 Sofia Papagiannaki
            self.utils.create_update_object(
347 94bff756 Sofia Papagiannaki
                   'account1', container, object,
348 94bff756 Sofia Papagiannaki
                   'application/octet-stream', data, meta, permissions)
349 94bff756 Sofia Papagiannaki
350 94bff756 Sofia Papagiannaki
        self.utils.merge_account('Account1', 'account1', only_stats=False,
351 94bff756 Sofia Papagiannaki
                                 dry=False, silent=True)
352 94bff756 Sofia Papagiannaki
353 99c11993 Sofia Papagiannaki
        self.assertTrue('Account1' in self.utils.existing_accounts())
354 99c11993 Sofia Papagiannaki
        self.assertTrue('account1' in self.utils.existing_accounts())
355 94bff756 Sofia Papagiannaki
356 94bff756 Sofia Papagiannaki
        try:
357 94bff756 Sofia Papagiannaki
            self.utils.backend.get_container_meta('account1', 'account1',
358 94bff756 Sofia Papagiannaki
                                                  'container1', 'pithos')
359 94bff756 Sofia Papagiannaki
        except NameError, e:
360 94bff756 Sofia Papagiannaki
            self.fail(e)
361 94bff756 Sofia Papagiannaki
362 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
363 94bff756 Sofia Papagiannaki
                    'permissions': permissions,
364 94bff756 Sofia Papagiannaki
                    'versions': versions[:-1]}
365 94bff756 Sofia Papagiannaki
        self._verify_object('account1', container, object, expected,
366 94bff756 Sofia Papagiannaki
                            strict=False)
367 94bff756 Sofia Papagiannaki
368 94bff756 Sofia Papagiannaki
369 94bff756 Sofia Papagiannaki
if __name__ == '__main__':
370 94bff756 Sofia Papagiannaki
    unittest.main()