Repository: googleapis/java-storage (java)

Issue:
Cloud Storage: getStorageClass in SetStorageClassLifecycleAction is not visible
getStorageClass() method in SetStorageClassLifecycleAction class is only visible inside the package. Its not accessible outside the package.

I am trying to read storage class set by the lifecycle rule through SDK in the following way. looks like its not possible. Can you suggest any other alternative to access if this is not possible.

```
f (lifecycleAction.getActionType().equals(SetStorageClassLifecycleAction.TYPE)) {
     return ((SetStorageClassLifecycleAction)lifeCycleRule.getAction()).getStorageClass(); 
}
```

**// Compiler error : The method getStorageClass() from the type BucketInfo.LifecycleRule.SetStorageClassLifecycleAction is  not visible**


#### Environment details

OS type and version: Windows 10
Java version: JDK 11
sdk version: google-cloud-storage-1.7.8.0.jar



Pull request:
fix: make the getStorageClass() method public
Fixes #21 

Patch:
diff --git a/.kokoro/build.sh b/.kokoro/build.sh
index dc2936ef..f1ae5840 100755
--- a/.kokoro/build.sh
+++ b/.kokoro/build.sh
@@ -44,13 +44,26 @@ test)
     bash .kokoro/coerce_logs.sh
     ;;
 lint)
-    mvn com.coveo:fmt-maven-plugin:check
+    mvn \
+      -Penable-samples \
+      com.coveo:fmt-maven-plugin:check
     ;;
 javadoc)
     mvn javadoc:javadoc javadoc:test-javadoc
     ;;
 integration)
     mvn -B ${INTEGRATION_TEST_ARGS} \
+      -Penable-integration-tests \
+      -DtrimStackTrace=false \
+      -Dclirr.skip=true \
+      -Denforcer.skip=true \
+      -fae \
+      verify
+    bash .kokoro/coerce_logs.sh
+    ;;
+samples)
+    mvn -B \
+      -Penable-samples \
       -DtrimStackTrace=false \
       -Dclirr.skip=true \
       -Denforcer.skip=true \
diff --git a/.kokoro/continuous/samples.cfg b/.kokoro/continuous/samples.cfg
new file mode 100644
index 00000000..fa7b493d
--- /dev/null
+++ b/.kokoro/continuous/samples.cfg
@@ -0,0 +1,31 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+  key: "TRAMPOLINE_IMAGE"
+  value: "gcr.io/cloud-devrel-kokoro-resources/java8"
+}
+
+env_vars: {
+  key: "JOB_TYPE"
+  value: "samples"
+}
+
+env_vars: {
+    key: "GCLOUD_PROJECT"
+    value: "gcloud-devel"
+}
+
+env_vars: {
+    key: "GOOGLE_APPLICATION_CREDENTIALS"
+    value: "keystore/73713_java_it_service_account"
+}
+
+before_action {
+  fetch_keystore {
+    keystore_resource {
+      keystore_config_id: 73713
+      keyname: "java_it_service_account"
+    }
+  }
+}
diff --git a/.kokoro/nightly/samples.cfg b/.kokoro/nightly/samples.cfg
new file mode 100644
index 00000000..9a910249
--- /dev/null
+++ b/.kokoro/nightly/samples.cfg
@@ -0,0 +1,31 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+    key: "TRAMPOLINE_IMAGE"
+    value: "gcr.io/cloud-devrel-kokoro-resources/java8"
+}
+
+env_vars: {
+    key: "JOB_TYPE"
+    value: "samples"
+}
+
+env_vars: {
+    key: "GCLOUD_PROJECT"
+    value: "gcloud-devel"
+}
+
+env_vars: {
+    key: "GOOGLE_APPLICATION_CREDENTIALS"
+    value: "keystore/73713_java_it_service_account"
+}
+
+before_action {
+  fetch_keystore {
+    keystore_resource {
+      keystore_config_id: 73713
+      keyname: "java_it_service_account"
+    }
+  }
+}
diff --git a/.kokoro/presubmit/samples.cfg b/.kokoro/presubmit/samples.cfg
new file mode 100644
index 00000000..fa7b493d
--- /dev/null
+++ b/.kokoro/presubmit/samples.cfg
@@ -0,0 +1,31 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+  key: "TRAMPOLINE_IMAGE"
+  value: "gcr.io/cloud-devrel-kokoro-resources/java8"
+}
+
+env_vars: {
+  key: "JOB_TYPE"
+  value: "samples"
+}
+
+env_vars: {
+    key: "GCLOUD_PROJECT"
+    value: "gcloud-devel"
+}
+
+env_vars: {
+    key: "GOOGLE_APPLICATION_CREDENTIALS"
+    value: "keystore/73713_java_it_service_account"
+}
+
+before_action {
+  fetch_keystore {
+    keystore_resource {
+      keystore_config_id: 73713
+      keyname: "java_it_service_account"
+    }
+  }
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..b537117d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,15 @@
+# Changelog
+
+## [1.103.0](https://www.github.com/googleapis/java-storage/compare/1.102.0...v1.103.0) (2020-01-06)
+
+
+### Features
+
+* add support for archive storage class ([#19](https://www.github.com/googleapis/java-storage/issues/19)) ([a3fbd67](https://www.github.com/googleapis/java-storage/commit/a3fbd67fb0789849922eb7e7b08dc33f3ea9efae))
+* make repo releasable ([#3](https://www.github.com/googleapis/java-storage/issues/3)) ([39ff6f6](https://www.github.com/googleapis/java-storage/commit/39ff6f67dc785d3cae070756ca502df749ac9f34))
+
+
+### Dependencies
+
+* update core transport dependencies ([#16](https://www.github.com/googleapis/java-storage/issues/16)) ([d0a82ab](https://www.github.com/googleapis/java-storage/commit/d0a82ab2b705246923a89a2b826ac1d6d1adba70))
+* update dependency com.google.apis:google-api-services-storage to v1-rev20191011-1.30.3 ([#7](https://www.github.com/googleapis/java-storage/issues/7)) ([5ac5b8a](https://www.github.com/googleapis/java-storage/commit/5ac5b8a802e5e6814ba629b0fdb238d3b337756b))
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ebbb59e5..085021dd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -25,4 +25,106 @@ information on using pull requests.
 ## Community Guidelines
 
 This project follows
-[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
\ No newline at end of file
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
+
+## Building the project
+
+To build, package, and run all unit tests run the command
+
+```
+mvn clean verify
+```
+
+### Running Integration tests
+
+To include integration tests when building the project, you need access to
+a GCP Project with a valid service account. 
+
+For instructions on how to generate a service account and corresponding
+credentials JSON see: [Creating a Service Account][1].
+
+Then run the following to build, package, run all unit tests and run all
+integration tests.
+
+```bash
+export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account.json
+mvn -Penable-integration-tests clean verify
+```
+
+## Code Samples
+
+Code Samples must be bundled in separate Maven modules, and guarded by a
+Maven profile with the name `enable-samples`.
+
+The samples must be separate from the primary project for a few reasons:
+1. Primary projects have a minimum Java version of Java 7 whereas samples have
+   a minimum Java version of Java 8. Due to this we need the ability to
+   selectively exclude samples from a build run.
+2. Many code samples depend on external GCP services and need
+   credentials to access the service.
+3. Code samples are not released as Maven artifacts and must be excluded from 
+   release builds.
+   
+### Building
+
+```bash
+mvn -Penable-samples clean verify
+```
+
+Some samples require access to GCP services and require a service account:
+
+```bash
+export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account.json
+mvn -Penable-samples clean verify
+```
+
+### Profile Config
+
+1. To add samples in a profile to your Maven project, add the following to your
+`pom.xml`
+
+    ```xml
+    <project>
+      [...]
+      <profiles>
+        <profile>
+          <id>enable-samples</id>
+          <modules>
+            <module>sample</module>
+          </modules>
+        </profile>
+      </profiles>
+      [...]
+    </project>
+    ```
+
+2. [Activate](#profile-activation) the profile.
+3. Define your samples in a normal Maven project in the `samples/` directory
+
+### Profile Activation
+
+To include code samples when building and testing the project, enable the 
+`enable-samples` Maven profile.
+
+#### Command line
+
+To activate the Maven profile on the command line add `-Penable-samples` to your
+Maven command.
+
+#### Maven `settings.xml`
+
+To activate the Maven profile in your `~/.m2/settings.xml` add an entry of
+`enable-samples` following the instructions in [Active Profiles][2].
+
+This method has the benefit of applying to all projects you build (and is
+respected by IntelliJ IDEA) and is recommended if you are going to be
+contributing samples to several projects.
+
+#### IntelliJ IDEA
+
+To activate the Maven Profile inside IntelliJ IDEA, follow the instructions in
+[Activate Maven profiles][3] to activate `enable-samples`.
+
+[1]: https://cloud.google.com/docs/authentication/getting-started#creating_a_service_account
+[2]: https://maven.apache.org/settings.html#Active_Profiles
+[3]: https://www.jetbrains.com/help/idea/work-with-maven-profiles.html#activate_maven_profiles
diff --git a/README.md b/README.md
index 2eb0a76b..b5d01c80 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ If you are using Maven with Bom, Add this to your pom.xml file.
   <dependency>
     <groupId>com.google.cloud</groupId>
     <artifactId>libraries-bom</artifactId>
-    <version>3.0.0</version>
+    <version>3.2.0</version>
     <type>pom</type>
     <scope>import</scope>
    </dependency>
@@ -37,16 +37,16 @@ If you are using Maven without Bom, Add this to your dependencies.
 <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage</artifactId>
-  <version>1.102.0</version>
+  <version>1.103.0</version>
 </dependency>
 ```
 If you are using Gradle, add this to your dependencies
 ```Groovy
-compile 'com.google.cloud:google-cloud-storage:1.102.0'
+compile 'com.google.cloud:google-cloud-storage:1.103.0'
 ```
 If you are using SBT, add this to your dependencies
 ```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "1.102.0"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "1.103.0"
 ```
 [//]: # ({x-version-update-end})
 
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 8dce08bf..0a6dc3c2 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>google-cloud-storage</artifactId>
-  <version>1.102.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>1.103.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   <packaging>jar</packaging>
   <name>Google Cloud Storage</name>
   <url>https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-storage</url>
@@ -12,7 +12,7 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>1.102.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>1.103.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <properties>
     <site.installationModule>google-cloud-storage</site.installationModule>
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java
index f478bb09..0fd7e0fc 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java
@@ -663,7 +663,7 @@ public class BucketInfo implements Serializable {
             .toString();
       }
 
-      StorageClass getStorageClass() {
+      public StorageClass getStorageClass() {
         return storageClass;
       }
     }
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java
index 65d6b38b..a345a31f 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java
@@ -41,22 +41,44 @@ public final class StorageClass extends StringEnumValue {
   private static final StringEnumType<StorageClass> type =
       new StringEnumType(StorageClass.class, CONSTRUCTOR);
 
-  /** Regional storage class. */
-  public static final StorageClass REGIONAL = type.createAndRegister("REGIONAL");
-
-  /** Multi-regional storage class. */
-  public static final StorageClass MULTI_REGIONAL = type.createAndRegister("MULTI_REGIONAL");
+  /**
+   * Standard storage class. See: https://cloud.google.com/storage/docs/storage-classes for details
+   */
+  public static final StorageClass STANDARD = type.createAndRegister("STANDARD");
 
-  /** Nearline storage class. */
+  /**
+   * Nearline storage class. See: https://cloud.google.com/storage/docs/storage-classes for details
+   */
   public static final StorageClass NEARLINE = type.createAndRegister("NEARLINE");
 
-  /** Coldline storage class. */
+  /**
+   * Coldline storage class. See: https://cloud.google.com/storage/docs/storage-classes for details
+   */
   public static final StorageClass COLDLINE = type.createAndRegister("COLDLINE");
 
-  /** Standard storage class. */
-  public static final StorageClass STANDARD = type.createAndRegister("STANDARD");
+  /**
+   * Archive storage class. See: https://cloud.google.com/storage/docs/storage-classes for details
+   */
+  public static final StorageClass ARCHIVE = type.createAndRegister("ARCHIVE");
+
+  /**
+   * Regional storage class. This is supported as a legacy storage class and will be deprecated in
+   * the future. See: https://cloud.google.com/storage/docs/storage-classes for details
+   */
+  public static final StorageClass REGIONAL = type.createAndRegister("REGIONAL");
 
-  /** Durable Reduced Availability (deprecated) */
+  /**
+   * Multi-regional storage class. This is supported as a legacy storage class and will be
+   * deprecated in the future. See: https://cloud.google.com/storage/docs/storage-classes for
+   * details
+   */
+  public static final StorageClass MULTI_REGIONAL = type.createAndRegister("MULTI_REGIONAL");
+
+  /**
+   * Durable Reduced Availability storage class. This is supported as a legacy storage class and
+   * will be deprecated in the future. See: https://cloud.google.com/storage/docs/storage-classes
+   * for details
+   */
   public static final StorageClass DURABLE_REDUCED_AVAILABILITY =
       type.createAndRegister("DURABLE_REDUCED_AVAILABILITY");
 
diff --git a/pom.xml b/pom.xml
index 01a8f87c..da44f95e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-parent</artifactId>
   <packaging>pom</packaging>
-  <version>1.102.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>1.103.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   <name>Storage Parent</name>
   <url>https://github.com/googleapis/java-storage</url>
   <description>
@@ -14,7 +14,7 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-shared-config</artifactId>
-    <version>0.3.0</version>
+    <version>0.4.0</version>
   </parent>
 
   <developers>
@@ -65,8 +65,8 @@
     <site.installationModule>google-cloud-storage-parent</site.installationModule>
     <google.core.version>1.91.3</google.core.version>
     <google.api-common.version>1.8.1</google.api-common.version>
-    <junit.version>4.12</junit.version>
-    <threeten.version>1.4.0</threeten.version>
+    <junit.version>4.13</junit.version>
+    <threeten.version>1.4.1</threeten.version>
     <javax.annotations.version>1.3.2</javax.annotations.version>
     <animal-sniffer.version>1.18</animal-sniffer.version>
     <opencensus.version>0.24.0</opencensus.version>
@@ -189,7 +189,7 @@
       <dependency>
         <groupId>com.google.truth</groupId>
         <artifactId>truth</artifactId>
-        <version>1.0</version>
+        <version>1.0.1</version>
         <scope>test</scope>
       </dependency>
       <dependency>
diff --git a/renovate.json b/renovate.json
index d014232c..f3a70c97 100644
--- a/renovate.json
+++ b/renovate.json
@@ -52,6 +52,12 @@
       ],
       "semanticCommitType": "build",
       "semanticCommitScope": "deps"
+    },
+    {
+      "packagePatterns": [
+        "^com.google.cloud:google-cloud-"
+      ],
+      "ignoreUnstable": false
     }
   ],
   "semanticCommits": true
diff --git a/synth.metadata b/synth.metadata
index 6185e82b..9948555c 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -1,5 +1,5 @@
 {
-  "updateTime": "2019-12-19T19:30:35.138529Z",
+  "updateTime": "2020-01-07T09:02:44.859072Z",
   "sources": [
     {
       "template": {
@@ -11,188 +11,413 @@
   ],
   "newFiles": [
     {
-      "path": "codecov.yaml"
+      "path": ".repo-metadata.json"
     },
     {
-      "path": "CONTRIBUTING.md"
+      "path": "renovate.json"
     },
     {
       "path": "license-checks.xml"
     },
     {
-      "path": "java.header"
+      "path": "synth.py"
+    },
+    {
+      "path": "CHANGELOG.md"
+    },
+    {
+      "path": "codecov.yaml"
     },
     {
       "path": "LICENSE"
     },
+    {
+      "path": ".gitignore"
+    },
+    {
+      "path": "pom.xml"
+    },
     {
       "path": "CODE_OF_CONDUCT.md"
     },
     {
-      "path": "renovate.json"
+      "path": "synth.metadata"
     },
     {
-      "path": ".kokoro/dependencies.sh"
+      "path": "README.md"
     },
     {
-      "path": ".kokoro/trampoline.sh"
+      "path": "versions.txt"
     },
     {
-      "path": ".kokoro/linkage-monitor.sh"
+      "path": "CONTRIBUTING.md"
     },
     {
-      "path": ".kokoro/build.sh"
+      "path": "java.header"
     },
     {
-      "path": ".kokoro/coerce_logs.sh"
+      "path": "google-cloud-storage/pom.xml"
     },
     {
-      "path": ".kokoro/build.bat"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/CopyRequestTest.java"
     },
     {
-      "path": ".kokoro/common.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java"
     },
     {
-      "path": ".kokoro/presubmit/dependencies.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java"
     },
     {
-      "path": ".kokoro/presubmit/linkage-monitor.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/SignatureInfoTest.java"
     },
     {
-      "path": ".kokoro/presubmit/java7.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BlobWriteChannelTest.java"
     },
     {
-      "path": ".kokoro/presubmit/integration.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BlobReadChannelTest.java"
     },
     {
-      "path": ".kokoro/presubmit/clirr.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java"
     },
     {
-      "path": ".kokoro/presubmit/java11.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/CorsTest.java"
     },
     {
-      "path": ".kokoro/presubmit/java8.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BlobInfoTest.java"
     },
     {
-      "path": ".kokoro/presubmit/lint.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java"
     },
     {
-      "path": ".kokoro/presubmit/java8-win.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java"
     },
     {
-      "path": ".kokoro/presubmit/java8-osx.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/AclTest.java"
     },
     {
-      "path": ".kokoro/presubmit/common.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java"
     },
     {
-      "path": ".kokoro/continuous/propose_release.sh"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/CanonicalExtensionHeadersSerializerTest.java"
     },
     {
-      "path": ".kokoro/continuous/propose_release.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java"
     },
     {
-      "path": ".kokoro/continuous/dependencies.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/OptionTest.java"
     },
     {
-      "path": ".kokoro/continuous/java7.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/ServiceAccountTest.java"
     },
     {
-      "path": ".kokoro/continuous/integration.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/SerializationTest.java"
     },
     {
-      "path": ".kokoro/continuous/java11.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java"
     },
     {
-      "path": ".kokoro/continuous/java8.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BlobIdTest.java"
     },
     {
-      "path": ".kokoro/continuous/lint.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java"
     },
     {
-      "path": ".kokoro/continuous/java8-win.cfg"
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/V4SigningTest.java"
+    },
+    {
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java"
+    },
+    {
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java"
+    },
+    {
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java"
+    },
+    {
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java"
+    },
+    {
+      "path": "google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/Blob.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/CanonicalExtensionHeadersSerializer.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/Option.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/SignedUrlEncodingHelper.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/ServiceAccount.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/BlobReadChannel.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/PolicyHelper.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/SignatureInfo.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageBatch.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/Cors.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/BlobId.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/CopyWriter.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/Acl.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/package-info.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageRoles.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageClass.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageFactory.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/HttpMethod.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageBatchResult.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/HmacKey.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteChannel.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/testing/RemoteStorageHelper.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/testing/package-info.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/spi/StorageRpcFactory.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/RpcBatch.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/StorageRpc.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpcSpans.java"
+    },
+    {
+      "path": "google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java"
+    },
+    {
+      "path": ".kokoro/build.bat"
+    },
+    {
+      "path": ".kokoro/build.sh"
+    },
+    {
+      "path": ".kokoro/dependencies.sh"
+    },
+    {
+      "path": ".kokoro/common.cfg"
+    },
+    {
+      "path": ".kokoro/trampoline.sh"
+    },
+    {
+      "path": ".kokoro/coerce_logs.sh"
+    },
+    {
+      "path": ".kokoro/linkage-monitor.sh"
+    },
+    {
+      "path": ".kokoro/continuous/dependencies.cfg"
+    },
+    {
+      "path": ".kokoro/continuous/samples.cfg"
+    },
+    {
+      "path": ".kokoro/continuous/java7.cfg"
     },
     {
       "path": ".kokoro/continuous/java8-osx.cfg"
     },
     {
-      "path": ".kokoro/continuous/common.cfg"
+      "path": ".kokoro/continuous/java8-win.cfg"
     },
     {
-      "path": ".kokoro/nightly/dependencies.cfg"
+      "path": ".kokoro/continuous/propose_release.sh"
     },
     {
-      "path": ".kokoro/nightly/java7.cfg"
+      "path": ".kokoro/continuous/lint.cfg"
     },
     {
-      "path": ".kokoro/nightly/integration.cfg"
+      "path": ".kokoro/continuous/java11.cfg"
     },
     {
-      "path": ".kokoro/nightly/java11.cfg"
+      "path": ".kokoro/continuous/common.cfg"
     },
     {
-      "path": ".kokoro/nightly/java8.cfg"
+      "path": ".kokoro/continuous/propose_release.cfg"
     },
     {
-      "path": ".kokoro/nightly/lint.cfg"
+      "path": ".kokoro/continuous/java8.cfg"
     },
     {
-      "path": ".kokoro/nightly/java8-win.cfg"
+      "path": ".kokoro/continuous/integration.cfg"
     },
     {
-      "path": ".kokoro/nightly/java8-osx.cfg"
+      "path": ".kokoro/release/drop.sh"
     },
     {
-      "path": ".kokoro/nightly/common.cfg"
+      "path": ".kokoro/release/stage.cfg"
     },
     {
-      "path": ".kokoro/release/bump_snapshot.cfg"
+      "path": ".kokoro/release/promote.cfg"
     },
     {
-      "path": ".kokoro/release/stage.sh"
+      "path": ".kokoro/release/publish_javadoc.cfg"
+    },
+    {
+      "path": ".kokoro/release/bump_snapshot.cfg"
     },
     {
       "path": ".kokoro/release/promote.sh"
     },
     {
-      "path": ".kokoro/release/snapshot.sh"
+      "path": ".kokoro/release/stage.sh"
     },
     {
-      "path": ".kokoro/release/drop.cfg"
+      "path": ".kokoro/release/snapshot.sh"
     },
     {
       "path": ".kokoro/release/snapshot.cfg"
     },
     {
-      "path": ".kokoro/release/publish_javadoc.cfg"
+      "path": ".kokoro/release/common.cfg"
+    },
+    {
+      "path": ".kokoro/release/bump_snapshot.sh"
+    },
+    {
+      "path": ".kokoro/release/common.sh"
+    },
+    {
+      "path": ".kokoro/release/drop.cfg"
     },
     {
       "path": ".kokoro/release/publish_javadoc.sh"
     },
     {
-      "path": ".kokoro/release/bump_snapshot.sh"
+      "path": ".kokoro/presubmit/dependencies.cfg"
     },
     {
-      "path": ".kokoro/release/drop.sh"
+      "path": ".kokoro/presubmit/samples.cfg"
     },
     {
-      "path": ".kokoro/release/common.cfg"
+      "path": ".kokoro/presubmit/java7.cfg"
     },
     {
-      "path": ".kokoro/release/common.sh"
+      "path": ".kokoro/presubmit/java8-osx.cfg"
     },
     {
-      "path": ".kokoro/release/stage.cfg"
+      "path": ".kokoro/presubmit/linkage-monitor.cfg"
     },
     {
-      "path": ".kokoro/release/promote.cfg"
+      "path": ".kokoro/presubmit/java8-win.cfg"
     },
     {
-      "path": ".github/PULL_REQUEST_TEMPLATE.md"
+      "path": ".kokoro/presubmit/lint.cfg"
+    },
+    {
+      "path": ".kokoro/presubmit/java11.cfg"
+    },
+    {
+      "path": ".kokoro/presubmit/common.cfg"
+    },
+    {
+      "path": ".kokoro/presubmit/clirr.cfg"
+    },
+    {
+      "path": ".kokoro/presubmit/java8.cfg"
+    },
+    {
+      "path": ".kokoro/presubmit/integration.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/dependencies.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/samples.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/java7.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/java8-osx.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/java8-win.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/lint.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/java11.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/common.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/java8.cfg"
+    },
+    {
+      "path": ".kokoro/nightly/integration.cfg"
     },
     {
       "path": ".github/release-please.yml"
     },
+    {
+      "path": ".github/PULL_REQUEST_TEMPLATE.md"
+    },
+    {
+      "path": ".github/ISSUE_TEMPLATE/bug_report.md"
+    },
     {
       "path": ".github/ISSUE_TEMPLATE/support_request.md"
     },
@@ -200,10 +425,52 @@
       "path": ".github/ISSUE_TEMPLATE/feature_request.md"
     },
     {
-      "path": ".github/ISSUE_TEMPLATE/bug_report.md"
+      "path": "__pycache__/synth.cpython-36.pyc"
     },
     {
-      "path": "__pycache__/synth.cpython-36.pyc"
+      "path": ".git/index"
+    },
+    {
+      "path": ".git/packed-refs"
+    },
+    {
+      "path": ".git/HEAD"
+    },
+    {
+      "path": ".git/config"
+    },
+    {
+      "path": ".git/shallow"
+    },
+    {
+      "path": ".git/objects/pack/pack-4ba81e2db03507941fa4dfc9d696e58e05551d34.idx"
+    },
+    {
+      "path": ".git/objects/pack/pack-4ba81e2db03507941fa4dfc9d696e58e05551d34.pack"
+    },
+    {
+      "path": ".git/refs/tags/v1.103.0"
+    },
+    {
+      "path": ".git/refs/remotes/origin/HEAD"
+    },
+    {
+      "path": ".git/refs/heads/autosynth"
+    },
+    {
+      "path": ".git/refs/heads/master"
+    },
+    {
+      "path": ".git/logs/HEAD"
+    },
+    {
+      "path": ".git/logs/refs/remotes/origin/HEAD"
+    },
+    {
+      "path": ".git/logs/refs/heads/autosynth"
+    },
+    {
+      "path": ".git/logs/refs/heads/master"
     }
   ]
 }
\ No newline at end of file
diff --git a/versions.txt b/versions.txt
new file mode 100644
index 00000000..f185dbd4
--- /dev/null
+++ b/versions.txt
@@ -0,0 +1,4 @@
+# Format:
+# module:released-version:current-version
+
+google-cloud-storage:1.103.0:1.103.1-SNAPSHOT
\ No newline at end of file


Test patch:
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java
index 4926e771..2516261a 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketInfoTest.java
@@ -80,6 +80,7 @@ public class BucketInfoTest {
   private static final String NOT_FOUND_PAGE = "error.html";
   private static final String LOCATION = "ASIA";
   private static final StorageClass STORAGE_CLASS = StorageClass.STANDARD;
+  private static final StorageClass ARCHIVE_STORAGE_CLASS = StorageClass.ARCHIVE;
   private static final String DEFAULT_KMS_KEY_NAME =
       "projects/p/locations/kr-loc/keyRings/kr/cryptoKeys/key";
   private static final Boolean VERSIONING_ENABLED = true;
@@ -130,6 +131,35 @@ public class BucketInfoTest {
           .setRetentionPolicyIsLocked(RETENTION_POLICY_IS_LOCKED)
           .setLogging(LOGGING)
           .build();
+  private static final BucketInfo BUCKET_INFO_ARCHIVE =
+      BucketInfo.newBuilder("b")
+          .setAcl(ACL)
+          .setEtag(ETAG)
+          .setGeneratedId(GENERATED_ID)
+          .setMetageneration(META_GENERATION)
+          .setOwner(OWNER)
+          .setSelfLink(SELF_LINK)
+          .setCors(CORS)
+          .setCreateTime(CREATE_TIME)
+          .setDefaultAcl(DEFAULT_ACL)
+          .setDeleteRules(DELETE_RULES)
+          .setLifecycleRules(LIFECYCLE_RULES)
+          .setIndexPage(INDEX_PAGE)
+          .setIamConfiguration(IAM_CONFIGURATION)
+          .setNotFoundPage(NOT_FOUND_PAGE)
+          .setLocation(LOCATION)
+          .setLocationType(LOCATION_TYPE)
+          .setStorageClass(ARCHIVE_STORAGE_CLASS)
+          .setVersioningEnabled(VERSIONING_ENABLED)
+          .setLabels(BUCKET_LABELS)
+          .setRequesterPays(REQUESTER_PAYS)
+          .setDefaultKmsKeyName(DEFAULT_KMS_KEY_NAME)
+          .setDefaultEventBasedHold(DEFAULT_EVENT_BASED_HOLD)
+          .setRetentionEffectiveTime(RETENTION_EFFECTIVE_TIME)
+          .setRetentionPeriod(RETENTION_PERIOD)
+          .setRetentionPolicyIsLocked(RETENTION_POLICY_IS_LOCKED)
+          .setLogging(LOGGING)
+          .build();
 
   @Test
   public void testToBuilder() {
@@ -139,6 +169,7 @@ public class BucketInfoTest {
     assertEquals("id", bucketInfo.getGeneratedId());
     bucketInfo = bucketInfo.toBuilder().setName("b").setGeneratedId(GENERATED_ID).build();
     compareBuckets(BUCKET_INFO, bucketInfo);
+    assertEquals(ARCHIVE_STORAGE_CLASS, BUCKET_INFO_ARCHIVE.getStorageClass());
   }
 
   @Test
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyRequestTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyRequestTest.java
index dc093816..381f18e1 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyRequestTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyRequestTest.java
@@ -24,9 +24,7 @@ import static org.junit.Assert.assertTrue;
 import com.google.cloud.storage.Storage.BlobSourceOption;
 import com.google.cloud.storage.Storage.BlobTargetOption;
 import com.google.common.collect.ImmutableList;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class CopyRequestTest {
 
@@ -40,8 +38,6 @@ public class CopyRequestTest {
   private static final BlobInfo TARGET_BLOB_INFO =
       BlobInfo.newBuilder(TARGET_BLOB_ID).setContentType(TARGET_BLOB_CONTENT_TYPE).build();
 
-  @Rule public ExpectedException thrown = ExpectedException.none();
-
   @Test
   public void testCopyRequest() {
     Storage.CopyRequest copyRequest1 =
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/OptionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/OptionTest.java
index bda6592e..549c7e97 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/OptionTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/OptionTest.java
@@ -21,9 +21,8 @@ import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNull;
 
 import com.google.cloud.storage.spi.v1.StorageRpc;
-import org.junit.Rule;
+import org.junit.Assert;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class OptionTest {
 
@@ -36,8 +35,6 @@ public class OptionTest {
   private static final Option OPTION_NOT_EQUALS1 = new Option(RPC_OPTION, OTHER_VALUE) {};
   private static final Option OPTION_NOT_EQUALS2 = new Option(ANOTHER_RPC_OPTION, VALUE) {};
 
-  @Rule public ExpectedException thrown = ExpectedException.none();
-
   @Test
   public void testEquals() {
     assertEquals(OPTION, OPTION_EQUALS);
@@ -57,7 +54,10 @@ public class OptionTest {
     Option option = new Option(RPC_OPTION, null) {};
     assertEquals(RPC_OPTION, option.getRpcOption());
     assertNull(option.getValue());
-    thrown.expect(NullPointerException.class);
-    new Option(null, VALUE) {};
+    try {
+      new Option(null, VALUE) {};
+      Assert.fail();
+    } catch (NullPointerException expected) {
+    }
   }
 }
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java
index 5200175e..cee705c4 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java
@@ -18,18 +18,18 @@ package com.google.cloud.storage;
 
 import com.google.cloud.TransportOptions;
 import org.easymock.EasyMock;
-import org.junit.Rule;
+import org.junit.Assert;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class StorageOptionsTest {
 
-  @Rule public ExpectedException thrown = ExpectedException.none();
-
   @Test
   public void testInvalidTransport() {
-    thrown.expect(IllegalArgumentException.class);
-    StorageOptions.newBuilder()
-        .setTransportOptions(EasyMock.<TransportOptions>createMock(TransportOptions.class));
+    try {
+      StorageOptions.newBuilder()
+          .setTransportOptions(EasyMock.<TransportOptions>createMock(TransportOptions.class));
+      Assert.fail();
+    } catch (IllegalArgumentException expected) {
+    }
   }
 }
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/V4SigningTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/V4SigningTest.java
index 12af94e2..8e1ad310 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/V4SigningTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/V4SigningTest.java
@@ -28,6 +28,7 @@ import com.google.cloud.conformance.storage.v1.SigningV4Test;
 import com.google.cloud.conformance.storage.v1.TestFile;
 import com.google.cloud.storage.Storage.SignUrlOption;
 import com.google.cloud.storage.testing.RemoteStorageHelper;
+import com.google.common.base.Charsets;
 import com.google.protobuf.Timestamp;
 import com.google.protobuf.util.JsonFormat;
 import java.io.IOException;
@@ -123,35 +124,35 @@ public class V4SigningTest {
   }
 
   /**
-   * Attempt to load all of the tests and return a {@code Collection<Object[]>} representing the set
-   * of tests. Each entry in the returned collection is the set of parameters to the constructor of
-   * this test class.
+   * Load all of the tests and return a {@code Collection<Object[]>} representing the set of tests.
+   * Each entry in the returned collection is the set of parameters to the constructor of this test
+   * class.
    *
-   * <p>The results of this method will then be ran by JUnit's Parameterized test runner
+   * <p>The results of this method will then be run by JUnit's Parameterized test runner
    */
   @Parameters(name = "{2}")
   public static Collection<Object[]> testCases() throws IOException {
-    final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+    ClassLoader cl = Thread.currentThread().getContextClassLoader();
 
-    final InputStream credentialsStream = cl.getResourceAsStream(SERVICE_ACCOUNT_JSON_RESOURCE);
+    InputStream credentialsStream = cl.getResourceAsStream(SERVICE_ACCOUNT_JSON_RESOURCE);
     assertNotNull(
         String.format("Unable to load service account json: %s", SERVICE_ACCOUNT_JSON_RESOURCE),
         credentialsStream);
 
-    final InputStream dataJson = cl.getResourceAsStream(TEST_DATA_JSON_RESOURCE);
+    InputStream dataJson = cl.getResourceAsStream(TEST_DATA_JSON_RESOURCE);
     assertNotNull(
         String.format("Unable to load test definition: %s", TEST_DATA_JSON_RESOURCE), dataJson);
 
-    final ServiceAccountCredentials serviceAccountCredentials =
+    ServiceAccountCredentials serviceAccountCredentials =
         ServiceAccountCredentials.fromStream(credentialsStream);
 
-    final InputStreamReader reader = new InputStreamReader(dataJson);
-    final TestFile.Builder testBuilder = TestFile.newBuilder();
+    InputStreamReader reader = new InputStreamReader(dataJson, Charsets.UTF_8);
+    TestFile.Builder testBuilder = TestFile.newBuilder();
     JsonFormat.parser().merge(reader, testBuilder);
-    final TestFile testFile = testBuilder.build();
+    TestFile testFile = testBuilder.build();
 
-    final List<SigningV4Test> tests = testFile.getSigningV4TestsList();
-    final ArrayList<Object[]> data = new ArrayList<>(tests.size());
+    List<SigningV4Test> tests = testFile.getSigningV4TestsList();
+    ArrayList<Object[]> data = new ArrayList<>(tests.size());
     for (SigningV4Test test : tests) {
       data.add(new Object[] {test, serviceAccountCredentials, test.getDescription()});
     }