Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests / pithos.py @ 7f87da8b

History | View | Annotate | Download (43.1 kB)

1 a3bca46c Stavros Sachtouris
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 a3bca46c Stavros Sachtouris
#
3 a3bca46c Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 a3bca46c Stavros Sachtouris
# without modification, are permitted provided that the following
5 a3bca46c Stavros Sachtouris
# conditions are met:
6 a3bca46c Stavros Sachtouris
#
7 a3bca46c Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 a3bca46c Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 a3bca46c Stavros Sachtouris
#      disclaimer.
10 a3bca46c Stavros Sachtouris
#
11 a3bca46c Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 a3bca46c Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 a3bca46c Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 a3bca46c Stavros Sachtouris
#      provided with the distribution.
15 a3bca46c Stavros Sachtouris
#
16 a3bca46c Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a3bca46c Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a3bca46c Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a3bca46c Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a3bca46c Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a3bca46c Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a3bca46c Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a3bca46c Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a3bca46c Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a3bca46c Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a3bca46c Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a3bca46c Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 a3bca46c Stavros Sachtouris
#
29 a3bca46c Stavros Sachtouris
# The views and conclusions contained in the software and
30 a3bca46c Stavros Sachtouris
# documentation are those of the authors and should not be
31 a3bca46c Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 a3bca46c Stavros Sachtouris
# or implied, of GRNET S.A.
33 a3bca46c Stavros Sachtouris
34 a3bca46c Stavros Sachtouris
import time
35 a3bca46c Stavros Sachtouris
import datetime
36 a3bca46c Stavros Sachtouris
import os
37 a3bca46c Stavros Sachtouris
import tempfile
38 a3bca46c Stavros Sachtouris
39 a3bca46c Stavros Sachtouris
from kamaki.clients import tests, ClientError
40 a3bca46c Stavros Sachtouris
from kamaki.clients.pithos import PithosClient
41 a3bca46c Stavros Sachtouris
42 a3bca46c Stavros Sachtouris
43 a3bca46c Stavros Sachtouris
class Pithos(tests.Generic):
44 a3bca46c Stavros Sachtouris
45 a3bca46c Stavros Sachtouris
    fnames = []
46 a3bca46c Stavros Sachtouris
47 a3bca46c Stavros Sachtouris
    def setUp(self):
48 a3bca46c Stavros Sachtouris
        self.client = PithosClient(
49 a3bca46c Stavros Sachtouris
            self['store', 'url'],
50 a3bca46c Stavros Sachtouris
            self['store', 'token'],
51 a3bca46c Stavros Sachtouris
            self['store', 'account'])
52 a3bca46c Stavros Sachtouris
53 a3bca46c Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
54 a3bca46c Stavros Sachtouris
        self.now_unformated = datetime.datetime.utcnow()
55 a3bca46c Stavros Sachtouris
        self._init_data()
56 a3bca46c Stavros Sachtouris
57 a3bca46c Stavros Sachtouris
        """Prepare an object to be shared - also its container"""
58 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
59 a3bca46c Stavros Sachtouris
        self.client.object_post('test',
60 a3bca46c Stavros Sachtouris
            update=True,
61 a3bca46c Stavros Sachtouris
            permissions={'read': 'someUser'})
62 a3bca46c Stavros Sachtouris
63 a3bca46c Stavros Sachtouris
        self.create_remote_object(self.c1, 'another.test')
64 a3bca46c Stavros Sachtouris
65 a3bca46c Stavros Sachtouris
    def _init_data(self):
66 a3bca46c Stavros Sachtouris
        self.c1 = 'c1_' + unicode(self.now)
67 a3bca46c Stavros Sachtouris
        self.c2 = 'c2_' + unicode(self.now)
68 a3bca46c Stavros Sachtouris
        self.c3 = 'c3_' + unicode(self.now)
69 7f87da8b Stavros Sachtouris
        try:
70 7f87da8b Stavros Sachtouris
            self.client.create_container(self.c2)
71 7f87da8b Stavros Sachtouris
        except ClientError:
72 7f87da8b Stavros Sachtouris
            pass
73 7f87da8b Stavros Sachtouris
        try:
74 7f87da8b Stavros Sachtouris
            self.client.create_container(self.c1)
75 7f87da8b Stavros Sachtouris
        except ClientError:
76 7f87da8b Stavros Sachtouris
            pass
77 7f87da8b Stavros Sachtouris
        try:
78 7f87da8b Stavros Sachtouris
            self.client.create_container(self.c3)
79 7f87da8b Stavros Sachtouris
        except ClientError:
80 7f87da8b Stavros Sachtouris
            pass
81 a3bca46c Stavros Sachtouris
82 a3bca46c Stavros Sachtouris
        self.create_remote_object(self.c1, 'test')
83 a3bca46c Stavros Sachtouris
        self.create_remote_object(self.c2, 'test')
84 a3bca46c Stavros Sachtouris
        self.create_remote_object(self.c1, 'test1')
85 a3bca46c Stavros Sachtouris
        self.create_remote_object(self.c2, 'test1')
86 a3bca46c Stavros Sachtouris
87 a3bca46c Stavros Sachtouris
    def create_remote_object(self, container, obj):
88 a3bca46c Stavros Sachtouris
        self.client.container = container
89 a3bca46c Stavros Sachtouris
        self.client.object_put(obj,
90 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream',
91 a3bca46c Stavros Sachtouris
            data='file %s that lives in %s' % (obj, container),
92 a3bca46c Stavros Sachtouris
            metadata={'incontainer': container})
93 a3bca46c Stavros Sachtouris
94 a3bca46c Stavros Sachtouris
    def forceDeleteContainer(self, container):
95 a3bca46c Stavros Sachtouris
        self.client.container = container
96 a3bca46c Stavros Sachtouris
        try:
97 a3bca46c Stavros Sachtouris
            r = self.client.list_objects()
98 a3bca46c Stavros Sachtouris
        except ClientError:
99 a3bca46c Stavros Sachtouris
            return
100 a3bca46c Stavros Sachtouris
        for obj in r:
101 a3bca46c Stavros Sachtouris
            name = obj['name']
102 a3bca46c Stavros Sachtouris
            self.client.del_object(name)
103 a3bca46c Stavros Sachtouris
        r = self.client.container_delete()
104 a3bca46c Stavros Sachtouris
        self.container = ''
105 a3bca46c Stavros Sachtouris
106 a3bca46c Stavros Sachtouris
    def tearDown(self):
107 a3bca46c Stavros Sachtouris
        """Destroy test cases"""
108 a3bca46c Stavros Sachtouris
        for fname in self.fnames:
109 a3bca46c Stavros Sachtouris
            try:
110 7f87da8b Stavros Sachtouris
                os.remove(fname)
111 a3bca46c Stavros Sachtouris
            except OSError:
112 a3bca46c Stavros Sachtouris
                pass
113 a3bca46c Stavros Sachtouris
        self.forceDeleteContainer(self.c1)
114 a3bca46c Stavros Sachtouris
        self.forceDeleteContainer(self.c2)
115 a3bca46c Stavros Sachtouris
        try:
116 a3bca46c Stavros Sachtouris
            self.forceDeleteContainer(self.c3)
117 a3bca46c Stavros Sachtouris
        except ClientError:
118 a3bca46c Stavros Sachtouris
            pass
119 a3bca46c Stavros Sachtouris
        self.client.container = ''
120 a3bca46c Stavros Sachtouris
121 a3bca46c Stavros Sachtouris
    def test_000(self):
122 a3bca46c Stavros Sachtouris
        """Prepare a full Pithos+ test"""
123 a3bca46c Stavros Sachtouris
        print('')
124 a3bca46c Stavros Sachtouris
        super(self.__class__, self).test_000()
125 a3bca46c Stavros Sachtouris
126 a3bca46c Stavros Sachtouris
    def test_account_head(self):
127 a3bca46c Stavros Sachtouris
        """Test account_HEAD"""
128 a3bca46c Stavros Sachtouris
        self._test_0010_account_head()
129 a3bca46c Stavros Sachtouris
130 a3bca46c Stavros Sachtouris
    def _test_0010_account_head(self):
131 a3bca46c Stavros Sachtouris
        r = self.client.account_head()
132 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
133 a3bca46c Stavros Sachtouris
134 a3bca46c Stavros Sachtouris
        r = self.client.account_head(until='1000000000')
135 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
136 a3bca46c Stavros Sachtouris
137 a3bca46c Stavros Sachtouris
        r = self.client.get_account_info(until='1000000000')
138 a3bca46c Stavros Sachtouris
        datestring = unicode(r['x-account-until-timestamp'])
139 a3bca46c Stavros Sachtouris
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
140 a3bca46c Stavros Sachtouris
141 a3bca46c Stavros Sachtouris
        r = self.client.get_account_quota()
142 a3bca46c Stavros Sachtouris
        self.assertTrue('x-account-policy-quota' in r)
143 a3bca46c Stavros Sachtouris
144 a3bca46c Stavros Sachtouris
        r = self.client.get_account_versioning()
145 a3bca46c Stavros Sachtouris
        self.assertTrue('x-account-policy-versioning' in r)
146 a3bca46c Stavros Sachtouris
147 a3bca46c Stavros Sachtouris
        """Check if(un)modified_since"""
148 a3bca46c Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
149 a3bca46c Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
150 a3bca46c Stavros Sachtouris
            r1 = self.client.account_head(if_modified_since=now_formated,
151 a3bca46c Stavros Sachtouris
                success=(204, 304, 412))
152 a3bca46c Stavros Sachtouris
            sc1 = r1.status_code
153 a3bca46c Stavros Sachtouris
            r1.release()
154 a3bca46c Stavros Sachtouris
            r2 = self.client.account_head(if_unmodified_since=now_formated,
155 a3bca46c Stavros Sachtouris
                success=(204, 304, 412))
156 a3bca46c Stavros Sachtouris
            sc2 = r2.status_code
157 a3bca46c Stavros Sachtouris
            r2.release()
158 a3bca46c Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
159 a3bca46c Stavros Sachtouris
160 a3bca46c Stavros Sachtouris
    def test_account_get(self):
161 a3bca46c Stavros Sachtouris
        """Test account_GET"""
162 a3bca46c Stavros Sachtouris
        self._test_0020_account_get()
163 a3bca46c Stavros Sachtouris
164 a3bca46c Stavros Sachtouris
    def _test_0020_account_get(self):
165 a3bca46c Stavros Sachtouris
        #r = self.client.account_get()
166 a3bca46c Stavros Sachtouris
        #self.assertEqual(r.status_code, 200)
167 a3bca46c Stavros Sachtouris
        r = self.client.list_containers()
168 a3bca46c Stavros Sachtouris
        fullLen = len(r)
169 a3bca46c Stavros Sachtouris
        self.assertTrue(fullLen > 2)
170 a3bca46c Stavros Sachtouris
171 a3bca46c Stavros Sachtouris
        r = self.client.account_get(limit=1)
172 a3bca46c Stavros Sachtouris
        self.assertEqual(len(r.json), 1)
173 a3bca46c Stavros Sachtouris
174 a3bca46c Stavros Sachtouris
        r = self.client.account_get(marker='c2_')
175 a3bca46c Stavros Sachtouris
        temp_c0 = r.json[0]['name']
176 a3bca46c Stavros Sachtouris
        temp_c2 = r.json[2]['name']
177 a3bca46c Stavros Sachtouris
178 a3bca46c Stavros Sachtouris
        r = self.client.account_get(limit=2, marker='c2_')
179 a3bca46c Stavros Sachtouris
        conames = [container['name'] for container in r.json \
180 a3bca46c Stavros Sachtouris
            if container['name'].lower().startswith('c2_')]
181 a3bca46c Stavros Sachtouris
        self.assertTrue(temp_c0 in conames)
182 a3bca46c Stavros Sachtouris
        self.assertFalse(temp_c2 in conames)
183 a3bca46c Stavros Sachtouris
184 a3bca46c Stavros Sachtouris
        r = self.client.account_get(show_only_shared=True)
185 a3bca46c Stavros Sachtouris
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
186 a3bca46c Stavros Sachtouris
187 a3bca46c Stavros Sachtouris
        r = self.client.account_get(until=1342609206)
188 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r.json) <= fullLen)
189 a3bca46c Stavros Sachtouris
190 a3bca46c Stavros Sachtouris
        """Check if(un)modified_since"""
191 a3bca46c Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
192 a3bca46c Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
193 a3bca46c Stavros Sachtouris
            r1 = self.client.account_get(if_modified_since=now_formated,
194 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
195 a3bca46c Stavros Sachtouris
            sc1 = r1.status_code
196 a3bca46c Stavros Sachtouris
            r1.release()
197 a3bca46c Stavros Sachtouris
            r2 = self.client.account_get(if_unmodified_since=now_formated,
198 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
199 a3bca46c Stavros Sachtouris
            sc2 = r2.status_code
200 a3bca46c Stavros Sachtouris
            r2.release()
201 a3bca46c Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
202 a3bca46c Stavros Sachtouris
203 a3bca46c Stavros Sachtouris
        """Check sharing_accounts"""
204 a3bca46c Stavros Sachtouris
        r = self.client.get_sharing_accounts()
205 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r) > 0)
206 a3bca46c Stavros Sachtouris
207 a3bca46c Stavros Sachtouris
    def test_account_post(self):
208 a3bca46c Stavros Sachtouris
        """Test account_POST"""
209 a3bca46c Stavros Sachtouris
        self._test_0030_account_post()
210 a3bca46c Stavros Sachtouris
211 a3bca46c Stavros Sachtouris
    def _test_0030_account_post(self):
212 a3bca46c Stavros Sachtouris
        r = self.client.account_post()
213 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
214 a3bca46c Stavros Sachtouris
        grpName = 'grp' + unicode(self.now)
215 a3bca46c Stavros Sachtouris
216 a3bca46c Stavros Sachtouris
        """Method set/del_account_meta and set_account_groupcall use
217 a3bca46c Stavros Sachtouris
            account_post internally
218 a3bca46c Stavros Sachtouris
        """
219 a3bca46c Stavros Sachtouris
        self.client.set_account_group(grpName, ['u1', 'u2'])
220 a3bca46c Stavros Sachtouris
        r = self.client.get_account_group()
221 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-account-group-' + grpName], 'u1,u2')
222 a3bca46c Stavros Sachtouris
        self.client.del_account_group(grpName)
223 a3bca46c Stavros Sachtouris
        r = self.client.get_account_group()
224 a3bca46c Stavros Sachtouris
        self.assertTrue('x-account-group-' + grpName not in r)
225 a3bca46c Stavros Sachtouris
226 a3bca46c Stavros Sachtouris
        mprefix = 'meta' + unicode(self.now)
227 a3bca46c Stavros Sachtouris
        self.client.set_account_meta({mprefix + '1': 'v1',
228 a3bca46c Stavros Sachtouris
            mprefix + '2': 'v2'})
229 a3bca46c Stavros Sachtouris
        r = self.client.get_account_meta()
230 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
231 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
232 a3bca46c Stavros Sachtouris
233 a3bca46c Stavros Sachtouris
        self.client.del_account_meta(mprefix + '1')
234 a3bca46c Stavros Sachtouris
        r = self.client.get_account_meta()
235 a3bca46c Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
236 a3bca46c Stavros Sachtouris
237 a3bca46c Stavros Sachtouris
        self.client.del_account_meta(mprefix + '2')
238 a3bca46c Stavros Sachtouris
        r = self.client.get_account_meta()
239 a3bca46c Stavros Sachtouris
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
240 a3bca46c Stavros Sachtouris
241 a3bca46c Stavros Sachtouris
        """Missing testing for quota, versioning, because normally
242 a3bca46c Stavros Sachtouris
        you don't have permissions to modify those at account level
243 a3bca46c Stavros Sachtouris
        """
244 a3bca46c Stavros Sachtouris
245 a3bca46c Stavros Sachtouris
        newquota = 1000000
246 a3bca46c Stavros Sachtouris
        self.client.set_account_quota(newquota)
247 a3bca46c Stavros Sachtouris
        #r = self.client.get_account_info()
248 a3bca46c Stavros Sachtouris
        #print(unicode(r))
249 a3bca46c Stavros Sachtouris
        #r = self.client.get_account_quota()
250 a3bca46c Stavros Sachtouris
        #self.assertEqual(r['x-account-policy-quota'], newquota)
251 a3bca46c Stavros Sachtouris
        self.client.set_account_versioning('auto')
252 a3bca46c Stavros Sachtouris
253 a3bca46c Stavros Sachtouris
    def test_container_head(self):
254 a3bca46c Stavros Sachtouris
        """Test container_HEAD"""
255 a3bca46c Stavros Sachtouris
        self._test_0040_container_head()
256 a3bca46c Stavros Sachtouris
257 a3bca46c Stavros Sachtouris
    def _test_0040_container_head(self):
258 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
259 a3bca46c Stavros Sachtouris
260 a3bca46c Stavros Sachtouris
        r = self.client.container_head()
261 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
262 a3bca46c Stavros Sachtouris
263 a3bca46c Stavros Sachtouris
        """Check until"""
264 a3bca46c Stavros Sachtouris
        r = self.client.container_head(until=1000000, success=(204, 404))
265 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 404)
266 a3bca46c Stavros Sachtouris
267 a3bca46c Stavros Sachtouris
        """Check and if(un)modified_since"""
268 a3bca46c Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
269 a3bca46c Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
270 a3bca46c Stavros Sachtouris
            r1 = self.client.container_head(if_modified_since=now_formated,
271 a3bca46c Stavros Sachtouris
                success=(204, 304, 412))
272 a3bca46c Stavros Sachtouris
            sc1 = r1.status_code
273 a3bca46c Stavros Sachtouris
            r1.release()
274 a3bca46c Stavros Sachtouris
            r2 = self.client.container_head(if_unmodified_since=now_formated,
275 a3bca46c Stavros Sachtouris
                success=(204, 304, 412))
276 a3bca46c Stavros Sachtouris
            sc2 = r2.status_code
277 a3bca46c Stavros Sachtouris
            r2.release()
278 a3bca46c Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
279 a3bca46c Stavros Sachtouris
280 a3bca46c Stavros Sachtouris
        """Check container object meta"""
281 a3bca46c Stavros Sachtouris
        r = self.client.get_container_object_meta()
282 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
283 a3bca46c Stavros Sachtouris
284 a3bca46c Stavros Sachtouris
    def test_container_get(self):
285 a3bca46c Stavros Sachtouris
        """Test container_GET"""
286 a3bca46c Stavros Sachtouris
        self._test_0050_container_get()
287 a3bca46c Stavros Sachtouris
288 a3bca46c Stavros Sachtouris
    def _test_0050_container_get(self):
289 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
290 a3bca46c Stavros Sachtouris
291 a3bca46c Stavros Sachtouris
        r = self.client.container_get()
292 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
293 a3bca46c Stavros Sachtouris
        fullLen = len(r.json)
294 a3bca46c Stavros Sachtouris
295 a3bca46c Stavros Sachtouris
        r = self.client.container_get(prefix='test')
296 a3bca46c Stavros Sachtouris
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
297 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r.json) > 1)
298 a3bca46c Stavros Sachtouris
        self.assertEqual(len(r.json), len(lalobjects))
299 a3bca46c Stavros Sachtouris
300 a3bca46c Stavros Sachtouris
        r = self.client.container_get(limit=1)
301 a3bca46c Stavros Sachtouris
        self.assertEqual(len(r.json), 1)
302 a3bca46c Stavros Sachtouris
303 a3bca46c Stavros Sachtouris
        r = self.client.container_get(marker='another')
304 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r.json) > 1)
305 a3bca46c Stavros Sachtouris
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
306 a3bca46c Stavros Sachtouris
        self.assertEqual(len(r.json), len(neobjects))
307 a3bca46c Stavros Sachtouris
308 a3bca46c Stavros Sachtouris
        r = self.client.container_get(prefix='another.test', delimiter='.')
309 a3bca46c Stavros Sachtouris
        self.assertTrue(fullLen > len(r.json))
310 a3bca46c Stavros Sachtouris
311 a3bca46c Stavros Sachtouris
        r = self.client.container_get(path='/')
312 a3bca46c Stavros Sachtouris
        self.assertEqual(fullLen, len(r.json))
313 a3bca46c Stavros Sachtouris
314 a3bca46c Stavros Sachtouris
        r = self.client.container_get(format='xml')
315 a3bca46c Stavros Sachtouris
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
316 a3bca46c Stavros Sachtouris
317 a3bca46c Stavros Sachtouris
        r = self.client.container_get(meta=['incontainer'])
318 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r.json) > 0)
319 a3bca46c Stavros Sachtouris
320 a3bca46c Stavros Sachtouris
        r = self.client.container_get(show_only_shared=True)
321 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r.json) < fullLen)
322 a3bca46c Stavros Sachtouris
323 a3bca46c Stavros Sachtouris
        try:
324 a3bca46c Stavros Sachtouris
            r = self.client.container_get(until=1000000000)
325 a3bca46c Stavros Sachtouris
            datestring = unicode(r.headers['x-account-until-timestamp'])
326 a3bca46c Stavros Sachtouris
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
327 a3bca46c Stavros Sachtouris
328 a3bca46c Stavros Sachtouris
        except ClientError:
329 a3bca46c Stavros Sachtouris
330 a3bca46c Stavros Sachtouris
            pass
331 a3bca46c Stavros Sachtouris
332 a3bca46c Stavros Sachtouris
        """Check and if un/modified_since"""
333 a3bca46c Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
334 a3bca46c Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
335 a3bca46c Stavros Sachtouris
            r1 = self.client.container_get(if_modified_since=now_formated,
336 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
337 a3bca46c Stavros Sachtouris
            sc1 = r1.status_code
338 a3bca46c Stavros Sachtouris
            r1.release()
339 a3bca46c Stavros Sachtouris
            r2 = self.client.container_get(if_unmodified_since=now_formated,
340 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
341 a3bca46c Stavros Sachtouris
            sc2 = r2.status_code
342 a3bca46c Stavros Sachtouris
            r2.release()
343 a3bca46c Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
344 a3bca46c Stavros Sachtouris
345 a3bca46c Stavros Sachtouris
    def test_container_put(self):
346 a3bca46c Stavros Sachtouris
        """Test container_PUT"""
347 a3bca46c Stavros Sachtouris
        self._test_0050_container_put()
348 a3bca46c Stavros Sachtouris
349 a3bca46c Stavros Sachtouris
    def _test_0050_container_put(self):
350 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
351 a3bca46c Stavros Sachtouris
352 a3bca46c Stavros Sachtouris
        r = self.client.container_put()
353 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
354 a3bca46c Stavros Sachtouris
355 a3bca46c Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
356 a3bca46c Stavros Sachtouris
        cquota = r.values()[0]
357 a3bca46c Stavros Sachtouris
        newquota = 2 * int(cquota)
358 a3bca46c Stavros Sachtouris
359 a3bca46c Stavros Sachtouris
        r = self.client.container_put(quota=newquota)
360 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
361 a3bca46c Stavros Sachtouris
362 a3bca46c Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
363 a3bca46c Stavros Sachtouris
        xquota = int(r.values()[0])
364 a3bca46c Stavros Sachtouris
        self.assertEqual(newquota, xquota)
365 a3bca46c Stavros Sachtouris
366 a3bca46c Stavros Sachtouris
        r = self.client.container_put(versioning='auto')
367 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
368 a3bca46c Stavros Sachtouris
369 a3bca46c Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
370 a3bca46c Stavros Sachtouris
        nvers = r.values()[0]
371 a3bca46c Stavros Sachtouris
        self.assertEqual('auto', nvers)
372 a3bca46c Stavros Sachtouris
373 a3bca46c Stavros Sachtouris
        r = self.client.container_put(versioning='none')
374 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
375 a3bca46c Stavros Sachtouris
376 a3bca46c Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
377 a3bca46c Stavros Sachtouris
        nvers = r.values()[0]
378 a3bca46c Stavros Sachtouris
        self.assertEqual('none', nvers)
379 a3bca46c Stavros Sachtouris
380 a3bca46c Stavros Sachtouris
        r = self.client.container_put(metadata={'m1': 'v1', 'm2': 'v2'})
381 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
382 a3bca46c Stavros Sachtouris
383 a3bca46c Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
384 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' in r)
385 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m1'], 'v1')
386 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
387 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2')
388 a3bca46c Stavros Sachtouris
389 a3bca46c Stavros Sachtouris
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
390 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
391 a3bca46c Stavros Sachtouris
392 a3bca46c Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
393 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' not in r)
394 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
395 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
396 a3bca46c Stavros Sachtouris
397 a3bca46c Stavros Sachtouris
        self.client.del_container_meta(self.client.container)
398 a3bca46c Stavros Sachtouris
399 a3bca46c Stavros Sachtouris
    def test_container_post(self):
400 a3bca46c Stavros Sachtouris
        """Test container_POST"""
401 a3bca46c Stavros Sachtouris
        self._test_0060_container_post()
402 a3bca46c Stavros Sachtouris
403 a3bca46c Stavros Sachtouris
    def _test_0060_container_post(self):
404 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
405 a3bca46c Stavros Sachtouris
406 a3bca46c Stavros Sachtouris
        """Simple post"""
407 a3bca46c Stavros Sachtouris
        r = self.client.container_post()
408 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 202)
409 a3bca46c Stavros Sachtouris
410 a3bca46c Stavros Sachtouris
        """post meta"""
411 a3bca46c Stavros Sachtouris
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
412 a3bca46c Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
413 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' in r)
414 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m1'], 'v1')
415 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
416 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2')
417 a3bca46c Stavros Sachtouris
418 a3bca46c Stavros Sachtouris
        """post/2del meta"""
419 a3bca46c Stavros Sachtouris
        r = self.client.del_container_meta('m1')
420 a3bca46c Stavros Sachtouris
        r = self.client.set_container_meta({'m2': 'v2a'})
421 a3bca46c Stavros Sachtouris
        r = self.client.get_container_meta(self.client.container)
422 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m1' not in r)
423 a3bca46c Stavros Sachtouris
        self.assertTrue('x-container-meta-m2' in r)
424 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
425 a3bca46c Stavros Sachtouris
426 a3bca46c Stavros Sachtouris
        """check quota"""
427 a3bca46c Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
428 a3bca46c Stavros Sachtouris
        cquota = r.values()[0]
429 a3bca46c Stavros Sachtouris
        newquota = 2 * int(cquota)
430 a3bca46c Stavros Sachtouris
        r = self.client.set_container_quota(newquota)
431 a3bca46c Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
432 a3bca46c Stavros Sachtouris
        xquota = int(r.values()[0])
433 a3bca46c Stavros Sachtouris
        self.assertEqual(newquota, xquota)
434 a3bca46c Stavros Sachtouris
        r = self.client.set_container_quota(cquota)
435 a3bca46c Stavros Sachtouris
        r = self.client.get_container_quota(self.client.container)
436 a3bca46c Stavros Sachtouris
        xquota = r.values()[0]
437 a3bca46c Stavros Sachtouris
        self.assertEqual(cquota, xquota)
438 a3bca46c Stavros Sachtouris
439 a3bca46c Stavros Sachtouris
        """Check versioning"""
440 a3bca46c Stavros Sachtouris
        self.client.set_container_versioning('auto')
441 a3bca46c Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
442 a3bca46c Stavros Sachtouris
        nvers = r.values()[0]
443 a3bca46c Stavros Sachtouris
        self.assertEqual('auto', nvers)
444 a3bca46c Stavros Sachtouris
        self.client.set_container_versioning('none')
445 a3bca46c Stavros Sachtouris
        r = self.client.get_container_versioning(self.client.container)
446 a3bca46c Stavros Sachtouris
        nvers = r.values()[0]
447 a3bca46c Stavros Sachtouris
        self.assertEqual('none', nvers)
448 a3bca46c Stavros Sachtouris
449 a3bca46c Stavros Sachtouris
        """put_block uses content_type and content_length to
450 a3bca46c Stavros Sachtouris
        post blocks of data 2 container. All that in upload_object"""
451 a3bca46c Stavros Sachtouris
        """Change a file at fs"""
452 a3bca46c Stavros Sachtouris
        fname = 'l100M.' + unicode(self.now)
453 a3bca46c Stavros Sachtouris
        self.create_large_file(1024 * 1024 * 100, fname)
454 a3bca46c Stavros Sachtouris
        self.fnames.append(fname)
455 a3bca46c Stavros Sachtouris
        """Upload it at a directory in container"""
456 a3bca46c Stavros Sachtouris
        self.client.create_directory('dir')
457 a3bca46c Stavros Sachtouris
        newf = open(fname, 'rb')
458 a3bca46c Stavros Sachtouris
        self.client.upload_object('/dir/sample.file', newf)
459 a3bca46c Stavros Sachtouris
        newf.close()
460 a3bca46c Stavros Sachtouris
        """Check if file has been uploaded"""
461 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info('/dir/sample.file')
462 a3bca46c Stavros Sachtouris
        self.assertTrue(int(r['content-length']) > 100000000)
463 a3bca46c Stavros Sachtouris
464 a3bca46c Stavros Sachtouris
        """What is tranfer_encoding? What should I check about it? """
465 a3bca46c Stavros Sachtouris
        #TODO
466 a3bca46c Stavros Sachtouris
467 a3bca46c Stavros Sachtouris
        """Check update=False"""
468 a3bca46c Stavros Sachtouris
        r = self.client.object_post('test',
469 a3bca46c Stavros Sachtouris
            update=False,
470 a3bca46c Stavros Sachtouris
            metadata={'newmeta': 'newval'})
471 a3bca46c Stavros Sachtouris
472 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info('test')
473 a3bca46c Stavros Sachtouris
        self.assertTrue('x-object-meta-newmeta' in r)
474 a3bca46c Stavros Sachtouris
        self.assertFalse('x-object-meta-incontainer' in r)
475 a3bca46c Stavros Sachtouris
476 a3bca46c Stavros Sachtouris
        r = self.client.del_container_meta('m2')
477 a3bca46c Stavros Sachtouris
478 a3bca46c Stavros Sachtouris
    def test_container_delete(self):
479 a3bca46c Stavros Sachtouris
        """Test container_DELETE"""
480 a3bca46c Stavros Sachtouris
        self._test_0070_container_delete()
481 a3bca46c Stavros Sachtouris
482 a3bca46c Stavros Sachtouris
    def _test_0070_container_delete(self):
483 a3bca46c Stavros Sachtouris
484 a3bca46c Stavros Sachtouris
        """Fail to delete a non-empty container"""
485 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
486 a3bca46c Stavros Sachtouris
        r = self.client.container_delete(success=409)
487 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 409)
488 a3bca46c Stavros Sachtouris
489 a3bca46c Stavros Sachtouris
        """Fail to delete c3 (empty) container"""
490 a3bca46c Stavros Sachtouris
        self.client.container = self.c3
491 a3bca46c Stavros Sachtouris
        r = self.client.container_delete(until='1000000000')
492 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
493 a3bca46c Stavros Sachtouris
494 a3bca46c Stavros Sachtouris
        """Delete c3 (empty) container"""
495 a3bca46c Stavros Sachtouris
        r = self.client.container_delete()
496 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
497 a3bca46c Stavros Sachtouris
498 a3bca46c Stavros Sachtouris
        """Purge container(empty a container), check versionlist"""
499 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
500 a3bca46c Stavros Sachtouris
        r = self.client.object_head('test', success=(200, 404))
501 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
502 a3bca46c Stavros Sachtouris
        self.client.del_container(delimiter='/')
503 a3bca46c Stavros Sachtouris
        r = self.client.object_head('test', success=(200, 404))
504 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 404)
505 a3bca46c Stavros Sachtouris
        r = self.client.get_object_versionlist('test')
506 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r) > 0)
507 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r[0]) > 1)
508 a3bca46c Stavros Sachtouris
        self.client.purge_container()
509 a3bca46c Stavros Sachtouris
        self.assertRaises(ClientError,
510 a3bca46c Stavros Sachtouris
            self.client.get_object_versionlist,
511 a3bca46c Stavros Sachtouris
            'test')
512 a3bca46c Stavros Sachtouris
513 a3bca46c Stavros Sachtouris
    def _test_0080_recreate_deleted_data(self):
514 a3bca46c Stavros Sachtouris
        self._init_data()
515 a3bca46c Stavros Sachtouris
516 a3bca46c Stavros Sachtouris
    def test_object_head(self):
517 a3bca46c Stavros Sachtouris
        """Test object_HEAD"""
518 a3bca46c Stavros Sachtouris
        self._test_0090_object_head()
519 a3bca46c Stavros Sachtouris
520 a3bca46c Stavros Sachtouris
    def _test_0090_object_head(self):
521 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
522 a3bca46c Stavros Sachtouris
        obj = 'test'
523 a3bca46c Stavros Sachtouris
524 a3bca46c Stavros Sachtouris
        r = self.client.object_head(obj)
525 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
526 a3bca46c Stavros Sachtouris
        etag = r.headers['etag']
527 a3bca46c Stavros Sachtouris
528 a3bca46c Stavros Sachtouris
        r = self.client.object_head(obj, version=40)
529 a3bca46c Stavros Sachtouris
        self.assertEqual(r.headers['x-object-version'], '40')
530 a3bca46c Stavros Sachtouris
531 a3bca46c Stavros Sachtouris
        r = self.client.object_head(obj, if_etag_match=etag)
532 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
533 a3bca46c Stavros Sachtouris
534 a3bca46c Stavros Sachtouris
        r = self.client.object_head(obj,
535 a3bca46c Stavros Sachtouris
            if_etag_not_match=etag,
536 a3bca46c Stavros Sachtouris
            success=(200, 412, 304))
537 a3bca46c Stavros Sachtouris
        self.assertNotEqual(r.status_code, 200)
538 a3bca46c Stavros Sachtouris
539 a3bca46c Stavros Sachtouris
        r = self.client.object_head(obj,
540 a3bca46c Stavros Sachtouris
            version=40,
541 a3bca46c Stavros Sachtouris
            if_etag_match=etag,
542 a3bca46c Stavros Sachtouris
            success=412)
543 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 412)
544 a3bca46c Stavros Sachtouris
545 a3bca46c Stavros Sachtouris
        """Check and if(un)modified_since"""
546 a3bca46c Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
547 a3bca46c Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
548 a3bca46c Stavros Sachtouris
            r1 = self.client.object_head(obj, if_modified_since=now_formated,
549 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
550 a3bca46c Stavros Sachtouris
            sc1 = r1.status_code
551 a3bca46c Stavros Sachtouris
            r1.release()
552 a3bca46c Stavros Sachtouris
            r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
553 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
554 a3bca46c Stavros Sachtouris
            sc2 = r2.status_code
555 a3bca46c Stavros Sachtouris
            r2.release()
556 a3bca46c Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
557 a3bca46c Stavros Sachtouris
558 a3bca46c Stavros Sachtouris
    def test_object_get(self):
559 a3bca46c Stavros Sachtouris
        """Test object_GET"""
560 a3bca46c Stavros Sachtouris
        self._test_0100_object_get()
561 a3bca46c Stavros Sachtouris
562 a3bca46c Stavros Sachtouris
    def _test_0100_object_get(self):
563 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
564 a3bca46c Stavros Sachtouris
        obj = 'test'
565 a3bca46c Stavros Sachtouris
566 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
567 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
568 a3bca46c Stavros Sachtouris
569 a3bca46c Stavros Sachtouris
        osize = int(r.headers['content-length'])
570 a3bca46c Stavros Sachtouris
        etag = r.headers['etag']
571 a3bca46c Stavros Sachtouris
572 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj, hashmap=True)
573 a3bca46c Stavros Sachtouris
        self.assertTrue('hashes' in r.json\
574 a3bca46c Stavros Sachtouris
            and 'block_hash' in r.json\
575 a3bca46c Stavros Sachtouris
            and 'block_size' in r.json\
576 a3bca46c Stavros Sachtouris
            and 'bytes' in r.json)
577 a3bca46c Stavros Sachtouris
578 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj, format='xml', hashmap=True)
579 a3bca46c Stavros Sachtouris
        self.assertEqual(len(r.text.split('hash>')), 3)
580 a3bca46c Stavros Sachtouris
581 a3bca46c Stavros Sachtouris
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
582 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj,
583 a3bca46c Stavros Sachtouris
            data_range=rangestr,
584 a3bca46c Stavros Sachtouris
            success=(200, 206))
585 a3bca46c Stavros Sachtouris
        partsize = int(r.headers['content-length'])
586 a3bca46c Stavros Sachtouris
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
587 a3bca46c Stavros Sachtouris
588 a3bca46c Stavros Sachtouris
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
589 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj,
590 a3bca46c Stavros Sachtouris
            data_range=rangestr,
591 a3bca46c Stavros Sachtouris
            if_range=True,
592 a3bca46c Stavros Sachtouris
            success=(200, 206))
593 a3bca46c Stavros Sachtouris
        partsize = int(r.headers['content-length'])
594 a3bca46c Stavros Sachtouris
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
595 a3bca46c Stavros Sachtouris
596 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj, if_etag_match=etag)
597 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
598 a3bca46c Stavros Sachtouris
599 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
600 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
601 a3bca46c Stavros Sachtouris
602 a3bca46c Stavros Sachtouris
        """Check and if(un)modified_since"""
603 a3bca46c Stavros Sachtouris
        for format in self.client.DATE_FORMATS:
604 a3bca46c Stavros Sachtouris
            now_formated = self.now_unformated.strftime(format)
605 a3bca46c Stavros Sachtouris
            r1 = self.client.object_get(obj, if_modified_since=now_formated,
606 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
607 a3bca46c Stavros Sachtouris
            sc1 = r1.status_code
608 a3bca46c Stavros Sachtouris
            r1.release()
609 a3bca46c Stavros Sachtouris
            r2 = self.client.object_get(obj,
610 a3bca46c Stavros Sachtouris
                if_unmodified_since=now_formated,
611 a3bca46c Stavros Sachtouris
                success=(200, 304, 412))
612 a3bca46c Stavros Sachtouris
            sc2 = r2.status_code
613 a3bca46c Stavros Sachtouris
            r2.release()
614 a3bca46c Stavros Sachtouris
            self.assertNotEqual(sc1, sc2)
615 a3bca46c Stavros Sachtouris
616 a3bca46c Stavros Sachtouris
        """Upload an object to download"""
617 a3bca46c Stavros Sachtouris
        src_file = tempfile.NamedTemporaryFile(delete=False)
618 a3bca46c Stavros Sachtouris
        dnl_file = tempfile.NamedTemporaryFile(delete=False)
619 a3bca46c Stavros Sachtouris
620 a3bca46c Stavros Sachtouris
        src_fname = src_file.name
621 a3bca46c Stavros Sachtouris
        dnl_fname = dnl_file.name
622 a3bca46c Stavros Sachtouris
623 a3bca46c Stavros Sachtouris
        src_file.close()
624 a3bca46c Stavros Sachtouris
        dnl_file.close()
625 a3bca46c Stavros Sachtouris
626 a3bca46c Stavros Sachtouris
        trg_fname = 'remotefile_%s' % self.now
627 a3bca46c Stavros Sachtouris
        f_size = 59247824
628 a3bca46c Stavros Sachtouris
        self.create_large_file(f_size, src_fname)
629 a3bca46c Stavros Sachtouris
        src_f = open(src_fname, 'rb+')
630 a3bca46c Stavros Sachtouris
        print('\tUploading...')
631 a3bca46c Stavros Sachtouris
        self.client.upload_object(trg_fname, src_f)
632 a3bca46c Stavros Sachtouris
        src_f.close()
633 a3bca46c Stavros Sachtouris
        print('\tDownloading...')
634 a3bca46c Stavros Sachtouris
        dnl_f = open(dnl_fname, 'wb+')
635 a3bca46c Stavros Sachtouris
        self.client.download_object(trg_fname, dnl_f)
636 a3bca46c Stavros Sachtouris
        dnl_f.close()
637 a3bca46c Stavros Sachtouris
638 a3bca46c Stavros Sachtouris
        print('\tCheck if files match...')
639 a3bca46c Stavros Sachtouris
        src_f = open(src_fname)
640 a3bca46c Stavros Sachtouris
        dnl_f = open(dnl_fname)
641 a3bca46c Stavros Sachtouris
        for pos in (0, f_size / 2, f_size - 20):
642 a3bca46c Stavros Sachtouris
            src_f.seek(pos)
643 a3bca46c Stavros Sachtouris
            dnl_f.seek(pos)
644 a3bca46c Stavros Sachtouris
            self.assertEqual(src_f.read(10), dnl_f.read(10))
645 a3bca46c Stavros Sachtouris
        src_f.close()
646 a3bca46c Stavros Sachtouris
        dnl_f.close()
647 a3bca46c Stavros Sachtouris
648 a3bca46c Stavros Sachtouris
        os.remove(src_fname)
649 a3bca46c Stavros Sachtouris
        os.remove(dnl_fname)
650 a3bca46c Stavros Sachtouris
651 a3bca46c Stavros Sachtouris
    def test_object_put(self):
652 a3bca46c Stavros Sachtouris
        """Test object_PUT"""
653 a3bca46c Stavros Sachtouris
        self._test_object_put()
654 a3bca46c Stavros Sachtouris
655 a3bca46c Stavros Sachtouris
    def _test_object_put(self):
656 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
657 a3bca46c Stavros Sachtouris
        obj = 'another.test'
658 a3bca46c Stavros Sachtouris
659 a3bca46c Stavros Sachtouris
        self.client.create_object(obj + '.FAKE')
660 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj + '.FAKE')
661 a3bca46c Stavros Sachtouris
        self.assertEqual(r['content-type'], 'application/octet-stream')
662 a3bca46c Stavros Sachtouris
663 a3bca46c Stavros Sachtouris
        """create the object"""
664 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj,
665 a3bca46c Stavros Sachtouris
            data='a',
666 a3bca46c Stavros Sachtouris
            content_type='application/octer-stream',
667 a3bca46c Stavros Sachtouris
            permissions={
668 a3bca46c Stavros Sachtouris
                'read': ['accX:groupA', 'u1', 'u2'],
669 a3bca46c Stavros Sachtouris
                'write': ['u2', 'u3']},
670 a3bca46c Stavros Sachtouris
            metadata={'key1': 'val1', 'key2': 'val2'},
671 a3bca46c Stavros Sachtouris
            content_encoding='UTF-8',
672 a3bca46c Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
673 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
674 a3bca46c Stavros Sachtouris
        etag = r.headers['etag']
675 a3bca46c Stavros Sachtouris
676 a3bca46c Stavros Sachtouris
        """Check content-disposition"""
677 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
678 a3bca46c Stavros Sachtouris
        self.assertTrue('content-disposition' in r)
679 a3bca46c Stavros Sachtouris
680 a3bca46c Stavros Sachtouris
        """Check permissions"""
681 a3bca46c Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
682 a3bca46c Stavros Sachtouris
        self.assertTrue('accx:groupa' in r['read'])
683 a3bca46c Stavros Sachtouris
        self.assertTrue('u1' in r['read'])
684 a3bca46c Stavros Sachtouris
        self.assertTrue('u2' in r['write'])
685 a3bca46c Stavros Sachtouris
        self.assertTrue('u3' in r['write'])
686 a3bca46c Stavros Sachtouris
687 a3bca46c Stavros Sachtouris
        """Check metadata"""
688 a3bca46c Stavros Sachtouris
        r = self.client.get_object_meta(obj)
689 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-key1'], 'val1')
690 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-key2'], 'val2')
691 a3bca46c Stavros Sachtouris
692 a3bca46c Stavros Sachtouris
        """Check public and if_etag_match"""
693 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
694 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream', public=True)
695 a3bca46c Stavros Sachtouris
696 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
697 a3bca46c Stavros Sachtouris
        self.assertTrue('x-object-public' in r.headers)
698 a3bca46c Stavros Sachtouris
        vers2 = int(r.headers['x-object-version'])
699 a3bca46c Stavros Sachtouris
        etag = r.headers['etag']
700 a3bca46c Stavros Sachtouris
        self.assertEqual(r.text, 'b')
701 a3bca46c Stavros Sachtouris
702 a3bca46c Stavros Sachtouris
        """Check if_etag_not_match"""
703 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
704 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream', success=(201, 412))
705 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 412)
706 a3bca46c Stavros Sachtouris
707 a3bca46c Stavros Sachtouris
        """Check content_type and content_length"""
708 a3bca46c Stavros Sachtouris
        tmpdir = 'dir' + unicode(self.now)
709 a3bca46c Stavros Sachtouris
        r = self.client.object_put(tmpdir,
710 a3bca46c Stavros Sachtouris
            content_type='application/directory',
711 a3bca46c Stavros Sachtouris
            content_length=0)
712 a3bca46c Stavros Sachtouris
713 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(tmpdir)
714 a3bca46c Stavros Sachtouris
        self.assertEqual(r['content-type'], 'application/directory')
715 a3bca46c Stavros Sachtouris
716 a3bca46c Stavros Sachtouris
        """Check copy_from, content_encoding"""
717 a3bca46c Stavros Sachtouris
        r = self.client.object_put('%s/%s' % (tmpdir, obj),
718 a3bca46c Stavros Sachtouris
            format=None,
719 a3bca46c Stavros Sachtouris
            copy_from='/%s/%s' % (self.client.container, obj),
720 a3bca46c Stavros Sachtouris
            content_encoding='application/octet-stream',
721 a3bca46c Stavros Sachtouris
            source_account=self.client.account,
722 a3bca46c Stavros Sachtouris
            content_length=0, success=201)
723 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
724 a3bca46c Stavros Sachtouris
725 a3bca46c Stavros Sachtouris
        """Test copy_object for cross-conctainer copy"""
726 a3bca46c Stavros Sachtouris
        self.client.copy_object(src_container=self.c2,
727 a3bca46c Stavros Sachtouris
            src_object='%s/%s' % (tmpdir, obj),
728 a3bca46c Stavros Sachtouris
            dst_container=self.c1,
729 a3bca46c Stavros Sachtouris
            dst_object=obj)
730 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
731 a3bca46c Stavros Sachtouris
        r1 = self.client.get_object_info(obj)
732 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
733 a3bca46c Stavros Sachtouris
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
734 a3bca46c Stavros Sachtouris
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
735 a3bca46c Stavros Sachtouris
736 a3bca46c Stavros Sachtouris
        """Check cross-container copy_from, content_encoding"""
737 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
738 a3bca46c Stavros Sachtouris
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
739 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj,
740 a3bca46c Stavros Sachtouris
            format=None,
741 a3bca46c Stavros Sachtouris
            copy_from=fromstr,
742 a3bca46c Stavros Sachtouris
            content_encoding='application/octet-stream',
743 a3bca46c Stavros Sachtouris
            source_account=self.client.account,
744 a3bca46c Stavros Sachtouris
            content_length=0, success=201)
745 a3bca46c Stavros Sachtouris
746 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
747 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
748 a3bca46c Stavros Sachtouris
        self.assertEqual(r['etag'], etag)
749 a3bca46c Stavros Sachtouris
750 a3bca46c Stavros Sachtouris
        """Check source_account"""
751 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
752 a3bca46c Stavros Sachtouris
        fromstr = '/%s/%s' % (self.c1, obj)
753 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj + 'v2',
754 a3bca46c Stavros Sachtouris
            format=None,
755 a3bca46c Stavros Sachtouris
            move_from=fromstr,
756 a3bca46c Stavros Sachtouris
            content_encoding='application/octet-stream',
757 a3bca46c Stavros Sachtouris
            source_account='nonExistendAddress@NeverLand.com',
758 a3bca46c Stavros Sachtouris
            content_length=0,
759 a3bca46c Stavros Sachtouris
            success=(201, 403))
760 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
761 a3bca46c Stavros Sachtouris
762 a3bca46c Stavros Sachtouris
        """Check cross-container move_from"""
763 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
764 a3bca46c Stavros Sachtouris
        r1 = self.client.get_object_info(obj)
765 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
766 a3bca46c Stavros Sachtouris
        self.client.move_object(src_container=self.c1,
767 a3bca46c Stavros Sachtouris
            src_object=obj,
768 a3bca46c Stavros Sachtouris
            dst_container=self.c2,
769 a3bca46c Stavros Sachtouris
            dst_object=obj + 'v0')
770 a3bca46c Stavros Sachtouris
        r0 = self.client.get_object_info(obj + 'v0')
771 a3bca46c Stavros Sachtouris
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
772 a3bca46c Stavros Sachtouris
773 a3bca46c Stavros Sachtouris
        """Check move_from"""
774 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj + 'v1',
775 a3bca46c Stavros Sachtouris
            format=None,
776 a3bca46c Stavros Sachtouris
            move_from='/%s/%s' % (self.c2, obj),
777 a3bca46c Stavros Sachtouris
            source_version=vers2,
778 a3bca46c Stavros Sachtouris
            content_encoding='application/octet-stream',
779 a3bca46c Stavros Sachtouris
            content_length=0, success=201)
780 a3bca46c Stavros Sachtouris
781 a3bca46c Stavros Sachtouris
        """Check manifest"""
782 a3bca46c Stavros Sachtouris
        mobj = 'manifest.test'
783 a3bca46c Stavros Sachtouris
        txt = ''
784 a3bca46c Stavros Sachtouris
        for i in range(10):
785 a3bca46c Stavros Sachtouris
            txt += '%s' % i
786 a3bca46c Stavros Sachtouris
            r = self.client.object_put('%s/%s' % (mobj, i),
787 a3bca46c Stavros Sachtouris
                data='%s' % i,
788 a3bca46c Stavros Sachtouris
                content_length=1,
789 a3bca46c Stavros Sachtouris
                success=201,
790 a3bca46c Stavros Sachtouris
                content_type='application/octet-stream',
791 a3bca46c Stavros Sachtouris
                content_encoding='application/octet-stream')
792 a3bca46c Stavros Sachtouris
793 a3bca46c Stavros Sachtouris
        r = self.client.object_put(mobj,
794 a3bca46c Stavros Sachtouris
            content_length=0,
795 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream',
796 a3bca46c Stavros Sachtouris
            manifest='%s/%s' % (self.client.container, mobj))
797 a3bca46c Stavros Sachtouris
798 a3bca46c Stavros Sachtouris
        r = self.client.object_get(mobj)
799 a3bca46c Stavros Sachtouris
        self.assertEqual(r.text, txt)
800 a3bca46c Stavros Sachtouris
801 a3bca46c Stavros Sachtouris
        """Upload a local file with one request"""
802 a3bca46c Stavros Sachtouris
        fname = 'l10K.' + unicode(self.now)
803 a3bca46c Stavros Sachtouris
        self.create_large_file(1024 * 10, fname)
804 a3bca46c Stavros Sachtouris
        self.fnames.append(fname)
805 a3bca46c Stavros Sachtouris
        newf = open(fname, 'rb')
806 a3bca46c Stavros Sachtouris
        self.client.upload_object('sample.file', newf)
807 a3bca46c Stavros Sachtouris
        newf.close()
808 a3bca46c Stavros Sachtouris
        """Check if file has been uploaded"""
809 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info('sample.file')
810 7f87da8b Stavros Sachtouris
        self.assertEqual(int(r['content-length']), 10240)
811 a3bca46c Stavros Sachtouris
812 a3bca46c Stavros Sachtouris
        """Some problems with transfer-encoding?"""
813 a3bca46c Stavros Sachtouris
814 a3bca46c Stavros Sachtouris
    def test_object_copy(self):
815 a3bca46c Stavros Sachtouris
        """Test object_COPY"""
816 a3bca46c Stavros Sachtouris
        self._test_0110_object_copy()
817 a3bca46c Stavros Sachtouris
818 a3bca46c Stavros Sachtouris
    def _test_0110_object_copy(self):
819 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
820 a3bca46c Stavros Sachtouris
        obj = 'test2'
821 a3bca46c Stavros Sachtouris
822 a3bca46c Stavros Sachtouris
        data = '{"key1":"val1", "key2":"val2"}'
823 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj + 'orig',
824 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream',
825 a3bca46c Stavros Sachtouris
            data=data,
826 a3bca46c Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
827 a3bca46c Stavros Sachtouris
            permissions={
828 a3bca46c Stavros Sachtouris
                'read': ['accX:groupA', 'u1', 'u2'],
829 a3bca46c Stavros Sachtouris
                'write': ['u2', 'u3']},
830 a3bca46c Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
831 a3bca46c Stavros Sachtouris
832 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj + 'orig',
833 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.client.container, obj),
834 a3bca46c Stavros Sachtouris
            ignore_content_type=False, content_type='application/json',
835 a3bca46c Stavros Sachtouris
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
836 a3bca46c Stavros Sachtouris
            permissions={'write': ['u5', 'accX:groupB']})
837 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
838 a3bca46c Stavros Sachtouris
839 a3bca46c Stavros Sachtouris
        """Check content-disposition"""
840 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
841 a3bca46c Stavros Sachtouris
        self.assertTrue('content-disposition' in r)
842 a3bca46c Stavros Sachtouris
843 a3bca46c Stavros Sachtouris
        """Check Metadata"""
844 a3bca46c Stavros Sachtouris
        r = self.client.get_object_meta(obj)
845 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
846 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
847 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
848 a3bca46c Stavros Sachtouris
849 a3bca46c Stavros Sachtouris
        """Check permissions"""
850 a3bca46c Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
851 a3bca46c Stavros Sachtouris
        self.assertFalse('read' in r or 'u2' in r['write'])
852 a3bca46c Stavros Sachtouris
        self.assertTrue('accx:groupb' in r['write'])
853 a3bca46c Stavros Sachtouris
854 a3bca46c Stavros Sachtouris
        """Check destination account"""
855 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj,
856 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
857 a3bca46c Stavros Sachtouris
            content_encoding='utf8',
858 a3bca46c Stavros Sachtouris
            content_type='application/json',
859 a3bca46c Stavros Sachtouris
            destination_account='nonExistendAddress@NeverLand.com',
860 a3bca46c Stavros Sachtouris
            success=(201, 403))
861 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
862 a3bca46c Stavros Sachtouris
863 a3bca46c Stavros Sachtouris
        """Check destination being another container
864 a3bca46c Stavros Sachtouris
        and also content_type and content encoding"""
865 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj,
866 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
867 a3bca46c Stavros Sachtouris
            content_encoding='utf8',
868 a3bca46c Stavros Sachtouris
            content_type='application/json')
869 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
870 a3bca46c Stavros Sachtouris
        self.assertEqual(r.headers['content-type'],
871 a3bca46c Stavros Sachtouris
            'application/json; charset=UTF-8')
872 a3bca46c Stavros Sachtouris
873 a3bca46c Stavros Sachtouris
        """Check ignore_content_type and content_type"""
874 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
875 a3bca46c Stavros Sachtouris
        etag = r.headers['etag']
876 a3bca46c Stavros Sachtouris
        ctype = r.headers['content-type']
877 a3bca46c Stavros Sachtouris
        self.assertEqual(ctype, 'application/json')
878 a3bca46c Stavros Sachtouris
879 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj + 'orig',
880 a3bca46c Stavros Sachtouris
            destination='/%s/%s0' % (self.client.container, obj),
881 a3bca46c Stavros Sachtouris
            ignore_content_type=True,
882 a3bca46c Stavros Sachtouris
            content_type='application/json')
883 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
884 a3bca46c Stavros Sachtouris
        self.assertNotEqual(r.headers['content-type'], 'application/json')
885 a3bca46c Stavros Sachtouris
886 a3bca46c Stavros Sachtouris
        """Check if_etag_(not_)match"""
887 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj,
888 a3bca46c Stavros Sachtouris
            destination='/%s/%s1' % (self.client.container, obj),
889 a3bca46c Stavros Sachtouris
            if_etag_match=etag)
890 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
891 a3bca46c Stavros Sachtouris
892 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj,
893 a3bca46c Stavros Sachtouris
            destination='/%s/%s2' % (self.client.container, obj),
894 a3bca46c Stavros Sachtouris
            if_etag_not_match='lalala')
895 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
896 a3bca46c Stavros Sachtouris
        vers2 = r.headers['x-object-version']
897 a3bca46c Stavros Sachtouris
898 a3bca46c Stavros Sachtouris
        """Check source_version, public and format """
899 a3bca46c Stavros Sachtouris
        r = self.client.object_copy(obj + '2',
900 a3bca46c Stavros Sachtouris
            destination='/%s/%s3' % (self.client.container, obj),
901 a3bca46c Stavros Sachtouris
            source_version=vers2,
902 a3bca46c Stavros Sachtouris
            format='xml',
903 a3bca46c Stavros Sachtouris
            public=True)
904 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
905 a3bca46c Stavros Sachtouris
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
906 a3bca46c Stavros Sachtouris
907 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj + '3')
908 a3bca46c Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
909 a3bca46c Stavros Sachtouris
910 a3bca46c Stavros Sachtouris
    def test_object_move(self):
911 a3bca46c Stavros Sachtouris
        """Test object_MOVE"""
912 a3bca46c Stavros Sachtouris
        self._test_0120_object_move()
913 a3bca46c Stavros Sachtouris
914 a3bca46c Stavros Sachtouris
    def _test_0120_object_move(self):
915 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
916 a3bca46c Stavros Sachtouris
        obj = 'test2'
917 a3bca46c Stavros Sachtouris
918 a3bca46c Stavros Sachtouris
        data = '{"key1": "val1", "key2": "val2"}'
919 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj + 'orig',
920 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream',
921 a3bca46c Stavros Sachtouris
            data=data,
922 a3bca46c Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
923 a3bca46c Stavros Sachtouris
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
924 a3bca46c Stavros Sachtouris
                'write': ['u2', 'u3']})
925 a3bca46c Stavros Sachtouris
926 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj + 'orig',
927 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.client.container, obj),
928 a3bca46c Stavros Sachtouris
            ignore_content_type=False,
929 a3bca46c Stavros Sachtouris
            content_type='application/json',
930 a3bca46c Stavros Sachtouris
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
931 a3bca46c Stavros Sachtouris
            permissions={'write': ['u5', 'accX:groupB']})
932 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
933 a3bca46c Stavros Sachtouris
934 a3bca46c Stavros Sachtouris
        """Check Metadata"""
935 a3bca46c Stavros Sachtouris
        r = self.client.get_object_meta(obj)
936 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
937 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
938 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
939 a3bca46c Stavros Sachtouris
940 a3bca46c Stavros Sachtouris
        """Check permissions"""
941 a3bca46c Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
942 a3bca46c Stavros Sachtouris
        self.assertFalse('read' in r)
943 a3bca46c Stavros Sachtouris
        self.assertTrue('u5' in r['write'])
944 a3bca46c Stavros Sachtouris
        self.assertTrue('accx:groupb' in r['write'])
945 a3bca46c Stavros Sachtouris
946 a3bca46c Stavros Sachtouris
        """Check destination account"""
947 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj,
948 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
949 a3bca46c Stavros Sachtouris
            content_encoding='utf8',
950 a3bca46c Stavros Sachtouris
            content_type='application/json',
951 a3bca46c Stavros Sachtouris
            destination_account='nonExistendAddress@NeverLand.com',
952 a3bca46c Stavros Sachtouris
            success=(201, 403))
953 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
954 a3bca46c Stavros Sachtouris
955 a3bca46c Stavros Sachtouris
        """Check destination being another container and also
956 a3bca46c Stavros Sachtouris
        content_type, content_disposition and content encoding"""
957 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj,
958 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.c1, obj),
959 a3bca46c Stavros Sachtouris
            content_encoding='utf8',
960 a3bca46c Stavros Sachtouris
            content_type='application/json',
961 a3bca46c Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
962 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
963 a3bca46c Stavros Sachtouris
        self.assertEqual(r.headers['content-type'],
964 a3bca46c Stavros Sachtouris
            'application/json; charset=UTF-8')
965 a3bca46c Stavros Sachtouris
        self.client.container = self.c1
966 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
967 a3bca46c Stavros Sachtouris
        self.assertTrue('content-disposition' in r\
968 a3bca46c Stavros Sachtouris
            and 'fname.ext' in r['content-disposition'])
969 a3bca46c Stavros Sachtouris
        etag = r['etag']
970 a3bca46c Stavros Sachtouris
        ctype = r['content-type']
971 a3bca46c Stavros Sachtouris
        self.assertEqual(ctype, 'application/json')
972 a3bca46c Stavros Sachtouris
973 a3bca46c Stavros Sachtouris
        """Check ignore_content_type and content_type"""
974 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj,
975 a3bca46c Stavros Sachtouris
            destination='/%s/%s' % (self.c2, obj),
976 a3bca46c Stavros Sachtouris
            ignore_content_type=True,
977 a3bca46c Stavros Sachtouris
            content_type='application/json')
978 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
979 a3bca46c Stavros Sachtouris
        self.assertNotEqual(r.headers['content-type'], 'application/json')
980 a3bca46c Stavros Sachtouris
981 a3bca46c Stavros Sachtouris
        """Check if_etag_(not_)match"""
982 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
983 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj,
984 a3bca46c Stavros Sachtouris
            destination='/%s/%s0' % (self.client.container, obj),
985 a3bca46c Stavros Sachtouris
            if_etag_match=etag)
986 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
987 a3bca46c Stavros Sachtouris
988 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj + '0',
989 a3bca46c Stavros Sachtouris
            destination='/%s/%s1' % (self.client.container, obj),
990 a3bca46c Stavros Sachtouris
            if_etag_not_match='lalala')
991 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
992 a3bca46c Stavros Sachtouris
993 a3bca46c Stavros Sachtouris
        """Check public and format """
994 a3bca46c Stavros Sachtouris
        r = self.client.object_move(obj + '1',
995 a3bca46c Stavros Sachtouris
            destination='/%s/%s2' % (self.client.container, obj),
996 a3bca46c Stavros Sachtouris
            format='xml', public=True)
997 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 201)
998 a3bca46c Stavros Sachtouris
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
999 a3bca46c Stavros Sachtouris
1000 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj + '2')
1001 a3bca46c Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
1002 a3bca46c Stavros Sachtouris
1003 a3bca46c Stavros Sachtouris
    def test_object_post(self):
1004 a3bca46c Stavros Sachtouris
        """Test object_POST"""
1005 a3bca46c Stavros Sachtouris
        self._test_0130_object_post()
1006 a3bca46c Stavros Sachtouris
1007 a3bca46c Stavros Sachtouris
    def _test_0130_object_post(self):
1008 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
1009 a3bca46c Stavros Sachtouris
        obj = 'test2'
1010 a3bca46c Stavros Sachtouris
        """create a filesystem file"""
1011 a3bca46c Stavros Sachtouris
        self.fnames.append(obj)
1012 a3bca46c Stavros Sachtouris
        newf = open(self.fnames[-1], 'w')
1013 a3bca46c Stavros Sachtouris
        newf.writelines(['ello!\n',
1014 a3bca46c Stavros Sachtouris
            'This is a test line\n',
1015 a3bca46c Stavros Sachtouris
            'inside a test file\n'])
1016 a3bca46c Stavros Sachtouris
        newf.close()
1017 a3bca46c Stavros Sachtouris
        """create a file on container"""
1018 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj,
1019 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream',
1020 a3bca46c Stavros Sachtouris
            data='H',
1021 a3bca46c Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1022 a3bca46c Stavros Sachtouris
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
1023 a3bca46c Stavros Sachtouris
                'write': ['u2', 'u3']})
1024 a3bca46c Stavros Sachtouris
1025 a3bca46c Stavros Sachtouris
        """Append tests update, content_range, content_type, content_length"""
1026 a3bca46c Stavros Sachtouris
        newf = open(obj, 'r')
1027 a3bca46c Stavros Sachtouris
        self.client.append_object(obj, newf)
1028 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
1029 a3bca46c Stavros Sachtouris
        self.assertTrue(r.text.startswith('Hello!'))
1030 a3bca46c Stavros Sachtouris
1031 a3bca46c Stavros Sachtouris
        """Overwrite tests update,
1032 a3bca46c Stavros Sachtouris
            content_type, content_length, content_range
1033 a3bca46c Stavros Sachtouris
        """
1034 a3bca46c Stavros Sachtouris
        newf.seek(0)
1035 a3bca46c Stavros Sachtouris
        r = self.client.overwrite_object(obj, 0, 10, newf)
1036 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
1037 a3bca46c Stavros Sachtouris
        self.assertTrue(r.text.startswith('ello!'))
1038 a3bca46c Stavros Sachtouris
        newf.close()
1039 a3bca46c Stavros Sachtouris
1040 a3bca46c Stavros Sachtouris
        """Truncate tests update,
1041 a3bca46c Stavros Sachtouris
            content_range, content_type, object_bytes and source_object"""
1042 a3bca46c Stavros Sachtouris
        r = self.client.truncate_object(obj, 5)
1043 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
1044 a3bca46c Stavros Sachtouris
        self.assertEqual(r.text, 'ello!')
1045 a3bca46c Stavros Sachtouris
1046 a3bca46c Stavros Sachtouris
        """Check metadata"""
1047 a3bca46c Stavros Sachtouris
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
1048 a3bca46c Stavros Sachtouris
        r = self.client.get_object_meta(obj)
1049 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1050 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1051 a3bca46c Stavros Sachtouris
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1052 a3bca46c Stavros Sachtouris
        self.client.del_object_meta(obj, 'mkey1')
1053 a3bca46c Stavros Sachtouris
        r = self.client.get_object_meta(obj)
1054 a3bca46c Stavros Sachtouris
        self.assertFalse('x-object-meta-mkey1' in r)
1055 a3bca46c Stavros Sachtouris
1056 a3bca46c Stavros Sachtouris
        """Check permissions"""
1057 a3bca46c Stavros Sachtouris
        self.client.set_object_sharing(obj,
1058 a3bca46c Stavros Sachtouris
            read_permition=['u4', 'u5'], write_permition=['u4'])
1059 a3bca46c Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
1060 a3bca46c Stavros Sachtouris
        self.assertTrue('read' in r)
1061 a3bca46c Stavros Sachtouris
        self.assertTrue('u5' in r['read'])
1062 a3bca46c Stavros Sachtouris
        self.assertTrue('write' in r)
1063 a3bca46c Stavros Sachtouris
        self.assertTrue('u4' in r['write'])
1064 a3bca46c Stavros Sachtouris
        self.client.del_object_sharing(obj)
1065 a3bca46c Stavros Sachtouris
        r = self.client.get_object_sharing(obj)
1066 a3bca46c Stavros Sachtouris
        self.assertTrue(len(r) == 0)
1067 a3bca46c Stavros Sachtouris
1068 a3bca46c Stavros Sachtouris
        """Check publish"""
1069 a3bca46c Stavros Sachtouris
        self.client.publish_object(obj)
1070 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
1071 a3bca46c Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
1072 a3bca46c Stavros Sachtouris
        self.client.unpublish_object(obj)
1073 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
1074 a3bca46c Stavros Sachtouris
        self.assertFalse('x-object-public' in r)
1075 a3bca46c Stavros Sachtouris
1076 a3bca46c Stavros Sachtouris
        """Check if_etag_(not)match"""
1077 a3bca46c Stavros Sachtouris
        etag = r['etag']
1078 a3bca46c Stavros Sachtouris
        """
1079 a3bca46c Stavros Sachtouris
        r = self.client.object_post(obj,
1080 a3bca46c Stavros Sachtouris
            update=True,
1081 a3bca46c Stavros Sachtouris
            public=True,
1082 a3bca46c Stavros Sachtouris
            if_etag_not_match=etag,
1083 a3bca46c Stavros Sachtouris
            success=(412, 202, 204))
1084 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 412)
1085 a3bca46c Stavros Sachtouris
        """
1086 a3bca46c Stavros Sachtouris
1087 a3bca46c Stavros Sachtouris
        r = self.client.object_post(obj, update=True, public=True,
1088 a3bca46c Stavros Sachtouris
            if_etag_match=etag, content_encoding='application/json')
1089 a3bca46c Stavros Sachtouris
1090 a3bca46c Stavros Sachtouris
        r = self.client.get_object_info(obj)
1091 a3bca46c Stavros Sachtouris
        helloVersion = r['x-object-version']
1092 a3bca46c Stavros Sachtouris
        self.assertTrue('x-object-public' in r)
1093 a3bca46c Stavros Sachtouris
        self.assertEqual(r['content-encoding'], 'application/json')
1094 a3bca46c Stavros Sachtouris
1095 a3bca46c Stavros Sachtouris
        """Check source_version and source_account and content_disposition"""
1096 a3bca46c Stavros Sachtouris
        r = self.client.object_post(obj,
1097 a3bca46c Stavros Sachtouris
            update=True,
1098 a3bca46c Stavros Sachtouris
            content_type='application/octet-srteam',
1099 a3bca46c Stavros Sachtouris
            content_length=5,
1100 a3bca46c Stavros Sachtouris
            content_range='bytes 1-5/*',
1101 a3bca46c Stavros Sachtouris
            source_object='/%s/%s' % (self.c2, obj),
1102 a3bca46c Stavros Sachtouris
            source_account='thisAccountWillNeverExist@adminland.com',
1103 a3bca46c Stavros Sachtouris
            source_version=helloVersion,
1104 a3bca46c Stavros Sachtouris
            data='12345',
1105 a3bca46c Stavros Sachtouris
            success=(403, 202, 204))
1106 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 403)
1107 a3bca46c Stavros Sachtouris
1108 a3bca46c Stavros Sachtouris
        r = self.client.object_post(obj,
1109 a3bca46c Stavros Sachtouris
            update=True,
1110 a3bca46c Stavros Sachtouris
            content_type='application/octet-srteam',
1111 a3bca46c Stavros Sachtouris
            content_length=5,
1112 a3bca46c Stavros Sachtouris
            content_range='bytes 1-5/*',
1113 a3bca46c Stavros Sachtouris
            source_object='/%s/%s' % (self.c2, obj),
1114 a3bca46c Stavros Sachtouris
            source_account=self.client.account,
1115 a3bca46c Stavros Sachtouris
            source_version=helloVersion,
1116 a3bca46c Stavros Sachtouris
            data='12345',
1117 a3bca46c Stavros Sachtouris
            content_disposition='attachment; filename="fname.ext"')
1118 a3bca46c Stavros Sachtouris
1119 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj)
1120 a3bca46c Stavros Sachtouris
        self.assertEqual(r.text, 'eello!')
1121 a3bca46c Stavros Sachtouris
        self.assertTrue('content-disposition' in r.headers\
1122 a3bca46c Stavros Sachtouris
            and 'fname.ext' in r.headers['content-disposition'])
1123 a3bca46c Stavros Sachtouris
1124 a3bca46c Stavros Sachtouris
        """Check manifest"""
1125 a3bca46c Stavros Sachtouris
        mobj = 'manifest.test'
1126 a3bca46c Stavros Sachtouris
        txt = ''
1127 a3bca46c Stavros Sachtouris
        for i in range(10):
1128 a3bca46c Stavros Sachtouris
            txt += '%s' % i
1129 a3bca46c Stavros Sachtouris
            r = self.client.object_put('%s/%s' % (mobj, i),
1130 a3bca46c Stavros Sachtouris
            data='%s' % i,
1131 a3bca46c Stavros Sachtouris
            content_length=1,
1132 a3bca46c Stavros Sachtouris
            success=201,
1133 a3bca46c Stavros Sachtouris
            content_encoding='application/octet-stream',
1134 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream')
1135 a3bca46c Stavros Sachtouris
1136 a3bca46c Stavros Sachtouris
        self.client.create_object_by_manifestation(mobj,
1137 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream')
1138 a3bca46c Stavros Sachtouris
1139 a3bca46c Stavros Sachtouris
        r = self.client.object_post(mobj,
1140 a3bca46c Stavros Sachtouris
            manifest='%s/%s' % (self.client.container, mobj))
1141 a3bca46c Stavros Sachtouris
1142 a3bca46c Stavros Sachtouris
        r = self.client.object_get(mobj)
1143 a3bca46c Stavros Sachtouris
        self.assertEqual(r.text, txt)
1144 a3bca46c Stavros Sachtouris
1145 a3bca46c Stavros Sachtouris
        """We need to check transfer_encoding """
1146 a3bca46c Stavros Sachtouris
1147 a3bca46c Stavros Sachtouris
    def test_object_delete(self):
1148 a3bca46c Stavros Sachtouris
        """Test object_DELETE"""
1149 a3bca46c Stavros Sachtouris
        self._test_0140_object_delete()
1150 a3bca46c Stavros Sachtouris
1151 a3bca46c Stavros Sachtouris
    def _test_0140_object_delete(self):
1152 a3bca46c Stavros Sachtouris
        self.client.container = self.c2
1153 a3bca46c Stavros Sachtouris
        obj = 'test2'
1154 a3bca46c Stavros Sachtouris
        """create a file on container"""
1155 a3bca46c Stavros Sachtouris
        r = self.client.object_put(obj,
1156 a3bca46c Stavros Sachtouris
            content_type='application/octet-stream',
1157 a3bca46c Stavros Sachtouris
            data='H',
1158 a3bca46c Stavros Sachtouris
            metadata={'mkey1': 'mval1', 'mkey2': 'mval2'},
1159 a3bca46c Stavros Sachtouris
            permissions={'read': ['accX:groupA', 'u1', 'u2'],
1160 a3bca46c Stavros Sachtouris
                'write': ['u2', 'u3']})
1161 a3bca46c Stavros Sachtouris
1162 a3bca46c Stavros Sachtouris
        """Check with false until"""
1163 a3bca46c Stavros Sachtouris
        r = self.client.object_delete(obj, until=1000000)
1164 a3bca46c Stavros Sachtouris
1165 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj, success=(200, 404))
1166 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 200)
1167 a3bca46c Stavros Sachtouris
1168 a3bca46c Stavros Sachtouris
        """Check normal case"""
1169 a3bca46c Stavros Sachtouris
        r = self.client.object_delete(obj)
1170 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 204)
1171 a3bca46c Stavros Sachtouris
1172 a3bca46c Stavros Sachtouris
        r = self.client.object_get(obj, success=(200, 404))
1173 a3bca46c Stavros Sachtouris
        self.assertEqual(r.status_code, 404)
1174 a3bca46c Stavros Sachtouris
1175 a3bca46c Stavros Sachtouris
    def create_large_file(self, size, name):
1176 a3bca46c Stavros Sachtouris
        """Create a large file at fs"""
1177 7f87da8b Stavros Sachtouris
        Ki = size / 10
1178 7f87da8b Stavros Sachtouris
        bytelist = [b * Ki for b in range(size / Ki)]
1179 4b6c06ed Stavros Sachtouris
        with open(name, 'w') as f:
1180 a3bca46c Stavros Sachtouris
            def append2file(step):
1181 a3bca46c Stavros Sachtouris
                f.seek(step)
1182 7f87da8b Stavros Sachtouris
                f.write(os.urandom(Ki))
1183 a3bca46c Stavros Sachtouris
            self.do_with_progress_bar(
1184 a3bca46c Stavros Sachtouris
                append2file,
1185 a3bca46c Stavros Sachtouris
                ' create rand file %s (%sB): ' % (name, size),
1186 7f87da8b Stavros Sachtouris
                bytelist)