diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java index e947e4da7..8da0b24a2 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java @@ -417,7 +417,13 @@ public Blob get(BlobId blob, BlobGetOption... options) { return Retrying.run( getOptions(), retryAlgorithmManager.getFor(req), - () -> storageClient.getObjectCallable().call(req, grpcCallContext), + () -> { + try { + return storageClient.getObjectCallable().call(req, grpcCallContext); + } catch (NotFoundException ignore) { + return null; + } + }, syntaxDecoders.blob.andThen(opts.clearBlobFields())); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java index 9a3265a09..63d4bbe17 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java @@ -19,6 +19,7 @@ import com.google.api.services.storage.model.StorageObject; import com.google.cloud.WriteChannel; import com.google.cloud.storage.BucketInfo.BuilderImpl; +import com.google.common.collect.ImmutableList; import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; @@ -73,4 +74,8 @@ public static void ifNonNull(@Nullable T t, Consumer c) { public static void ifNonNull(@Nullable T1 t, Function map, Consumer c) { Utils.ifNonNull(t, map, c); } + + public static BlobInfo noAcl(BlobInfo bi) { + return bi.toBuilder().setOwner(null).setAcl(ImmutableList.of()).build(); + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITObjectTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITObjectTest.java index 6825664f8..2b116c0a8 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITObjectTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITObjectTest.java @@ -40,6 +40,7 @@ import com.google.cloud.storage.BucketFixture; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.CopyWriter; +import com.google.cloud.storage.PackagePrivateMethodWorkarounds; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobField; import com.google.cloud.storage.Storage.BlobWriteOption; @@ -488,6 +489,14 @@ public void testListBlobsEmptySelectedFields() throws InterruptedException { } } + @Test + public void getBlobReturnNullOn404() { + String bucketName = bucketFixture.getBucketInfo().getName(); + BlobId id = BlobId.of(bucketName, "__d_o_e_s__n_o_t__e_x_i_s_t__"); + Blob blob = storage.get(id); + assertThat(blob).isNull(); + } + @Test(timeout = 7500) public void testListBlobRequesterPays() throws InterruptedException { unsetRequesterPays(storage, requesterPaysBucketFixture); @@ -1435,17 +1444,14 @@ public void testAttemptDeletionObjectTemporaryHold() { @Test public void testBlobReload() throws Exception { - // GRPC Error Handling bug - // b/247621346 - assumeTrue(clientName.startsWith("JSON")); - String blobName = "test-blob-reload"; BlobId blobId = BlobId.of(bucketFixture.getBucketInfo().getName(), blobName); BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build(); Blob blob = storage.create(blobInfo, new byte[] {0, 1, 2}); Blob blobUnchanged = blob.reload(); - assertEquals(blob, blobUnchanged); + // gRPC and json have differing defaults on projections b/258835631 + assertThat(blobUnchanged).isAnyOf(blob, PackagePrivateMethodWorkarounds.noAcl(blob)); blob.writer().close(); try { @@ -1453,7 +1459,6 @@ public void testBlobReload() throws Exception { fail("StorageException was expected"); } catch (StorageException e) { assertEquals(412, e.getCode()); - assertEquals("conditionNotMet", e.getReason()); } Blob updated = blob.reload();