Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / pithos.py @ 45a3721b

History | View | Annotate | Download (46.6 kB)

1
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
import time
35
import datetime
36
from os import urandom
37
from tempfile import NamedTemporaryFile
38
from string import ascii_letters
39

    
40
from kamaki.clients import livetest, ClientError
41
from kamaki.clients.pithos import PithosClient
42
from kamaki.clients.astakos import AstakosClient
43

    
44

    
45
def chargen():
46
    """10 + 2 * 26 + 26 = 88"""
47
    while True:
48
        for CH in xrange(10):
49
            yield '%s' % CH
50
        for CH in ascii_letters:
51
            yield CH
52
        for CH in '~!@#$%^&*()_+`-=:";|<>?,./':
53
            yield CH
54

    
55

    
56
def sample_block(f, block):
57
    block_size = 4 * 1024 * 1024
58
    f.seek(block * block_size)
59
    ch = [f.read(1)]
60
    f.seek(block_size / 2, 1)
61
    ch.append(f.read(1))
62
    f.seek((block + 1) * block_size - 1)
63
    ch.append(f.read(1))
64
    return ch
65

    
66

    
67
class Pithos(livetest.Generic):
68

    
69
    files = []
70

    
71
    def setUp(self):
72
        self.cloud = 'cloud.%s' % self['testcloud']
73
        aurl, self.token = self[self.cloud, 'url'], self[self.cloud, 'token']
74
        self.auth_base = AstakosClient(aurl, self.token)
75
        purl = self.auth_base.get_service_endpoints(
76
            'object-store')['publicURL']
77
        self.uuid = self.auth_base.user_term('id')
78
        self.client = PithosClient(purl, self.token, self.uuid)
79

    
80
        self.now = time.mktime(time.gmtime())
81
        self.now_unformated = datetime.datetime.utcnow()
82
        self._init_data()
83

    
84
        """Prepare an object to be shared - also its container"""
85
        self.client.container = self.c1
86
        self.client.object_post(
87
            'test',
88
            update=True,
89
            permissions={'read': [self.client.account]})
90

    
91
        self.create_remote_object(self.c1, 'another.test')
92

    
93
    def _init_data(self):
94
        self.c1 = 'c1_' + unicode(self.now)
95
        self.c2 = 'c2_' + unicode(self.now)
96
        self.c3 = 'c3_' + unicode(self.now)
97
        try:
98
            self.client.create_container(self.c2)
99
        except ClientError:
100
            pass
101
        try:
102
            self.client.create_container(self.c1)
103
        except ClientError:
104
            pass
105
        try:
106
            self.client.create_container(self.c3)
107
        except ClientError:
108
            pass
109

    
110
        self.create_remote_object(self.c1, 'test')
111
        self.create_remote_object(self.c2, 'test')
112
        self.create_remote_object(self.c1, 'test1')
113
        self.create_remote_object(self.c2, 'test1')
114

    
115
    def create_remote_object(self, container, obj):
116
        self.client.container = container
117
        self.client.object_put(
118
            obj,
119
            content_type='application/octet-stream',
120
            data='file %s that lives in %s' % (obj, container),
121
            metadata={'incontainer': container})
122

    
123
    def forceDeleteContainer(self, container):
124
        self.client.container = container
125
        try:
126
            r = self.client.list_objects()
127
        except ClientError:
128
            return
129
        for obj in r:
130
            name = obj['name']
131
            self.client.del_object(name)
132
        r = self.client.container_delete()
133
        self.container = ''
134

    
135
    def tearDown(self):
136
        """Destroy test cases"""
137
        for f in self.files:
138
            f.close()
139
        self.forceDeleteContainer(self.c1)
140
        self.forceDeleteContainer(self.c2)
141
        try:
142
            self.forceDeleteContainer(self.c3)
143
        except ClientError:
144
            pass
145
        self.client.container = ''
146

    
147
    def test_000(self):
148
        """Prepare a full Pithos+ test"""
149
        print('')
150
        super(self.__class__, self).test_000()
151

    
152
    def test_account_head(self):
153
        """Test account_HEAD"""
154
        self._test_0010_account_head()
155

    
156
    def _test_0010_account_head(self):
157
        r = self.client.account_head()
158
        self.assertEqual(r.status_code, 204)
159

    
160
        r = self.client.account_head(until='1000000000')
161
        self.assertEqual(r.status_code, 204)
162

    
163
        r = self.client.get_account_info(until='1000000000')
164
        datestring = unicode(r['x-account-until-timestamp'])
165
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
166

    
167
        r = self.client.get_account_quota()
168
        self.assertTrue('x-account-policy-quota' in r)
169

    
170
        #r = self.client.get_account_versioning()
171
        #self.assertTrue('x-account-policy-versioning' in r)
172

    
173
        """Check if(un)modified_since"""
174
        for format in self.client.DATE_FORMATS:
175
            now_formated = self.now_unformated.strftime(format)
176
            r1 = self.client.account_head(
177
                if_modified_since=now_formated, success=(204, 304, 412))
178
            sc1 = r1.status_code
179
            r2 = self.client.account_head(
180
                if_unmodified_since=now_formated, success=(204, 304, 412))
181
            sc2 = r2.status_code
182
            self.assertNotEqual(sc1, sc2)
183

    
184
    def test_account_get(self):
185
        """Test account_GET"""
186
        self._test_0020_account_get()
187

    
188
    def _test_0020_account_get(self):
189
        #r = self.client.account_get()
190
        #self.assertEqual(r.status_code, 200)
191
        r = self.client.list_containers()
192
        fullLen = len(r)
193
        self.assertTrue(fullLen > 2)
194

    
195
        r = self.client.account_get(limit=1)
196
        self.assertEqual(len(r.json), 1)
197

    
198
        r = self.client.account_get(marker='c2_')
199
        temp_c0 = r.json[0]['name']
200
        temp_c2 = r.json[2]['name']
201

    
202
        r = self.client.account_get(limit=2, marker='c2_')
203
        conames = [container['name'] for container in r.json if (
204
            container['name'].lower().startswith('c2_'))]
205
        self.assertTrue(temp_c0 in conames)
206
        self.assertFalse(temp_c2 in conames)
207

    
208
        r = self.client.account_get(show_only_shared=True)
209
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
210

    
211
        r = self.client.account_get(until=1342609206.0)
212
        self.assertTrue(len(r.json) <= fullLen)
213

    
214
        """Check if(un)modified_since"""
215
        for format in self.client.DATE_FORMATS:
216
            now_formated = self.now_unformated.strftime(format)
217
            r1 = self.client.account_get(
218
                if_modified_since=now_formated, success=(200, 304, 412))
219
            sc1 = r1.status_code
220
            r2 = self.client.account_get(
221
                if_unmodified_since=now_formated, success=(200, 304, 412))
222
            sc2 = r2.status_code
223
            self.assertNotEqual(sc1, sc2)
224

    
225
        """Check sharing_accounts"""
226
        r = self.client.get_sharing_accounts()
227
        try:
228
            self.assertTrue(len(r) > 0)
229
        except AssertionError as e:
230
            print '\n\tWARNING: Are there any sharers to your account?'
231
            self.assertEqual(len(r), 0)
232
            print '\tIf there are, this (%s) is an error, else it is OK' % e
233

    
234
    def test_account_post(self):
235
        """Test account_POST"""
236
        self._test_0030_account_post()
237

    
238
    def _test_0030_account_post(self):
239
        r = self.client.account_post()
240
        self.assertEqual(r.status_code, 202)
241
        grpName = 'grp' + unicode(self.now)
242

    
243
        """Method set/del_account_meta and set_account_groupcall use
244
            account_post internally
245
        """
246
        u1 = self.client.account
247
        #  Invalid display name
248
        u2 = '1nc0r3c7-d15p14y-n4m3'
249
        #  valid display name
250
        u3 = '6488c1b2-cb06-40a8-a02a-d474b8d29c59'
251
        self.assertRaises(
252
            ClientError,
253
            self.client.set_account_group,
254
            grpName, [u1, u2])
255
        self.client.set_account_group(grpName, [u1])
256
        r = self.client.get_account_group()
257
        self.assertEqual(r['x-account-group-' + grpName], '%s' % u1)
258
        try:
259
            self.client.set_account_group(grpName, [u1, u3])
260
            r = self.client.get_account_group()
261
            self.assertEqual(
262
                r['x-account-group-' + grpName], '%s,%s' % (u1, u3))
263
        except:
264
            print('\tInvalid user id %s (it is ok, though)' % u3)
265
        self.client.del_account_group(grpName)
266
        r = self.client.get_account_group()
267
        self.assertTrue('x-account-group-' + grpName not in r)
268

    
269
        mprefix = 'meta' + unicode(self.now)
270
        self.client.set_account_meta({
271
            mprefix + '1': 'v1', mprefix + '2': 'v2'})
272
        r = self.client.get_account_meta()
273
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
274
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
275

    
276
        self.client.del_account_meta(mprefix + '1')
277
        r = self.client.get_account_meta()
278
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
279

    
280
        self.client.del_account_meta(mprefix + '2')
281
        r = self.client.get_account_meta()
282
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
283

    
284
        """Missing testing for quota, versioning, because normally
285
        you don't have permissions to modify those at account level
286
        """
287

    
288
        #newquota = 1000000
289
        #self.client.set_account_quota(newquota)
290
        #r = self.client.get_account_info()
291
        #print(unicode(r))
292
        #r = self.client.get_account_quota()
293
        #self.assertEqual(r['x-account-policy-quota'], newquota)
294
        #self.client.set_account_versioning('auto')
295

    
296
    def test_container_head(self):
297
        """Test container_HEAD"""
298
        self._test_0040_container_head()
299

    
300
    def _test_0040_container_head(self):
301
        self.client.container = self.c1
302

    
303
        r = self.client.container_head()
304
        self.assertEqual(r.status_code, 204)
305

    
306
        """Check until"""
307
        r = self.client.container_head(until=1000000, success=(204, 404))
308
        self.assertEqual(r.status_code, 404)
309

    
310
        """Check and if(un)modified_since"""
311
        for format in self.client.DATE_FORMATS:
312
            now_formated = self.now_unformated.strftime(format)
313
            r1 = self.client.container_head(
314
                if_modified_since=now_formated, success=(204, 304, 412))
315
            sc1 = r1.status_code
316
            r2 = self.client.container_head(
317
                if_unmodified_since=now_formated, success=(204, 304, 412))
318
            sc2 = r2.status_code
319
            self.assertNotEqual(sc1, sc2)
320

    
321
        """Check container object meta"""
322
        r = self.client.get_container_object_meta()
323
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
324

    
325
    def test_container_get(self):
326
        """Test container_GET"""
327
        self._test_0050_container_get()
328

    
329
    def _test_0050_container_get(self):
330
        self.client.container = self.c1
331

    
332
        r = self.client.container_get()
333
        self.assertEqual(r.status_code, 200)
334
        fullLen = len(r.json)
335

    
336
        r = self.client.container_get(prefix='test')
337
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
338
        self.assertTrue(len(r.json) > 1)
339
        self.assertEqual(len(r.json), len(lalobjects))
340

    
341
        r = self.client.container_get(limit=1)
342
        self.assertEqual(len(r.json), 1)
343

    
344
        r = self.client.container_get(marker='another')
345
        self.assertTrue(len(r.json) > 1)
346
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
347
        self.assertEqual(len(r.json), len(neobjects))
348

    
349
        r = self.client.container_get(prefix='another.test', delimiter='.')
350
        self.assertTrue(fullLen > len(r.json))
351

    
352
        r = self.client.container_get(path='/')
353
        self.assertEqual(fullLen, len(r.json))
354

    
355
        r = self.client.container_get(format='xml')
356
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
357

    
358
        r = self.client.container_get(meta=['incontainer'])
359
        self.assertTrue(len(r.json) > 0)
360

    
361
        r = self.client.container_get(show_only_shared=True)
362
        self.assertTrue(len(r.json) < fullLen)
363

    
364
        try:
365
            r = self.client.container_get(until=1000000000)
366
            datestring = unicode(r.headers['x-account-until-timestamp'])
367
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
368

    
369
        except ClientError:
370

    
371
            pass
372

    
373
        """Check and if un/modified_since"""
374
        for format in self.client.DATE_FORMATS:
375
            now_formated = self.now_unformated.strftime(format)
376
            r1 = self.client.container_get(
377
                if_modified_since=now_formated, success=(200, 304, 412))
378
            sc1 = r1.status_code
379
            r2 = self.client.container_get(
380
                if_unmodified_since=now_formated, success=(200, 304, 412))
381
            sc2 = r2.status_code
382
            self.assertNotEqual(sc1, sc2)
383

    
384
    def test_container_put(self):
385
        """Test container_PUT"""
386
        self._test_0050_container_put()
387

    
388
    def _test_0050_container_put(self):
389
        self.client.container = self.c2
390

    
391
        r = self.client.create_container()
392
        self.assertTrue(isinstance(r, dict))
393

    
394
        r = self.client.get_container_limit(self.client.container)
395
        cquota = r.values()[0]
396
        newquota = 2 * int(cquota)
397

    
398
        r = self.client.create_container(sizelimit=newquota)
399
        self.assertTrue(isinstance(r, dict))
400

    
401
        r = self.client.get_container_limit(self.client.container)
402
        xquota = int(r.values()[0])
403
        self.assertEqual(newquota, xquota)
404

    
405
        r = self.client.create_container(versioning='auto')
406
        self.assertTrue(isinstance(r, dict))
407

    
408
        r = self.client.get_container_versioning(self.client.container)
409
        nvers = r.values()[0]
410
        self.assertEqual('auto', nvers)
411

    
412
        r = self.client.container_put(versioning='none')
413
        self.assertEqual(r.status_code, 202)
414

    
415
        r = self.client.get_container_versioning(self.client.container)
416
        nvers = r.values()[0]
417
        self.assertEqual('none', nvers)
418

    
419
        r = self.client.create_container(metadata={'m1': 'v1', 'm2': 'v2'})
420
        self.assertTrue(isinstance(r, dict))
421

    
422
        r = self.client.get_container_meta(self.client.container)
423
        self.assertTrue('x-container-meta-m1' in r)
424
        self.assertEqual(r['x-container-meta-m1'], 'v1')
425
        self.assertTrue('x-container-meta-m2' in r)
426
        self.assertEqual(r['x-container-meta-m2'], 'v2')
427

    
428
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
429
        self.assertEqual(r.status_code, 202)
430

    
431
        r = self.client.get_container_meta(self.client.container)
432
        self.assertTrue('x-container-meta-m1' not in r)
433
        self.assertTrue('x-container-meta-m2' in r)
434
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
435

    
436
        self.client.del_container_meta(self.client.container)
437

    
438
    def test_container_post(self):
439
        """Test container_POST"""
440
        self._test_0060_container_post()
441

    
442
    def _test_0060_container_post(self):
443
        self.client.container = self.c2
444

    
445
        """Simple post"""
446
        r = self.client.container_post()
447
        self.assertEqual(r.status_code, 202)
448

    
449
        """post meta"""
450
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
451
        r = self.client.get_container_meta(self.client.container)
452
        self.assertTrue('x-container-meta-m1' in r)
453
        self.assertEqual(r['x-container-meta-m1'], 'v1')
454
        self.assertTrue('x-container-meta-m2' in r)
455
        self.assertEqual(r['x-container-meta-m2'], 'v2')
456

    
457
        """post/2del meta"""
458
        r = self.client.del_container_meta('m1')
459
        r = self.client.set_container_meta({'m2': 'v2a'})
460
        r = self.client.get_container_meta(self.client.container)
461
        self.assertTrue('x-container-meta-m1' not in r)
462
        self.assertTrue('x-container-meta-m2' in r)
463
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
464

    
465
        """check quota"""
466
        r = self.client.get_container_limit(self.client.container)
467
        cquota = r.values()[0]
468
        newquota = 2 * int(cquota)
469
        r = self.client.set_container_limit(newquota)
470
        r = self.client.get_container_limit(self.client.container)
471
        xquota = int(r.values()[0])
472
        self.assertEqual(newquota, xquota)
473
        r = self.client.set_container_limit(cquota)
474
        r = self.client.get_container_limit(self.client.container)
475
        xquota = r.values()[0]
476
        self.assertEqual(cquota, xquota)
477

    
478
        """Check versioning"""
479
        self.client.set_container_versioning('auto')
480
        r = self.client.get_container_versioning(self.client.container)
481
        nvers = r.values()[0]
482
        self.assertEqual('auto', nvers)
483
        self.client.set_container_versioning('none')
484
        r = self.client.get_container_versioning(self.client.container)
485
        nvers = r.values()[0]
486
        self.assertEqual('none', nvers)
487

    
488
        """put_block uses content_type and content_length to
489
        post blocks of data 2 container. All that in upload_object"""
490
        """Change a file at fs"""
491
        f = self.create_large_file(1024 * 1024 * 100)
492
        """Upload it at a directory in container"""
493
        self.client.create_directory('dir')
494
        r = self.client.upload_object('/dir/sample.file', f)
495
        for term in ('content-length', 'content-type', 'x-object-version'):
496
            self.assertTrue(term in r)
497
        """Check if file has been uploaded"""
498
        r = self.client.get_object_info('/dir/sample.file')
499
        self.assertTrue(int(r['content-length']) > 100000000)
500

    
501
        """What is tranfer_encoding? What should I check about it? """
502
        #TODO
503

    
504
        """Check update=False"""
505
        r = self.client.object_post(
506
            'test',
507
            update=False,
508
            metadata={'newmeta': 'newval'})
509

    
510
        r = self.client.get_object_info('test')
511
        self.assertTrue('x-object-meta-newmeta' in r)
512
        self.assertFalse('x-object-meta-incontainer' in r)
513

    
514
        r = self.client.del_container_meta('m2')
515

    
516
    def test_container_delete(self):
517
        """Test container_DELETE"""
518
        self._test_0070_container_delete()
519

    
520
    def _test_0070_container_delete(self):
521

    
522
        """Fail to delete a non-empty container"""
523
        self.client.container = self.c2
524
        r = self.client.container_delete(success=409)
525
        self.assertEqual(r.status_code, 409)
526

    
527
        """Fail to delete c3 (empty) container"""
528
        self.client.container = self.c3
529
        r = self.client.container_delete(until='1000000000')
530
        self.assertEqual(r.status_code, 204)
531

    
532
        """Delete c3 (empty) container"""
533
        r = self.client.container_delete()
534
        self.assertEqual(r.status_code, 204)
535

    
536
        """Purge container(empty a container), check versionlist"""
537
        self.client.container = self.c1
538
        r = self.client.object_head('test', success=(200, 404))
539
        self.assertEqual(r.status_code, 200)
540
        self.client.del_container(delimiter='/')
541
        r = self.client.object_head('test', success=(200, 404))
542
        self.assertEqual(r.status_code, 404)
543
        r = self.client.get_object_versionlist('test')
544
        self.assertTrue(len(r) > 0)
545
        self.assertTrue(len(r[0]) > 1)
546
        self.client.purge_container()
547
        self.assertRaises(
548
            ClientError, self.client.get_object_versionlist, 'test')
549

    
550
    def _test_0080_recreate_deleted_data(self):
551
        self._init_data()
552

    
553
    def test_object_head(self):
554
        """Test object_HEAD"""
555
        self._test_0090_object_head()
556

    
557
    def _test_0090_object_head(self):
558
        self.client.container = self.c2
559
        obj = 'test'
560

    
561
        r = self.client.object_head(obj)
562
        self.assertEqual(r.status_code, 200)
563
        etag = r.headers['etag']
564
        real_version = r.headers['x-object-version']
565

    
566
        self.assertRaises(
567
            ClientError, self.client.object_head, obj, version=-10)
568
        r = self.client.object_head(obj, version=real_version)
569
        self.assertEqual(r.headers['x-object-version'], real_version)
570

    
571
        r = self.client.object_head(obj, if_etag_match=etag)
572
        self.assertEqual(r.status_code, 200)
573

    
574
        r = self.client.object_head(
575
            obj, if_etag_not_match=etag, success=(200, 412, 304))
576
        self.assertNotEqual(r.status_code, 200)
577

    
578
        r = self.client.object_head(
579
            obj, version=real_version, if_etag_match=etag, success=200)
580
        self.assertEqual(r.status_code, 200)
581

    
582
        """Check and if(un)modified_since"""
583
        for format in self.client.DATE_FORMATS:
584
            now_formated = self.now_unformated.strftime(format)
585
            r1 = self.client.object_head(
586
                obj, if_modified_since=now_formated, success=(200, 304, 412))
587
            sc1 = r1.status_code
588
            r2 = self.client.object_head(
589
                obj, if_unmodified_since=now_formated, success=(200, 304, 412))
590
            sc2 = r2.status_code
591
            self.assertNotEqual(sc1, sc2)
592

    
593
    def test_object_get(self):
594
        """Test object_GET"""
595
        self._test_0100_object_get()
596

    
597
    def _test_0100_object_get(self):
598
        self.client.container = self.c1
599
        obj = 'test'
600

    
601
        r = self.client.object_get(obj)
602
        self.assertEqual(r.status_code, 200)
603

    
604
        osize = int(r.headers['content-length'])
605
        etag = r.headers['etag']
606

    
607
        r = self.client.object_get(obj, hashmap=True)
608
        for term in ('hashes', 'block_hash', 'block_hash', 'bytes'):
609
            self.assertTrue(term in r.json)
610

    
611
        r = self.client.object_get(obj, format='xml', hashmap=True)
612
        self.assertEqual(len(r.text.split('hash>')), 3)
613

    
614
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
615
        r = self.client.object_get(
616
            obj, data_range=rangestr, success=(200, 206))
617
        partsize = int(r.headers['content-length'])
618
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
619

    
620
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
621
        r = self.client.object_get(
622
            obj, data_range=rangestr, if_range=True, success=(200, 206))
623
        partsize = int(r.headers['content-length'])
624
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
625

    
626
        r = self.client.object_get(obj, if_etag_match=etag)
627
        self.assertEqual(r.status_code, 200)
628

    
629
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
630
        self.assertEqual(r.status_code, 200)
631

    
632
        """Check and if(un)modified_since"""
633
        for format in self.client.DATE_FORMATS:
634
            now_formated = self.now_unformated.strftime(format)
635
            r1 = self.client.object_get(
636
                obj, if_modified_since=now_formated, success=(200, 304, 412))
637
            sc1 = r1.status_code
638
            r2 = self.client.object_get(
639
                obj, if_unmodified_since=now_formated, success=(200, 304, 412))
640
            sc2 = r2.status_code
641
            self.assertNotEqual(sc1, sc2)
642

    
643
        """Upload an object to download"""
644
        container_info_cache = dict()
645
        trg_fname = 'remotefile_%s' % self.now
646
        f_size = 59247824
647
        src_f = self.create_large_file(f_size)
648
        print('\tUploading...')
649
        r = self.client.upload_object(
650
            trg_fname, src_f, container_info_cache=container_info_cache)
651
        print('\tDownloading...')
652
        self.files.append(NamedTemporaryFile())
653
        dnl_f = self.files[-1]
654
        self.client.download_object(trg_fname, dnl_f)
655

    
656
        print('\tCheck if files match...')
657
        for pos in (0, f_size / 2, f_size - 128):
658
            src_f.seek(pos)
659
            dnl_f.seek(pos)
660
            self.assertEqual(src_f.read(64), dnl_f.read(64))
661

    
662
        print('\tDownload KiBs to string and check again...')
663
        for pos in (0, f_size / 2, f_size - 256):
664
            src_f.seek(pos)
665
            tmp_s = self.client.download_to_string(
666
                trg_fname, range_str='%s-%s' % (pos, (pos + 128)))
667
            self.assertEqual(tmp_s, src_f.read(len(tmp_s)))
668
        print('\tUploading KiBs as strings...')
669
        trg_fname = 'fromString_%s' % self.now
670
        src_size = 2 * 1024
671
        src_f.seek(0)
672
        src_str = src_f.read(src_size)
673
        self.client.upload_from_string(trg_fname, src_str)
674
        print('\tDownload as string and check...')
675
        tmp_s = self.client.download_to_string(trg_fname)
676
        self.assertEqual(tmp_s, src_str)
677

    
678
        """Upload a boring file"""
679
        trg_fname = 'boringfile_%s' % self.now
680
        src_f = self.create_boring_file(42)
681
        print('\tUploading boring file...')
682
        self.client.upload_object(
683
            trg_fname, src_f, container_info_cache=container_info_cache)
684
        print('\tDownloading boring file...')
685
        self.files.append(NamedTemporaryFile())
686
        dnl_f = self.files[-1]
687
        self.client.download_object(trg_fname, dnl_f)
688

    
689
        print('\tCheck if files match...')
690
        for i in range(42):
691
            self.assertEqual(sample_block(src_f, i), sample_block(dnl_f, i))
692

    
693
    def test_object_put(self):
694
        """Test object_PUT"""
695
        self._test_object_put()
696

    
697
    def _test_object_put(self):
698
        self.client.container = self.c2
699
        obj = 'another.test'
700

    
701
        self.client.create_object(obj + '.FAKE')
702
        r = self.client.get_object_info(obj + '.FAKE')
703
        self.assertEqual(r['content-type'], 'application/octet-stream')
704

    
705
        """create the object"""
706
        r = self.client.object_put(
707
            obj,
708
            data='a',
709
            content_type='application/octer-stream',
710
            permissions=dict(
711
                read=['accX:groupA', 'u1', 'u2'],
712
                write=['u2', 'u3']),
713
            metadata=dict(key1='val1', key2='val2'),
714
            content_encoding='UTF-8',
715
            content_disposition='attachment; filename="fname.ext"')
716
        self.assertEqual(r.status_code, 201)
717
        etag = r.headers['etag']
718

    
719
        """Check content-disposition"""
720
        r = self.client.get_object_info(obj)
721
        self.assertTrue('content-disposition' in r)
722

    
723
        """Check permissions"""
724
        r = self.client.get_object_sharing(obj)
725
        self.assertTrue('accx:groupa' in r['read'])
726
        self.assertTrue('u1' in r['read'])
727
        self.assertTrue('u2' in r['write'])
728
        self.assertTrue('u3' in r['write'])
729

    
730
        """Check metadata"""
731
        r = self.client.get_object_meta(obj)
732
        self.assertEqual(r['x-object-meta-key1'], 'val1')
733
        self.assertEqual(r['x-object-meta-key2'], 'val2')
734

    
735
        """Check public and if_etag_match"""
736
        r = self.client.object_put(
737
            obj,
738
            if_etag_match=etag,
739
            data='b',
740
            content_type='application/octet-stream',
741
            public=True)
742

    
743
        r = self.client.object_get(obj)
744
        self.assertTrue('x-object-public' in r.headers)
745
        vers2 = int(r.headers['x-object-version'])
746
        etag = r.headers['etag']
747
        self.assertEqual(r.text, 'b')
748

    
749
        """Check if_etag_not_match"""
750
        r = self.client.object_put(
751
            obj,
752
            if_etag_not_match=etag,
753
            data='c',
754
            content_type='application/octet-stream',
755
            success=(201, 412))
756
        self.assertEqual(r.status_code, 412)
757

    
758
        """Check content_type and content_length"""
759
        tmpdir = 'dir' + unicode(self.now)
760
        r = self.client.object_put(
761
            tmpdir, content_type='application/directory', content_length=0)
762

    
763
        r = self.client.get_object_info(tmpdir)
764
        self.assertEqual(r['content-type'], 'application/directory')
765

    
766
        """Check copy_from, content_encoding"""
767
        r = self.client.object_put(
768
            '%s/%s' % (tmpdir, obj),
769
            format=None,
770
            copy_from='/%s/%s' % (self.client.container, obj),
771
            content_encoding='application/octet-stream',
772
            source_account=self.client.account,
773
            content_length=0,
774
            success=201)
775
        self.assertEqual(r.status_code, 201)
776

    
777
        """Test copy_object for cross-conctainer copy"""
778
        self.client.copy_object(
779
            src_container=self.c2,
780
            src_object='%s/%s' % (tmpdir, obj),
781
            dst_container=self.c1,
782
            dst_object=obj)
783
        self.client.container = self.c1
784
        r1 = self.client.get_object_info(obj)
785
        self.client.container = self.c2
786
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
787
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
788

    
789
        """Check cross-container copy_from, content_encoding"""
790
        self.client.container = self.c1
791
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
792
        r = self.client.object_put(
793
            obj,
794
            format=None,
795
            copy_from=fromstr,
796
            content_encoding='application/octet-stream',
797
            source_account=self.client.account,
798
            content_length=0,
799
            success=201)
800

    
801
        self.assertEqual(r.status_code, 201)
802
        r = self.client.get_object_info(obj)
803
        self.assertEqual(r['etag'], etag)
804

    
805
        """Check source_account"""
806
        self.client.container = self.c2
807
        fromstr = '/%s/%s' % (self.c1, obj)
808
        r = self.client.object_put(
809
            '%sv2' % obj,
810
            format=None,
811
            move_from=fromstr,
812
            content_encoding='application/octet-stream',
813
            source_account='nonExistendAddress@NeverLand.com',
814
            content_length=0,
815
            success=(201, 403))
816
        self.assertEqual(r.status_code, 403)
817

    
818
        """Check cross-container move_from"""
819
        self.client.container = self.c1
820
        r1 = self.client.get_object_info(obj)
821
        self.client.container = self.c2
822
        self.client.move_object(
823
            src_container=self.c1,
824
            src_object=obj,
825
            dst_container=self.c2,
826
            dst_object=obj + 'v0')
827
        r0 = self.client.get_object_info(obj + 'v0')
828
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
829

    
830
        """Check move_from"""
831
        r = self.client.object_put(
832
            '%sv1' % obj,
833
            format=None,
834
            move_from='/%s/%s' % (self.c2, obj),
835
            source_version=vers2,
836
            content_encoding='application/octet-stream',
837
            content_length=0, success=201)
838

    
839
        """Check manifest"""
840
        mobj = 'manifest.test'
841
        txt = ''
842
        for i in range(10):
843
            txt += '%s' % i
844
            r = self.client.object_put(
845
                '%s/%s' % (mobj, i),
846
                data='%s' % i,
847
                content_length=1,
848
                success=201,
849
                content_type='application/octet-stream',
850
                content_encoding='application/octet-stream')
851

    
852
        r = self.client.object_put(
853
            mobj,
854
            content_length=0,
855
            content_type='application/octet-stream',
856
            manifest='%s/%s' % (self.client.container, mobj))
857

    
858
        r = self.client.object_get(mobj)
859
        self.assertEqual(r.text, txt)
860

    
861
        """Upload a local file with one request"""
862
        newf = self.create_large_file(1024 * 10)
863
        self.client.upload_object('sample.file', newf)
864
        """Check if file has been uploaded"""
865
        r = self.client.get_object_info('sample.file')
866
        self.assertEqual(int(r['content-length']), 10240)
867

    
868
        """Some problems with transfer-encoding?"""
869

    
870
    def test_object_copy(self):
871
        """Test object_COPY"""
872
        self._test_0110_object_copy()
873

    
874
    def _test_0110_object_copy(self):
875
        #  TODO: check with source_account option
876
        self.client.container = self.c2
877
        obj = 'test2'
878

    
879
        data = '{"key1":"val1", "key2":"val2"}'
880
        r = self.client.object_put(
881
            '%sorig' % obj,
882
            content_type='application/octet-stream',
883
            data=data,
884
            metadata=dict(mkey1='mval1', mkey2='mval2'),
885
            permissions=dict(
886
                read=['accX:groupA', 'u1', 'u2'],
887
                write=['u2', 'u3']),
888
            content_disposition='attachment; filename="fname.ext"')
889

    
890
        r = self.client.object_copy(
891
            '%sorig' % obj,
892
            destination='/%s/%s' % (self.client.container, obj),
893
            ignore_content_type=False, content_type='application/json',
894
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
895
            permissions={'write': ['u5', 'accX:groupB']})
896
        self.assertEqual(r.status_code, 201)
897

    
898
        """Check content-disposition"""
899
        r = self.client.get_object_info(obj)
900
        self.assertTrue('content-disposition' in r)
901

    
902
        """Check Metadata"""
903
        r = self.client.get_object_meta(obj)
904
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
905
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
906
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
907

    
908
        """Check permissions"""
909
        r = self.client.get_object_sharing(obj)
910
        self.assertFalse('read' in r or 'u2' in r['write'])
911
        self.assertTrue('accx:groupb' in r['write'])
912

    
913
        """Check destination account"""
914
        r = self.client.object_copy(
915
            obj,
916
            destination='/%s/%s' % (self.c1, obj),
917
            content_encoding='utf8',
918
            content_type='application/json',
919
            destination_account='nonExistendAddress@NeverLand.com',
920
            success=(201, 403))
921
        self.assertEqual(r.status_code, 403)
922

    
923
        """Check destination being another container
924
        and also content_type and content encoding"""
925
        r = self.client.object_copy(
926
            obj,
927
            destination='/%s/%s' % (self.c1, obj),
928
            content_encoding='utf8',
929
            content_type='application/json')
930
        self.assertEqual(r.status_code, 201)
931
        self.assertEqual(
932
            r.headers['content-type'],
933
            'application/json; charset=UTF-8')
934

    
935
        """Check ignore_content_type and content_type"""
936
        r = self.client.object_get(obj)
937
        etag = r.headers['etag']
938
        ctype = r.headers['content-type']
939
        self.assertEqual(ctype, 'application/json')
940

    
941
        r = self.client.object_copy(
942
            '%sorig' % obj,
943
            destination='/%s/%s0' % (self.client.container, obj),
944
            ignore_content_type=True,
945
            content_type='application/json')
946
        self.assertEqual(r.status_code, 201)
947
        self.assertNotEqual(r.headers['content-type'], 'application/json')
948

    
949
        """Check if_etag_(not_)match"""
950
        r = self.client.object_copy(
951
            obj,
952
            destination='/%s/%s1' % (self.client.container, obj),
953
            if_etag_match=etag)
954
        self.assertEqual(r.status_code, 201)
955

    
956
        r = self.client.object_copy(
957
            obj,
958
            destination='/%s/%s2' % (self.client.container, obj),
959
            if_etag_not_match='lalala')
960
        self.assertEqual(r.status_code, 201)
961
        vers2 = r.headers['x-object-version']
962

    
963
        """Check source_version, public and format """
964
        r = self.client.object_copy(
965
            '%s2' % obj,
966
            destination='/%s/%s3' % (self.client.container, obj),
967
            source_version=vers2,
968
            format='xml',
969
            public=True)
970
        self.assertEqual(r.status_code, 201)
971
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
972

    
973
        r = self.client.get_object_info(obj + '3')
974
        self.assertTrue('x-object-public' in r)
975

    
976
    def test_object_move(self):
977
        """Test object_MOVE"""
978
        self._test_0120_object_move()
979

    
980
    def _test_0120_object_move(self):
981
        self.client.container = self.c2
982
        obj = 'test2'
983

    
984
        data = '{"key1": "val1", "key2": "val2"}'
985
        r = self.client.object_put(
986
            '%sorig' % obj,
987
            content_type='application/octet-stream',
988
            data=data,
989
            metadata=dict(mkey1='mval1', mkey2='mval2'),
990
            permissions=dict(
991
                read=['accX:groupA', 'u1', 'u2'],
992
                write=['u2', 'u3']))
993

    
994
        r = self.client.object_move(
995
            '%sorig' % obj,
996
            destination='/%s/%s' % (self.client.container, obj),
997
            ignore_content_type=False,
998
            content_type='application/json',
999
            metadata=dict(mkey2='mval2a', mkey3='mval3'),
1000
            permissions=dict(write=['u5', 'accX:groupB']))
1001
        self.assertEqual(r.status_code, 201)
1002

    
1003
        """Check Metadata"""
1004
        r = self.client.get_object_meta(obj)
1005
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1006
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1007
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1008

    
1009
        """Check permissions"""
1010
        r = self.client.get_object_sharing(obj)
1011
        self.assertFalse('read' in r)
1012
        self.assertTrue('u5' in r['write'])
1013
        self.assertTrue('accx:groupb' in r['write'])
1014

    
1015
        """Check destination account"""
1016
        r = self.client.object_move(
1017
            obj,
1018
            destination='/%s/%s' % (self.c1, obj),
1019
            content_encoding='utf8',
1020
            content_type='application/json',
1021
            destination_account='nonExistendAddress@NeverLand.com',
1022
            success=(201, 403))
1023
        self.assertEqual(r.status_code, 403)
1024

    
1025
        """Check destination being another container and also
1026
        content_type, content_disposition and content encoding"""
1027
        r = self.client.object_move(
1028
            obj,
1029
            destination='/%s/%s' % (self.c1, obj),
1030
            content_encoding='utf8',
1031
            content_type='application/json',
1032
            content_disposition='attachment; filename="fname.ext"')
1033
        self.assertEqual(r.status_code, 201)
1034
        self.assertEqual(
1035
            r.headers['content-type'],
1036
            'application/json; charset=UTF-8')
1037
        self.client.container = self.c1
1038
        r = self.client.get_object_info(obj)
1039
        self.assertTrue('content-disposition' in r)
1040
        self.assertTrue('fname.ext' in r['content-disposition'])
1041
        etag = r['etag']
1042
        ctype = r['content-type']
1043
        self.assertEqual(ctype, 'application/json')
1044

    
1045
        """Check ignore_content_type and content_type"""
1046
        r = self.client.object_move(
1047
            obj,
1048
            destination='/%s/%s' % (self.c2, obj),
1049
            ignore_content_type=True,
1050
            content_type='application/json')
1051
        self.assertEqual(r.status_code, 201)
1052
        self.assertNotEqual(r.headers['content-type'], 'application/json')
1053

    
1054
        """Check if_etag_(not_)match"""
1055
        self.client.container = self.c2
1056
        r = self.client.object_move(
1057
            obj,
1058
            destination='/%s/%s0' % (self.client.container, obj),
1059
            if_etag_match=etag)
1060
        self.assertEqual(r.status_code, 201)
1061

    
1062
        r = self.client.object_move(
1063
            '%s0' % obj,
1064
            destination='/%s/%s1' % (self.client.container, obj),
1065
            if_etag_not_match='lalala')
1066
        self.assertEqual(r.status_code, 201)
1067

    
1068
        """Check public and format """
1069
        r = self.client.object_move(
1070
            '%s1' % obj,
1071
            destination='/%s/%s2' % (self.client.container, obj),
1072
            format='xml',
1073
            public=True)
1074
        self.assertEqual(r.status_code, 201)
1075
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
1076

    
1077
        r = self.client.get_object_info(obj + '2')
1078
        self.assertTrue('x-object-public' in r)
1079

    
1080
    def test_object_post(self):
1081
        """Test object_POST"""
1082
        self._test_0130_object_post()
1083

    
1084
    def _test_0130_object_post(self):
1085
        self.client.container = self.c2
1086
        obj = 'test2'
1087

    
1088
        """create a filesystem file"""
1089
        self.files.append(NamedTemporaryFile())
1090
        newf = self.files[-1]
1091
        newf.writelines([
1092
            'ello!\n',
1093
            'This is a test line\n',
1094
            'inside a test file\n'])
1095

    
1096
        """create a file on container"""
1097
        r = self.client.object_put(
1098
            obj,
1099
            content_type='application/octet-stream',
1100
            data='H',
1101
            metadata=dict(mkey1='mval1', mkey2='mval2'),
1102
            permissions=dict(
1103
                read=['accX:groupA', 'u1', 'u2'],
1104
                write=['u2', 'u3']))
1105

    
1106
        """Append livetest update, content_[range|type|length]"""
1107
        newf.seek(0)
1108
        self.client.append_object(obj, newf)
1109
        r = self.client.object_get(obj)
1110
        self.assertTrue(r.text.startswith('Hello!'))
1111

    
1112
        """Overwrite livetest update,
1113
            content_type, content_length, content_range
1114
        """
1115
        newf.seek(0)
1116
        r = self.client.overwrite_object(obj, 0, 10, newf)
1117
        r = self.client.object_get(obj)
1118
        self.assertTrue(r.text.startswith('ello!'))
1119

    
1120
        """Truncate livetest update,
1121
            content_range, content_type, object_bytes and source_object"""
1122
        r = self.client.truncate_object(obj, 5)
1123
        r = self.client.object_get(obj)
1124
        self.assertEqual(r.text, 'ello!')
1125

    
1126
        """Check metadata"""
1127
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
1128
        r = self.client.get_object_meta(obj)
1129
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1130
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1131
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1132
        self.client.del_object_meta(obj, 'mkey1')
1133
        r = self.client.get_object_meta(obj)
1134
        self.assertFalse('x-object-meta-mkey1' in r)
1135

    
1136
        """Check permissions"""
1137
        self.client.set_object_sharing(
1138
            obj, read_permission=['u4', 'u5'], write_permission=['u4'])
1139
        r = self.client.get_object_sharing(obj)
1140
        self.assertTrue('read' in r)
1141
        self.assertTrue('u5' in r['read'])
1142
        self.assertTrue('write' in r)
1143
        self.assertTrue('u4' in r['write'])
1144
        self.client.del_object_sharing(obj)
1145
        r = self.client.get_object_sharing(obj)
1146
        self.assertTrue(len(r) == 0)
1147

    
1148
        """Check publish"""
1149
        self.client.publish_object(obj)
1150
        r = self.client.get_object_info(obj)
1151
        self.assertTrue('x-object-public' in r)
1152
        self.client.unpublish_object(obj)
1153
        r = self.client.get_object_info(obj)
1154
        self.assertFalse('x-object-public' in r)
1155

    
1156
        """Check if_etag_(not)match"""
1157
        etag = r['etag']
1158
        r = self.client.object_post(
1159
            obj,
1160
            update=True,
1161
            public=True,
1162
            if_etag_not_match=etag,
1163
            success=(412, 202, 204))
1164
        #self.assertEqual(r.status_code, 412)
1165

    
1166
        r = self.client.object_post(
1167
            obj,
1168
            update=True,
1169
            public=True,
1170
            if_etag_match=etag,
1171
            content_encoding='application/json')
1172

    
1173
        r = self.client.get_object_info(obj)
1174
        helloVersion = r['x-object-version']
1175
        self.assertTrue('x-object-public' in r)
1176
        self.assertEqual(r['content-encoding'], 'application/json')
1177

    
1178
        """Check source_version and source_account and content_disposition"""
1179
        r = self.client.object_post(
1180
            obj,
1181
            update=True,
1182
            content_type='application/octet-srteam',
1183
            content_length=5,
1184
            content_range='bytes 1-5/*',
1185
            source_object='/%s/%s' % (self.c2, obj),
1186
            source_account='thisAccountWillNeverExist@adminland.com',
1187
            source_version=helloVersion,
1188
            data='12345',
1189
            success=(403, 202, 204))
1190
        self.assertEqual(r.status_code, 403)
1191

    
1192
        r = self.client.object_post(
1193
            obj,
1194
            update=True,
1195
            content_type='application/octet-srteam',
1196
            content_length=5,
1197
            content_range='bytes 1-5/*',
1198
            source_object='/%s/%s' % (self.c2, obj),
1199
            source_account=self.client.account,
1200
            source_version=helloVersion,
1201
            data='12345',
1202
            content_disposition='attachment; filename="fname.ext"')
1203

    
1204
        r = self.client.object_get(obj)
1205
        self.assertEqual(r.text, 'eello!')
1206
        self.assertTrue('content-disposition' in r.headers)
1207
        self.assertTrue('fname.ext' in r.headers['content-disposition'])
1208

    
1209
        """Check manifest"""
1210
        mobj = 'manifest.test'
1211
        txt = ''
1212
        for i in range(10):
1213
            txt += '%s' % i
1214
            r = self.client.object_put(
1215
                '%s/%s' % (mobj, i),
1216
                data='%s' % i,
1217
                content_length=1,
1218
                success=201,
1219
                content_encoding='application/octet-stream',
1220
                content_type='application/octet-stream')
1221

    
1222
        self.client.create_object_by_manifestation(
1223
            mobj, content_type='application/octet-stream')
1224

    
1225
        r = self.client.object_post(
1226
            mobj, manifest='%s/%s' % (self.client.container, mobj))
1227

    
1228
        r = self.client.object_get(mobj)
1229
        self.assertEqual(r.text, txt)
1230

    
1231
        """We need to check transfer_encoding """
1232

    
1233
    def test_object_delete(self):
1234
        """Test object_DELETE"""
1235
        self._test_0140_object_delete()
1236

    
1237
    def _test_0140_object_delete(self):
1238
        self.client.container = self.c2
1239
        obj = 'test2'
1240
        """create a file on container"""
1241
        r = self.client.object_put(
1242
            obj,
1243
            content_type='application/octet-stream',
1244
            data='H',
1245
            metadata=dict(mkey1='mval1', mkey2='mval2'),
1246
            permissions=dict(
1247
                read=['accX:groupA', 'u1', 'u2'],
1248
                write=['u2', 'u3']))
1249

    
1250
        """Check with false until"""
1251
        r = self.client.object_delete(obj, until=1000000)
1252

    
1253
        r = self.client.object_get(obj, success=(200, 404))
1254
        self.assertEqual(r.status_code, 200)
1255

    
1256
        """Check normal case"""
1257
        r = self.client.object_delete(obj)
1258
        self.assertEqual(r.status_code, 204)
1259

    
1260
        r = self.client.object_get(obj, success=(200, 404))
1261
        self.assertEqual(r.status_code, 404)
1262

    
1263
    def create_large_file(self, size):
1264
        """Create a large file at fs"""
1265
        print
1266
        self.files.append(NamedTemporaryFile())
1267
        f = self.files[-1]
1268
        Ki = size / 8
1269
        bytelist = [b * Ki for b in range(size / Ki)]
1270

    
1271
        def append2file(step):
1272
            f.seek(step)
1273
            f.write(urandom(Ki))
1274
            f.flush()
1275
        self.do_with_progress_bar(
1276
            append2file,
1277
            ' create rand file %s (%sB): ' % (f.name, size),
1278
            bytelist)
1279
        f.seek(0)
1280
        return f
1281

    
1282
    def create_boring_file(self, num_of_blocks):
1283
        """Create a file with some blocks being the same"""
1284
        self.files.append(NamedTemporaryFile())
1285
        tmpFile = self.files[-1]
1286
        block_size = 4 * 1024 * 1024
1287
        print('\n\tCreate boring file of %s blocks' % num_of_blocks)
1288
        chars = chargen()
1289
        while num_of_blocks:
1290
            fslice = 3 if num_of_blocks > 3 else num_of_blocks
1291
            tmpFile.write(fslice * block_size * chars.next())
1292
            num_of_blocks -= fslice
1293
        print('\t\tDone')
1294
        tmpFile.seek(0)
1295
        return tmpFile