def test_head_object_if_modified_since(self): size = 1024 * 256 self.assert_head_bucket_result(result=self.s3.head_bucket( Bucket=env.BUCKET)) key = KEY_PREFIX + random_string(16) body = random_bytes(size) expect_md5 = compute_md5(body) self.assert_put_object_result(result=self.s3.put_object( Bucket=env.BUCKET, Key=key, Body=body), etag=expect_md5) self.assert_head_object_result(result=self.s3.head_object( Bucket=env.BUCKET, Key=key, IfModifiedSince=datetime.datetime(1946, 2, 14)), etag=expect_md5, content_length=size) try: self.s3.head_object(Bucket=env.BUCKET, Key=key, IfModifiedSince=datetime.datetime.now()) self.fail() # Non exception occurred is illegal. except Exception as e: # Error code 304 is legal. self.assert_client_error(error=e, expect_status_code=304) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=key)) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=KEY_PREFIX))
def test_head_object_if_match(self): size = 1024 * 256 self.assert_head_bucket_result(result=self.s3.head_bucket( Bucket=env.BUCKET)) key = KEY_PREFIX + random_string(16) body = random_bytes(size) expect_md5 = compute_md5(body) self.assert_put_object_result(result=self.s3.put_object( Bucket=env.BUCKET, Key=key, Body=body), etag=expect_md5) self.assert_head_object_result(result=self.s3.head_object( Bucket=env.BUCKET, Key=key, IfMatch=expect_md5), etag=expect_md5, content_length=size) try: fake_etag = '1b2cf535f27731c974343645a3985328' self.s3.head_object(Bucket=env.BUCKET, Key=key, IfMatch=fake_etag) self.fail() # Non exception occurred is illegal. except Exception as e: # Error code 412 is legal. self.assert_client_error(error=e, expect_status_code=412) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=key)) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=KEY_PREFIX))
def test_cors_options(self): # Put object key = 'test-options-object' size = 1024 * 256 body = random_bytes(size) expect_md5 = compute_md5(body) self.assert_put_object_result(result=self.s3.put_object( Bucket=env.BUCKET, Key=key, Body=body), etag=expect_md5) # Put bucket cors self.assert_result_status_code(result=self.s3.put_bucket_cors( Bucket=env.BUCKET, CORSConfiguration=CORS_CONFIG)) options_url = '{bucket_url}/{key}'.format(bucket_url=BUCKET_URL, key=key) # Send options requests self.assert_cors_request_result(result=requests.options( url=options_url, headers={ 'Origin': PUT_ORIGIN, 'Access-Control-Request-Method': 'GET' }), response_code=200, response_origin=PUT_ORIGIN, response_method='GET') # Delete bucket cors self.assert_result_status_code( result=self.s3.delete_bucket_cors(Bucket=env.BUCKET), status_code=204) # Send options requests self.assert_cors_request_result(result=requests.options( url=options_url, headers={ 'Origin': PUT_ORIGIN, 'Access-Control-Request-Method': 'GET' }), response_code=200, response_origin=None, response_method=None) # Delete object self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=key))
def __do_test_put_object(self, file_name, file_size): key = file_name body = random_bytes(file_size) expect_etag = compute_md5(body) # put object self.assert_put_object_result( result=self.s3.put_object(Bucket=BUCKET, Key=key, Body=body), etag=expect_etag) # head object self.assert_head_object_result( result=self.s3.head_object(Bucket=BUCKET, Key=key), etag=expect_etag, content_length=file_size) # get object self.assert_get_object_result( result=self.s3.get_object(Bucket=BUCKET, Key=key), etag=expect_etag, content_length=file_size, body_md5=expect_etag)
def __test_transfer(self, size): name = random_string(16) key = KEY_PREFIX + name local_filename = os.path.join('/tmp', name) expect_md5 = generate_file(path=local_filename, size=size) # Upload parallel f = open(local_filename, 'rb') future = self.tm.upload(fileobj=f, bucket=BUCKET, key=key) result = wait_future_done(future, timeout=90) self.assertTrue(result) f.close() # Checking remote file stat self.assert_head_object_result(result=self.s3.head_object( Bucket=BUCKET, Key=key), content_length=size) # Download parallel download_filename = local_filename + "_dl" f = open(download_filename, 'wb+') future = self.tm.download(fileobj=f, bucket=BUCKET, key=key) result = wait_future_done(future, timeout=90) self.assertTrue(result) f.flush() # Checking download file f.seek(0) actual_md5 = compute_md5(f.read()) f.close() self.assertEqual(actual_md5, expect_md5) # Remove remote and local files os.remove(local_filename) os.remove(download_filename) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=BUCKET, Key=key)) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=BUCKET, Key=KEY_PREFIX))
def test_head_object(self): size = 1024 * 256 self.assert_head_bucket_result(self.s3.head_bucket(Bucket=env.BUCKET)) key = KEY_PREFIX + random_string(16) body = random_bytes(size) expect_md5 = compute_md5(body) self.assert_put_object_result(result=self.s3.put_object( Bucket=env.BUCKET, Key=key, Body=body), etag=expect_md5) self.assert_head_object_result(result=self.s3.head_object( Bucket=env.BUCKET, Key=key), etag=expect_md5, content_length=size) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=key)) self.assert_delete_object_result( result=self.s3.delete_object(Bucket=env.BUCKET, Key=KEY_PREFIX)) try: self.s3.head_object(Bucket=env.BUCKET, Key=key) self.fail() # Non exception occurred is illegal. except Exception as e: # Error code 404 is legal. self.assert_client_error(e, expect_status_code=404)
def test_put_directory(self): key = random_string(16) content_type = 'application/directory' md5 = compute_md5(bytes()) # Put a directory object self.assert_put_object_result(result=self.s3.put_object( Bucket=BUCKET, Key=key, ContentType=content_type), etag=md5) # Get the directory info self.assert_head_object_result(result=self.s3.head_object( Bucket=BUCKET, Key=key + '/'), etag=md5, content_type=content_type, content_length=0) # Get directory object self.assert_get_object_result(result=self.s3.get_object(Bucket=BUCKET, Key=key + '/'), etag=md5, content_type=content_type, content_length=0, body_md5=md5) # Delete the directory self.assert_delete_object_result( result=self.s3.delete_object(Bucket=BUCKET, Key=key + '/'))