Skip to content

Commit 40aa930

Browse files
committed
add test cases
1 parent c160e08 commit 40aa930

File tree

2 files changed

+121
-33
lines changed

2 files changed

+121
-33
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ nosetests.xml
4545
.project
4646
.pydevproject
4747
/.idea
48-
/.venv
48+
/.venv
49+
/.qiniu_pythonsdk_hostscache.json

test_qiniu.py

Lines changed: 119 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import string
55
import random
66
import tempfile
7+
import hashlib
78
from imp import reload
89

910
import requests
@@ -55,21 +56,43 @@ def rand_string(length):
5556
return ''.join([random.choice(lib) for i in range(0, length)])
5657

5758

58-
def create_temp_file(size):
59-
t = tempfile.mktemp()
60-
f = open(t, 'wb')
61-
f.seek(size - 1)
62-
f.write(b('0'))
63-
f.close()
64-
return t
65-
59+
def create_temp_file(size, rand=True):
60+
fd, path = tempfile.mkstemp()
61+
with os.fdopen(fd, "wb") as f:
62+
if rand:
63+
rest = size
64+
while rest > 0:
65+
to_write = min(rest, 1 << 22)
66+
f.write(os.urandom(to_write))
67+
rest -= to_write
68+
else:
69+
f.seek(size - 1)
70+
f.write(b('0'))
71+
f.close()
72+
return path
73+
74+
def hash_of_file(path, hash_factory=hashlib.md5, chunk_num_blocks=128):
75+
h = hash_factory()
76+
with open(path, 'rb') as f:
77+
for chunk in iter(lambda: f.read(chunk_num_blocks*h.block_size), b''):
78+
h.update(chunk)
79+
return h.digest()
80+
81+
def hash_of_io(io, hash_factory=hashlib.md5, chunk_num_blocks=128):
82+
h = hash_factory()
83+
for chunk in iter(lambda: io.read(chunk_num_blocks*h.block_size), b''):
84+
h.update(chunk)
85+
return h.digest()
6686

6787
def remove_temp_file(file):
6888
try:
6989
os.remove(file)
7090
except OSError:
7191
pass
7292

93+
def get_qiniu_file(key):
94+
url = "http://" + os.getenv('QINIU_TEST_DOMAIN') + '/' + key + '?t=' + str(random.randint(0, 1 << 63 - 1))
95+
return urlopen(url)
7396

7497
def is_travis():
7598
return os.environ['QINIU_TEST_ENV'] == 'travis'
@@ -276,6 +299,7 @@ def test_delete_after_days(self):
276299
class UploaderTestCase(unittest.TestCase):
277300
mime_type = "text/plain"
278301
params = {'x:a': 'a'}
302+
policy = { 'returnBody': '{"hash":$(etag),"key":$(key),"fname":$(fname),"a":$(x:a)}' }
279303
q = Auth(access_key, secret_key)
280304

281305
def test_put(self):
@@ -285,6 +309,7 @@ def test_put(self):
285309
ret, info = put_data(token, key, data)
286310
print(info)
287311
assert ret['key'] == key
312+
assert get_qiniu_file(key).getcode() == 200
288313

289314
def test_put_crc(self):
290315
key = ''
@@ -293,16 +318,22 @@ def test_put_crc(self):
293318
ret, info = put_data(token, key, data, check_crc=True)
294319
print(info)
295320
assert ret['key'] == key
321+
assert get_qiniu_file(key).getcode() == 200
296322

297323
def test_putfile(self):
298-
localfile = __file__
324+
localfile = create_temp_file(1024 * 1024)
299325
key = 'test_file'
300326

301-
token = self.q.upload_token(bucket_name, key)
327+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
302328
ret, info = put_file(token, key, localfile, mime_type=self.mime_type, check_crc=True)
303329
print(info)
304330
assert ret['key'] == key
305331
assert ret['hash'] == etag(localfile)
332+
assert ret['fname'] == os.path.basename(localfile)
333+
resp = get_qiniu_file(key)
334+
assert resp.getcode() == 200
335+
assert resp.headers['content-type'] == self.mime_type
336+
assert hash_of_file(localfile) == hash_of_io(resp)
306337

307338
def test_putInvalidCrc(self):
308339
key = 'test_invalid'
@@ -321,6 +352,7 @@ def test_putWithoutKey(self):
321352
ret, info = put_data(token, key, data)
322353
print(info)
323354
assert ret['hash'] == ret['key']
355+
assert get_qiniu_file(ret['key']).getcode() == 200
324356

325357
data = 'hello bubby!'
326358
token = self.q.upload_token(bucket_name, 'nokey2')
@@ -338,6 +370,7 @@ def test_withoutRead_withoutSeek_retry(self):
338370
print(info)
339371
assert ret['key'] == key
340372
assert ret['hash'] == 'FlYu0iBR1WpvYi4whKXiBuQpyLLk'
373+
assert get_qiniu_file(key).getcode() == 200
341374

342375
def test_putData_without_fname(self):
343376
if is_travis():
@@ -349,17 +382,23 @@ def test_putData_without_fname(self):
349382
ret, info = put_data(token, key, input_stream)
350383
print(info)
351384
assert ret is not None
385+
resp = get_qiniu_file(key)
386+
assert resp.getcode() == 200
387+
assert hash_of_file(localfile) == hash_of_io(resp)
352388

353389
def test_putData_without_fname1(self):
354390
if is_travis():
355391
return
356392
localfile = create_temp_file(30 * 1024 * 1024)
357393
key = 'test_putData_without_fname1'
358394
with open(localfile, 'rb') as input_stream:
359-
token = self.q.upload_token(bucket_name)
395+
token = self.q.upload_token(bucket_name, None, 3600, self.policy)
360396
ret, info = put_data(token, key, input_stream, self.params, self.mime_type, False, None, "")
361397
print(info)
362-
assert ret is not None
398+
assert ret['fname'] == ''
399+
resp = get_qiniu_file(key)
400+
assert resp.getcode() == 200
401+
assert hash_of_file(localfile) == hash_of_io(resp)
363402

364403
def test_putData_without_fname2(self):
365404
if is_travis():
@@ -371,99 +410,144 @@ def test_putData_without_fname2(self):
371410
ret, info = put_data(token, key, input_stream, self.params, self.mime_type, False, None, " ")
372411
print(info)
373412
assert ret is not None
413+
resp = get_qiniu_file(key)
414+
assert resp.getcode() == 200
415+
assert hash_of_file(localfile) == hash_of_io(resp)
374416

375417

376418
class ResumableUploaderTestCase(unittest.TestCase):
377419
mime_type = "text/plain"
378420
params = {'x:a': 'a'}
379421
q = Auth(access_key, secret_key)
422+
policy = { 'returnBody': '{"hash":$(etag),"key":$(key),"fname":$(fname),"a":$(x:a)}' }
380423

381424
def test_put_stream(self):
382-
localfile = __file__
425+
localfile = create_temp_file(1024 * 1024)
383426
key = 'test_file_r'
384427
size = os.stat(localfile).st_size
385428
set_default(default_zone=Zone('http://upload.qiniup.com'))
386429
with open(localfile, 'rb') as input_stream:
387-
token = self.q.upload_token(bucket_name, key)
388-
ret, info = put_stream(token, key, input_stream, os.path.basename(__file__), size, hostscache_dir,
430+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
431+
file_name = os.path.basename(localfile)
432+
ret, info = put_stream(token, key, input_stream, file_name, size, hostscache_dir,
389433
self.params,
390434
self.mime_type, part_size=None, version=None, bucket_name=None)
391435
assert ret['key'] == key
436+
assert ret['a'] == 'a'
437+
assert ret['fname'] == file_name
438+
resp = get_qiniu_file(key)
439+
assert resp.getcode() == 200
440+
assert resp.headers['content-type'] == self.mime_type
441+
assert hash_of_file(localfile) == hash_of_io(resp)
392442

393443
def test_put_stream_v2_without_bucket_name(self):
394444
localfile = __file__
395445
key = 'test_file_r'
396446
size = os.stat(localfile).st_size
397447
set_default(default_zone=Zone('http://upload.qiniup.com'))
398448
with open(localfile, 'rb') as input_stream:
399-
token = self.q.upload_token(bucket_name, key)
400-
ret, info = put_stream(token, key, input_stream, os.path.basename(__file__), size, hostscache_dir,
449+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
450+
file_name = os.path.basename(localfile)
451+
ret, info = put_stream(token, key, input_stream, file_name, size, hostscache_dir,
401452
self.params,
402453
self.mime_type, part_size=1024 * 1024 * 10, version='v2')
403454
assert ret['key'] == key
455+
assert ret['a'] == 'a'
456+
assert ret['fname'] == file_name
457+
resp = get_qiniu_file(key)
458+
assert resp.getcode() == 200
459+
assert resp.headers['content-type'] == self.mime_type
460+
assert hash_of_file(localfile) == hash_of_io(resp)
404461

405462
def test_put_2m_stream_v2(self):
406463
localfile = create_temp_file(2 * 1024 * 1024 + 1)
407464
key = 'test_file_r'
408465
size = os.stat(localfile).st_size
409466
set_default(default_zone=Zone('http://upload.qiniup.com'))
410467
with open(localfile, 'rb') as input_stream:
411-
token = self.q.upload_token(bucket_name, key)
412-
ret, info = put_stream(token, key, input_stream, os.path.basename(localfile), size, hostscache_dir,
468+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
469+
file_name = os.path.basename(localfile)
470+
ret, info = put_stream(token, key, input_stream, file_name, size, hostscache_dir,
413471
self.params,
414472
self.mime_type, part_size=1024 * 1024 * 4, version='v2', bucket_name=bucket_name)
415473
assert ret['key'] == key
416-
remove_temp_file(localfile)
474+
assert ret['a'] == 'a'
475+
assert ret['fname'] == file_name
476+
resp = get_qiniu_file(key)
477+
assert resp.getcode() == 200
478+
assert resp.headers['content-type'] == self.mime_type
479+
assert hash_of_file(localfile) == hash_of_io(resp)
417480

418481
def test_put_4m_stream_v2(self):
419482
localfile = create_temp_file(4 * 1024 * 1024)
420483
key = 'test_file_r'
421484
size = os.stat(localfile).st_size
422485
set_default(default_zone=Zone('http://upload.qiniup.com'))
423486
with open(localfile, 'rb') as input_stream:
424-
token = self.q.upload_token(bucket_name, key)
425-
ret, info = put_stream(token, key, input_stream, os.path.basename(localfile), size, hostscache_dir,
487+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
488+
file_name = os.path.basename(localfile)
489+
ret, info = put_stream(token, key, input_stream, file_name, size, hostscache_dir,
426490
self.params,
427491
self.mime_type, part_size=1024 * 1024 * 4, version='v2', bucket_name=bucket_name)
428492
assert ret['key'] == key
429-
remove_temp_file(localfile)
493+
assert ret['a'] == 'a'
494+
assert ret['fname'] == file_name
495+
resp = get_qiniu_file(key)
496+
assert resp.getcode() == 200
497+
assert resp.headers['content-type'] == self.mime_type
498+
assert hash_of_file(localfile) == hash_of_io(resp)
430499

431500
def test_put_10m_stream_v2(self):
432501
localfile = create_temp_file(10 * 1024 * 1024 + 1)
433502
key = 'test_file_r'
434503
size = os.stat(localfile).st_size
435504
set_default(default_zone=Zone('http://upload.qiniup.com'))
436505
with open(localfile, 'rb') as input_stream:
437-
token = self.q.upload_token(bucket_name, key)
438-
ret, info = put_stream(token, key, input_stream, os.path.basename(localfile), size, hostscache_dir,
506+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
507+
file_name = os.path.basename(localfile)
508+
ret, info = put_stream(token, key, input_stream, file_name, size, hostscache_dir,
439509
self.params,
440510
self.mime_type, part_size=1024 * 1024 * 4, version='v2', bucket_name=bucket_name)
441511
assert ret['key'] == key
442-
remove_temp_file(localfile)
512+
assert ret['a'] == 'a'
513+
assert ret['fname'] == file_name
514+
resp = get_qiniu_file(key)
515+
assert resp.getcode() == 200
516+
assert resp.headers['content-type'] == self.mime_type
517+
assert hash_of_file(localfile) == hash_of_io(resp)
443518

444519
def test_big_file(self):
445520
key = 'big'
446-
token = self.q.upload_token(bucket_name, key)
521+
token = self.q.upload_token(bucket_name, key, 3600, self.policy)
447522
localfile = create_temp_file(4 * 1024 * 1024 + 1)
448523
progress_handler = lambda progress, total: progress
449524
qiniu.set_default(default_zone=Zone('http://a', 'http://upload.qiniup.com'))
450525
ret, info = put_file(token, key, localfile, self.params, self.mime_type, progress_handler=progress_handler)
451526
print(info)
452527
assert ret['key'] == key
453-
remove_temp_file(localfile)
528+
assert ret['a'] == 'a'
529+
assert ret['fname'] == os.path.basename(localfile)
530+
resp = get_qiniu_file(key)
531+
assert resp.getcode() == 200
532+
assert resp.headers['content-type'] == self.mime_type
533+
assert hash_of_file(localfile) == hash_of_io(resp)
454534

455535
def test_retry(self):
456-
localfile = __file__
536+
localfile = create_temp_file(1024 * 1024 - 1)
457537
key = 'test_file_r_retry'
458538
qiniu.set_default(default_zone=Zone('http://a', 'http://upload.qiniup.com'))
459539
token = self.q.upload_token(bucket_name, key)
460540
ret, info = put_file(token, key, localfile, self.params, self.mime_type)
461541
print(info)
462542
assert ret['key'] == key
463543
assert ret['hash'] == etag(localfile)
544+
resp = get_qiniu_file(key)
545+
assert resp.getcode() == 200
546+
assert resp.headers['content-type'] == self.mime_type
547+
assert hash_of_file(localfile) == hash_of_io(resp)
464548

465549
def test_put_stream_with_key_limits(self):
466-
localfile = __file__
550+
localfile = create_temp_file(1024 * 1024 - 2)
467551
key = 'test_file_r'
468552
size = os.stat(localfile).st_size
469553
set_default(default_zone=Zone('http://upload.qiniup.com'))
@@ -478,6 +562,9 @@ def test_put_stream_with_key_limits(self):
478562
self.params,
479563
self.mime_type)
480564
assert info.status_code == 200
565+
resp = get_qiniu_file(key)
566+
assert resp.getcode() == 200
567+
assert hash_of_file(localfile) == hash_of_io(resp)
481568

482569

483570
class DownloadTestCase(unittest.TestCase):
@@ -513,13 +600,13 @@ def test_zero_size(self):
513600
remove_temp_file("x")
514601

515602
def test_small_size(self):
516-
localfile = create_temp_file(1024 * 1024)
603+
localfile = create_temp_file(1024 * 1024, rand=False)
517604
hash = etag(localfile)
518605
assert hash == 'FnlAdmDasGTQOIgrU1QIZaGDv_1D'
519606
remove_temp_file(localfile)
520607

521608
def test_large_size(self):
522-
localfile = create_temp_file(4 * 1024 * 1024 + 1)
609+
localfile = create_temp_file(4 * 1024 * 1024 + 1, rand=False)
523610
hash = etag(localfile)
524611
assert hash == 'ljF323utglY3GI6AvLgawSJ4_dgk'
525612
remove_temp_file(localfile)

0 commit comments

Comments
 (0)