BlobReadChannel( StorageOptions serviceOptions, BlobId blob, Map<StorageRpc.Option, ?> requestOptions) { this.serviceOptions = serviceOptions; this.blob = blob; this.requestOptions = requestOptions; isOpen = true; storageRpc = serviceOptions.getStorageRpcV1(); storageObject = blob.toPb(); }
/** * Adds a request representing the "delete blob" operation to this batch. Calling {@link * StorageBatchResult#get()} on the return value yields {@code true} upon successful deletion, * {@code false} if the blob was not found, or throws a {@link StorageException} if the operation * failed. */ public StorageBatchResult<Boolean> delete(BlobId blob, BlobSourceOption... options) { StorageBatchResult<Boolean> result = new StorageBatchResult<>(); RpcBatch.Callback<Void> callback = createDeleteCallback(result); Map<StorageRpc.Option, ?> optionMap = StorageImpl.optionMap(blob, options); batch.addDelete(blob.toPb(), callback, optionMap); return result; }
/** * Adds a request representing the "get blob" operation to this batch. The {@code options} can be * used in the same way as for {@link Storage#get(BlobId, BlobGetOption...)}. Calling {@link * StorageBatchResult#get()} on the return value yields the requested {@link Blob} if successful, * {@code null} if no such blob exists, or throws a {@link StorageException} if the operation * failed. */ public StorageBatchResult<Blob> get(BlobId blob, BlobGetOption... options) { StorageBatchResult<Blob> result = new StorageBatchResult<>(); RpcBatch.Callback<StorageObject> callback = createGetCallback(this.options, result); Map<StorageRpc.Option, ?> optionMap = StorageImpl.optionMap(blob, options); batch.addGet(blob.toPb(), callback, optionMap); return result; }
@Test public void testReadFinish() throws IOException { reader = new BlobReadChannel(options, BLOB_ID, EMPTY_RPC_OPTIONS); byte[] result = {}; ByteBuffer readBuffer = ByteBuffer.allocate(DEFAULT_CHUNK_SIZE); expect(storageRpcMock.read(BLOB_ID.toPb(), EMPTY_RPC_OPTIONS, 0, DEFAULT_CHUNK_SIZE)) .andReturn(Tuple.of("etag", result)); replay(storageRpcMock); assertEquals(-1, reader.read(readBuffer)); }
@Test public void testSeek() throws IOException { reader = new BlobReadChannel(options, BLOB_ID, EMPTY_RPC_OPTIONS); reader.seek(42); byte[] result = randomByteArray(DEFAULT_CHUNK_SIZE); ByteBuffer readBuffer = ByteBuffer.allocate(DEFAULT_CHUNK_SIZE); expect(storageRpcMock.read(BLOB_ID.toPb(), EMPTY_RPC_OPTIONS, 42, DEFAULT_CHUNK_SIZE)) .andReturn(Tuple.of("etag", result)); replay(storageRpcMock); reader.read(readBuffer); assertArrayEquals(result, readBuffer.array()); }
@Test public void testReadAllBytes() { EasyMock.expect( storageRpcMock.load(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), EMPTY_RPC_OPTIONS)) .andReturn(BLOB_CONTENT); EasyMock.replay(storageRpcMock); initializeService(); byte[] readBytes = storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1); assertArrayEquals(BLOB_CONTENT, readBytes); }
@Test public void testDeleteBlob() { EasyMock.expect( storageRpcMock.delete(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), EMPTY_RPC_OPTIONS)) .andReturn(true); EasyMock.replay(storageRpcMock); initializeService(); assertTrue(storage.delete(BUCKET_NAME1, BLOB_NAME1)); }
@Test public void testToPbAndFromPb() { compareBlobIds(BLOB, BlobId.fromPb(BLOB.toPb())); } }
@Test public void testDeleteBlobWithOptions() { EasyMock.expect( storageRpcMock.delete(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), BLOB_SOURCE_OPTIONS)) .andReturn(true); EasyMock.replay(storageRpcMock); initializeService(); assertTrue( storage.delete( BUCKET_NAME1, BLOB_NAME1, BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION)); }
@Test public void testReadAllBytesWithOptions() { EasyMock.expect( storageRpcMock.load(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), BLOB_SOURCE_OPTIONS)) .andReturn(BLOB_CONTENT); EasyMock.replay(storageRpcMock); initializeService(); byte[] readBytes = storage.readAllBytes( BUCKET_NAME1, BLOB_NAME1, BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION); assertArrayEquals(BLOB_CONTENT, readBytes); }
@Test public void testGetBlobWithOptions() { EasyMock.expect( storageRpcMock.get(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), BLOB_GET_OPTIONS)) .andReturn(BLOB_INFO1.toPb()); EasyMock.replay(storageRpcMock); initializeService(); Blob blob = storage.get(BUCKET_NAME1, BLOB_NAME1, BLOB_GET_METAGENERATION, BLOB_GET_GENERATION); assertEquals(expectedBlob1, blob); }
@Test public void testDeleteBlobWithOptionsFromBlobId() { EasyMock.expect(storageRpcMock.delete(BLOB_INFO1.getBlobId().toPb(), BLOB_SOURCE_OPTIONS)) .andReturn(true); EasyMock.replay(storageRpcMock); initializeService(); assertTrue( storage.delete( BLOB_INFO1.getBlobId(), BLOB_SOURCE_GENERATION_FROM_BLOB_ID, BLOB_SOURCE_METAGENERATION)); }
@Test public void testGetBlob() { EasyMock.expect( storageRpcMock.get(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), EMPTY_RPC_OPTIONS)) .andReturn(BLOB_INFO1.toPb()); EasyMock.replay(storageRpcMock); initializeService(); Blob blob = storage.get(BUCKET_NAME1, BLOB_NAME1); assertEquals(expectedBlob1, blob); }
@Test public void testGetBlobWithOptionsFromBlobId() { EasyMock.expect(storageRpcMock.get(BLOB_INFO1.getBlobId().toPb(), BLOB_GET_OPTIONS)) .andReturn(BLOB_INFO1.toPb()); EasyMock.replay(storageRpcMock); initializeService(); Blob blob = storage.get( BLOB_INFO1.getBlobId(), BLOB_GET_METAGENERATION, BLOB_GET_GENERATION_FROM_BLOB_ID); assertEquals(expectedBlob1, blob); }
@Test public void testReadAllBytesFromBlobIdWithOptions() { EasyMock.expect(storageRpcMock.load(BLOB_INFO1.getBlobId().toPb(), BLOB_SOURCE_OPTIONS)) .andReturn(BLOB_CONTENT); EasyMock.replay(storageRpcMock); initializeService(); byte[] readBytes = storage.readAllBytes( BLOB_INFO1.getBlobId(), BLOB_SOURCE_GENERATION_FROM_BLOB_ID, BLOB_SOURCE_METAGENERATION); assertArrayEquals(BLOB_CONTENT, readBytes); }
@Test public void testReadAllBytesWithDecriptionKey() { EasyMock.expect( storageRpcMock.load(BlobId.of(BUCKET_NAME1, BLOB_NAME1).toPb(), ENCRYPTION_KEY_OPTIONS)) .andReturn(BLOB_CONTENT) .times(2); EasyMock.replay(storageRpcMock); initializeService(); byte[] readBytes = storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1, BlobSourceOption.decryptionKey(KEY)); assertArrayEquals(BLOB_CONTENT, readBytes); readBytes = storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1, BlobSourceOption.decryptionKey(BASE64_KEY)); assertArrayEquals(BLOB_CONTENT, readBytes); }
@Test public void testRuntimeException() { BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); String exceptionMessage = "Artificial runtime exception"; EasyMock.expect(storageRpcMock.get(blob.toPb(), EMPTY_RPC_OPTIONS)) .andThrow(new RuntimeException(exceptionMessage)); EasyMock.replay(storageRpcMock); storage = options .toBuilder() .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) .build() .getService(); thrown.expect(StorageException.class); thrown.expectMessage(exceptionMessage); storage.get(blob); } }
@Test public void testReadAllBytesFromBlobIdWithDecriptionKey() { EasyMock.expect(storageRpcMock.load(BLOB_INFO1.getBlobId().toPb(), ENCRYPTION_KEY_OPTIONS)) .andReturn(BLOB_CONTENT) .times(2); EasyMock.replay(storageRpcMock); initializeService(); byte[] readBytes = storage.readAllBytes(BLOB_INFO1.getBlobId(), BlobSourceOption.decryptionKey(KEY)); assertArrayEquals(BLOB_CONTENT, readBytes); readBytes = storage.readAllBytes(BLOB_INFO1.getBlobId(), BlobSourceOption.decryptionKey(BASE64_KEY)); assertArrayEquals(BLOB_CONTENT, readBytes); }
@Test public void testRetryableException() { BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); EasyMock.expect(storageRpcMock.get(blob.toPb(), EMPTY_RPC_OPTIONS)) .andThrow(new StorageException(500, "internalError")) .andReturn(BLOB_INFO1.toPb()); EasyMock.replay(storageRpcMock); storage = options .toBuilder() .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) .build() .getService(); initializeServiceDependentObjects(); Blob readBlob = storage.get(blob); assertEquals(expectedBlob1, readBlob); }
@Test public void testNonRetryableException() { BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); String exceptionMessage = "Not Implemented"; EasyMock.expect(storageRpcMock.get(blob.toPb(), EMPTY_RPC_OPTIONS)) .andThrow(new StorageException(501, exceptionMessage)); EasyMock.replay(storageRpcMock); storage = options .toBuilder() .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) .build() .getService(); initializeServiceDependentObjects(); thrown.expect(StorageException.class); thrown.expectMessage(exceptionMessage); storage.get(blob); }