Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / swiss_army / tests.py @ 99c11993

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 94bff756 Sofia Papagiannaki
    def _verify_object(self, account, container, object, expected={},
63 94bff756 Sofia Papagiannaki
                       strict=True):
64 94bff756 Sofia Papagiannaki
        self._verify_object_metadata(account, container, object,
65 94bff756 Sofia Papagiannaki
                                     expected.get('meta'))
66 94bff756 Sofia Papagiannaki
        self._verify_object_history(account, container, object,
67 94bff756 Sofia Papagiannaki
                                    expected.get('versions'),
68 94bff756 Sofia Papagiannaki
                                    strict=strict)
69 94bff756 Sofia Papagiannaki
        self._verify_object_permissions(account, container, object,
70 94bff756 Sofia Papagiannaki
                                        expected.get('permissions'))
71 94bff756 Sofia Papagiannaki
72 94bff756 Sofia Papagiannaki
    def _verify_object_metadata(self, account, container, object, expected):
73 94bff756 Sofia Papagiannaki
        object_meta = self.utils.backend.get_object_meta(
74 94bff756 Sofia Papagiannaki
            account, account, container, object, 'pithos')
75 94bff756 Sofia Papagiannaki
        for k in expected:
76 94bff756 Sofia Papagiannaki
            self.assertTrue(k in object_meta)
77 94bff756 Sofia Papagiannaki
            self.assertEquals(object_meta[k], expected[k])
78 94bff756 Sofia Papagiannaki
79 94bff756 Sofia Papagiannaki
    def _verify_object_history(self, account, container, object, expected,
80 94bff756 Sofia Papagiannaki
                               strict=True):
81 94bff756 Sofia Papagiannaki
        history = self.utils.list_past_versions(account, container, object)
82 94bff756 Sofia Papagiannaki
        if strict:
83 94bff756 Sofia Papagiannaki
            self.assertEquals(sorted(expected), history)
84 94bff756 Sofia Papagiannaki
        else:
85 94bff756 Sofia Papagiannaki
            self.assertTrue(set(expected) <= set(history))
86 94bff756 Sofia Papagiannaki
87 94bff756 Sofia Papagiannaki
    def _verify_object_permissions(self, account, container, object, expected):
88 94bff756 Sofia Papagiannaki
        expected = expected or {}
89 94bff756 Sofia Papagiannaki
        perms_tuple = self.utils.backend.get_object_permissions(
90 94bff756 Sofia Papagiannaki
            account, account, container, object)
91 94bff756 Sofia Papagiannaki
92 94bff756 Sofia Papagiannaki
        self.assertEqual(len(perms_tuple), 3)
93 94bff756 Sofia Papagiannaki
94 94bff756 Sofia Papagiannaki
        object_perms = perms_tuple[2]
95 94bff756 Sofia Papagiannaki
96 94bff756 Sofia Papagiannaki
        for k in expected:
97 94bff756 Sofia Papagiannaki
            self.assertTrue(set(expected.get(k)) <= set(object_perms.get(k)))
98 94bff756 Sofia Papagiannaki
99 94bff756 Sofia Papagiannaki
        for holder in expected.get('read', []):
100 94bff756 Sofia Papagiannaki
            if holder == '*':
101 94bff756 Sofia Papagiannaki
                continue
102 94bff756 Sofia Papagiannaki
            try:
103 94bff756 Sofia Papagiannaki
                # check first for a group permission
104 94bff756 Sofia Papagiannaki
                owner, group = holder.split(':')
105 94bff756 Sofia Papagiannaki
            except ValueError:
106 94bff756 Sofia Papagiannaki
                holders = [holder]
107 94bff756 Sofia Papagiannaki
            else:
108 94bff756 Sofia Papagiannaki
                holders = self.utils.backend.permissions.group_members(owner,
109 94bff756 Sofia Papagiannaki
                                                                       group)
110 94bff756 Sofia Papagiannaki
111 94bff756 Sofia Papagiannaki
            for h in holders:
112 94bff756 Sofia Papagiannaki
                try:
113 94bff756 Sofia Papagiannaki
                    self.utils.backend.get_object_meta(
114 94bff756 Sofia Papagiannaki
                        holder, account, container, object, 'pithos')
115 94bff756 Sofia Papagiannaki
                except Exception, e:
116 94bff756 Sofia Papagiannaki
                    self.fail(e)
117 94bff756 Sofia Papagiannaki
118 94bff756 Sofia Papagiannaki
    def test_existing_accounts(self):
119 94bff756 Sofia Papagiannaki
        accounts = self.utils.existing_accounts()
120 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(accounts), accounts)
121 94bff756 Sofia Papagiannaki
        self.assertTrue(set(['account1', 'account2']) <= set(accounts))
122 94bff756 Sofia Papagiannaki
123 94bff756 Sofia Papagiannaki
    def test_duplicate_accounts(self):
124 94bff756 Sofia Papagiannaki
        duplicates = self.utils.duplicate_accounts()
125 94bff756 Sofia Papagiannaki
        self.assertTrue(['Account1', 'account1'] in duplicates)
126 94bff756 Sofia Papagiannaki
127 94bff756 Sofia Papagiannaki
    def test_list_all_containers(self):
128 94bff756 Sofia Papagiannaki
        step = 10
129 94bff756 Sofia Papagiannaki
        containers = []
130 94bff756 Sofia Papagiannaki
        append = containers.append
131 94bff756 Sofia Papagiannaki
        for i in range(3 * step + 1):
132 94bff756 Sofia Papagiannaki
            while 1:
133 94bff756 Sofia Papagiannaki
                cname = unicode(uuid.uuid4())
134 94bff756 Sofia Papagiannaki
                if cname not in containers:
135 94bff756 Sofia Papagiannaki
                    append(cname)
136 94bff756 Sofia Papagiannaki
                    break
137 94bff756 Sofia Papagiannaki
            self.utils.backend.put_container('account1', 'account1', cname)
138 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(containers),
139 94bff756 Sofia Papagiannaki
                          self.utils.list_all_containers('account1',
140 94bff756 Sofia Papagiannaki
                                                         step=step))
141 94bff756 Sofia Papagiannaki
142 94bff756 Sofia Papagiannaki
    def test_list_all_container_objects(self):
143 94bff756 Sofia Papagiannaki
        containers = ('container1', 'container2')
144 94bff756 Sofia Papagiannaki
        objects = defaultdict(list)
145 94bff756 Sofia Papagiannaki
        for c in containers:
146 94bff756 Sofia Papagiannaki
            self.utils.backend.put_container('account1', 'account1', c)
147 94bff756 Sofia Papagiannaki
            step = 10
148 94bff756 Sofia Papagiannaki
            append = objects[c].append
149 94bff756 Sofia Papagiannaki
            content_type = 'application/octet-stream'
150 94bff756 Sofia Papagiannaki
            for i in range(3 * step + 1):
151 94bff756 Sofia Papagiannaki
                while 1:
152 94bff756 Sofia Papagiannaki
                    oname = unicode(uuid.uuid4())
153 94bff756 Sofia Papagiannaki
                    if oname not in objects:
154 94bff756 Sofia Papagiannaki
                        append(oname)
155 94bff756 Sofia Papagiannaki
                        break
156 94bff756 Sofia Papagiannaki
                data = get_random_data(int(random.random()))
157 94bff756 Sofia Papagiannaki
                self.utils.create_update_object('account1', c, oname,
158 94bff756 Sofia Papagiannaki
                                                content_type, data)
159 94bff756 Sofia Papagiannaki
160 94bff756 Sofia Papagiannaki
        (self.assertEquals(sorted(objects.get(c)),
161 94bff756 Sofia Papagiannaki
                           self.utils.list_all_container_objects('account1', c)
162 94bff756 Sofia Papagiannaki
                           ) for c in containers)
163 94bff756 Sofia Papagiannaki
164 94bff756 Sofia Papagiannaki
    def test_list_all_objects(self):
165 94bff756 Sofia Papagiannaki
        containers = ('container1', 'container2')
166 94bff756 Sofia Papagiannaki
        objects = []
167 94bff756 Sofia Papagiannaki
        append = objects.append
168 94bff756 Sofia Papagiannaki
        for c in containers:
169 94bff756 Sofia Papagiannaki
            self.utils.backend.put_container('account1', 'account1', c)
170 94bff756 Sofia Papagiannaki
            step = 10
171 94bff756 Sofia Papagiannaki
            content_type = 'application/octet-stream'
172 94bff756 Sofia Papagiannaki
            for i in range(3 * step + 1):
173 94bff756 Sofia Papagiannaki
                while 1:
174 94bff756 Sofia Papagiannaki
                    oname = unicode(uuid.uuid4())
175 94bff756 Sofia Papagiannaki
                    if oname not in objects:
176 94bff756 Sofia Papagiannaki
                        append(os.path.join(c, oname))
177 94bff756 Sofia Papagiannaki
                        break
178 94bff756 Sofia Papagiannaki
                data = get_random_data(int(random.random()))
179 94bff756 Sofia Papagiannaki
                self.utils.create_update_object('account1', c, oname,
180 94bff756 Sofia Papagiannaki
                                                content_type, data)
181 94bff756 Sofia Papagiannaki
182 94bff756 Sofia Papagiannaki
        self.assertEquals(len(objects),
183 94bff756 Sofia Papagiannaki
                          len(self.utils.list_all_objects('account1')))
184 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(objects),
185 94bff756 Sofia Papagiannaki
                          self.utils.list_all_objects('account1'))
186 94bff756 Sofia Papagiannaki
187 94bff756 Sofia Papagiannaki
    def test_list_past_versions(self):
188 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
189 94bff756 Sofia Papagiannaki
        versions = []
190 94bff756 Sofia Papagiannaki
        append = versions.append
191 94bff756 Sofia Papagiannaki
        for i in range(5):
192 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
193 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object('account1', 'container1',
194 94bff756 Sofia Papagiannaki
                                                   'object1',
195 94bff756 Sofia Papagiannaki
                                                   'application/octet-stream',
196 94bff756 Sofia Papagiannaki
                                                   data))
197 94bff756 Sofia Papagiannaki
        self.assertEquals(sorted(versions[:-1]),
198 94bff756 Sofia Papagiannaki
                          self.utils.list_past_versions('account1',
199 94bff756 Sofia Papagiannaki
                                                        'container1',
200 94bff756 Sofia Papagiannaki
                                                        'object1'))
201 94bff756 Sofia Papagiannaki
202 94bff756 Sofia Papagiannaki
    def test_move(self):
203 94bff756 Sofia Papagiannaki
        # create containers
204 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
205 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
206 94bff756 Sofia Papagiannaki
207 94bff756 Sofia Papagiannaki
        # add group
208 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
209 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
210 94bff756 Sofia Papagiannaki
211 94bff756 Sofia Papagiannaki
        # upload object and update it several times
212 94bff756 Sofia Papagiannaki
        versions = []
213 94bff756 Sofia Papagiannaki
        append = versions.append
214 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
215 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account1', 'account2', 'Account1:test'],
216 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
217 94bff756 Sofia Papagiannaki
        for i in range(5):
218 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
219 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object('Account1', 'container1',
220 94bff756 Sofia Papagiannaki
                                                   'object1',
221 94bff756 Sofia Papagiannaki
                                                   'application/octet-stream',
222 94bff756 Sofia Papagiannaki
                                                   data, meta, permissions))
223 94bff756 Sofia Papagiannaki
224 94bff756 Sofia Papagiannaki
        self.utils.move_object('Account1', 'container1', 'object1', 'account1',
225 94bff756 Sofia Papagiannaki
                               dry=False, silent=True)
226 94bff756 Sofia Papagiannaki
227 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
228 94bff756 Sofia Papagiannaki
                    'versions': versions[:-1],
229 94bff756 Sofia Papagiannaki
                    'permissions': permissions}
230 94bff756 Sofia Papagiannaki
        self._verify_object('account1', 'container1', 'object1', expected)
231 94bff756 Sofia Papagiannaki
232 94bff756 Sofia Papagiannaki
    def test_merge(self):
233 94bff756 Sofia Papagiannaki
        # create container
234 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container0')
235 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
236 94bff756 Sofia Papagiannaki
237 94bff756 Sofia Papagiannaki
        # add group
238 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
239 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
240 94bff756 Sofia Papagiannaki
241 94bff756 Sofia Papagiannaki
        # upload objects and update them several times
242 94bff756 Sofia Papagiannaki
        versions = defaultdict(list)
243 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
244 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account2', 'Account1:test'],
245 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
246 94bff756 Sofia Papagiannaki
247 94bff756 Sofia Papagiannaki
        for i in range(2):
248 94bff756 Sofia Papagiannaki
            container = 'container%s' % i
249 94bff756 Sofia Papagiannaki
            versions[container] = {}
250 94bff756 Sofia Papagiannaki
            for j in range(3):
251 94bff756 Sofia Papagiannaki
                object = 'object%s' % j
252 94bff756 Sofia Papagiannaki
                versions[container][object] = []
253 94bff756 Sofia Papagiannaki
                append = versions[container][object].append
254 94bff756 Sofia Papagiannaki
                for k in range(5):
255 94bff756 Sofia Papagiannaki
                    data = get_random_data(int(random.random()))
256 94bff756 Sofia Papagiannaki
                    append(self.utils.create_update_object(
257 94bff756 Sofia Papagiannaki
                        'Account1', container, object,
258 94bff756 Sofia Papagiannaki
                        'application/octet-stream', data, meta, permissions))
259 94bff756 Sofia Papagiannaki
260 94bff756 Sofia Papagiannaki
        self.utils.merge_account('Account1', 'account1', only_stats=False,
261 94bff756 Sofia Papagiannaki
                                 dry=False, silent=True)
262 94bff756 Sofia Papagiannaki
263 99c11993 Sofia Papagiannaki
        self.assertTrue('Account1' in self.utils.existing_accounts())
264 94bff756 Sofia Papagiannaki
        self.assertTrue('account1' in self.utils.existing_accounts())
265 94bff756 Sofia Papagiannaki
266 94bff756 Sofia Papagiannaki
        # assert container has been created
267 94bff756 Sofia Papagiannaki
        try:
268 94bff756 Sofia Papagiannaki
            self.utils.backend.get_container_meta('account1', 'account1',
269 94bff756 Sofia Papagiannaki
                                                  'container1', 'pithos')
270 94bff756 Sofia Papagiannaki
        except NameError, e:
271 94bff756 Sofia Papagiannaki
            self.fail(e)
272 94bff756 Sofia Papagiannaki
273 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
274 94bff756 Sofia Papagiannaki
                    'permissions': permissions}
275 94bff756 Sofia Papagiannaki
        for c, o_dict in versions.iteritems():
276 94bff756 Sofia Papagiannaki
            for o, versions in o_dict.iteritems():
277 94bff756 Sofia Papagiannaki
                expected['versions'] = versions[:-1]
278 94bff756 Sofia Papagiannaki
                self._verify_object('account1', c, o, expected)
279 94bff756 Sofia Papagiannaki
280 94bff756 Sofia Papagiannaki
    def test_merge_existing_dest_container(self):
281 94bff756 Sofia Papagiannaki
        # create container
282 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
283 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
284 94bff756 Sofia Papagiannaki
285 94bff756 Sofia Papagiannaki
        # add group
286 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
287 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
288 94bff756 Sofia Papagiannaki
289 94bff756 Sofia Papagiannaki
        # upload objects and update them several times
290 94bff756 Sofia Papagiannaki
        versions = defaultdict(list)
291 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
292 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account2', 'Account1:test'],
293 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
294 94bff756 Sofia Papagiannaki
295 94bff756 Sofia Papagiannaki
        versions = []
296 94bff756 Sofia Papagiannaki
        append = versions.append
297 94bff756 Sofia Papagiannaki
        for k in range(5):
298 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
299 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object(
300 94bff756 Sofia Papagiannaki
                'Account1', 'container1', 'object1',
301 94bff756 Sofia Papagiannaki
                'application/octet-stream', data, meta, permissions))
302 94bff756 Sofia Papagiannaki
303 94bff756 Sofia Papagiannaki
        self.utils.merge_account('Account1', 'account1', only_stats=False,
304 94bff756 Sofia Papagiannaki
                                 dry=False, silent=True)
305 94bff756 Sofia Papagiannaki
306 99c11993 Sofia Papagiannaki
        self.assertTrue('Account1' in self.utils.existing_accounts())
307 99c11993 Sofia Papagiannaki
        self.assertTrue('account1' in self.utils.existing_accounts())
308 94bff756 Sofia Papagiannaki
309 94bff756 Sofia Papagiannaki
        try:
310 94bff756 Sofia Papagiannaki
            self.utils.backend.get_container_meta('account1', 'account1',
311 94bff756 Sofia Papagiannaki
                                                  'container1', 'pithos')
312 94bff756 Sofia Papagiannaki
        except NameError, e:
313 94bff756 Sofia Papagiannaki
            self.fail(e)
314 94bff756 Sofia Papagiannaki
315 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
316 94bff756 Sofia Papagiannaki
                    'versions': versions[:-1],
317 94bff756 Sofia Papagiannaki
                    'permissions': permissions}
318 94bff756 Sofia Papagiannaki
        self._verify_object('account1', 'container1', 'object1', expected)
319 94bff756 Sofia Papagiannaki
320 94bff756 Sofia Papagiannaki
    def test_merge_existing_dest_object(self):
321 94bff756 Sofia Papagiannaki
        # create container
322 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('Account1', 'Account1', 'container1')
323 94bff756 Sofia Papagiannaki
        self.utils.backend.put_container('account1', 'account1', 'container1')
324 94bff756 Sofia Papagiannaki
325 94bff756 Sofia Papagiannaki
        # add group
326 94bff756 Sofia Papagiannaki
        self.utils.backend.update_account_groups('Account1', 'Account1',
327 94bff756 Sofia Papagiannaki
                                                 {'test': ['account3']})
328 94bff756 Sofia Papagiannaki
329 94bff756 Sofia Papagiannaki
        # upload objects and update them several times
330 94bff756 Sofia Papagiannaki
        versions = defaultdict(list)
331 94bff756 Sofia Papagiannaki
        meta = {'foo': 'bar'}
332 94bff756 Sofia Papagiannaki
        permissions = {'read': ['account2', 'Account1:test'],
333 94bff756 Sofia Papagiannaki
                       'write': ['account2', 'Account1:test']}
334 94bff756 Sofia Papagiannaki
335 94bff756 Sofia Papagiannaki
        container = 'container1'
336 94bff756 Sofia Papagiannaki
        object = 'object1'
337 94bff756 Sofia Papagiannaki
        versions = []
338 94bff756 Sofia Papagiannaki
        append = versions.append
339 94bff756 Sofia Papagiannaki
        for k in range(5):
340 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
341 94bff756 Sofia Papagiannaki
            append(self.utils.create_update_object(
342 94bff756 Sofia Papagiannaki
                   'Account1', container, object,
343 94bff756 Sofia Papagiannaki
                   'application/octet-stream', data, meta, permissions))
344 94bff756 Sofia Papagiannaki
            data = get_random_data(int(random.random()))
345 94bff756 Sofia Papagiannaki
            self.utils.create_update_object(
346 94bff756 Sofia Papagiannaki
                   'account1', container, object,
347 94bff756 Sofia Papagiannaki
                   'application/octet-stream', data, meta, permissions)
348 94bff756 Sofia Papagiannaki
349 94bff756 Sofia Papagiannaki
        self.utils.merge_account('Account1', 'account1', only_stats=False,
350 94bff756 Sofia Papagiannaki
                                 dry=False, silent=True)
351 94bff756 Sofia Papagiannaki
352 99c11993 Sofia Papagiannaki
        self.assertTrue('Account1' in self.utils.existing_accounts())
353 99c11993 Sofia Papagiannaki
        self.assertTrue('account1' in self.utils.existing_accounts())
354 94bff756 Sofia Papagiannaki
355 94bff756 Sofia Papagiannaki
        try:
356 94bff756 Sofia Papagiannaki
            self.utils.backend.get_container_meta('account1', 'account1',
357 94bff756 Sofia Papagiannaki
                                                  'container1', 'pithos')
358 94bff756 Sofia Papagiannaki
        except NameError, e:
359 94bff756 Sofia Papagiannaki
            self.fail(e)
360 94bff756 Sofia Papagiannaki
361 94bff756 Sofia Papagiannaki
        expected = {'meta': meta,
362 94bff756 Sofia Papagiannaki
                    'permissions': permissions,
363 94bff756 Sofia Papagiannaki
                    'versions': versions[:-1]}
364 94bff756 Sofia Papagiannaki
        self._verify_object('account1', container, object, expected,
365 94bff756 Sofia Papagiannaki
                            strict=False)
366 94bff756 Sofia Papagiannaki
367 94bff756 Sofia Papagiannaki
368 94bff756 Sofia Papagiannaki
if __name__ == '__main__':
369 94bff756 Sofia Papagiannaki
    unittest.main()