def test_get_logging(self, do_request): request_text = """GET /?logging= HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive date: Sat, 12 Dec 2015 00:35:45 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:9J42bjaM3bgBuP0l/79K64DccZ0=""" response_text = """HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:43 GMT Content-Type: application/xml Content-Length: 214 Connection: keep-alive x-oss-request-id: 566B6BDFD5A340D61A739420 <?xml version="1.0" encoding="UTF-8"?> <BucketLoggingStatus> <LoggingEnabled> <TargetBucket>ming-xxx-share</TargetBucket> <TargetPrefix>{0}</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>""" for prefix in [u"日志%+/*", "logging/", "日志%+/*"]: req_info = mock_response(do_request, response_text.format(to_string(prefix))) result = bucket().get_bucket_logging() self.assertRequest(req_info, request_text) self.assertEqual(result.target_bucket, "ming-xxx-share") self.assertEqual(result.target_prefix, to_string(prefix))
def test_put_website(self, do_request): request_text = """PUT /?website= HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: 155 date: Sat, 12 Dec 2015 00:35:47 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:ZUVg/fNrUVyan0Y5xhz5zvcPZcs= <WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument><ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>""" response_text = """HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:47 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6BE31BA604C27DD429E8""" for index, error in [("index+中文.html", "error.中文"), (u"中-+()文.index", u"@#$%中文.error")]: req_info = mock_response(do_request, response_text) bucket().put_bucket_website(oss2.models.BucketWebsite(index, error)) self.assertRequest(req_info, request_text.format(to_string(index), to_string(error)))
def test_get_website(self, do_request): template = '<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument>' + \ '<ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>' for index, error in [('index+中文.html', 'error.中文') ,(u'中-+()文.index', u'@#$%中文.error')]: do_request.return_value = r4get_meta(template.format(to_string(index), to_string(error))) result = bucket().get_bucket_website() self.assertEqual(result.index_file, to_string(index)) self.assertEqual(result.error_file, to_string(error))
def test_referer(self): referers = ['http://hello.com', 'mibrowser:home', '中文+referer', u'中文+referer'] config = oss2.models.BucketReferer(True, referers) self.bucket.put_bucket_referer(config) wait_meta_sync() result = self.bucket.get_bucket_referer() self.assertTrue(result.allow_empty_referer) self.assertEqual(sorted(to_string(r) for r in referers), sorted(to_string(r) for r in result.referers))
def test_put_website(self, do_request): req_info = RequestInfo() do_request.auto_spec = True do_request.side_effect = partial(do4put, req_info=req_info, data_type=DT_BYTES) template = '<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument>' + \ '<ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>' for index, error in [('index+中文.html', 'error.中文') ,(u'中-+()文.index', u'@#$%中文.error')]: bucket().put_bucket_website(oss2.models.BucketWebsite(index, error)) self.assertXmlEqual(req_info.data, template.format(to_string(index), to_string(error)))
def test_get_website(self, do_request): template = ( "<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument>" + "<ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>" ) for index, error in [("index+中文.html", "error.中文"), (u"中-+()文.index", u"@#$%中文.error")]: do_request.return_value = r4get_meta(template.format(to_string(index), to_string(error))) result = bucket().get_bucket_website() self.assertEqual(result.index_file, to_string(index)) self.assertEqual(result.error_file, to_string(error))
def test_get_to_file_with_query_parameter(self, do_request): content = random_bytes(1023) request_text = '''GET /sjbhlsgsbecvlpbf?response-content-type=override-content-type HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive date: Sat, 12 Dec 2015 00:35:53 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:PAedG7U86ZxQ2WTB+GdpSltoiTI=''' response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:53 GMT Content-Type: override-content-type Content-Length: {0} Connection: keep-alive x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3 Accept-Ranges: bytes ETag: "D80CF0E5BE2436514894D64B2BCFB2AE" Last-Modified: Sat, 12 Dec 2015 00:35:53 GMT x-oss-object-type: Normal {1}'''.format(len(content), to_string(content)) req_info = mock_response(do_request, response_text) filename = self.tempname() query_params = {'response-content-type': 'override-content-type'} result = bucket().get_object_to_file('sjbhlsgsbecvlpbf', filename, params=query_params) self.assertRequest(req_info, request_text) self.assertEqual(result.content_type, 'override-content-type')
def test_xml_input_output(self): xml_input1 = """<?xml version="1.0" encoding="UTF-8"?> <RefererConfiguration> <AllowEmptyReferer>true</AllowEmptyReferer> <RefererList> <Referer>阿里云</Referer> </RefererList> </RefererConfiguration>""" xml_input2 = u"""<?xml version="1.0" encoding="UTF-8"?> <RefererConfiguration> <AllowEmptyReferer>true</AllowEmptyReferer> <RefererList> <Referer>阿里云</Referer> </RefererList> </RefererConfiguration>""" for input in [xml_input1, xml_input2]: self.bucket.put_bucket_referer(input) time.sleep(1) resp = self.bucket._get_bucket_config(oss2.Bucket.REFERER) result = oss2.models.GetBucketRefererResult(resp) oss2.xml_utils.parse_get_bucket_referer(result, resp.read()) self.assertEqual(result.allow_empty_referer, True) self.assertEqual(result.referers[0], to_string(u"阿里云"))
def make_get_object(content): request_text = '''GET /sjbhlsgsbecvlpbf HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive date: Sat, 12 Dec 2015 00:35:53 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:PAedG7U86ZxQ2WTB+GdpSltoiTI=''' response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:53 GMT Content-Type: text/plain Content-Length: {0} Connection: keep-alive x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3 Accept-Ranges: bytes ETag: "D80CF0E5BE2436514894D64B2BCFB2AE" Last-Modified: Sat, 12 Dec 2015 00:35:53 GMT x-oss-object-type: Normal {1}'''.format(len(content), to_string(content)) return request_text, response_text
def test_upload_part(self, do_request): content = random_bytes(1024) request_text = '''PUT /tmmzgvvmsgesihfo?partNumber=3&uploadId=41337E94168A4E6F918C3D6CAAFADCCD HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: 1024 date: Sat, 12 Dec 2015 00:35:59 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:3+h0rLBaA3gPrM4iZoFSyQZn2ts= {0}'''.format(oss2.to_string(content)) response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:59 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6BEF6078C0E44874A4AD ETag: "DF1F9DE8F39BDE03716AC8D425589A5A"''' req_info = mock_response(do_request, response_text) result = bucket().upload_part('tmmzgvvmsgesihfo', '41337E94168A4E6F918C3D6CAAFADCCD', 3, content) self.assertRequest(req_info, request_text) self.assertEqual(req_info.data, content) self.assertEqual(result.etag, 'DF1F9DE8F39BDE03716AC8D425589A5A')
def test_put_without_crc_in_response(self, do_request): content = b'dummy content' request_text = '''PUT /sjbhlsgsbecvlpbf.txt HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Type: text/plain Content-Length: {0} date: Sat, 12 Dec 2015 00:35:53 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g= Accept: */* {1}'''.format(len(content), oss2.to_string(content)) response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:53 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3 ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"''' req_info = unittests.common.mock_response(do_request, response_text) result = unittests.common.bucket().put_object('sjbhlsgsbecvlpbf.txt', content) self.assertRequest(req_info, request_text) self.assertEqual(result.status, 200) self.assertEqual(result.request_id, '566B6BE93A7B8CFD53D4BAA3') self.assertEqual(result.etag, 'D80CF0E5BE2436514894D64B2BCFB2AE')
def same_lifecycle(orig_rule, bucket): try: rules = bucket.get_bucket_lifecycle().rules except oss2.exceptions.NoSuchLifecycle: return False if not rules: return False rule_got = rules[0] if orig_rule.id != rule_got.id: return False if to_string(orig_rule.prefix) != rule_got.prefix: return False if orig_rule.status != rule_got.status: return False if orig_rule.expiration.days != rule_got.expiration.days: return False if orig_rule.expiration.date != rule_got.expiration.date: return False return True
def test_website(self): key = self.random_key('/') content = random_bytes(32) self.bucket.put_object('index.html', content) # 设置index页面和error页面 self.bucket.put_bucket_website(oss2.models.BucketWebsite('index.html', 'error.html')) wait_meta_sync() def same_website(website, index, error): return website.index_file == index and website.error_file == error # 验证index页面和error页面 self.retry_assert(lambda: same_website(self.bucket.get_bucket_website(), 'index.html', 'error.html')) # 验证读取目录会重定向到index页面 result = self.bucket.get_object(key) self.assertEqual(result.read(), content) self.bucket.delete_object('index.html') # 中文 for index, error in [('index+中文.html', 'error.中文'), (u'index+中文.html', u'error.中文')]: self.bucket.put_bucket_website(oss2.models.BucketWebsite(index, error)) self.retry_assert(lambda: same_website(self.bucket.get_bucket_website(), to_string(index), to_string(error))) # 关闭静态网站托管模式 self.bucket.delete_bucket_website() self.bucket.delete_bucket_website() self.assertRaises(oss2.exceptions.NoSuchWebsite, self.bucket.get_bucket_website)
def test_lifecycle_days(self): from oss2.models import LifecycleExpiration, LifecycleRule, BucketLifecycle for prefix in ["", "中文前缀+/", u"中文前缀+/"]: rule = LifecycleRule( random_string(10), prefix, status=LifecycleRule.DISABLED, expiration=LifecycleExpiration(days=356) ) lifecycle = BucketLifecycle([rule]) self.bucket.put_bucket_lifecycle(lifecycle) time.sleep(1) rule_got = self.bucket.get_bucket_lifecycle().rules[0] self.assertEqual(rule.id, rule_got.id) self.assertEqual(to_string(rule.prefix), rule_got.prefix) self.assertEqual(rule.status, rule_got.status) self.assertEqual(rule_got.expiration.days, 356) self.assertEqual(rule_got.expiration.date, None) self.bucket.delete_bucket_lifecycle() self.bucket.delete_bucket_lifecycle() self.assertRaises(oss2.exceptions.NoSuchLifecycle, self.bucket.get_bucket_lifecycle)
def test_append_without_crc_in_response(self, do_request): size = 8192 position = 0 content = unittests.common.random_bytes(size) request_text = '''POST /sjbhlsgsbecvlpbf?position={0}&append= HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: {1} date: Sat, 12 Dec 2015 00:36:29 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:1njpxsTivMNvTdfYolCUefRInVY= {2}'''.format(position, len(content), oss2.to_string(content)) response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:36:29 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6C0D1790CF586F72240B ETag: "24F7FA10676D816E0D6C6B5600000000" x-oss-next-append-position: {0}'''.format(position + len(content), unittests.common.calc_crc(content)) req_info = unittests.common.mock_response(do_request, response_text) result = unittests.common.bucket().append_object('sjbhlsgsbecvlpbf', position, content, init_crc=0) self.assertRequest(req_info, request_text) self.assertEqual(result.status, 200) self.assertEqual(result.next_position, size) self.assertEqual(result.etag, '24F7FA10676D816E0D6C6B5600000000')
def test_get_logging(self, do_request): target_bucket_name = 'fake-bucket' template = '''<?xml version="1.0" encoding="UTF-8"?> <BucketLoggingStatus> <LoggingEnabled> <TargetBucket>fake-bucket</TargetBucket> <TargetPrefix>{0}</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>''' for prefix in [u'日志%+/*', 'logging/', '日志%+/*']: do_request.return_value = r4get_meta(template.format(to_string(prefix))) result = bucket().get_bucket_logging() self.assertEqual(result.target_bucket, target_bucket_name) self.assertEqual(result.target_prefix, to_string(prefix))
def test_batch_delete_objects(self): for key in ['中文!@#$%^&*()-=文件\x0C-2.txt', u'中文!@#$%^&*()-=文件\x0C-3.txt', '<hello>']: content = '中文内容' self.bucket.put_object(key, content) result = self.bucket.batch_delete_objects([key]) self.assertEqual(result.deleted_keys[0], to_string(key)) self.assertTrue(not self.bucket.object_exists(key))
def test_put_get_list_delete(self): for key in ['中文!@#$%^&*()-=文件\x0C-1.txt', u'中文!@#$%^&*()-=文件\x0C-1.txt']: content = '中文内容' self.bucket.put_object(key, content) self.assertEqual(self.bucket.get_object(key).read(), to_bytes(content)) self.assertTrue(to_string(key) in list(info.key for info in oss2.ObjectIterator(self.bucket, prefix='中文'))) self.bucket.delete_object(key)
def test_referer(self): referers = ["http://hello.com", "mibrowser:home", "中文+referer", u"中文+referer"] config = oss2.models.BucketReferer(True, referers) self.bucket.put_bucket_referer(config) time.sleep(1) result = self.bucket.get_bucket_referer() self.assertTrue(result.allow_empty_referer) self.assertEqual(sorted(to_string(r) for r in referers), sorted(result.referers))
def test_put_logging(self, do_request): req_info = RequestInfo() do_request.auto_spec = True do_request.side_effect = partial(do4put, req_info=req_info, data_type=DT_BYTES) template = '<BucketLoggingStatus><LoggingEnabled><TargetBucket>fake-bucket</TargetBucket>' + \ '<TargetPrefix>{0}</TargetPrefix></LoggingEnabled></BucketLoggingStatus>' target_bucket_name = 'fake-bucket' for prefix in [u'日志+/', 'logging/', '日志+/']: bucket().put_bucket_logging(oss2.models.BucketLogging(target_bucket_name, prefix)) self.assertXmlEqual(req_info.data, template.format(to_string(prefix)))
def test_get_website(self, do_request): request_text = """GET /?website= HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive date: Sat, 12 Dec 2015 00:35:48 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:gTNIEjVmU76CwrhC2HftAaHcwBw=""" response_text = """HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:49 GMT Content-Type: application/xml Content-Length: 218 Connection: keep-alive x-oss-request-id: 566B6BE5FFDB697977D52407 <?xml version="1.0" encoding="UTF-8"?> <WebsiteConfiguration> <IndexDocument> <Suffix>{0}</Suffix> </IndexDocument> <ErrorDocument> <Key>{1}</Key> </ErrorDocument> </WebsiteConfiguration>""" for index, error in [("index+中文.html", "error.中文"), (u"中-+()文.index", u"@#$%中文.error")]: req_info = mock_response(do_request, response_text.format(to_string(index), to_string(error))) result = bucket().get_bucket_website() self.assertRequest(req_info, request_text) self.assertEqual(result.index_file, to_string(index)) self.assertEqual(result.error_file, to_string(error))
def test_website(self): key = self.random_key("/") content = random_bytes(32) self.bucket.put_object("index.html", content) # 设置index页面和error页面 self.bucket.put_bucket_website(oss2.models.BucketWebsite("index.html", "error.html")) time.sleep(1) # 验证index页面和error页面 website = self.bucket.get_bucket_website() self.assertEqual(website.index_file, "index.html") self.assertEqual(website.error_file, "error.html") # 验证读取目录会重定向到index页面 result = self.bucket.get_object(key) self.assertEqual(result.read(), content) self.bucket.delete_object("index.html") # 中文 for index, error in [("index+中文.html", "error.中文"), (u"index+中文.html", u"error.中文")]: self.bucket.put_bucket_website(oss2.models.BucketWebsite(index, error)) time.sleep(1) website = self.bucket.get_bucket_website() self.assertEqual(website.index_file, to_string(index)) self.assertEqual(website.error_file, to_string(error)) # 关闭静态网站托管模式 self.bucket.delete_bucket_website() self.bucket.delete_bucket_website() # 再次关闭报错 self.assertRaises(oss2.exceptions.NoSuchWebsite, self.bucket.get_bucket_website)
def test_compat(self): # from unicode u = u'中文' self.assertEqual(u, oss2.to_unicode(u)) self.assertEqual(u.encode('utf-8'), oss2.to_bytes(u)) if is_py2: self.assertEqual(u.encode('utf-8'), oss2.to_string(u)) if is_py3: self.assertEqual(u, oss2.to_string(u)) # from bytes b = u.encode('utf-8') self.assertEqual(b.decode('utf-8'), oss2.to_unicode(b)) self.assertEqual(b, oss2.to_bytes(b)) if is_py2: self.assertEqual(b, oss2.to_string(b)) if is_py3: self.assertEqual(b.decode('utf-8'), oss2.to_string(b))
def test_put_logging(self, do_request): req_info = RequestInfo() do_request.auto_spec = True do_request.side_effect = partial(do4put, req_info=req_info, data_type=DT_BYTES) template = '<BucketLoggingStatus><LoggingEnabled><TargetBucket>fake-bucket</TargetBucket>' + \ '<TargetPrefix>{0}</TargetPrefix></LoggingEnabled></BucketLoggingStatus>' target_bucket_name = 'fake-bucket' for prefix in [u'日志+/', 'logging/', '日志+/']: bucket().put_bucket_logging( oss2.models.BucketLogging(target_bucket_name, prefix)) self.assertXmlEqual(req_info.data, template.format(to_string(prefix)))
def __init__(self, response_text): if isinstance(response_text, bytes): fields = re.split(b'\n\n', response_text, 1) else: fields = re.split('\n\n', response_text, 1) head_fields = re.split('\n', oss2.to_string(fields[0])) response_line_fields = head_fields[0].split(' ', 2) self.status = int(response_line_fields[1]) self.headers = head_fields_to_headers(head_fields[1:]) if len(fields) == 2: self.body = oss2.to_bytes(fields[1]) else: self.body = b'' self.__io = io.BytesIO(self.body)
def make_select_object(sql, resp_content, req_params=None, output_raw=False, simulate_bad_frame=False, simulate_bad_crc=False, status=206, error=b''): req_body = xml_utils.to_select_object(sql, req_params) request_text = '''POST /select-test.txt?x-oss-process=csv/select HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: {0} date: Sat, 12 Dec 2015 00:35:53 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g= Accept: */* {1}'''.format(len(req_body), to_string(req_body)) resp_body = generate_data(resp_content, output_raw, simulate_bad_crc=simulate_bad_crc, status=status, error=error) if (simulate_bad_frame): resp_body = resp_content response_text = '''HTTP/1.1 206 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:53 GMT Content-Length: {0} Connection: keep-alive x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3 ETag: "D80CF0E5BE2436514894D64B2BCFB2AE" x-oss-select-output-raw:{1} '''.format(len(resp_body), str(output_raw).lower()) if (sys.version_info[0] == 3 and type(resp_body).__name__ == 'str'): resp_body = str.encode(resp_body) return request_text, str.encode(response_text) + resp_body
def generate_data(resp_content, output_raw, error=b'', status=206, simulate_bad_crc=False): if output_raw: return to_string(resp_content) else: continiousFrame = ContiniousFrame(100) dataFrame = DataFrame(len(resp_content), resp_content) frameStr = dataFrame.to_bytes() if (simulate_bad_crc): frameStr = frameStr[ 0:len(frameStr) - 2] + b'X' # 'X' is the character that does not exist in the content endFrame = EndFrame(len(resp_content), len(resp_content), status, error) return continiousFrame.to_bytes() + frameStr + endFrame.to_bytes()
def test_logging(self): other_bucket = oss2.Bucket(self.bucket.auth, OSS_ENDPOINT, random_string(63).lower()) other_bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE) for prefix in ["logging/", u"日志+/", "日志+/"]: other_bucket.put_bucket_logging(oss2.models.BucketLogging(self.bucket.bucket_name, prefix)) time.sleep(1) result = other_bucket.get_bucket_logging() self.assertEqual(result.target_bucket, self.bucket.bucket_name) self.assertEqual(result.target_prefix, to_string(prefix)) other_bucket.delete_bucket_logging() other_bucket.delete_bucket_logging() result = other_bucket.get_bucket_logging() self.assertEqual(result.target_bucket, "") self.assertEqual(result.target_prefix, "") other_bucket.delete_bucket()
def test_batch_delete(self, do_request): request_text = '''POST /?delete=&encoding-type=url HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: 100 Content-MD5: zsbG45tEj+StFBFghUllvw== date: Sat, 12 Dec 2015 00:35:53 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:tc4g/qgaHwQ+CoI828v2zFCHj2E= <Delete><Quiet>false</Quiet><Object><Key>hello</Key></Object><Object><Key>world</Key></Object></Delete>''' response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:53 GMT Content-Type: application/xml Content-Length: 383 Connection: keep-alive x-oss-request-id: 566B6BE9229E6BA1F6F538DE <?xml version="1.0" encoding="UTF-8"?> <DeleteResult> <EncodingType>url</EncodingType> <Deleted> <Key>hello</Key> </Deleted> <Deleted> <Key>world</Key> </Deleted> </DeleteResult>''' req_info = mock_response(do_request, response_text) key_list = ['hello', 'world'] result = bucket().batch_delete_objects(key_list) self.assertRequest(req_info, request_text) self.assertEqual(result.deleted_keys, list(to_string(key) for key in key_list))
def test_logging(self): other_bucket = oss2.Bucket(self.bucket.auth, OSS_ENDPOINT, random_string(63).lower()) other_bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE) def same_logging(bucket_logging, target_bucket, target_prefix): return bucket_logging.target_bucket == target_bucket and bucket_logging.target_prefix == target_prefix for prefix in [u'日志+/', 'logging/', '日志+/']: other_bucket.put_bucket_logging(oss2.models.BucketLogging(self.bucket.bucket_name, prefix)) wait_meta_sync() self.retry_assert(lambda: same_logging(other_bucket.get_bucket_logging(), self.bucket.bucket_name, to_string(prefix))) other_bucket.delete_bucket_logging() other_bucket.delete_bucket_logging() self.retry_assert(lambda: same_logging(other_bucket.get_bucket_logging(), '', '')) other_bucket.delete_bucket()
def __init__(self, request_text): if isinstance(request_text, bytes): fields = re.split(b'\n\n', request_text, 1) else: fields = re.split('\n\n', request_text, 1) head_fields = re.split('\n', oss2.to_string(fields[0])) request_line_fields = head_fields[0].split() uri_query_fields = request_line_fields[1].split('?') if len(uri_query_fields) == 2: self.params = query_to_params(uri_query_fields[1]) else: self.params = {} if len(fields) == 2: self.body = oss2.to_bytes(fields[1]) else: self.body = b'' self.method = request_line_fields[0] self.headers = head_fields_to_headers(head_fields[1:]) self.url = 'http://' + self.headers['host'] + uri_query_fields[0]
def make_put_object(content): request_text = '''PUT /sjbhlsgsbecvlpbf.txt HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Type: text/plain Content-Length: {0} date: Sat, 12 Dec 2015 00:35:53 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g= Accept: */* {1}'''.format(len(content), to_string(content)) response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:53 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3 ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"''' return request_text, response_text
def test_batch_delete(self, do_request): body = '''<?xml version="1.0" encoding="UTF-8"?> <DeleteResult> <EncodingType>url</EncodingType> <Deleted> <Key>%E4%B8%AD%E6%96%87%21%40%23%24%25%5E%26%2A%28%29-%3D%E6%96%87%E4%BB%B6%0C-2.txt</Key> </Deleted> <Deleted> <Key>%E4%B8%AD%E6%96%87%21%40%23%24%25%5E%26%2A%28%29-%3D%E6%96%87%E4%BB%B6%0C-3.txt</Key> </Deleted> <Deleted> <Key>%3Chello%3E</Key> </Deleted> </DeleteResult> ''' do_request.auto_spec = True do_request.side_effect = partial(do4body, body=body, content_type='application/xml') key_list = ['中文!@#$%^&*()-=文件\x0C-2.txt', u'中文!@#$%^&*()-=文件\x0C-3.txt', '<hello>'] result = bucket().batch_delete_objects(key_list) self.assertEqual(result.deleted_keys, list(to_string(key) for key in key_list))
def make_append_object(position, content): request_text = '''POST /sjbhlsgsbecvlpbf?position={0}&append= HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: {1} date: Sat, 12 Dec 2015 00:36:29 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:1njpxsTivMNvTdfYolCUefRInVY= {2}'''.format(position, len(content), to_string(content)) response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:36:29 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6C0D1790CF586F72240B ETag: "24F7FA10676D816E0D6C6B5600000000" x-oss-next-append-position: {0} x-oss-hash-crc64ecma: {1}'''.format(position + len(content), calc_crc(content)) return request_text, response_text
def test_put_logging(self, do_request): request_text = '''PUT /?logging= HTTP/1.1 Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com Accept-Encoding: identity Connection: keep-alive Content-Length: 156 date: Sat, 12 Dec 2015 00:35:42 GMT User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3) Accept: */* authorization: OSS ZCDmm7TPZKHtx77j:uofFeeNDtRu6WY5iUkNwTymtPI4= <BucketLoggingStatus><LoggingEnabled><TargetBucket>ming-xxx-share</TargetBucket><TargetPrefix>{0}</TargetPrefix></LoggingEnabled></BucketLoggingStatus>''' response_text = '''HTTP/1.1 200 OK Server: AliyunOSS Date: Sat, 12 Dec 2015 00:35:42 GMT Content-Length: 0 Connection: keep-alive x-oss-request-id: 566B6BDED5A340D61A739262''' for prefix in [u'日志+/', 'logging/', '日志+/']: req_info = unittests.common.mock_response(do_request, response_text) unittests.common.bucket().put_bucket_logging(oss2.models.BucketLogging('ming-xxx-share', prefix)) self.assertRequest(req_info, request_text.format(oss2.to_string(prefix)))
def test_object_iterator_chinese(self): for prefix in [self.random_key('中+文'), self.random_key(u'中+文')]: self.bucket.put_object(prefix, b'content of object') object_got = list(oss2.ObjectIterator(self.bucket, prefix=prefix, max_keys=1))[0].key self.assertEqual(to_string(prefix), object_got)
def all_tags(parent, tag): return [oss2.to_string(node.text) or '' for node in parent.findall(tag)]