diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 10129b2a7..1a52a0032 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -156,6 +156,11 @@
easymock
test
+
+ org.mockito
+ mockito-core
+ test
+
org.objenesis
objenesis
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java
new file mode 100644
index 000000000..7039ffddc
--- /dev/null
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.storage;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.google.api.core.ApiClock;
+import com.google.cloud.Identity;
+import com.google.cloud.Policy;
+import com.google.cloud.ServiceOptions;
+import com.google.cloud.storage.spi.StorageRpcFactory;
+import com.google.cloud.storage.spi.v1.StorageRpc;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.io.BaseEncoding;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.EncodedKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Map;
+import javax.crypto.spec.SecretKeySpec;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class StorageImplMockitoTest {
+
+ private static final String BUCKET_NAME1 = "b1";
+ private static final String BUCKET_NAME2 = "b2";
+ private static final String BUCKET_NAME3 = "b3";
+ private static final String BLOB_NAME1 = "n1";
+ private static final String BLOB_NAME2 = "n2";
+ private static final String BLOB_NAME3 = "n3";
+ private static final byte[] BLOB_CONTENT = {0xD, 0xE, 0xA, 0xD};
+ private static final byte[] BLOB_SUB_CONTENT = {0xE, 0xA};
+ private static final String CONTENT_MD5 = "O1R4G1HJSDUISJjoIYmVhQ==";
+ private static final String CONTENT_CRC32C = "9N3EPQ==";
+ private static final String SUB_CONTENT_MD5 = "5e7c7CdasUiOn3BO560jPg==";
+ private static final String SUB_CONTENT_CRC32C = "bljNYA==";
+ private static final int DEFAULT_CHUNK_SIZE = 2 * 1024 * 1024;
+ private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA=";
+ private static final Key KEY =
+ new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256");
+ private static final String KMS_KEY_NAME =
+ "projects/gcloud-devel/locations/us/keyRings/gcs_kms_key_ring_us/cryptoKeys/key";
+ private static final Long RETENTION_PERIOD = 10L;
+ private static final String USER_PROJECT = "test-project";
+ private static final int DEFAULT_BUFFER_SIZE = 15 * 1024 * 1024;
+ private static final int MIN_BUFFER_SIZE = 256 * 1024;
+ // BucketInfo objects
+ private static final BucketInfo BUCKET_INFO1 =
+ BucketInfo.newBuilder(BUCKET_NAME1).setMetageneration(42L).build();
+ private static final BucketInfo BUCKET_INFO2 = BucketInfo.newBuilder(BUCKET_NAME2).build();
+ private static final BucketInfo BUCKET_INFO3 =
+ BucketInfo.newBuilder(BUCKET_NAME3)
+ .setRetentionPeriod(RETENTION_PERIOD)
+ .setRetentionPolicyIsLocked(true)
+ .setMetageneration(42L)
+ .build();
+
+ // BlobInfo objects
+ private static final BlobInfo BLOB_INFO1 =
+ BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME1, 24L)
+ .setMetageneration(42L)
+ .setContentType("application/json")
+ .setMd5("md5string")
+ .build();
+ private static final BlobInfo BLOB_INFO2 = BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME2).build();
+ private static final BlobInfo BLOB_INFO3 = BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME3).build();
+
+ // Empty StorageRpc options
+ private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of();
+
+ // Bucket target options
+ private static final Storage.BucketTargetOption BUCKET_TARGET_METAGENERATION =
+ Storage.BucketTargetOption.metagenerationMatch();
+ private static final Storage.BucketTargetOption BUCKET_TARGET_PREDEFINED_ACL =
+ Storage.BucketTargetOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE);
+ private static final Storage.BucketTargetOption BUCKET_TARGET_USER_PROJECT =
+ Storage.BucketTargetOption.userProject(USER_PROJECT);
+ private static final Map BUCKET_TARGET_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration(),
+ StorageRpc.Option.PREDEFINED_ACL, BUCKET_TARGET_PREDEFINED_ACL.getValue());
+ private static final Map BUCKET_TARGET_OPTIONS_LOCK_RETENTION_POLICY =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH,
+ BUCKET_INFO3.getMetageneration(),
+ StorageRpc.Option.USER_PROJECT,
+ USER_PROJECT);
+
+ // Blob target options (create, update, compose)
+ private static final Storage.BlobTargetOption BLOB_TARGET_GENERATION =
+ Storage.BlobTargetOption.generationMatch();
+ private static final Storage.BlobTargetOption BLOB_TARGET_METAGENERATION =
+ Storage.BlobTargetOption.metagenerationMatch();
+ private static final Storage.BlobTargetOption BLOB_TARGET_DISABLE_GZIP_CONTENT =
+ Storage.BlobTargetOption.disableGzipContent();
+ private static final Storage.BlobTargetOption BLOB_TARGET_NOT_EXIST =
+ Storage.BlobTargetOption.doesNotExist();
+ private static final Storage.BlobTargetOption BLOB_TARGET_PREDEFINED_ACL =
+ Storage.BlobTargetOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE);
+ private static final Map BLOB_TARGET_OPTIONS_CREATE =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration(),
+ StorageRpc.Option.IF_GENERATION_MATCH, 0L,
+ StorageRpc.Option.PREDEFINED_ACL, BUCKET_TARGET_PREDEFINED_ACL.getValue());
+ private static final Map BLOB_TARGET_OPTIONS_CREATE_DISABLE_GZIP_CONTENT =
+ ImmutableMap.of(StorageRpc.Option.IF_DISABLE_GZIP_CONTENT, true);
+ private static final Map BLOB_TARGET_OPTIONS_UPDATE =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration(),
+ StorageRpc.Option.PREDEFINED_ACL, BUCKET_TARGET_PREDEFINED_ACL.getValue());
+ private static final Map BLOB_TARGET_OPTIONS_COMPOSE =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_GENERATION_MATCH, BLOB_INFO1.getGeneration(),
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration());
+
+ // Blob write options (create, writer)
+ private static final Storage.BlobWriteOption BLOB_WRITE_METAGENERATION =
+ Storage.BlobWriteOption.metagenerationMatch();
+ private static final Storage.BlobWriteOption BLOB_WRITE_NOT_EXIST =
+ Storage.BlobWriteOption.doesNotExist();
+ private static final Storage.BlobWriteOption BLOB_WRITE_PREDEFINED_ACL =
+ Storage.BlobWriteOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE);
+ private static final Storage.BlobWriteOption BLOB_WRITE_MD5_HASH =
+ Storage.BlobWriteOption.md5Match();
+ private static final Storage.BlobWriteOption BLOB_WRITE_CRC2C =
+ Storage.BlobWriteOption.crc32cMatch();
+
+ // Bucket get/source options
+ private static final Storage.BucketSourceOption BUCKET_SOURCE_METAGENERATION =
+ Storage.BucketSourceOption.metagenerationMatch(BUCKET_INFO1.getMetageneration());
+ private static final Map BUCKET_SOURCE_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_SOURCE_METAGENERATION.getValue());
+ private static final Storage.BucketGetOption BUCKET_GET_METAGENERATION =
+ Storage.BucketGetOption.metagenerationMatch(BUCKET_INFO1.getMetageneration());
+ private static final Storage.BucketGetOption BUCKET_GET_FIELDS =
+ Storage.BucketGetOption.fields(Storage.BucketField.LOCATION, Storage.BucketField.ACL);
+ private static final Storage.BucketGetOption BUCKET_GET_EMPTY_FIELDS =
+ Storage.BucketGetOption.fields();
+ private static final Map BUCKET_GET_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_SOURCE_METAGENERATION.getValue());
+
+ // Blob get/source options
+ private static final Storage.BlobGetOption BLOB_GET_METAGENERATION =
+ Storage.BlobGetOption.metagenerationMatch(BLOB_INFO1.getMetageneration());
+ private static final Storage.BlobGetOption BLOB_GET_GENERATION =
+ Storage.BlobGetOption.generationMatch(BLOB_INFO1.getGeneration());
+ private static final Storage.BlobGetOption BLOB_GET_GENERATION_FROM_BLOB_ID =
+ Storage.BlobGetOption.generationMatch();
+ private static final Storage.BlobGetOption BLOB_GET_FIELDS =
+ Storage.BlobGetOption.fields(Storage.BlobField.CONTENT_TYPE, Storage.BlobField.CRC32C);
+ private static final Storage.BlobGetOption BLOB_GET_EMPTY_FIELDS = Storage.BlobGetOption.fields();
+ private static final Map BLOB_GET_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_GET_METAGENERATION.getValue(),
+ StorageRpc.Option.IF_GENERATION_MATCH, BLOB_GET_GENERATION.getValue());
+ private static final Storage.BlobSourceOption BLOB_SOURCE_METAGENERATION =
+ Storage.BlobSourceOption.metagenerationMatch(BLOB_INFO1.getMetageneration());
+ private static final Storage.BlobSourceOption BLOB_SOURCE_GENERATION =
+ Storage.BlobSourceOption.generationMatch(BLOB_INFO1.getGeneration());
+ private static final Storage.BlobSourceOption BLOB_SOURCE_GENERATION_FROM_BLOB_ID =
+ Storage.BlobSourceOption.generationMatch();
+ private static final Map BLOB_SOURCE_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_SOURCE_METAGENERATION.getValue(),
+ StorageRpc.Option.IF_GENERATION_MATCH, BLOB_SOURCE_GENERATION.getValue());
+ private static final Map BLOB_SOURCE_OPTIONS_COPY =
+ ImmutableMap.of(
+ StorageRpc.Option.IF_SOURCE_METAGENERATION_MATCH, BLOB_SOURCE_METAGENERATION.getValue(),
+ StorageRpc.Option.IF_SOURCE_GENERATION_MATCH, BLOB_SOURCE_GENERATION.getValue());
+
+ // Bucket list options
+ private static final Storage.BucketListOption BUCKET_LIST_PAGE_SIZE =
+ Storage.BucketListOption.pageSize(42L);
+ private static final Storage.BucketListOption BUCKET_LIST_PREFIX =
+ Storage.BucketListOption.prefix("prefix");
+ private static final Storage.BucketListOption BUCKET_LIST_FIELDS =
+ Storage.BucketListOption.fields(Storage.BucketField.LOCATION, Storage.BucketField.ACL);
+ private static final Storage.BucketListOption BUCKET_LIST_EMPTY_FIELDS =
+ Storage.BucketListOption.fields();
+ private static final Map BUCKET_LIST_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.MAX_RESULTS, BUCKET_LIST_PAGE_SIZE.getValue(),
+ StorageRpc.Option.PREFIX, BUCKET_LIST_PREFIX.getValue());
+
+ // Blob list options
+ private static final Storage.BlobListOption BLOB_LIST_PAGE_SIZE =
+ Storage.BlobListOption.pageSize(42L);
+ private static final Storage.BlobListOption BLOB_LIST_PREFIX =
+ Storage.BlobListOption.prefix("prefix");
+ private static final Storage.BlobListOption BLOB_LIST_FIELDS =
+ Storage.BlobListOption.fields(Storage.BlobField.CONTENT_TYPE, Storage.BlobField.MD5HASH);
+ private static final Storage.BlobListOption BLOB_LIST_VERSIONS =
+ Storage.BlobListOption.versions(false);
+ private static final Storage.BlobListOption BLOB_LIST_EMPTY_FIELDS =
+ Storage.BlobListOption.fields();
+ private static final Map BLOB_LIST_OPTIONS =
+ ImmutableMap.of(
+ StorageRpc.Option.MAX_RESULTS, BLOB_LIST_PAGE_SIZE.getValue(),
+ StorageRpc.Option.PREFIX, BLOB_LIST_PREFIX.getValue(),
+ StorageRpc.Option.VERSIONS, BLOB_LIST_VERSIONS.getValue());
+
+ // ACLs
+ private static final Acl ACL = Acl.of(Acl.User.ofAllAuthenticatedUsers(), Acl.Role.OWNER);
+ private static final Acl OTHER_ACL =
+ Acl.of(new Acl.Project(Acl.Project.ProjectRole.OWNERS, "p"), Acl.Role.READER);
+
+ // Customer supplied encryption key options
+ private static final Map ENCRYPTION_KEY_OPTIONS =
+ ImmutableMap.of(StorageRpc.Option.CUSTOMER_SUPPLIED_KEY, BASE64_KEY);
+
+ // Customer managed encryption key options
+ private static final Map KMS_KEY_NAME_OPTIONS =
+ ImmutableMap.of(StorageRpc.Option.KMS_KEY_NAME, KMS_KEY_NAME);
+ // IAM policies
+ private static final String POLICY_ETAG1 = "CAE=";
+ private static final String POLICY_ETAG2 = "CAI=";
+ private static final Policy LIB_POLICY1 =
+ Policy.newBuilder()
+ .addIdentity(StorageRoles.objectViewer(), Identity.allUsers())
+ .addIdentity(
+ StorageRoles.objectAdmin(),
+ Identity.user("test1@gmail.com"),
+ Identity.user("test2@gmail.com"))
+ .setEtag(POLICY_ETAG1)
+ .setVersion(1)
+ .build();
+
+ private static final ServiceAccount SERVICE_ACCOUNT = ServiceAccount.of("test@google.com");
+
+ private static final com.google.api.services.storage.model.Policy API_POLICY1 =
+ new com.google.api.services.storage.model.Policy()
+ .setBindings(
+ ImmutableList.of(
+ new com.google.api.services.storage.model.Policy.Bindings()
+ .setMembers(ImmutableList.of("allUsers"))
+ .setRole("roles/storage.objectViewer"),
+ new com.google.api.services.storage.model.Policy.Bindings()
+ .setMembers(ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com"))
+ .setRole("roles/storage.objectAdmin")))
+ .setEtag(POLICY_ETAG1)
+ .setVersion(1);
+
+ private static final String PRIVATE_KEY_STRING =
+ "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoG"
+ + "BAL2xolH1zrISQ8+GzOV29BNjjzq4/HIP8Psd1+cZb81vDklSF+95wB250MSE0BDc81pvIMwj5OmIfLg1NY6uB"
+ + "1xavOPpVdx1z664AGc/BEJ1zInXGXaQ6s+SxGenVq40Yws57gikQGMZjttpf1Qbz4DjkxsbRoeaRHn06n9pH1e"
+ + "jAgMBAAECgYEAkWcm0AJF5LMhbWKbjkxm/LG06UNApkHX6vTOOOODkonM/qDBnhvKCj8Tan+PaU2j7679Cd19q"
+ + "xCm4SBQJET7eBhqLD9L2j9y0h2YUQnLbISaqUS1/EXcr2C1Lf9VCEn1y/GYuDYqs85rGoQ4ZYfM9ClROSq86fH"
+ + "+cbIIssqJqukCQQD18LjfJz/ichFeli5/l1jaFid2XoCH3T6TVuuysszVx68fh60gSIxEF/0X2xB+wuPxTP4IQ"
+ + "+t8tD/ktd232oWXAkEAxXPych2QBHePk9/lek4tOkKBgfnDzex7S/pI0G1vpB3VmzBbCsokn9lpOv7JV8071GD"
+ + "lW/7R6jlLfpQy3hN31QJAE10osSk99m5Uv8XDU3hvHnywDrnSFOBulNs7I47AYfSe7TSZhPkxUgsxejddTR27J"
+ + "LyTI8N1PxRSE4feNSOXcQJAMMKJRJT4U6IS2rmXubREhvaVdLtxFxEnAYQ1JwNfZm/XqBMw6GEy2iaeTetNXVl"
+ + "ZRQEIoscyn1y2v/No/F5iYQJBAKBOGASoQcBjGTOg/H/SfcE8QVNsKEpthRrs6CkpT80aZ/AV+ksfoIf2zw2M3"
+ + "mAHfrO+TBLdz4sicuFQvlN9SEc=";
+
+ private static final String PUBLIC_KEY_STRING =
+ "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9saJR9c6y"
+ + "EkPPhszldvQTY486uPxyD/D7HdfnGW/Nbw5JUhfvecAdudDEhNAQ3PNabyDMI+TpiHy4NTWOrgdcWrzj6VXcdc"
+ + "+uuABnPwRCdcyJ1xl2kOrPksRnp1auNGMLOe4IpEBjGY7baX9UG8+A45MbG0aHmkR59Op/aR9XowIDAQAB";
+
+ private static final String SIGNED_URL =
+ "http://www.test.com/test-bucket/test1.txt?GoogleAccessId=testClient-test@test.com&Expires=1553839761&Signature=MJUBXAZ7";
+
+ private static final ApiClock TIME_SOURCE =
+ new ApiClock() {
+ @Override
+ public long nanoTime() {
+ return 42_000_000_000L;
+ }
+
+ @Override
+ public long millisTime() {
+ return 42_000L;
+ }
+ };
+
+ // List of chars under test were taken from
+ // https://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters
+ private static final Map RFC3986_URI_ENCODING_MAP =
+ ImmutableMap.builder()
+ .put('!', "%21")
+ .put('#', "%23")
+ .put('$', "%24")
+ .put('&', "%26")
+ .put('\'', "%27")
+ .put('(', "%28")
+ .put(')', "%29")
+ .put('*', "%2A")
+ .put('+', "%2B")
+ .put(',', "%2C")
+ // NOTE: Whether the forward slash character should be encoded depends on the URI segment
+ // being encoded. The path segment should not encode forward slashes, but others (e.g.
+ // query parameter keys and values) should encode them. Tests verifying encoding behavior
+ // in path segments should make a copy of this map and replace the mapping for '/' to "/".
+ .put('/', "%2F")
+ .put(':', "%3A")
+ .put(';', "%3B")
+ .put('=', "%3D")
+ .put('?', "%3F")
+ .put('@', "%40")
+ .put('[', "%5B")
+ .put(']', "%5D")
+ // In addition to [a-zA-Z0-9], these chars should not be URI-encoded:
+ .put('-', "-")
+ .put('_', "_")
+ .put('.', ".")
+ .put('~', "~")
+ .build();
+
+ private static final String ACCOUNT = "account";
+ private static PrivateKey privateKey;
+ private static PublicKey publicKey;
+
+ private StorageOptions options;
+ private StorageRpcFactory rpcFactoryMock;
+ private StorageRpc storageRpcMock;
+ private Storage storage;
+
+ private Blob expectedBlob1, expectedBlob2, expectedBlob3, expectedUpdated;
+ private Bucket expectedBucket1, expectedBucket2, expectedBucket3;
+
+ @BeforeClass
+ public static void beforeClass() throws NoSuchAlgorithmException, InvalidKeySpecException {
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+ EncodedKeySpec privateKeySpec =
+ new PKCS8EncodedKeySpec(BaseEncoding.base64().decode(PRIVATE_KEY_STRING));
+ privateKey = keyFactory.generatePrivate(privateKeySpec);
+ EncodedKeySpec publicKeySpec =
+ new X509EncodedKeySpec(BaseEncoding.base64().decode(PUBLIC_KEY_STRING));
+ publicKey = keyFactory.generatePublic(publicKeySpec);
+ }
+
+ @Before
+ public void setUp() {
+ rpcFactoryMock = mock(StorageRpcFactory.class);
+ storageRpcMock = mock(StorageRpc.class);
+ when(rpcFactoryMock.create(any(StorageOptions.class))).thenReturn(storageRpcMock);
+ options =
+ StorageOptions.newBuilder()
+ .setProjectId("projectId")
+ .setClock(TIME_SOURCE)
+ .setServiceRpcFactory(rpcFactoryMock)
+ .setRetrySettings(ServiceOptions.getNoRetrySettings())
+ .build();
+ }
+
+ private void initializeService() {
+ storage = options.getService();
+ initializeServiceDependentObjects();
+ }
+
+ private void initializeServiceDependentObjects() {
+ expectedBlob1 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1));
+ expectedBlob2 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO2));
+ expectedBlob3 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO3));
+ expectedBucket1 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO1));
+ expectedBucket2 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO2));
+ expectedBucket3 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO3));
+ expectedUpdated = null;
+ }
+
+ @Test
+ public void testGetOptions() {
+ initializeService();
+ assertSame(options, storage.getOptions());
+ }
+
+ @Test
+ public void testCreateBucket() {
+ when(storageRpcMock.create(BUCKET_INFO1.toPb(), EMPTY_RPC_OPTIONS))
+ .thenReturn(BUCKET_INFO1.toPb())
+ .thenThrow(new RuntimeException("Fail"));
+ initializeService();
+ Bucket bucket = storage.create(BUCKET_INFO1);
+ assertEquals(expectedBucket1, bucket);
+ }
+
+ @Test
+ public void testCreateBucketWithOptions() {
+ when(storageRpcMock.create(BUCKET_INFO1.toPb(), BUCKET_TARGET_OPTIONS))
+ .thenReturn(BUCKET_INFO1.toPb())
+ .thenThrow(new RuntimeException("Fail"));
+ initializeService();
+ Bucket bucket =
+ storage.create(BUCKET_INFO1, BUCKET_TARGET_METAGENERATION, BUCKET_TARGET_PREDEFINED_ACL);
+ assertEquals(expectedBucket1, bucket);
+ }
+}
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java
index e1dd06e4f..55295a9d9 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java
@@ -431,34 +431,6 @@ private void initializeServiceDependentObjects() {
expectedBucket3 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO3));
}
- @Test
- public void testGetOptions() {
- EasyMock.replay(storageRpcMock);
- initializeService();
- assertSame(options, storage.getOptions());
- }
-
- @Test
- public void testCreateBucket() {
- EasyMock.expect(storageRpcMock.create(BUCKET_INFO1.toPb(), EMPTY_RPC_OPTIONS))
- .andReturn(BUCKET_INFO1.toPb());
- EasyMock.replay(storageRpcMock);
- initializeService();
- Bucket bucket = storage.create(BUCKET_INFO1);
- assertEquals(expectedBucket1, bucket);
- }
-
- @Test
- public void testCreateBucketWithOptions() {
- EasyMock.expect(storageRpcMock.create(BUCKET_INFO1.toPb(), BUCKET_TARGET_OPTIONS))
- .andReturn(BUCKET_INFO1.toPb());
- EasyMock.replay(storageRpcMock);
- initializeService();
- Bucket bucket =
- storage.create(BUCKET_INFO1, BUCKET_TARGET_METAGENERATION, BUCKET_TARGET_PREDEFINED_ACL);
- assertEquals(expectedBucket1, bucket);
- }
-
@Test
public void testCreateBlob() throws IOException {
Capture capturedStream = Capture.newInstance();
diff --git a/pom.xml b/pom.xml
index 53f6ca345..b2361fe8f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,6 +66,7 @@
1.93.4
1.9.0
4.13
+ 1.10.19
1.4.4
1.3.2
1.18
@@ -190,6 +191,12 @@
3.6
test
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
org.objenesis
objenesis