Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (46.2 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
        self.assertRaises(
250
            ClientError,
251
            self.client.set_account_group,
252
            grpName, [u1, u2])
253
        self.client.set_account_group(grpName, [u1])
254
        r = self.client.get_account_group()
255
        self.assertEqual(r['x-account-group-' + grpName], '%s' % u1)
256
        self.client.del_account_group(grpName)
257
        r = self.client.get_account_group()
258
        self.assertTrue('x-account-group-' + grpName not in r)
259

    
260
        mprefix = 'meta' + unicode(self.now)
261
        self.client.set_account_meta({
262
            mprefix + '1': 'v1', mprefix + '2': 'v2'})
263
        r = self.client.get_account_meta()
264
        self.assertEqual(r['x-account-meta-' + mprefix + '1'], 'v1')
265
        self.assertEqual(r['x-account-meta-' + mprefix + '2'], 'v2')
266

    
267
        self.client.del_account_meta(mprefix + '1')
268
        r = self.client.get_account_meta()
269
        self.assertTrue('x-account-meta-' + mprefix + '1' not in r)
270

    
271
        self.client.del_account_meta(mprefix + '2')
272
        r = self.client.get_account_meta()
273
        self.assertTrue('x-account-meta-' + mprefix + '2' not in r)
274

    
275
        """Missing testing for quota, versioning, because normally
276
        you don't have permissions to modify those at account level
277
        """
278

    
279
        #newquota = 1000000
280
        #self.client.set_account_quota(newquota)
281
        #r = self.client.get_account_info()
282
        #print(unicode(r))
283
        #r = self.client.get_account_quota()
284
        #self.assertEqual(r['x-account-policy-quota'], newquota)
285
        #self.client.set_account_versioning('auto')
286

    
287
    def test_container_head(self):
288
        """Test container_HEAD"""
289
        self._test_0040_container_head()
290

    
291
    def _test_0040_container_head(self):
292
        self.client.container = self.c1
293

    
294
        r = self.client.container_head()
295
        self.assertEqual(r.status_code, 204)
296

    
297
        """Check until"""
298
        r = self.client.container_head(until=1000000, success=(204, 404))
299
        self.assertEqual(r.status_code, 404)
300

    
301
        """Check and if(un)modified_since"""
302
        for format in self.client.DATE_FORMATS:
303
            now_formated = self.now_unformated.strftime(format)
304
            r1 = self.client.container_head(
305
                if_modified_since=now_formated, success=(204, 304, 412))
306
            sc1 = r1.status_code
307
            r2 = self.client.container_head(
308
                if_unmodified_since=now_formated, success=(204, 304, 412))
309
            sc2 = r2.status_code
310
            self.assertNotEqual(sc1, sc2)
311

    
312
        """Check container object meta"""
313
        r = self.client.get_container_object_meta()
314
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
315

    
316
    def test_container_get(self):
317
        """Test container_GET"""
318
        self._test_0050_container_get()
319

    
320
    def _test_0050_container_get(self):
321
        self.client.container = self.c1
322

    
323
        r = self.client.container_get()
324
        self.assertEqual(r.status_code, 200)
325
        fullLen = len(r.json)
326

    
327
        r = self.client.container_get(prefix='test')
328
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
329
        self.assertTrue(len(r.json) > 1)
330
        self.assertEqual(len(r.json), len(lalobjects))
331

    
332
        r = self.client.container_get(limit=1)
333
        self.assertEqual(len(r.json), 1)
334

    
335
        r = self.client.container_get(marker='another')
336
        self.assertTrue(len(r.json) > 1)
337
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
338
        self.assertEqual(len(r.json), len(neobjects))
339

    
340
        r = self.client.container_get(prefix='another.test', delimiter='.')
341
        self.assertTrue(fullLen > len(r.json))
342

    
343
        r = self.client.container_get(path='/')
344
        self.assertEqual(fullLen, len(r.json))
345

    
346
        r = self.client.container_get(format='xml')
347
        self.assertEqual(r.text.split()[4], 'name="' + self.c1 + '">')
348

    
349
        r = self.client.container_get(meta=['incontainer'])
350
        self.assertTrue(len(r.json) > 0)
351

    
352
        r = self.client.container_get(show_only_shared=True)
353
        self.assertTrue(len(r.json) < fullLen)
354

    
355
        try:
356
            r = self.client.container_get(until=1000000000)
357
            datestring = unicode(r.headers['x-account-until-timestamp'])
358
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
359

    
360
        except ClientError:
361

    
362
            pass
363

    
364
        """Check and if un/modified_since"""
365
        for format in self.client.DATE_FORMATS:
366
            now_formated = self.now_unformated.strftime(format)
367
            r1 = self.client.container_get(
368
                if_modified_since=now_formated, success=(200, 304, 412))
369
            sc1 = r1.status_code
370
            r2 = self.client.container_get(
371
                if_unmodified_since=now_formated, success=(200, 304, 412))
372
            sc2 = r2.status_code
373
            self.assertNotEqual(sc1, sc2)
374

    
375
    def test_container_put(self):
376
        """Test container_PUT"""
377
        self._test_0050_container_put()
378

    
379
    def _test_0050_container_put(self):
380
        self.client.container = self.c2
381

    
382
        r = self.client.create_container()
383
        self.assertTrue(isinstance(r, dict))
384

    
385
        r = self.client.get_container_limit(self.client.container)
386
        cquota = r.values()[0]
387
        newquota = 2 * int(cquota)
388

    
389
        r = self.client.create_container(sizelimit=newquota)
390
        self.assertTrue(isinstance(r, dict))
391

    
392
        r = self.client.get_container_limit(self.client.container)
393
        xquota = int(r.values()[0])
394
        self.assertEqual(newquota, xquota)
395

    
396
        r = self.client.create_container(versioning='auto')
397
        self.assertTrue(isinstance(r, dict))
398

    
399
        r = self.client.get_container_versioning(self.client.container)
400
        nvers = r.values()[0]
401
        self.assertEqual('auto', nvers)
402

    
403
        r = self.client.container_put(versioning='none')
404
        self.assertEqual(r.status_code, 202)
405

    
406
        r = self.client.get_container_versioning(self.client.container)
407
        nvers = r.values()[0]
408
        self.assertEqual('none', nvers)
409

    
410
        r = self.client.create_container(metadata={'m1': 'v1', 'm2': 'v2'})
411
        self.assertTrue(isinstance(r, dict))
412

    
413
        r = self.client.get_container_meta(self.client.container)
414
        self.assertTrue('x-container-meta-m1' in r)
415
        self.assertEqual(r['x-container-meta-m1'], 'v1')
416
        self.assertTrue('x-container-meta-m2' in r)
417
        self.assertEqual(r['x-container-meta-m2'], 'v2')
418

    
419
        r = self.client.container_put(metadata={'m1': '', 'm2': 'v2a'})
420
        self.assertEqual(r.status_code, 202)
421

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

    
427
        self.client.del_container_meta(self.client.container)
428

    
429
    def test_container_post(self):
430
        """Test container_POST"""
431
        self._test_0060_container_post()
432

    
433
    def _test_0060_container_post(self):
434
        self.client.container = self.c2
435

    
436
        """Simple post"""
437
        r = self.client.container_post()
438
        self.assertEqual(r.status_code, 202)
439

    
440
        """post meta"""
441
        self.client.set_container_meta({'m1': 'v1', 'm2': 'v2'})
442
        r = self.client.get_container_meta(self.client.container)
443
        self.assertTrue('x-container-meta-m1' in r)
444
        self.assertEqual(r['x-container-meta-m1'], 'v1')
445
        self.assertTrue('x-container-meta-m2' in r)
446
        self.assertEqual(r['x-container-meta-m2'], 'v2')
447

    
448
        """post/2del meta"""
449
        r = self.client.del_container_meta('m1')
450
        r = self.client.set_container_meta({'m2': 'v2a'})
451
        r = self.client.get_container_meta(self.client.container)
452
        self.assertTrue('x-container-meta-m1' not in r)
453
        self.assertTrue('x-container-meta-m2' in r)
454
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
455

    
456
        """check quota"""
457
        r = self.client.get_container_limit(self.client.container)
458
        cquota = r.values()[0]
459
        newquota = 2 * int(cquota)
460
        r = self.client.set_container_limit(newquota)
461
        r = self.client.get_container_limit(self.client.container)
462
        xquota = int(r.values()[0])
463
        self.assertEqual(newquota, xquota)
464
        r = self.client.set_container_limit(cquota)
465
        r = self.client.get_container_limit(self.client.container)
466
        xquota = r.values()[0]
467
        self.assertEqual(cquota, xquota)
468

    
469
        """Check versioning"""
470
        self.client.set_container_versioning('auto')
471
        r = self.client.get_container_versioning(self.client.container)
472
        nvers = r.values()[0]
473
        self.assertEqual('auto', nvers)
474
        self.client.set_container_versioning('none')
475
        r = self.client.get_container_versioning(self.client.container)
476
        nvers = r.values()[0]
477
        self.assertEqual('none', nvers)
478

    
479
        """put_block uses content_type and content_length to
480
        post blocks of data 2 container. All that in upload_object"""
481
        """Change a file at fs"""
482
        f = self.create_large_file(1024 * 1024 * 100)
483
        """Upload it at a directory in container"""
484
        self.client.create_directory('dir')
485
        r = self.client.upload_object('/dir/sample.file', f)
486
        for term in ('content-length', 'content-type', 'x-object-version'):
487
            self.assertTrue(term in r)
488
        """Check if file has been uploaded"""
489
        r = self.client.get_object_info('/dir/sample.file')
490
        self.assertTrue(int(r['content-length']) > 100000000)
491

    
492
        """What is tranfer_encoding? What should I check about it? """
493
        #TODO
494

    
495
        """Check update=False"""
496
        r = self.client.object_post(
497
            'test',
498
            update=False,
499
            metadata={'newmeta': 'newval'})
500

    
501
        r = self.client.get_object_info('test')
502
        self.assertTrue('x-object-meta-newmeta' in r)
503
        self.assertFalse('x-object-meta-incontainer' in r)
504

    
505
        r = self.client.del_container_meta('m2')
506

    
507
    def test_container_delete(self):
508
        """Test container_DELETE"""
509
        self._test_0070_container_delete()
510

    
511
    def _test_0070_container_delete(self):
512

    
513
        """Fail to delete a non-empty container"""
514
        self.client.container = self.c2
515
        r = self.client.container_delete(success=409)
516
        self.assertEqual(r.status_code, 409)
517

    
518
        """Fail to delete c3 (empty) container"""
519
        self.client.container = self.c3
520
        r = self.client.container_delete(until='1000000000')
521
        self.assertEqual(r.status_code, 204)
522

    
523
        """Delete c3 (empty) container"""
524
        r = self.client.container_delete()
525
        self.assertEqual(r.status_code, 204)
526

    
527
        """Purge container(empty a container), check versionlist"""
528
        self.client.container = self.c1
529
        r = self.client.object_head('test', success=(200, 404))
530
        self.assertEqual(r.status_code, 200)
531
        self.client.del_container(delimiter='/')
532
        r = self.client.object_head('test', success=(200, 404))
533
        self.assertEqual(r.status_code, 404)
534
        r = self.client.get_object_versionlist('test')
535
        self.assertTrue(len(r) > 0)
536
        self.assertTrue(len(r[0]) > 1)
537
        self.client.purge_container()
538
        self.assertRaises(
539
            ClientError, self.client.get_object_versionlist, 'test')
540

    
541
    def _test_0080_recreate_deleted_data(self):
542
        self._init_data()
543

    
544
    def test_object_head(self):
545
        """Test object_HEAD"""
546
        self._test_0090_object_head()
547

    
548
    def _test_0090_object_head(self):
549
        self.client.container = self.c2
550
        obj = 'test'
551

    
552
        r = self.client.object_head(obj)
553
        self.assertEqual(r.status_code, 200)
554
        etag = r.headers['etag']
555
        real_version = r.headers['x-object-version']
556

    
557
        self.assertRaises(
558
            ClientError, self.client.object_head, obj, version=-10)
559
        r = self.client.object_head(obj, version=real_version)
560
        self.assertEqual(r.headers['x-object-version'], real_version)
561

    
562
        r = self.client.object_head(obj, if_etag_match=etag)
563
        self.assertEqual(r.status_code, 200)
564

    
565
        r = self.client.object_head(
566
            obj, if_etag_not_match=etag, success=(200, 412, 304))
567
        self.assertNotEqual(r.status_code, 200)
568

    
569
        r = self.client.object_head(
570
            obj, version=real_version, if_etag_match=etag, success=200)
571
        self.assertEqual(r.status_code, 200)
572

    
573
        """Check and if(un)modified_since"""
574
        for format in self.client.DATE_FORMATS:
575
            now_formated = self.now_unformated.strftime(format)
576
            r1 = self.client.object_head(
577
                obj, if_modified_since=now_formated, success=(200, 304, 412))
578
            sc1 = r1.status_code
579
            r2 = self.client.object_head(
580
                obj, if_unmodified_since=now_formated, success=(200, 304, 412))
581
            sc2 = r2.status_code
582
            self.assertNotEqual(sc1, sc2)
583

    
584
    def test_object_get(self):
585
        """Test object_GET"""
586
        self._test_0100_object_get()
587

    
588
    def _test_0100_object_get(self):
589
        self.client.container = self.c1
590
        obj = 'test'
591

    
592
        r = self.client.object_get(obj)
593
        self.assertEqual(r.status_code, 200)
594

    
595
        osize = int(r.headers['content-length'])
596
        etag = r.headers['etag']
597

    
598
        r = self.client.object_get(obj, hashmap=True)
599
        for term in ('hashes', 'block_hash', 'block_hash', 'bytes'):
600
            self.assertTrue(term in r.json)
601

    
602
        r = self.client.object_get(obj, format='xml', hashmap=True)
603
        self.assertEqual(len(r.text.split('hash>')), 3)
604

    
605
        rangestr = 'bytes=%s-%s' % (osize / 3, osize / 2)
606
        r = self.client.object_get(
607
            obj, data_range=rangestr, success=(200, 206))
608
        partsize = int(r.headers['content-length'])
609
        self.assertTrue(0 < partsize and partsize <= 1 + osize / 3)
610

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

    
617
        r = self.client.object_get(obj, if_etag_match=etag)
618
        self.assertEqual(r.status_code, 200)
619

    
620
        r = self.client.object_get(obj, if_etag_not_match=etag + 'LALALA')
621
        self.assertEqual(r.status_code, 200)
622

    
623
        """Check and if(un)modified_since"""
624
        for format in self.client.DATE_FORMATS:
625
            now_formated = self.now_unformated.strftime(format)
626
            r1 = self.client.object_get(
627
                obj, if_modified_since=now_formated, success=(200, 304, 412))
628
            sc1 = r1.status_code
629
            r2 = self.client.object_get(
630
                obj, if_unmodified_since=now_formated, success=(200, 304, 412))
631
            sc2 = r2.status_code
632
            self.assertNotEqual(sc1, sc2)
633

    
634
        """Upload an object to download"""
635
        container_info_cache = dict()
636
        trg_fname = 'remotefile_%s' % self.now
637
        f_size = 59247824
638
        src_f = self.create_large_file(f_size)
639
        print('\tUploading...')
640
        r = self.client.upload_object(
641
            trg_fname, src_f, container_info_cache=container_info_cache)
642
        print('\tDownloading...')
643
        self.files.append(NamedTemporaryFile())
644
        dnl_f = self.files[-1]
645
        self.client.download_object(trg_fname, dnl_f)
646

    
647
        print('\tCheck if files match...')
648
        for pos in (0, f_size / 2, f_size - 128):
649
            src_f.seek(pos)
650
            dnl_f.seek(pos)
651
            self.assertEqual(src_f.read(64), dnl_f.read(64))
652

    
653
        print('\tDownload KiBs to string and check again...')
654
        for pos in (0, f_size / 2, f_size - 256):
655
            src_f.seek(pos)
656
            tmp_s = self.client.download_to_string(
657
                trg_fname, range_str='%s-%s' % (pos, (pos + 128)))
658
            self.assertEqual(tmp_s, src_f.read(len(tmp_s)))
659
        print('\tUploading KiBs as strings...')
660
        trg_fname = 'fromString_%s' % self.now
661
        src_size = 2 * 1024
662
        src_f.seek(0)
663
        src_str = src_f.read(src_size)
664
        self.client.upload_from_string(trg_fname, src_str)
665
        print('\tDownload as string and check...')
666
        tmp_s = self.client.download_to_string(trg_fname)
667
        self.assertEqual(tmp_s, src_str)
668

    
669
        """Upload a boring file"""
670
        trg_fname = 'boringfile_%s' % self.now
671
        src_f = self.create_boring_file(42)
672
        print('\tUploading boring file...')
673
        self.client.upload_object(
674
            trg_fname, src_f, container_info_cache=container_info_cache)
675
        print('\tDownloading boring file...')
676
        self.files.append(NamedTemporaryFile())
677
        dnl_f = self.files[-1]
678
        self.client.download_object(trg_fname, dnl_f)
679

    
680
        print('\tCheck if files match...')
681
        for i in range(42):
682
            self.assertEqual(sample_block(src_f, i), sample_block(dnl_f, i))
683

    
684
    def test_object_put(self):
685
        """Test object_PUT"""
686
        self._test_0150_object_put()
687

    
688
    def _test_0150_object_put(self):
689
        self.client.container = self.c2
690
        obj = 'another.test'
691

    
692
        self.client.create_object(obj + '.FAKE')
693
        r = self.client.get_object_info(obj + '.FAKE')
694
        self.assertEqual(r['content-type'], 'application/octet-stream')
695

    
696
        """create the object"""
697
        r = self.client.object_put(
698
            obj,
699
            data='a',
700
            content_type='application/octer-stream',
701
            permissions=dict(
702
                read=['accX:groupA', 'u1', 'u2'],
703
                write=['u2', 'u3']),
704
            metadata=dict(key1='val1', key2='val2'),
705
            content_encoding='UTF-8',
706
            content_disposition='attachment; filename="fname.ext"')
707
        self.assertEqual(r.status_code, 201)
708
        etag = r.headers['etag']
709

    
710
        """Check content-disposition"""
711
        r = self.client.get_object_info(obj)
712
        self.assertTrue('content-disposition' in r)
713

    
714
        """Check permissions"""
715
        r = self.client.get_object_sharing(obj)
716
        self.assertTrue('accx:groupa' in r['read'])
717
        self.assertTrue('u1' in r['read'])
718
        self.assertTrue('u2' in r['write'])
719
        self.assertTrue('u3' in r['write'])
720

    
721
        """Check metadata"""
722
        r = self.client.get_object_meta(obj)
723
        self.assertEqual(r['x-object-meta-key1'], 'val1')
724
        self.assertEqual(r['x-object-meta-key2'], 'val2')
725

    
726
        """Check public and if_etag_match"""
727
        r = self.client.object_put(
728
            obj,
729
            if_etag_match=etag,
730
            data='b',
731
            content_type='application/octet-stream',
732
            public=True)
733

    
734
        r = self.client.object_get(obj)
735
        self.assertTrue('x-object-public' in r.headers)
736
        vers2 = int(r.headers['x-object-version'])
737
        etag = r.headers['etag']
738
        self.assertEqual(r.text, 'b')
739

    
740
        """Check if_etag_not_match"""
741
        r = self.client.object_put(
742
            obj,
743
            if_etag_not_match=etag,
744
            data='c',
745
            content_type='application/octet-stream',
746
            success=(201, 412))
747
        self.assertEqual(r.status_code, 412)
748

    
749
        """Check content_type and content_length"""
750
        tmpdir = 'dir' + unicode(self.now)
751
        r = self.client.object_put(
752
            tmpdir, content_type='application/directory', content_length=0)
753

    
754
        r = self.client.get_object_info(tmpdir)
755
        self.assertEqual(r['content-type'], 'application/directory')
756

    
757
        """Check copy_from, content_encoding"""
758
        r = self.client.object_put(
759
            '%s/%s' % (tmpdir, obj),
760
            format=None,
761
            copy_from='/%s/%s' % (self.client.container, obj),
762
            content_encoding='application/octet-stream',
763
            source_account=self.client.account,
764
            content_length=0,
765
            success=201)
766
        self.assertEqual(r.status_code, 201)
767

    
768
        """Test copy_object for cross-conctainer copy"""
769
        self.client.copy_object(
770
            src_container=self.c2,
771
            src_object='%s/%s' % (tmpdir, obj),
772
            dst_container=self.c1,
773
            dst_object=obj)
774
        self.client.container = self.c1
775
        r1 = self.client.get_object_info(obj)
776
        self.client.container = self.c2
777
        r2 = self.client.get_object_info('%s/%s' % (tmpdir, obj))
778
        self.assertEqual(r1['x-object-hash'], r2['x-object-hash'])
779

    
780
        """Check cross-container copy_from, content_encoding"""
781
        self.client.container = self.c1
782
        fromstr = '/%s/%s/%s' % (self.c2, tmpdir, obj)
783
        r = self.client.object_put(
784
            obj,
785
            format=None,
786
            copy_from=fromstr,
787
            content_encoding='application/octet-stream',
788
            source_account=self.client.account,
789
            content_length=0,
790
            success=201)
791

    
792
        self.assertEqual(r.status_code, 201)
793
        r = self.client.get_object_info(obj)
794
        self.assertEqual(r['etag'], etag)
795

    
796
        """Check source_account"""
797
        self.client.container = self.c2
798
        fromstr = '/%s/%s' % (self.c1, obj)
799
        r = self.client.object_put(
800
            '%sv2' % obj,
801
            format=None,
802
            move_from=fromstr,
803
            content_encoding='application/octet-stream',
804
            source_account='nonExistendAddress@NeverLand.com',
805
            content_length=0,
806
            success=(201, 403))
807
        self.assertEqual(r.status_code, 403)
808

    
809
        """Check cross-container move_from"""
810
        self.client.container = self.c1
811
        r1 = self.client.get_object_info(obj)
812
        self.client.container = self.c2
813
        self.client.move_object(
814
            src_container=self.c1,
815
            src_object=obj,
816
            dst_container=self.c2,
817
            dst_object=obj + 'v0')
818
        r0 = self.client.get_object_info(obj + 'v0')
819
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
820

    
821
        """Check move_from"""
822
        r = self.client.object_put(
823
            '%sv1' % obj,
824
            format=None,
825
            move_from='/%s/%s' % (self.c2, obj),
826
            source_version=vers2,
827
            content_encoding='application/octet-stream',
828
            content_length=0, success=201)
829

    
830
        """Check manifest"""
831
        mobj = 'manifest.test'
832
        txt = ''
833
        for i in range(10):
834
            txt += '%s' % i
835
            r = self.client.object_put(
836
                '%s/%s' % (mobj, i),
837
                data='%s' % i,
838
                content_length=1,
839
                success=201,
840
                content_type='application/octet-stream',
841
                content_encoding='application/octet-stream')
842

    
843
        r = self.client.object_put(
844
            mobj,
845
            content_length=0,
846
            content_type='application/octet-stream',
847
            manifest='%s/%s' % (self.client.container, mobj))
848

    
849
        r = self.client.object_get(mobj)
850
        self.assertEqual(r.text, txt)
851

    
852
        """Upload a local file with one request"""
853
        newf = self.create_large_file(1024 * 10)
854
        self.client.upload_object('sample.file', newf)
855
        """Check if file has been uploaded"""
856
        r = self.client.get_object_info('sample.file')
857
        self.assertEqual(int(r['content-length']), 10240)
858

    
859
        """Some problems with transfer-encoding?"""
860

    
861
    def test_object_copy(self):
862
        """Test object_COPY"""
863
        self._test_0110_object_copy()
864

    
865
    def _test_0110_object_copy(self):
866
        #  TODO: check with source_account option
867
        self.client.container = self.c2
868
        obj = 'test2'
869

    
870
        data = '{"key1":"val1", "key2":"val2"}'
871
        r = self.client.object_put(
872
            '%sorig' % obj,
873
            content_type='application/octet-stream',
874
            data=data,
875
            metadata=dict(mkey1='mval1', mkey2='mval2'),
876
            permissions=dict(
877
                read=['accX:groupA', 'u1', 'u2'],
878
                write=['u2', 'u3']),
879
            content_disposition='attachment; filename="fname.ext"')
880

    
881
        r = self.client.object_copy(
882
            '%sorig' % obj,
883
            destination='/%s/%s' % (self.client.container, obj),
884
            ignore_content_type=False, content_type='application/json',
885
            metadata={'mkey2': 'mval2a', 'mkey3': 'mval3'},
886
            permissions={'write': ['u5', 'accX:groupB']})
887
        self.assertEqual(r.status_code, 201)
888

    
889
        """Check content-disposition"""
890
        r = self.client.get_object_info(obj)
891
        self.assertTrue('content-disposition' in r)
892

    
893
        """Check Metadata"""
894
        r = self.client.get_object_meta(obj)
895
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
896
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
897
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
898

    
899
        """Check permissions"""
900
        r = self.client.get_object_sharing(obj)
901
        self.assertFalse('read' in r or 'u2' in r['write'])
902
        self.assertTrue('accx:groupb' in r['write'])
903

    
904
        """Check destination account"""
905
        r = self.client.object_copy(
906
            obj,
907
            destination='/%s/%s' % (self.c1, obj),
908
            content_encoding='utf8',
909
            content_type='application/json',
910
            destination_account='nonExistendAddress@NeverLand.com',
911
            success=(201, 404))
912
        self.assertEqual(r.status_code, 404)
913

    
914
        """Check destination being another container
915
        and also content_type and content encoding"""
916
        r = self.client.object_copy(
917
            obj,
918
            destination='/%s/%s' % (self.c1, obj),
919
            content_encoding='utf8',
920
            content_type='application/json')
921
        self.assertEqual(r.status_code, 201)
922
        self.assertEqual(
923
            r.headers['content-type'],
924
            'application/json; charset=UTF-8')
925

    
926
        """Check ignore_content_type and content_type"""
927
        r = self.client.object_get(obj)
928
        etag = r.headers['etag']
929
        ctype = r.headers['content-type']
930
        self.assertEqual(ctype, 'application/json')
931

    
932
        r = self.client.object_copy(
933
            '%sorig' % obj,
934
            destination='/%s/%s0' % (self.client.container, obj),
935
            ignore_content_type=True,
936
            content_type='application/json')
937
        self.assertEqual(r.status_code, 201)
938
        self.assertNotEqual(r.headers['content-type'], 'application/json')
939

    
940
        """Check if_etag_(not_)match"""
941
        r = self.client.object_copy(
942
            obj,
943
            destination='/%s/%s1' % (self.client.container, obj),
944
            if_etag_match=etag)
945
        self.assertEqual(r.status_code, 201)
946

    
947
        r = self.client.object_copy(
948
            obj,
949
            destination='/%s/%s2' % (self.client.container, obj),
950
            if_etag_not_match='lalala')
951
        self.assertEqual(r.status_code, 201)
952
        vers2 = r.headers['x-object-version']
953

    
954
        """Check source_version, public and format """
955
        r = self.client.object_copy(
956
            '%s2' % obj,
957
            destination='/%s/%s3' % (self.client.container, obj),
958
            source_version=vers2,
959
            format='xml',
960
            public=True)
961
        self.assertEqual(r.status_code, 201)
962
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
963

    
964
        r = self.client.get_object_info(obj + '3')
965
        self.assertTrue('x-object-public' in r)
966

    
967
    def test_object_move(self):
968
        """Test object_MOVE"""
969
        self._test_0120_object_move()
970

    
971
    def _test_0120_object_move(self):
972
        self.client.container = self.c2
973
        obj = 'test2'
974

    
975
        data = '{"key1": "val1", "key2": "val2"}'
976
        r = self.client.object_put(
977
            '%sorig' % obj,
978
            content_type='application/octet-stream',
979
            data=data,
980
            metadata=dict(mkey1='mval1', mkey2='mval2'),
981
            permissions=dict(
982
                read=['accX:groupA', 'u1', 'u2'],
983
                write=['u2', 'u3']))
984

    
985
        r = self.client.object_move(
986
            '%sorig' % obj,
987
            destination='/%s/%s' % (self.client.container, obj),
988
            ignore_content_type=False,
989
            content_type='application/json',
990
            metadata=dict(mkey2='mval2a', mkey3='mval3'),
991
            permissions=dict(write=['u5', 'accX:groupB']))
992
        self.assertEqual(r.status_code, 201)
993

    
994
        """Check Metadata"""
995
        r = self.client.get_object_meta(obj)
996
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
997
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
998
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
999

    
1000
        """Check permissions"""
1001
        r = self.client.get_object_sharing(obj)
1002
        self.assertFalse('read' in r)
1003
        self.assertTrue('u5' in r['write'])
1004
        self.assertTrue('accx:groupb' in r['write'])
1005

    
1006
        """Check destination account"""
1007
        r = self.client.object_move(
1008
            obj,
1009
            destination='/%s/%s' % (self.c1, obj),
1010
            content_encoding='utf8',
1011
            content_type='application/json',
1012
            destination_account='nonExistendAddress@NeverLand.com',
1013
            success=(201, 404))
1014
        self.assertEqual(r.status_code, 404)
1015

    
1016
        """Check destination being another container and also
1017
        content_type, content_disposition and content encoding"""
1018
        r = self.client.object_move(
1019
            obj,
1020
            destination='/%s/%s' % (self.c1, obj),
1021
            content_encoding='utf8',
1022
            content_type='application/json',
1023
            content_disposition='attachment; filename="fname.ext"')
1024
        self.assertEqual(r.status_code, 201)
1025
        self.assertEqual(
1026
            r.headers['content-type'],
1027
            'application/json; charset=UTF-8')
1028
        self.client.container = self.c1
1029
        r = self.client.get_object_info(obj)
1030
        self.assertTrue('content-disposition' in r)
1031
        self.assertTrue('fname.ext' in r['content-disposition'])
1032
        etag = r['etag']
1033
        ctype = r['content-type']
1034
        self.assertEqual(ctype, 'application/json')
1035

    
1036
        """Check ignore_content_type and content_type"""
1037
        r = self.client.object_move(
1038
            obj,
1039
            destination='/%s/%s' % (self.c2, obj),
1040
            ignore_content_type=True,
1041
            content_type='application/json')
1042
        self.assertEqual(r.status_code, 201)
1043
        self.assertNotEqual(r.headers['content-type'], 'application/json')
1044

    
1045
        """Check if_etag_(not_)match"""
1046
        self.client.container = self.c2
1047
        r = self.client.object_move(
1048
            obj,
1049
            destination='/%s/%s0' % (self.client.container, obj),
1050
            if_etag_match=etag)
1051
        self.assertEqual(r.status_code, 201)
1052

    
1053
        r = self.client.object_move(
1054
            '%s0' % obj,
1055
            destination='/%s/%s1' % (self.client.container, obj),
1056
            if_etag_not_match='lalala')
1057
        self.assertEqual(r.status_code, 201)
1058

    
1059
        """Check public and format """
1060
        r = self.client.object_move(
1061
            '%s1' % obj,
1062
            destination='/%s/%s2' % (self.client.container, obj),
1063
            format='xml',
1064
            public=True)
1065
        self.assertEqual(r.status_code, 201)
1066
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
1067

    
1068
        r = self.client.get_object_info(obj + '2')
1069
        self.assertTrue('x-object-public' in r)
1070

    
1071
    def test_object_post(self):
1072
        """Test object_POST"""
1073
        self._test_0130_object_post()
1074

    
1075
    def _test_0130_object_post(self):
1076
        self.client.container = self.c2
1077
        obj = 'test2'
1078

    
1079
        """create a filesystem file"""
1080
        self.files.append(NamedTemporaryFile())
1081
        newf = self.files[-1]
1082
        newf.writelines([
1083
            'ello!\n',
1084
            'This is a test line\n',
1085
            'inside a test file\n'])
1086

    
1087
        """create a file on container"""
1088
        r = self.client.object_put(
1089
            obj,
1090
            content_type='application/octet-stream',
1091
            data='H',
1092
            metadata=dict(mkey1='mval1', mkey2='mval2'),
1093
            permissions=dict(
1094
                read=['accX:groupA', 'u1', 'u2'],
1095
                write=['u2', 'u3']))
1096

    
1097
        """Append livetest update, content_[range|type|length]"""
1098
        newf.seek(0)
1099
        self.client.append_object(obj, newf)
1100
        r = self.client.object_get(obj)
1101
        self.assertTrue(r.text.startswith('Hello!'))
1102

    
1103
        """Overwrite livetest update,
1104
            content_type, content_length, content_range
1105
        """
1106
        newf.seek(0)
1107
        r = self.client.overwrite_object(obj, 0, 10, newf)
1108
        r = self.client.object_get(obj)
1109
        self.assertTrue(r.text.startswith('ello!'))
1110

    
1111
        """Truncate livetest update,
1112
            content_range, content_type, object_bytes and source_object"""
1113
        r = self.client.truncate_object(obj, 5)
1114
        r = self.client.object_get(obj)
1115
        self.assertEqual(r.text, 'ello!')
1116

    
1117
        """Check metadata"""
1118
        self.client.set_object_meta(obj, {'mkey2': 'mval2a', 'mkey3': 'mval3'})
1119
        r = self.client.get_object_meta(obj)
1120
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1121
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1122
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1123
        self.client.del_object_meta(obj, 'mkey1')
1124
        r = self.client.get_object_meta(obj)
1125
        self.assertFalse('x-object-meta-mkey1' in r)
1126

    
1127
        """Check permissions"""
1128
        self.client.set_object_sharing(
1129
            obj, read_permission=['u4', 'u5'], write_permission=['u4'])
1130
        r = self.client.get_object_sharing(obj)
1131
        self.assertTrue('read' in r)
1132
        self.assertTrue('u5' in r['read'])
1133
        self.assertTrue('write' in r)
1134
        self.assertTrue('u4' in r['write'])
1135
        self.client.del_object_sharing(obj)
1136
        r = self.client.get_object_sharing(obj)
1137
        self.assertTrue(len(r) == 0)
1138

    
1139
        """Check publish"""
1140
        self.client.publish_object(obj)
1141
        r = self.client.get_object_info(obj)
1142
        self.assertTrue('x-object-public' in r)
1143
        self.client.unpublish_object(obj)
1144
        r = self.client.get_object_info(obj)
1145
        self.assertFalse('x-object-public' in r)
1146

    
1147
        """Check if_etag_(not)match"""
1148
        etag = r['etag']
1149
        r = self.client.object_post(
1150
            obj,
1151
            update=True,
1152
            public=True,
1153
            if_etag_not_match=etag,
1154
            success=(412, 202, 204))
1155
        #self.assertEqual(r.status_code, 412)
1156

    
1157
        r = self.client.object_post(
1158
            obj,
1159
            update=True,
1160
            public=True,
1161
            if_etag_match=etag,
1162
            content_encoding='application/json')
1163

    
1164
        r = self.client.get_object_info(obj)
1165
        helloVersion = r['x-object-version']
1166
        self.assertTrue('x-object-public' in r)
1167
        self.assertEqual(r['content-encoding'], 'application/json')
1168

    
1169
        """Check source_version and source_account and content_disposition"""
1170
        r = self.client.object_post(
1171
            obj,
1172
            update=True,
1173
            content_type='application/octet-srteam',
1174
            content_length=5,
1175
            content_range='bytes 1-5/*',
1176
            source_object='/%s/%s' % (self.c2, obj),
1177
            source_account='thisAccountWillNeverExist@adminland.com',
1178
            source_version=helloVersion,
1179
            data='12345',
1180
            success=(403, 202, 204))
1181
        self.assertEqual(r.status_code, 403)
1182

    
1183
        r = self.client.object_post(
1184
            obj,
1185
            update=True,
1186
            content_type='application/octet-srteam',
1187
            content_length=5,
1188
            content_range='bytes 1-5/*',
1189
            source_object='/%s/%s' % (self.c2, obj),
1190
            source_account=self.client.account,
1191
            source_version=helloVersion,
1192
            data='12345',
1193
            content_disposition='attachment; filename="fname.ext"')
1194

    
1195
        r = self.client.object_get(obj)
1196
        self.assertEqual(r.text, 'eello!')
1197
        self.assertTrue('content-disposition' in r.headers)
1198
        self.assertTrue('fname.ext' in r.headers['content-disposition'])
1199

    
1200
        """Check manifest"""
1201
        mobj = 'manifest.test'
1202
        txt = ''
1203
        for i in range(10):
1204
            txt += '%s' % i
1205
            r = self.client.object_put(
1206
                '%s/%s' % (mobj, i),
1207
                data='%s' % i,
1208
                content_length=1,
1209
                success=201,
1210
                content_encoding='application/octet-stream',
1211
                content_type='application/octet-stream')
1212

    
1213
        self.client.create_object_by_manifestation(
1214
            mobj, content_type='application/octet-stream')
1215

    
1216
        r = self.client.object_post(
1217
            mobj, manifest='%s/%s' % (self.client.container, mobj))
1218

    
1219
        r = self.client.object_get(mobj)
1220
        self.assertEqual(r.text, txt)
1221

    
1222
        """We need to check transfer_encoding """
1223

    
1224
    def test_object_delete(self):
1225
        """Test object_DELETE"""
1226
        self._test_0140_object_delete()
1227

    
1228
    def _test_0140_object_delete(self):
1229
        self.client.container = self.c2
1230
        obj = 'test2'
1231
        """create a file on container"""
1232
        r = self.client.object_put(
1233
            obj,
1234
            content_type='application/octet-stream',
1235
            data='H',
1236
            metadata=dict(mkey1='mval1', mkey2='mval2'),
1237
            permissions=dict(
1238
                read=['accX:groupA', 'u1', 'u2'],
1239
                write=['u2', 'u3']))
1240

    
1241
        """Check with false until"""
1242
        r = self.client.object_delete(obj, until=1000000)
1243

    
1244
        r = self.client.object_get(obj, success=(200, 404))
1245
        self.assertEqual(r.status_code, 200)
1246

    
1247
        """Check normal case"""
1248
        r = self.client.object_delete(obj)
1249
        self.assertEqual(r.status_code, 204)
1250

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

    
1254
    def create_large_file(self, size):
1255
        """Create a large file at fs"""
1256
        print
1257
        self.files.append(NamedTemporaryFile())
1258
        f = self.files[-1]
1259
        Ki = size / 8
1260
        bytelist = [b * Ki for b in range(size / Ki)]
1261

    
1262
        def append2file(step):
1263
            f.seek(step)
1264
            f.write(urandom(Ki))
1265
            f.flush()
1266
        self.do_with_progress_bar(
1267
            append2file,
1268
            ' create rand file %s (%sB): ' % (f.name, size),
1269
            bytelist)
1270
        f.seek(0)
1271
        return f
1272

    
1273
    def create_boring_file(self, num_of_blocks):
1274
        """Create a file with some blocks being the same"""
1275
        self.files.append(NamedTemporaryFile())
1276
        tmpFile = self.files[-1]
1277
        block_size = 4 * 1024 * 1024
1278
        print('\n\tCreate boring file of %s blocks' % num_of_blocks)
1279
        chars = chargen()
1280
        while num_of_blocks:
1281
            fslice = 3 if num_of_blocks > 3 else num_of_blocks
1282
            tmpFile.write(fslice * block_size * chars.next())
1283
            num_of_blocks -= fslice
1284
        print('\t\tDone')
1285
        tmpFile.seek(0)
1286
        return tmpFile