def test_put_block_from_url_and_validate_content_md5(self): # Arrange dest_blob_name = self.get_resource_name('destblob') dest_blob = self.bsc.get_blob_client(self.container_name, dest_blob_name) src_md5 = StorageContentValidation.get_content_md5( self.source_blob_data) # Act part 1: put block from url with md5 validation dest_blob.stage_block_from_url(block_id=1, source_url=self.source_blob_url, source_content_md5=src_md5, source_offset=0, source_length=8 * 1024) # Assert block was staged committed, uncommitted = dest_blob.get_block_list('all') self.assertEqual(len(uncommitted), 1) self.assertEqual(len(committed), 0) # Act part 2: put block from url with wrong md5 fake_md5 = StorageContentValidation.get_content_md5(b"POTATO") with self.assertRaises(HttpResponseError) as error: dest_blob.stage_block_from_url(block_id=2, source_url=self.source_blob_url, source_content_md5=fake_md5, source_offset=0, source_length=8 * 1024) self.assertEqual(error.exception.error_code, StorageErrorCode.md5_mismatch) # Assert block was not staged committed, uncommitted = dest_blob.get_block_list('all') self.assertEqual(len(uncommitted), 1) self.assertEqual(len(committed), 0)
def test_append_block_from_url_and_validate_content_md5(self): # Arrange source_blob_data = self.get_random_bytes(LARGE_BLOB_SIZE) source_blob_client = self._create_source_blob(source_blob_data) src_md5 = StorageContentValidation.get_content_md5(source_blob_data) sas = source_blob_client.generate_shared_access_signature( permission=BlobPermissions.READ + BlobPermissions.DELETE, expiry=datetime.utcnow() + timedelta(hours=1), ) destination_blob_client = self._create_blob() # Act part 1: make append block from url calls with correct md5 resp = destination_blob_client.append_block_from_url( source_blob_client.url + '?' + sas, source_content_md5=src_md5) self.assertEqual(resp.get('blob_append_offset'), '0') self.assertEqual(resp.get('blob_committed_block_count'), 1) self.assertIsNotNone(resp.get('etag')) self.assertIsNotNone(resp.get('last_modified')) # Assert the destination blob is constructed correctly destination_blob_properties = destination_blob_client.get_blob_properties( ) self.assertBlobEqual(destination_blob_client, source_blob_data) self.assertEqual(destination_blob_properties.get('etag'), resp.get('etag')) self.assertEqual(destination_blob_properties.get('last_modified'), resp.get('last_modified')) # Act part 2: put block from url with wrong md5 with self.assertRaises(HttpResponseError): destination_blob_client.append_block_from_url( source_blob_client.url + '?' + sas, source_content_md5=StorageContentValidation.get_content_md5( b"POTATO"))