async def _test_put_block_list(self): # Arrange await self._setup() blob_name = self._get_blob_reference() blob = self.bsc.get_blob_client(self.container_name, blob_name) await blob.stage_block('1', b'AAA') await blob.stage_block('2', b'BBB') await blob.stage_block('3', b'CCC') # Act block_list = [ BlobBlock(block_id='1'), BlobBlock(block_id='2'), BlobBlock(block_id='3') ] put_block_list_resp = await blob.commit_block_list(block_list) # Assert content = await blob.download_blob() actual = await content.content_as_bytes() self.assertEqual(actual, b'AAABBBCCC') self.assertEqual(content.properties.etag, put_block_list_resp.get('etag')) self.assertEqual(content.properties.last_modified, put_block_list_resp.get('last_modified'))
async def _test_get_block_list_committed_blocks(self): # Arrange await self._setup() blob_name = self._get_blob_reference() blob = self.bsc.get_blob_client(self.container_name, blob_name) await blob.stage_block('1', b'AAA') await blob.stage_block('2', b'BBB') await blob.stage_block('3', b'CCC') block_list = [ BlobBlock(block_id='1'), BlobBlock(block_id='2'), BlobBlock(block_id='3') ] await blob.commit_block_list(block_list) # Act block_list = await blob.get_block_list('committed') # Assert self.assertIsNotNone(block_list) self.assertEqual(len(block_list), 2) self.assertEqual(len(block_list[1]), 0) self.assertEqual(len(block_list[0]), 3) self.assertEqual(block_list[0][0].id, '1') self.assertEqual(block_list[0][0].size, 3) self.assertEqual(block_list[0][1].id, '2') self.assertEqual(block_list[0][1].size, 3) self.assertEqual(block_list[0][2].id, '3') self.assertEqual(block_list[0][2].size, 3)
async def _test_put_block_list_with_md5(self): # Arrange await self._setup() blob_name = self._get_blob_reference() blob = self.bsc.get_blob_client(self.container_name, blob_name) await blob.stage_block('1', b'AAA') await blob.stage_block('2', b'BBB') await blob.stage_block('3', b'CCC') # Act block_list = [BlobBlock(block_id='1'), BlobBlock(block_id='2'), BlobBlock(block_id='3')] await blob.commit_block_list(block_list, validate_content=True)
async def _test_put_block_list_invalid_block_id(self): # Arrange await self._setup() blob_name = self._get_blob_reference() blob = self.bsc.get_blob_client(self.container_name, blob_name) await blob.stage_block('1', b'AAA') await blob.stage_block('2', b'BBB') await blob.stage_block('3', b'CCC') # Act try: block_list = [BlobBlock(block_id='1'), BlobBlock(block_id='2'), BlobBlock(block_id='4')] await blob.commit_block_list(block_list) self.fail() except HttpResponseError as e: self.assertGreaterEqual(str(e).find('specified block list is invalid'), 0)
async def _test_put_block_list_with_blob_tier_specified(self): # Arrange await self._setup() blob_name = self._get_blob_reference() blob_client = self.bsc.get_blob_client(self.container_name, blob_name) await blob_client.stage_block('1', b'AAA') await blob_client.stage_block('2', b'BBB') await blob_client.stage_block('3', b'CCC') blob_tier = StandardBlobTier.Cool # Act block_list = [ BlobBlock(block_id='1'), BlobBlock(block_id='2'), BlobBlock(block_id='3') ] await blob_client.commit_block_list(block_list, standard_blob_tier=blob_tier) # Assert blob_properties = await blob_client.get_blob_properties() self.assertEqual(blob_properties.blob_tier, blob_tier)
async def _test_put_block_and_put_block_list(self): # Arrange blob_client, _ = await self._create_block_blob() await blob_client.stage_block('1', b'AAA', cpk=TEST_ENCRYPTION_KEY) await blob_client.stage_block('2', b'BBB', cpk=TEST_ENCRYPTION_KEY) await blob_client.stage_block('3', b'CCC', cpk=TEST_ENCRYPTION_KEY) # Act block_list = [ BlobBlock(block_id='1'), BlobBlock(block_id='2'), BlobBlock(block_id='3') ] put_block_list_resp = await blob_client.commit_block_list( block_list, cpk=TEST_ENCRYPTION_KEY) # Assert self.assertIsNotNone(put_block_list_resp['etag']) self.assertIsNotNone(put_block_list_resp['last_modified']) self.assertTrue(put_block_list_resp['request_server_encrypted']) self.assertEqual(put_block_list_resp['encryption_key_sha256'], TEST_ENCRYPTION_KEY.key_hash) # Act get the blob content without cpk should fail with self.assertRaises(HttpResponseError): await blob_client.download_blob() # Act get the blob content blob = await blob_client.download_blob(cpk=TEST_ENCRYPTION_KEY) # Assert content was retrieved with the cpk self.assertEqual(await blob.content_as_bytes(), b'AAABBBCCC') self.assertEqual(blob.properties.etag, put_block_list_resp['etag']) self.assertEqual(blob.properties.last_modified, put_block_list_resp['last_modified']) self.assertEqual(blob.properties.encryption_key_sha256, TEST_ENCRYPTION_KEY.key_hash)
async def _test_put_block_from_url_and_commit(self): # Arrange # create source blob and get source blob url source_blob_name = self.get_resource_name("sourceblob") self.config.use_byte_buffer = True # Make sure using chunk upload, then we can record the request source_blob_client, _ = await self._create_block_blob( blob_name=source_blob_name, data=self.byte_data) source_blob_sas = source_blob_client.generate_shared_access_signature( permission=BlobPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1)) source_blob_url = source_blob_client.url + "?" + source_blob_sas # create destination blob self.config.use_byte_buffer = False destination_blob_client, _ = await self._create_block_blob( cpk=TEST_ENCRYPTION_KEY) # Act part 1: make put block from url calls await destination_blob_client.stage_block_from_url( block_id=1, source_url=source_blob_url, source_offset=0, source_length=4 * 1024 - 1, cpk=TEST_ENCRYPTION_KEY) await destination_blob_client.stage_block_from_url( block_id=2, source_url=source_blob_url, source_offset=4 * 1024, source_length=8 * 1024, cpk=TEST_ENCRYPTION_KEY) # Assert blocks committed, uncommitted = await destination_blob_client.get_block_list( 'all') self.assertEqual(len(uncommitted), 2) self.assertEqual(len(committed), 0) # commit the blocks without cpk should fail block_list = [BlobBlock(block_id='1'), BlobBlock(block_id='2')] with self.assertRaises(HttpResponseError): await destination_blob_client.commit_block_list(block_list) # Act commit the blocks with cpk should succeed put_block_list_resp = await destination_blob_client.commit_block_list( block_list, cpk=TEST_ENCRYPTION_KEY) # Assert self.assertIsNotNone(put_block_list_resp['etag']) self.assertIsNotNone(put_block_list_resp['last_modified']) self.assertTrue(put_block_list_resp['request_server_encrypted']) self.assertEqual(put_block_list_resp['encryption_key_sha256'], TEST_ENCRYPTION_KEY.key_hash) # Act get the blob content blob = await destination_blob_client.download_blob( cpk=TEST_ENCRYPTION_KEY) # Assert content was retrieved with the cpk self.assertEqual(await blob.content_as_bytes(), self.byte_data[0:8 * 1024 + 1]) self.assertEqual(blob.properties.etag, put_block_list_resp['etag']) self.assertEqual(blob.properties.last_modified, put_block_list_resp['last_modified']) self.assertEqual(blob.properties.encryption_key_sha256, TEST_ENCRYPTION_KEY.key_hash)