Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / pithos.py @ f5f2dc53

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