Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / tests.py @ 0f653327

History | View | Annotate | Download (49.9 kB)

1
# Copyright 2011 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 gevent.monkey
35
#Monkey-patch everything for gevent early on
36
gevent.monkey.patch_all()
37

    
38
from argparse import ArgumentParser
39
import unittest
40
import time, datetime, os, sys
41
from shutil import copyfile
42

    
43
from kamaki.clients import ClientError
44
from kamaki.clients.pithos import PithosClient as pithos
45
from kamaki.clients.cyclades import CycladesClient as cyclades
46

    
47
TEST_ALL = False
48

    
49
class testCyclades(unittest.TestCase):
50
    """Set up a Cyclades thorough test"""
51
    def setUp(self):
52
        """okeanos"""
53
        url='https://cyclades.okeanos.grnet.gr/api/v1.1'
54
        token='MI6PT0yrXJ9Ji/x8l9Wmig=='
55
        account='saxtouri@gmail.com'
56
        self.img = '1395fdfb-51b4-419f-bb02-f7d632860611'
57

    
58
        """okeanos.io"""
59
        #url = 'https://cyclades.okeanos.io/api/v1.1'
60
        #token='0TpoyAXqJSPxLdDuZHiLOA=='
61
        #account='saxtouri@admin.grnet.gr'
62
        #self.img = '43cc8497-61c3-4c46-ae8d-3e33861f8527'
63
        #self.img_details= {
64
        #    u'status': u'ACTIVE',
65
        #    u'updated': u'2012-08-21T12:57:39+00:00',
66
        #    u'name': u'Debian Base',
67
        #    u'created': u'2012-08-21T12:56:53+00:00',
68
        #    u'progress': 100,
69
        #    u'id': u'43cc8497-61c3-4c46-ae8d-3e33861f8527',
70
        #    u'metadata': {
71
        #        u'values': {
72
        #            u'kernel': u'2.6.32',
73
        #            u'osfamily': u'linux', 
74
        #            u'users': u'root', 
75
        #            u'gui': u'No GUI', 
76
        #            u'sortorder': u'1', 
77
        #            u'os': u'debian', 
78
        #            u'root_partition': 
79
        #            u'1', u'description': 
80
        #            u'Debian Squeeze Base System'}
81
        #        }
82
        #    }
83
        flavorid = 1
84

    
85
        self.servers = {}
86
        self.now = time.mktime(time.gmtime())
87
        self.servname1 = 'serv'+unicode(self.now)
88
        self.servname2 = self.servname1+'_v2'
89
        self.flavorid = 1
90
        #servers have to be created at the begining...
91

    
92
        self.client = cyclades(url, token)
93
        pass
94

    
95
    def tearDown(self):
96
        """Destoy servers used in testing"""
97
        if 0 >= len(self.servers):
98
            return
99
        there_are_servers_running = True
100
        deleted_servers = {}
101
        waitime = 0
102
        print
103
        print('-> Found %s servers to delete'%len(self.servers))
104
        while there_are_servers_running:
105
            there_are_servers_running = False
106
            if waitime > 0:
107
                c = ['|','/','-','\\']
108
                suffix = ''
109
                sys.stdout.write('\t. . . wait %s seconds: '%waitime)
110
                for i in range(4*waitime):
111
                    oldlen = len(suffix)
112
                    suffix = '%ss %s'%(i/4, c[i%4])
113
                    sys.stdout.write(oldlen*'\b'+suffix)
114
                    sys.stdout.flush()
115
                    time.sleep(0.25)
116
                oldlen = len(': '+suffix)
117
                print(oldlen*'\b'+oldlen*' ')
118
                sys.stdout.flush()
119
            waitime += 7
120
            dservers = self.client.list_servers(detail=True)
121
            for server in dservers:
122
                if server['name'] in self.servers.keys():
123
                    there_are_servers_running = True
124
                    sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
125
                    if server['status'] == 'BUILD':
126
                        print('\twait...')
127
                    else:
128
                        print('\tDELETE %s'%server['name'])
129
                        self._delete_server(server['id'])
130
                        self.servers.pop(server['name'])
131
                        deleted_servers[server['name']] = 0
132
                        waitime =0 
133
                elif server['name'] in deleted_servers.keys():
134
                    there_are_servers_running = True
135
                    sys.stdout.write('\t%s status:%s '%(server['name'], server['status']))
136
                    retries = deleted_servers[server['name']]
137
                    if retries > 10:
138
                        print('\tretry DELETE %s'%server['name'])
139
                        self._delete_server(server['id'])
140
                        retries = 0
141
                        waitime = 0
142
                    else:
143
                        print('\tnot deleted yet ...')
144
                    deleted_servers[server['name']] = retries + 1
145

    
146
    def _create_server(self, servername, flavorid, imageid, personality=None):
147
        server = self.client.create_server(servername, flavorid, imageid, personality)
148
        self.servers[servername] = server
149
        return server
150

    
151
    def _delete_server(self, servid):
152
        self.client.delete_server(servid)
153

    
154
    def dont_test(self):
155
        global TEST_ALL
156
        if TEST_ALL:
157
            return True
158
        return False
159

    
160
    def assert_dicts_are_deeply_equal(self, d1, d2):
161
        for k,v in d1.items():
162
            self.assertTrue(d2.has_key(k))
163
            if isinstance(v, dict):
164
                self.assert_dicts_are_deeply_equal(v, d2[k])
165
            else:
166
                self.assertEqual(unicode(v), unicode(d2[k]))
167

    
168

    
169
    def test_000(self):
170
        "Prepare a full Cyclades test scenario"
171
        global TEST_ALL
172
        TEST_ALL = True
173

    
174
        self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
175
        self.server2 = self._create_server(self.servname2, self.flavorid, self.img)
176

    
177
        print('testing')
178
        sys.stdout.write(' test create server')
179
        self._test_create_server()
180
        print('...ok')
181

    
182
        sys.stdout.write(' test list servers')
183
        self._test_list_servers()
184
        print('...ok')
185

    
186
        sys.stdout.write(' test get server details')
187
        self._test_get_server_details()
188
        print('...ok')
189

    
190
        sys.stdout.write(' test get image details')
191
        self._test_get_image_details()
192
        print('...ok')
193

    
194

    
195
    def test_list_servers(self):
196
        """Test list servers"""
197
        if self.dont_test():
198
            return
199
        self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
200
        self.server2 = self._create_server(self.servname2, self.flavorid, self.img)
201
        self._test_list_servers()
202

    
203
    def _test_list_servers(self):
204
        servers = self.client.list_servers()
205
        dservers = self.client.list_servers(detail=True)
206

    
207
        """detailed and simple are same size"""
208
        self.assertEqual(len(dservers), len(servers))
209
        for i in range(len(servers)):
210
            for field in ['created', 'flavorRef', 'hostId', 'imageRef', 'progress',
211
                'status', 'updated']:
212
                self.assertFalse(servers[i].has_key(field))
213
                self.assertTrue(dservers[i].has_key(field))
214

    
215
        """detailed and simple contain same names"""
216
        names = sorted(map(lambda x: x["name"], servers))
217
        dnames = sorted(map(lambda x: x["name"], dservers))
218
        self.assertEqual(names, dnames)
219

    
220
    def test_create_server(self):
221
        """Test create_server"""
222
        if self.dont_test():
223
            return
224
        self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
225
        self._test_create_server()
226

    
227
    def _test_create_server(self):
228
        self.assertEqual(self.server1["name"], self.servname1)
229
        self.assertEqual(self.server1["flavorRef"], self.flavorid)
230
        self.assertEqual(self.server1["imageRef"], self.img)
231
        self.assertEqual(self.server1["status"], "BUILD")
232

    
233
    def test_get_server_details(self):
234
        """Test get_server_details"""
235
        if self.dont_test():
236
            return
237
        self.server1 = self._create_server(self.servname1, self.flavorid, self.img)
238
        self._test_get_server_details()
239

    
240
    def _test_get_server_details(self):
241
        r = self.client.get_server_details(self.server1['id'])
242
        self.assertEqual(r["name"], self.servname1)
243
        self.assertEqual(r["flavorRef"], self.flavorid)
244
        self.assertEqual(r["imageRef"], self.img)
245
        self.assertEqual(r["status"], "BUILD")
246

    
247
    def test_get_image_details(self):
248
        """Test get_image_details"""
249
        if self.dont_test():
250
            return
251
        self._test_get_image_details()
252

    
253
    def _test_get_image_details(self):
254
        r = self.client.get_image_details(self.img)
255
        d = self.img_details
256
        self.assert_dicts_are_deeply_equal(r, d)
257

    
258
class testPithos(unittest.TestCase):
259
    """Set up a Pithos+ thorough test"""
260
    def setUp(self):
261
        """
262
        url = 'http://127.0.0.1:8000/v1'
263
        token = 'C/yBXmz3XjTFBnujc2biAg=='
264
        token = 'ac0yH8cQMEZu3M3Mp1MWGA=='
265
        account = 'admin@adminland.com'
266
        """
267

    
268
        url='https://pithos.okeanos.grnet.gr/v1'
269

    
270
        token='Kn+G9dfmlPLR2WFnhfBOow=='
271
        account='saxtouri@grnet.gr'
272
        """
273

274
        url='https://pithos.okeanos.io/v1'
275
        token='0TpoyAXqJSPxLdDuZHiLOA=='
276
        account='saxtouri@admin.grnet.gr'
277
        """
278
        
279
        """
280
        def add_handler(name, level, prefix=''):
281
            h = logging.StreamHandler()
282
            fmt = logging.Formatter(prefix + '%(message)s')
283
            h.setFormatter(fmt)
284
            logger = logging.getLogger(name)
285
            logger.addHandler(h)
286
            logger.setLevel(level)
287
        import logging
288
        sendlog = logging.getLogger('clients.send')
289
        recvlog = logging.getLogger('clients.recv')
290
        add_handler('requests', logging.INFO, prefix='* ')
291
        add_handler('clients.send', logging.INFO, prefix='> ')
292
        add_handler('clients.recv', logging.INFO, prefix='< ')
293
        """
294
        
295
        self.fname = None
296
        container=None
297
        self.client = pithos(url, token, account, container)
298
        self.now = time.mktime(time.gmtime())
299
        self.c1 = 'c1_'+unicode(self.now)
300
        self.c2 = 'c2_'+unicode(self.now)
301
        self.c3 = 'c3_'+unicode(self.now)
302

    
303

    
304
        self.client.create_container(self.c1)
305
        self.client.create_container(self.c2)
306
        self.client.create_container(self.c3)
307
        self.makeNewObject(self.c1, 'test')
308
        self.makeNewObject(self.c2, 'test')
309
        self.now_unformated = datetime.datetime.utcnow()
310
        self.makeNewObject(self.c1, 'test1')
311
        self.makeNewObject(self.c2, 'test1')
312
        """Prepare an object to be shared - also its container"""
313
        self.client.container = self.c1
314
        r = self.client.object_post('test', update=True, permitions={'read':'someUser'})
315
        
316
        self.makeNewObject(self.c1, 'another.test')
317

    
318
    def makeNewObject(self, container, obj):
319
        self.client.container = container
320
        r = self.client.object_put(obj, content_type='application/octet-stream',
321
            data= 'file '+obj+' that lives in '+container,
322
            metadata={'incontainer':container})
323

    
324
    def forceDeleteContainer(self, container):
325
        self.client.container = container
326
        try:
327
            r = self.client.list_objects()
328
        except ClientError:
329
            return
330
        for obj in r:
331
            name = obj['name']
332
            self.client.del_object(name)
333
        r = self.client.container_delete()
334
        self.container = ''
335

    
336
    def tearDown(self):
337
        """Destroy test cases"""
338
        if self.fname is not None:
339
            try:
340
                os.remove(self.fname)
341
            except OSError:
342
                pass
343
            self.fname = None
344
        self.forceDeleteContainer(self.c1)
345
        self.forceDeleteContainer(self.c2)
346
        try:
347
            self.forceDeleteContainer(self.c3)
348
        except ClientError:
349
            pass
350
        self.client.container=''
351

    
352
    def test_000(self):
353
        """Perform a full Pithos+ kamaki support test"""
354

    
355
    def test_account_head(self):
356
        """Test account_HEAD"""
357
        r = self.client.account_head()
358
        self.assertEqual(r.status_code, 204)
359
        
360
        r = self.client.account_head(until='1000000000')
361
        self.assertEqual(r.status_code, 204)
362
       
363
        r = self.client.get_account_info(until='1000000000') 
364
        datestring = unicode(r['x-account-until-timestamp'])
365
        self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
366

    
367
        r = self.client.get_account_quota()
368
        self.assertTrue(r.has_key('x-account-policy-quota'))
369

    
370
        r = self.client.get_account_versioning()
371
        self.assertTrue(r.has_key('x-account-policy-versioning'))
372

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

    
384
    def test_account_get(self):
385
        """Test account_GET"""
386
        #r = self.client.account_get()
387
        #self.assertEqual(r.status_code, 200)
388
        r = self.client.list_containers()
389
        fullLen = len(r)
390
        self.assertTrue(fullLen > 2)
391
        
392
        r = self.client.account_get(limit=1)
393
        self.assertEqual(len(r.json), 1)
394
        
395

    
396
        r = self.client.account_get(marker='c2_')
397
        temp_c0 = r.json[0]['name']
398
        temp_c2 = r.json[2]['name']
399
        
400
        r = self.client.account_get(limit=2, marker='c2_')
401
        conames = [container['name'] for container in r.json \
402
            if container['name'].lower().startswith('c2_')]
403
        self.assertTrue(temp_c0 in conames)
404
        self.assertFalse(temp_c2 in conames)
405
        
406

    
407
        r = self.client.account_get(show_only_shared=True)
408
        self.assertTrue(self.c1 in [c['name'] for c in r.json])
409
        
410
        r = self.client.account_get(until=1342609206)
411
        self.assertTrue(len(r.json) <= fullLen)
412
        
413
        """Check if(un)modified_since"""
414
        for format in self.client.DATE_FORMATS:
415
            now_formated = self.now_unformated.strftime(format)
416
            r1 = self.client.account_get(if_modified_since=now_formated, success=(200, 304, 412))
417
            sc1 = r1.status_code
418
            r1.release()
419
            r2 = self.client.account_get(if_unmodified_since=now_formated, success=(200, 304, 412))
420
            sc2 = r2.status_code
421
            r2.release()
422
            self.assertNotEqual(sc1, sc2)
423

    
424
        """Check sharing_accounts"""
425
        r = self.client.get_sharing_accounts()
426
        self.assertTrue(len(r)>0)
427

    
428
    def test_account_post(self):
429
        """Test account_POST"""
430
        r = self.client.account_post()
431
        self.assertEqual(r.status_code, 202)
432
        grpName = 'grp'+unicode(self.now)
433
        
434

    
435
        """Method set/del_account_meta and set_account_groupcall use account_post internally
436
        """
437
        self.client.set_account_group(grpName, ['u1', 'u2'])
438
        r = self.client.get_account_group()
439
        self.assertEqual(r['x-account-group-'+grpName], 'u1,u2')
440
        self.client.del_account_group(grpName)
441
        r = self.client.get_account_group()
442
        self.assertTrue(not r.has_key('x-account-group-'+grpName))
443

    
444
        mprefix = 'meta'+unicode(self.now)
445
        self.client.set_account_meta({mprefix+'1':'v1', mprefix+'2':'v2'})
446
        r = self.client.get_account_meta()
447
        self.assertEqual(r['x-account-meta-'+mprefix+'1'], 'v1')
448
        self.assertEqual(r['x-account-meta-'+mprefix+'2'], 'v2')
449

    
450
        self.client.del_account_meta(mprefix+'1')
451
        r = self.client.get_account_meta()
452
        self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'1'))
453

    
454
        self.client.del_account_meta(mprefix+'2')
455
        r = self.client.get_account_meta()
456
        self.assertTrue(not r.has_key('x-account-meta-'+mprefix+'2'))
457

    
458
        """Missing testing for quota, versioning, because normally
459
        you don't have permitions to modify those at account level
460
        """
461

    
462
        newquota=1000000
463
        self.client.set_account_quota(newquota)
464
        #r = self.client.get_account_info()
465
        #print(unicode(r))
466
        #r = self.client.get_account_quota()
467
        #self.assertEqual(r['x-account-policy-quota'], newquota)
468
        self.client.set_account_versioning('auto')
469

    
470
    def test_container_head(self):
471
        """Test container_HEAD"""
472
        self.client.container = self.c1
473

    
474
        r = self.client.container_head()
475
        self.assertEqual(r.status_code, 204)
476
        
477
        """Check until"""
478
        r = self.client.container_head(until=1000000, success=(204, 404))
479
        self.assertEqual(r.status_code, 404)
480
        
481
        """Check and if(un)modified_since"""
482
        for format in self.client.DATE_FORMATS:
483
            now_formated = self.now_unformated.strftime(format)
484
            r1 = self.client.container_head(if_modified_since=now_formated, success=(204, 304, 412))
485
            sc1=r1.status_code
486
            r1.release()
487
            r2 = self.client.container_head(if_unmodified_since=now_formated, success=(204, 304, 412))
488
            sc2=r2.status_code
489
            r2.release()
490
            self.assertNotEqual(sc1, sc2)
491

    
492
        """Check container object meta"""
493
        r = self.client.get_container_object_meta()
494
        self.assertEqual(r['x-container-object-meta'], 'Incontainer')
495

    
496
    def test_container_get(self):
497
        """Test container_GET"""
498
        self.client.container = self.c1
499

    
500
        r = self.client.container_get()
501
        self.assertEqual(r.status_code, 200)
502
        fullLen = len(r.json)
503
        
504

    
505
        r = self.client.container_get(prefix='test')
506
        lalobjects = [obj for obj in r.json if obj['name'].startswith('test')]
507
        self.assertTrue(len(r.json) > 1)
508
        self.assertEqual(len(r.json), len(lalobjects))
509
        
510

    
511
        r = self.client.container_get(limit=1)
512
        self.assertEqual(len(r.json), 1)
513
        
514

    
515
        r = self.client.container_get(marker='another')
516
        self.assertTrue(len(r.json) > 1)
517
        neobjects = [obj for obj in r.json if obj['name'] > 'another']
518
        self.assertEqual(len(r.json), len(neobjects))
519
        
520

    
521
        r = self.client.container_get(prefix='another.test', delimiter='.')
522
        self.assertTrue(fullLen > len(r.json))
523
        
524

    
525
        r = self.client.container_get(path='/')
526
        self.assertEqual(fullLen, len(r.json))
527
        
528

    
529
        r = self.client.container_get(format='xml')
530
        self.assertEqual(r.text.split()[4], 'name="'+self.c1+'">')
531
        
532

    
533
        r = self.client.container_get(meta=['incontainer'])
534
        self.assertTrue(len(r.json) > 0)
535
        
536

    
537
        r = self.client.container_get(show_only_shared=True)
538
        self.assertTrue(len(r.json) < fullLen)
539
        
540

    
541
        try:
542
            r = self.client.container_get(until=1000000000)
543
            datestring = unicode(r.headers['x-account-until-timestamp'])
544
            self.assertEqual(u'Sun, 09 Sep 2001 01:46:40 GMT', datestring)
545
            
546
        except ClientError:
547
            
548
            pass
549

    
550
        """Check and if un/modified_since"""
551
        for format in self.client.DATE_FORMATS:
552
            now_formated = self.now_unformated.strftime(format)
553
            r1 = self.client.container_get(if_modified_since=now_formated, success=(200, 304, 412))
554
            sc1 = r1.status_code
555
            r1.release()
556
            r2 = self.client.container_get(if_unmodified_since=now_formated, success=(200, 304, 412))
557
            sc2 = r2.status_code
558
            r2.release()
559
            self.assertNotEqual(sc1, sc2)
560
       
561
    def test_container_put(self):
562
        """Test container_PUT"""
563
        self.client.container = self.c2
564

    
565
        r = self.client.container_put()
566
        self.assertEqual(r.status_code, 202)
567
        
568

    
569
        r = self.client.get_container_quota(self.client.container)
570
        cquota = r.values()[0]
571
        newquota = 2*int(cquota)
572

    
573
        r = self.client.container_put(quota=newquota)
574
        self.assertEqual(r.status_code, 202)
575
        
576
        r = self.client.get_container_quota(self.client.container)
577
        xquota = int(r.values()[0])
578
        self.assertEqual(newquota, xquota)
579

    
580
        r = self.client.container_put(versioning='auto')
581
        self.assertEqual(r.status_code, 202)
582
        
583
        r = self.client.get_container_versioning(self.client.container)
584
        nvers = r.values()[0]
585
        self.assertEqual('auto', nvers)
586

    
587
        r = self.client.container_put(versioning='none')
588
        self.assertEqual(r.status_code, 202)
589
        
590
        r = self.client.get_container_versioning(self.client.container)
591
        nvers = r.values()[0]
592
        self.assertEqual('none', nvers)
593

    
594
        r = self.client.container_put(metadata={'m1':'v1', 'm2':'v2'})
595
        self.assertEqual(r.status_code, 202)
596
        
597
        r = self.client.get_container_meta(self.client.container)
598
        self.assertTrue(r.has_key('x-container-meta-m1'))
599
        self.assertEqual(r['x-container-meta-m1'], 'v1')
600
        self.assertTrue(r.has_key('x-container-meta-m2'))
601
        self.assertEqual(r['x-container-meta-m2'], 'v2')
602

    
603
        r = self.client.container_put(metadata={'m1':'', 'm2':'v2a'})
604
        self.assertEqual(r.status_code, 202)
605
        
606
        r = self.client.get_container_meta(self.client.container)
607
        self.assertTrue(not r.has_key('x-container-meta-m1'))
608
        self.assertTrue(r.has_key('x-container-meta-m2'))
609
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
610
       
611
        self.client.del_container_meta(self.client.container)
612

    
613
    def test_container_post(self):
614
        """Test container_POST"""
615
        self.client.container = self.c2
616

    
617
        """Simple post"""
618
        r = self.client.container_post()
619
        self.assertEqual(r.status_code, 202)
620
        
621

    
622
        """post meta"""
623
        self.client.set_container_meta({'m1':'v1', 'm2':'v2'})
624
        r = self.client.get_container_meta(self.client.container)
625
        self.assertTrue(r.has_key('x-container-meta-m1'))
626
        self.assertEqual(r['x-container-meta-m1'], 'v1')
627
        self.assertTrue(r.has_key('x-container-meta-m2'))
628
        self.assertEqual(r['x-container-meta-m2'], 'v2')
629

    
630
        """post/2del meta"""
631
        r = self.client.del_container_meta('m1')
632
        r = self.client.set_container_meta({'m2':'v2a'})
633
        r = self.client.get_container_meta(self.client.container)
634
        self.assertTrue(not r.has_key('x-container-meta-m1'))
635
        self.assertTrue(r.has_key('x-container-meta-m2'))
636
        self.assertEqual(r['x-container-meta-m2'], 'v2a')
637

    
638
        """check quota"""
639
        r = self.client.get_container_quota(self.client.container)
640
        cquota = r.values()[0]
641
        newquota = 2*int(cquota)
642
        r = self.client.set_container_quota(newquota)
643
        r = self.client.get_container_quota(self.client.container)
644
        xquota = int(r.values()[0])
645
        self.assertEqual(newquota, xquota)
646
        r = self.client.set_container_quota(cquota)
647
        r = self.client.get_container_quota(self.client.container)
648
        xquota = r.values()[0]
649
        self.assertEqual(cquota, xquota)
650

    
651
        """Check versioning"""
652
        self.client.set_container_versioning('auto')
653
        r = self.client.get_container_versioning(self.client.container)
654
        nvers = r.values()[0]
655
        self.assertEqual('auto', nvers)
656
        self.client.set_container_versioning('none')
657
        r = self.client.get_container_versioning(self.client.container)
658
        nvers = r.values()[0]
659
        self.assertEqual('none', nvers)
660

    
661
        """put_block uses content_type and content_length to
662
        post blocks of data 2 container. All that in upload_object"""
663
        """Change a file at fs"""
664
        self.create_large_file(1024*1024*100, 'l100M.'+unicode(self.now))
665
        """Upload it at a directory in container"""
666
        self.client.create_directory('dir')
667
        newf = open(self.fname, 'r')
668
        self.client.upload_object('/dir/sample.file', newf)
669
        newf.close()
670
        """Check if file has been uploaded"""
671
        r = self.client.get_object_info('/dir/sample.file')
672
        self.assertTrue(int(r['content-length']) > 100000000)
673

    
674
        """WTF is tranfer_encoding? What should I check about th** s**t? """
675
        #TODO
676

    
677
        """Check update=False"""
678
        r = self.client.object_post('test', update=False, metadata={'newmeta':'newval'})
679
        
680
        r = self.client.get_object_info('test')
681
        self.assertTrue(r.has_key('x-object-meta-newmeta'))
682
        self.assertFalse(r.has_key('x-object-meta-incontainer'))
683

    
684
        r = self.client.del_container_meta('m2')
685

    
686
    def test_container_delete(self):
687
        """Test container_DELETE"""
688

    
689
        """Fail to delete a non-empty container"""
690
        self.client.container = self.c2
691
        r = self.client.container_delete(success=409)
692
        self.assertEqual(r.status_code, 409)
693
        
694

    
695
        """Fail to delete c3 (empty) container"""
696
        self.client.container = self.c3
697
        r = self.client.container_delete(until='1000000000')
698
        self.assertEqual(r.status_code, 204)
699
        
700

    
701
        """Delete c3 (empty) container"""
702
        r = self.client.container_delete()
703
        self.assertEqual(r.status_code, 204)
704

    
705
        """Purge container(empty a container), check versionlist"""
706
        self.client.container = self.c1
707
        r = self.client.object_head('test', success=(200, 404))
708
        self.assertEqual(r.status_code, 200)
709
        self.client.del_container(delimiter='/')
710
        r = self.client.object_head('test', success=(200, 404))
711
        self.assertEqual(r.status_code, 404)
712
        r = self.client.get_object_versionlist('test')
713
        self.assertTrue(len(r) > 0)
714
        self.assertTrue(len(r[0])>1)
715
        self.client.purge_container()
716
        self.assertRaises(ClientError, self.client.get_object_versionlist, 'test')
717

    
718
    def test_object_head(self):
719
        """Test object_HEAD"""
720
        self.client.container = self.c2
721
        obj = 'test'
722

    
723
        r = self.client.object_head(obj)
724
        self.assertEqual(r.status_code, 200)
725
        etag = r.headers['etag']
726
        
727

    
728
        r = self.client.object_head(obj, version=40)
729
        self.assertEqual(r.headers['x-object-version'], '40')
730
        
731

    
732
        r = self.client.object_head(obj, if_etag_match=etag)
733
        self.assertEqual(r.status_code, 200)
734
        
735
        r = self.client.object_head(obj, if_etag_not_match=etag, success=(200, 412, 304))
736
        self.assertNotEqual(r.status_code, 200)
737
        
738

    
739
        r = self.client.object_head(obj, version=40, if_etag_match=etag, success=412)
740
        self.assertEqual(r.status_code, 412)
741
        
742

    
743
        """Check and if(un)modified_since"""
744
        for format in self.client.DATE_FORMATS:
745
            now_formated = self.now_unformated.strftime(format)
746
            r1 = self.client.object_head(obj, if_modified_since=now_formated,
747
                success=(200, 304, 412))
748
            sc1 = r1.status_code
749
            r1.release()
750
            r2 = self.client.object_head(obj, if_unmodified_since=now_formated,
751
                success=(200, 304, 412))
752
            sc2 = r2.status_code
753
            r2.release()
754
            self.assertNotEqual(sc1, sc2)
755

    
756
    def test_object_get(self):
757
        """Test object_GET"""
758
        self.client.container = self.c1
759
        obj = 'test'
760

    
761
        r = self.client.object_get(obj)
762
        self.assertEqual(r.status_code, 200)
763

    
764
        osize = int(r.headers['content-length'])
765
        etag = r.headers['etag']
766
        
767

    
768
        r = self.client.object_get(obj, hashmap=True)
769
        self.assertTrue(r.json.has_key('hashes') \
770
            and r.json.has_key('block_hash') \
771
            and r.json.has_key('block_size') \
772
            and r.json.has_key('bytes'))
773
        
774

    
775
        r = self.client.object_get(obj, format='xml', hashmap=True)
776
        self.assertEqual(len(r.text.split('hash>')), 3)
777
        
778

    
779
        rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
780
        r = self.client.object_get(obj, data_range=rangestr, success=(200, 206))
781
        partsize = int(r.headers['content-length'])
782
        self.assertTrue(0 < partsize and partsize <= 1+osize/3)
783
        
784

    
785
        rangestr = 'bytes=%s-%s'%(osize/3, osize/2)
786
        r = self.client.object_get(obj, data_range=rangestr, if_range=True, success=(200, 206))
787
        partsize = int(r.headers['content-length'])
788
        self.assertTrue(0 < partsize and partsize <= 1+osize/3)
789
        
790

    
791
        r = self.client.object_get(obj, if_etag_match=etag)
792
        self.assertEqual(r.status_code, 200)
793
        
794

    
795
        r = self.client.object_get(obj, if_etag_not_match=etag+'LALALA')
796
        self.assertEqual(r.status_code, 200)
797
        
798

    
799
        """Check and if(un)modified_since"""
800
        for format in self.client.DATE_FORMATS:
801
            now_formated = self.now_unformated.strftime(format)
802
            r1 = self.client.object_get(obj, if_modified_since=now_formated,
803
                success=(200, 304, 412))
804
            sc1 = r1.status_code
805
            r1.release()
806
            r2 = self.client.object_get(obj, if_unmodified_since=now_formated, success=(200, 304, 412))
807
            sc2 = r2.status_code
808
            r2.release()
809
            self.assertNotEqual(sc1, sc2)
810

    
811
    def test_object_put(self):
812
        """Test object_PUT"""
813

    
814
        self.client.container = self.c2
815
        obj='another.test'
816

    
817
        """create the object"""
818
        r = self.client.object_put(obj, data='a', content_type='application/octer-stream',
819
            permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']},
820
            metadata={'key1':'val1', 'key2':'val2'}, content_encoding='UTF-8',
821
            content_disposition='attachment; filename="fname.ext"')
822
        self.assertEqual(r.status_code, 201)
823
        etag = r.headers['etag']
824
        
825
        """Check content-disposition"""
826
        r = self.client.get_object_info(obj)
827
        self.assertTrue(r.has_key('content-disposition'))
828

    
829
        """Check permitions"""
830
        r = self.client.get_object_sharing(obj)
831
        self.assertTrue('accx:groupa' in r['read'])
832
        self.assertTrue('u1' in r['read'])
833
        self.assertTrue('u2' in r['write'])
834
        self.assertTrue('u3' in r['write'])
835

    
836
        """Check metadata"""
837
        r = self.client.get_object_meta(obj)
838
        self.assertEqual(r['x-object-meta-key1'], 'val1')
839
        self.assertEqual(r['x-object-meta-key2'], 'val2')
840

    
841
        """Check public and if_etag_match"""
842
        r = self.client.object_put(obj, if_etag_match=etag, data='b',
843
            content_type='application/octet-stream', public=True)
844
        
845
        r = self.client.object_get(obj)
846
        self.assertTrue(r.headers.has_key('x-object-public'))
847
        vers2 = int(r.headers['x-object-version'])
848
        etag = r.headers['etag']
849
        self.assertEqual(r.text, 'b')
850
        
851
        """Check if_etag_not_match"""
852
        r = self.client.object_put(obj, if_etag_not_match=etag, data='c',
853
            content_type='application/octet-stream', success=(201, 412))
854
        self.assertEqual(r.status_code, 412)
855
        
856

    
857
        """Check content_type and content_length"""
858
        tmpdir = 'dir'+unicode(self.now)
859
        r = self.client.object_put(tmpdir, content_type='application/directory',
860
            content_length=0)
861
        
862
        r = self.client.get_object_info(tmpdir)
863
        self.assertEqual(r['content-type'], 'application/directory')
864

    
865
        """Check copy_from, content_encoding"""
866
        r = self.client.object_put('%s/%s'%(tmpdir, obj), format=None, 
867
            copy_from='/%s/%s'%(self.client.container, obj),
868
            content_encoding='application/octet-stream', 
869
            source_account=self.client.account,
870
            content_length=0, success=201)
871
        self.assertEqual(r.status_code, 201)
872

    
873
        """Test copy_object for cross-conctainer copy"""
874
        self.client.copy_object(src_container=self.c2, src_object='%s/%s'%(tmpdir, obj),
875
            dst_container=self.c1, dst_object=obj)
876
        self.client.container = self.c1
877
        r1 = self.client.get_object_info(obj)
878
        self.client.container = self.c2
879
        r2 = self.client.get_object_info('%s/%s'%(tmpdir, obj))
880
        self.assertEqual(r1['x-object-hash'],r2['x-object-hash'])
881
        
882
        """Check cross-container copy_from, content_encoding"""
883
        self.client.container = self.c1
884
        fromstr = '/'+self.c2+'/'+tmpdir+'/'+obj
885
        r = self.client.object_put(obj, format=None, copy_from=fromstr,
886
            content_encoding='application/octet-stream', 
887
            source_account=self.client.account,
888
            content_length=0, success=201)
889
        
890
        self.assertEqual(r.status_code, 201)
891
        r = self.client.get_object_info(obj)
892
        self.assertEqual(r['etag'], etag)
893

    
894
        """Check source_account"""
895
        self.client.container = self.c2
896
        fromstr = '/'+self.c1+'/'+obj
897
        r = self.client.object_put(obj+'v2', format=None, move_from=fromstr,
898
            content_encoding='application/octet-stream', 
899
            source_account='nonExistendAddress@NeverLand.com', 
900
            content_length=0, success=(201, 403))
901
        self.assertEqual(r.status_code, 403)
902
        
903
        """Check cross-container move_from"""
904
        self.client.container = self.c1
905
        r1 = self.client.get_object_info(obj)
906
        self.client.container = self.c2
907
        self.client.move_object(src_container=self.c1, src_object=obj, dst_container=self.c2,
908
        dst_object=obj+'v0')
909
        r0 = self.client.get_object_info(obj+'v0')
910
        self.assertEqual(r1['x-object-hash'], r0['x-object-hash'])
911

    
912
        """Check move_from"""
913
        r = self.client.object_put(obj+'v1', format=None, 
914
            move_from='/'+self.c2+'/'+obj,
915
            source_version = vers2,
916
            content_encoding='application/octet-stream',
917
            content_length=0, success=201)
918
        
919
        """Check manifest"""
920
        mobj = 'manifest.test'
921
        txt = ''
922
        for i in range(10):
923
            txt += '%s'%i
924
            r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
925
                content_type='application/octet-stream', content_encoding='application/octet-stream')
926
            
927
        r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream',
928
            manifest='%s/%s'%(self.client.container, mobj))
929
        
930
        r = self.client.object_get(mobj)
931
        self.assertEqual(r.text, txt)
932
       
933
        """Upload a local file with one request"""
934
        self.create_large_file(1024*10, 'l10K.'+unicode(self.now))
935
        newf = open(self.fname, 'r')
936
        self.client.upload_object('sample.file', newf)
937
        newf.close()
938
        """Check if file has been uploaded"""
939
        r = self.client.get_object_info('sample.file')
940
        self.assertEqual(int(r['content-length']), 10260)
941

    
942
        """Some problems with transfer-encoding?"""
943

    
944
    def test_object_copy(self):
945
        """Test object_COPY"""
946
        self.client.container=self.c2
947
        obj = 'test2'
948

    
949
        data= '{"key1":"val1", "key2":"val2"}'
950
        r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
951
            data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
952
            permitions={
953
                'read':['accX:groupA', 'u1', 'u2'],
954
                'write':['u2', 'u3']},
955
            content_disposition='attachment; filename="fname.ext"')
956
        
957
        r = self.client.object_copy(obj+'orig',
958
            destination = '/'+self.client.container+'/'+obj,
959
            ignore_content_type=False, content_type='application/json', 
960
            metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
961
            permitions={'write':['u5', 'accX:groupB']})
962
        self.assertEqual(r.status_code, 201)
963
        
964
        """Check content-disposition"""
965
        r = self.client.get_object_info(obj)
966
        self.assertTrue(r.has_key('content-disposition'))
967

    
968
        """Check Metadata"""
969
        r = self.client.get_object_meta(obj)
970
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
971
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
972
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
973

    
974
        """Check permitions"""
975
        r = self.client.get_object_sharing(obj)
976
        self.assertFalse(r.has_key('read') or 'u2' in r['write'])
977
        self.assertTrue('accx:groupb' in r['write'])
978

    
979
        """Check destination account"""
980
        r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
981
            content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
982
            success=(201, 403))
983
        self.assertEqual(r.status_code, 403)
984
        
985

    
986
        """Check destination being another container
987
        and also content_type and content encoding"""
988
        r = self.client.object_copy(obj, destination='/%s/%s'%(self.c1,obj),
989
            content_encoding='utf8', content_type='application/json')
990
        self.assertEqual(r.status_code, 201)
991
        self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
992
        
993

    
994
        """Check ignore_content_type and content_type"""
995
        r = self.client.object_get(obj)
996
        etag = r.headers['etag']
997
        ctype = r.headers['content-type']
998
        self.assertEqual(ctype, 'application/json')
999
        
1000
        r = self.client.object_copy(obj+'orig',
1001
            destination = '/'+self.client.container+'/'+obj+'0',
1002
            ignore_content_type=True, content_type='application/json')
1003
        self.assertEqual(r.status_code, 201)
1004
        self.assertNotEqual(r.headers['content-type'], 'application/json')
1005
        
1006

    
1007
        """Check if_etag_(not_)match"""
1008
        r = self.client.object_copy(obj,
1009
            destination='/'+self.client.container+'/'+obj+'1', if_etag_match=etag)
1010
        self.assertEqual(r.status_code, 201)
1011
        
1012
        r = self.client.object_copy(obj,
1013
            destination='/'+self.client.container+'/'+obj+'2', if_etag_not_match='lalala')
1014
        self.assertEqual(r.status_code, 201)
1015
        vers2 = r.headers['x-object-version']
1016
        
1017

    
1018
        """Check source_version, public and format """
1019
        r = self.client.object_copy(obj+'2', destination='/'+self.client.container+'/'+obj+'3', source_version=vers2, format='xml', public=True)
1020
        self.assertEqual(r.status_code, 201)
1021
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
1022
        
1023
        r = self.client.get_object_info(obj+'3')
1024
        self.assertTrue(r.has_key('x-object-public'))
1025

    
1026
    def test_object_move(self):
1027
        """Test object_MOVE"""
1028
        self.client.container= self.c2
1029
        obj = 'test2'
1030

    
1031
        data= '{"key1":"val1", "key2":"val2"}'
1032
        r = self.client.object_put(obj+'orig', content_type='application/octet-stream',
1033
            data= data, metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1034
            permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1035
        
1036
        r = self.client.object_move(obj+'orig', destination = '/'+self.client.container+'/'+obj,
1037
            ignore_content_type=False, content_type='application/json', 
1038
            metadata={'mkey2':'mval2a', 'mkey3':'mval3'},
1039
            permitions={'write':['u5', 'accX:groupB']})
1040
        self.assertEqual(r.status_code, 201)
1041
        
1042

    
1043
        """Check Metadata"""
1044
        r = self.client.get_object_meta(obj)
1045
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1046
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1047
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1048

    
1049
        """Check permitions"""
1050
        r = self.client.get_object_sharing(obj)
1051
        self.assertFalse(r.has_key('read'))
1052
        self.assertTrue('u5' in r['write'])
1053
        self.assertTrue('accx:groupb' in r['write'])
1054

    
1055
        """Check destination account"""
1056
        r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj), content_encoding='utf8',
1057
            content_type='application/json', destination_account='nonExistendAddress@NeverLand.com',
1058
            success=(201, 403))
1059
        self.assertEqual(r.status_code, 403)
1060
        
1061

    
1062
        """Check destination being another container and also
1063
        content_type, content_disposition and content encoding"""
1064
        r = self.client.object_move(obj, destination='/%s/%s'%(self.c1,obj),
1065
            content_encoding='utf8', content_type='application/json',
1066
            content_disposition='attachment; filename="fname.ext"')
1067
        self.assertEqual(r.status_code, 201)
1068
        self.assertEqual(r.headers['content-type'], 'application/json; charset=UTF-8')
1069
        self.client.container=self.c1
1070
        r = self.client.get_object_info(obj)
1071
        self.assertTrue(r.has_key('content-disposition') and 'fname.ext' in r['content-disposition'])
1072
        etag = r['etag']
1073
        ctype = r['content-type']
1074
        self.assertEqual(ctype, 'application/json')
1075

    
1076
        """Check ignore_content_type and content_type"""
1077
        r = self.client.object_move(obj, destination = '/%s/%s'%(self.c2,obj),
1078
            ignore_content_type=True, content_type='application/json')
1079
        self.assertEqual(r.status_code, 201)
1080
        self.assertNotEqual(r.headers['content-type'], 'application/json')
1081
        
1082

    
1083
        """Check if_etag_(not_)match"""
1084
        self.client.container=self.c2
1085
        r = self.client.object_move(obj, destination='/'+self.client.container+'/'+obj+'0',
1086
            if_etag_match=etag)
1087
        self.assertEqual(r.status_code, 201)
1088
        
1089
        r = self.client.object_move(obj+'0', destination='/'+self.client.container+'/'+obj+'1',
1090
            if_etag_not_match='lalala')
1091
        self.assertEqual(r.status_code, 201)
1092
        
1093

    
1094
        """Check public and format """
1095
        r = self.client.object_move(obj+'1', destination='/'+self.client.container+'/'+obj+'2',
1096
            format='xml', public=True)
1097
        self.assertEqual(r.status_code, 201)
1098
        self.assertTrue(r.headers['content-type'].index('xml') > 0)
1099
        
1100
        r = self.client.get_object_info(obj+'2')
1101
        self.assertTrue(r.has_key('x-object-public'))
1102

    
1103
    def test_object_post(self):
1104
        """Test object_POST"""
1105
        self.client.container=self.c2
1106
        obj = 'test2'
1107
        """create a filesystem file"""
1108
        self.fname = obj
1109
        newf = open(self.fname, 'w')
1110
        newf.writelines(['ello!\n','This is a test line\n','inside a test file\n'])
1111
        newf.close()
1112
        """create a file on container"""
1113
        r = self.client.object_put(obj, content_type='application/octet-stream',
1114
            data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1115
            permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1116
        
1117

    
1118
        """Append tests update, content_range, content_type, content_length"""
1119
        newf = open(obj, 'r')
1120
        self.client.append_object(obj, newf)
1121
        r = self.client.object_get(obj)
1122
        self.assertTrue(r.text.startswith('Hello!'))
1123
        
1124

    
1125
        """Overwrite tests update, content_type, content_length, content_range"""
1126
        newf.seek(0)
1127
        r = self.client.overwrite_object(obj, 0, 10, newf)
1128
        r = self.client.object_get(obj)
1129
        self.assertTrue(r.text.startswith('ello!'))
1130
        newf.close()
1131
        
1132
        
1133
        """Truncate tests update, content_range, content_type,
1134
        object_bytes and source_object"""
1135
        r = self.client.truncate_object(obj, 5)
1136
        r = self.client.object_get(obj)
1137
        self.assertEqual(r.text, 'ello!')
1138
        
1139

    
1140
        """Check metadata"""
1141
        self.client.set_object_meta(obj, {'mkey2':'mval2a', 'mkey3':'mval3'})
1142
        r = self.client.get_object_meta(obj)
1143
        self.assertEqual(r['x-object-meta-mkey1'], 'mval1')
1144
        self.assertEqual(r['x-object-meta-mkey2'], 'mval2a')
1145
        self.assertEqual(r['x-object-meta-mkey3'], 'mval3')
1146
        self.client.del_object_meta('mkey1', obj)
1147
        r = self.client.get_object_meta(obj)
1148
        self.assertFalse(r.has_key('x-object-meta-mkey1'))
1149

    
1150
        """Check permitions"""
1151
        self.client.set_object_sharing(obj,
1152
            read_permition=['u4', 'u5'], write_permition=['u4'])
1153
        r = self.client.get_object_sharing(obj)
1154
        self.assertTrue(r.has_key('read'))
1155
        self.assertTrue('u5' in r['read'])
1156
        self.assertTrue(r.has_key('write'))
1157
        self.assertTrue('u4' in r['write'])
1158
        self.client.del_object_sharing(obj)
1159
        r = self.client.get_object_sharing(obj)
1160
        self.assertTrue(len(r) == 0)
1161

    
1162
        """Check publish"""
1163
        self.client.publish_object(obj)
1164
        r = self.client.get_object_info(obj)
1165
        self.assertTrue(r.has_key('x-object-public'))
1166
        self.client.unpublish_object(obj)
1167
        r = self.client.get_object_info(obj)
1168
        self.assertFalse(r.has_key('x-object-public'))
1169

    
1170
        """Check if_etag_(not)match"""
1171
        etag = r['etag']
1172
        #r = self.client.object_post(obj, update=True, public=True,
1173
        #    if_etag_not_match=etag, success=(412,202,204))
1174
        #self.assertEqual(r.status_code, 412)
1175
        
1176
        r = self.client.object_post(obj, update=True, public=True,
1177
            if_etag_match=etag, content_encoding='application/json')
1178
        
1179
        r = self.client.get_object_info(obj)
1180
        helloVersion = r['x-object-version']
1181
        self.assertTrue(r.has_key('x-object-public'))
1182
        self.assertEqual(r['content-encoding'], 'application/json')
1183

    
1184
        """Check source_version and source_account and content_disposition"""
1185
        r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1186
            content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1187
            source_account='thisAccountWillNeverExist@adminland.com',
1188
            source_version=helloVersion, data='12345', success=(403, 202, 204))
1189
        self.assertEqual(r.status_code, 403)
1190
        
1191
        r = self.client.object_post(obj, update=True, content_type='application/octet-srteam',
1192
            content_length=5, content_range='bytes 1-5/*', source_object='/%s/%s'%(self.c2,obj),
1193
            source_account=self.client.account, source_version=helloVersion, data='12345',
1194
            content_disposition='attachment; filename="fname.ext"')
1195
        
1196
        r = self.client.object_get(obj)
1197
        self.assertEqual(r.text, 'eello!')
1198
        self.assertTrue(r.headers.has_key('content-disposition')
1199
            and 'fname.ext' in r.headers['content-disposition'])
1200
        
1201

    
1202
        """Check manifest"""
1203
        mobj = 'manifest.test'
1204
        txt = ''
1205
        for i in range(10):
1206
            txt += '%s'%i
1207
            r = self.client.object_put('%s/%s'%(mobj, i), data='%s'%i, content_length=1, success=201,
1208
                content_encoding='application/octet-stream', content_type='application/octet-stream')
1209
            
1210
        #r = self.client.object_put(mobj, content_length=0, content_type='application/octet-stream')
1211
        self.client.create_object_by_manifestation(mobj, content_type='application/octet-stream')
1212
        
1213
        r = self.client.object_post(mobj, manifest='%s/%s'%(self.client.container, mobj))
1214
        
1215
        r = self.client.object_get(mobj)
1216
        self.assertEqual(r.text, txt)
1217
        
1218

    
1219
        """We need to check transfer_encoding """
1220

    
1221
    def test_object_delete(self):
1222
        """Test object_DELETE"""
1223
        self.client.container=self.c2
1224
        obj = 'test2'
1225
        """create a file on container"""
1226
        r = self.client.object_put(obj, content_type='application/octet-stream',
1227
            data= 'H', metadata={'mkey1':'mval1', 'mkey2':'mval2'},
1228
            permitions={'read':['accX:groupA', 'u1', 'u2'], 'write':['u2', 'u3']})
1229
        
1230

    
1231
        """Check with false until"""
1232
        r = self.client.object_delete(obj, until=1000000)
1233
        
1234
        r = self.client.object_get(obj, success=(200, 404))
1235
        self.assertEqual(r.status_code, 200)
1236
        
1237

    
1238
        """Check normal case"""
1239
        r = self.client.object_delete(obj)
1240
        self.assertEqual(r.status_code, 204)
1241
        
1242
        r = self.client.object_get(obj, success=(200, 404))
1243
        self.assertEqual(r.status_code, 404)
1244
        
1245

    
1246
    def create_large_file(self, size, name):
1247
        """Create a large file at fs"""
1248
        self.fname = name
1249
        import random
1250
        random.seed(self.now)
1251
        f = open(self.fname, 'w')
1252
        sys.stdout.write(' create random file %s of size %s'%(name, size)+' 0%')
1253
        for hobyte_id in range(size/8):
1254
            sss = 'hobt%s'%random.randint(1000, 9999)
1255
            f.write(sss)
1256
            if 0 == (hobyte_id*800)%size:
1257
                f.write('\n')
1258
                sys.stdout.write('\b\b')
1259
                prs = (hobyte_id*800)//size
1260
                if prs > 10:
1261
                    sys.stdout.write('\b')
1262
                sys.stdout.write('%s'%prs+'%')
1263
                sys.stdout.flush()
1264
        print('\b\b\b100%')
1265
        f.close()
1266
        """"""
1267

    
1268
def init_parser():
1269
    parser = ArgumentParser(add_help=False)
1270
    parser.add_argument('-h', '--help', dest='help', action='store_true', default=False,
1271
        help="Show this help message and exit")
1272
    return parser
1273

    
1274
if __name__ == '__main__':
1275
    parser = init_parser()
1276
    args, argv = parser.parse_known_args()
1277

    
1278
    if len(argv) > 2 or getattr(args,'help') or len(argv) < 1:
1279
        raise Exception('\tusage: tests.py <group> [command]')
1280
    suiteFew = unittest.TestSuite()
1281

    
1282
    if len(argv) == 0 or argv[0] == 'pithos':
1283
        if len(argv) == 1:
1284
            suiteFew.addTest(unittest.makeSuite(testPithos))
1285
        else:
1286
            suiteFew.addTest(testPithos('test_'+argv[1]))
1287
    if len(argv) == 0 or argv[0] == 'cyclades':
1288
        if len(argv) == 1:
1289
            #suiteFew.addTest(unittest.makeSuite(testCyclades))
1290
            suiteFew.addTest(testCyclades('test_000'))
1291
        else:
1292
            suiteFew.addTest(testCyclades('test_'+argv[1]))
1293

    
1294
    unittest.TextTestRunner(verbosity = 2).run(suiteFew)