Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests / pithos.py @ 773d61ca

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