diff --git a/.gemini/config.yaml b/.gemini/config.yaml new file mode 100644 index 0000000000..8afb848534 --- /dev/null +++ b/.gemini/config.yaml @@ -0,0 +1,10 @@ +# https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github#custom-configuration +have_fun: false +code_review: + disable: false + comment_severity_threshold: HIGH + max_review_comments: -1 + pull_request_opened: + help: false + summary: false + code_review: false diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 46f7ababf4..b0834efa0f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,11 +4,11 @@ # For syntax help see: # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax -# The @googleapis/cloud-storage-dpe is the default owner for changes in this repo -* @googleapis/yoshi-java @googleapis/cloud-storage-dpe +# The @googleapis/gcs-sdk-team is the default owner for changes in this repo +* @googleapis/yoshi-java @googleapis/gcs-sdk-team # for handwritten libraries, keep codeowner_team in .repo-metadata.json as owner -**/*.java @googleapis/cloud-storage-dpe +**/*.java @googleapis/gcs-sdk-team # The java-samples-reviewers team is the default owner for samples changes diff --git a/.github/release-please.yml b/.github/release-please.yml index 7341462432..bbe99166de 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -59,3 +59,10 @@ branches: - README.md - .readme-partials.yaml branch: 2.47.x + - bumpMinorPreMajor: true + handleGHRelease: true + releaseType: java-backport + extraFiles: + - README.md + - .readme-partials.yaml + branch: 2.49.x diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index b41763405f..d953e4f76b 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -180,6 +180,23 @@ branchProtectionRules: - 'Kokoro - Test: Java 17 GraalVM Native Image' - javadoc - unmanaged_dependency_check + - pattern: 2.49.x + isAdminEnforced: true + requiredApprovingReviewCount: 1 + requiresCodeOwnerReviews: true + requiresStrictStatusChecks: false + requiredStatusCheckContexts: + - dependencies (17) + - lint + - clirr + - units (8) + - units (11) + - 'Kokoro - Test: Integration' + - cla/google + - 'Kokoro - Test: Java GraalVM Native Image' + - 'Kokoro - Test: Java 17 GraalVM Native Image' + - javadoc + - unmanaged_dependency_check permissionRules: - team: yoshi-admins permission: admin diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 9d33c38186..9c972c8cb5 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -43,7 +43,7 @@ jobs: with: fetch-depth: 0 token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} - - uses: googleapis/sdk-platform-java/.github/scripts@v2.54.0 + - uses: googleapis/sdk-platform-java/.github/scripts@v2.55.1 if: env.SHOULD_RUN == 'true' with: base_ref: ${{ github.base_ref }} diff --git a/.github/workflows/renovate_config_check.yaml b/.github/workflows/renovate_config_check.yaml index 7c5ec7865e..292ebcf214 100644 --- a/.github/workflows/renovate_config_check.yaml +++ b/.github/workflows/renovate_config_check.yaml @@ -16,7 +16,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' - name: Install Renovate and Config Validator run: | diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 9f3349cfc6..1002c7112e 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -17,6 +17,6 @@ jobs: # repository .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.44.0 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.45.1 with: bom-path: google-cloud-storage-bom/pom.xml diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg index 6631426cdd..6bcb91e8e3 100644 --- a/.kokoro/presubmit/graalvm-native-17.cfg +++ b/.kokoro/presubmit/graalvm-native-17.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.44.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.45.1" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native.cfg b/.kokoro/presubmit/graalvm-native.cfg index 366a07b5d5..f05038e16c 100644 --- a/.kokoro/presubmit/graalvm-native.cfg +++ b/.kokoro/presubmit/graalvm-native.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.44.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.45.1" } env_vars: { diff --git a/.repo-metadata.json b/.repo-metadata.json index 18fe4b0c5a..1807b79a7d 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -13,7 +13,7 @@ "api_id": "storage.googleapis.com", "library_type": "GAPIC_COMBO", "requires_billing": true, - "codeowner_team": "@googleapis/cloud-storage-dpe", + "codeowner_team": "@googleapis/gcs-sdk-team", "excluded_poms": "google-cloud-storage-bom,google-cloud-storage", "issue_tracker": "https://issuetracker.google.com/savedsearches/559782", "extra_versioned_modules": "gapic-google-cloud-storage-v2", diff --git a/CHANGELOG.md b/CHANGELOG.md index c828b0890f..20fb2004a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## [2.50.0](https://github.com/googleapis/java-storage/compare/v2.49.0...v2.50.0) (2025-03-14) + + +### Features + +* Next release from main branch is 2.50.0 ([#2968](https://github.com/googleapis/java-storage/issues/2968)) ([4a69fcc](https://github.com/googleapis/java-storage/commit/4a69fcc16787904675e5ba15f42bcab67553a7aa)) + + +### Bug Fixes + +* **deps:** Update the Java code generator (gapic-generator-java) to 2.54.0 ([22e7e3d](https://github.com/googleapis/java-storage/commit/22e7e3d4e8c56184f9c91b1e0bf52d5c4aa4cf9f)) +* **deps:** Update the Java code generator (gapic-generator-java) to 2.55.1 ([81c8c61](https://github.com/googleapis/java-storage/commit/81c8c611ab51a706d63670dff86db5bfd04ef544)) +* Improve 503 handling for json resumable uploads ([#2987](https://github.com/googleapis/java-storage/issues/2987)) ([9bc2b14](https://github.com/googleapis/java-storage/commit/9bc2b14a0058cded0321e5afa3ea3fc59bf3421b)) +* Update usages of String.format to explicitly pass Locale.US ([#2974](https://github.com/googleapis/java-storage/issues/2974)) ([8bcb2de](https://github.com/googleapis/java-storage/commit/8bcb2de22ea39cfc0b4dda07daba78ea192b5e98)), closes [#2972](https://github.com/googleapis/java-storage/issues/2972) + + +### Dependencies + +* Update dependency com.google.apis:google-api-services-storage to v1-rev20250224-2.0.0 ([#2969](https://github.com/googleapis/java-storage/issues/2969)) ([80a40c4](https://github.com/googleapis/java-storage/commit/80a40c41527a5fb83a41ac4754d5be22f5cd5c2b)) +* Update googleapis/sdk-platform-java action to v2.55.1 ([#2985](https://github.com/googleapis/java-storage/issues/2985)) ([e22a2de](https://github.com/googleapis/java-storage/commit/e22a2de0fe1dc66e6e5b6d311f4812c290177203)) +* Update sdk-platform-java dependencies ([#2983](https://github.com/googleapis/java-storage/issues/2983)) ([9eeb82a](https://github.com/googleapis/java-storage/commit/9eeb82af81ad8095c21542808a8eaa5098dee074)) +* Update sdk-platform-java dependencies ([#2986](https://github.com/googleapis/java-storage/issues/2986)) ([10b922a](https://github.com/googleapis/java-storage/commit/10b922a8ae831fcd0107abf54091566442ae5fde)) + ## [2.49.0](https://github.com/googleapis/java-storage/compare/v2.48.2...v2.49.0) (2025-02-26) diff --git a/README.md b/README.md index 344d8502eb..cf899ba9e0 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.55.0 + 26.56.0 pom import @@ -46,12 +46,12 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage - 2.48.2 + 2.49.0 com.google.cloud google-cloud-storage-control - 2.48.2 + 2.49.0 ``` @@ -59,20 +59,20 @@ If you are using Maven without the BOM, add this to your dependencies: If you are using Gradle 5.x or later, add this to your dependencies: ```Groovy -implementation platform('com.google.cloud:libraries-bom:26.55.0') +implementation platform('com.google.cloud:libraries-bom:26.56.0') implementation 'com.google.cloud:google-cloud-storage' ``` If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-storage:2.49.0' +implementation 'com.google.cloud:google-cloud-storage:2.50.0' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.49.0" +libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.50.0" ``` ## Authentication @@ -515,7 +515,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-storage/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-storage.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.49.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.50.0 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml index 4845e6efab..3f3bee92ff 100644 --- a/gapic-google-cloud-storage-v2/pom.xml +++ b/gapic-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.49.0 + 2.50.0 gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 diff --git a/generation_config.yaml b/generation_config.yaml index 1a74239123..6e9ca8db90 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,6 +1,6 @@ -gapic_generator_version: 2.53.0 -googleapis_commitish: 6bc8e91bf92cc985da5ed0c227b48f12315cb695 -libraries_bom_version: 26.55.0 +gapic_generator_version: 2.55.1 +googleapis_commitish: d0ba3ce0fafe1225ebda6b259a2e29dfe2934bb5 +libraries_bom_version: 26.56.0 libraries: - api_shortname: storage name_pretty: Cloud Storage @@ -13,7 +13,7 @@ libraries: repo: googleapis/java-storage repo_short: java-storage distribution_name: com.google.cloud:google-cloud-storage - codeowner_team: '@googleapis/cloud-storage-dpe' + codeowner_team: '@googleapis/gcs-sdk-team' api_id: storage.googleapis.com requires_billing: true library_type: GAPIC_COMBO diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index b0c64685e0..28a6b98f32 100644 --- a/google-cloud-storage-bom/pom.xml +++ b/google-cloud-storage-bom/pom.xml @@ -19,12 +19,12 @@ 4.0.0 com.google.cloud google-cloud-storage-bom - 2.49.0 + 2.50.0 pom com.google.cloud sdk-platform-java-config - 3.44.0 + 3.45.1 @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.49.0 + 2.50.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.49.0 + 2.50.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.49.0 + 2.50.0 com.google.api.grpc proto-google-cloud-storage-v2 - 2.49.0 + 2.50.0 com.google.cloud google-cloud-storage-control - 2.49.0 + 2.50.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.49.0 + 2.50.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.49.0 + 2.50.0 diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index 8dfd37f5a2..a05f4fd398 100644 --- a/google-cloud-storage-control/pom.xml +++ b/google-cloud-storage-control/pom.xml @@ -5,13 +5,13 @@ 4.0.0 com.google.cloud google-cloud-storage-control - 2.49.0 + 2.50.0 google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 9d0251da3e..88c168d957 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.49.0 + 2.50.0 jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,11 +12,11 @@ com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 google-cloud-storage - 1.119.0 + 1.119.1 @@ -239,14 +239,14 @@ com.google.api.grpc proto-google-cloud-kms-v1 - 0.152.0 + 0.153.0 test com.google.cloud google-cloud-kms - 2.61.0 + 2.62.0 test diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedReadableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedReadableByteChannel.java index 86afe7a98c..60e4fbcdc4 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedReadableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedReadableByteChannel.java @@ -52,6 +52,7 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.ScatteringByteChannel; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.function.Function; @@ -318,7 +319,10 @@ private static String getHeaderValue(@NonNull HttpHeaders headers, @NonNull Stri } else { throw new IllegalStateException( String.format( - "Unexpected header type '%s' for header %s", o.getClass().getName(), headerName)); + Locale.US, + "Unexpected header type '%s' for header %s", + o.getClass().getName(), + headerName)); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java index 52ce09fd7e..c5379005a0 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobInfo.java @@ -40,6 +40,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -1441,7 +1442,7 @@ public String getMd5ToHexString() { byte[] decodedMd5 = BaseEncoding.base64().decode(md5); StringBuilder stringBuilder = new StringBuilder(); for (byte b : decodedMd5) { - stringBuilder.append(String.format("%02x", b & 0xff)); + stringBuilder.append(String.format(Locale.US, "%02x", b & 0xff)); } return stringBuilder.toString(); } @@ -1473,7 +1474,7 @@ public String getCrc32cToHexString() { byte[] decodeCrc32c = BaseEncoding.base64().decode(crc32c); StringBuilder stringBuilder = new StringBuilder(); for (byte b : decodeCrc32c) { - stringBuilder.append(String.format("%02x", b & 0xff)); + stringBuilder.append(String.format(Locale.US, "%02x", b & 0xff)); } return stringBuilder.toString(); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteRangeSpec.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteRangeSpec.java index 524bfe3c2e..a166c5ea2f 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteRangeSpec.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteRangeSpec.java @@ -24,6 +24,7 @@ import com.google.common.base.MoreObjects.ToStringHelper; import com.google.storage.v2.ReadObjectRequest; import java.io.Serializable; +import java.util.Locale; import java.util.Objects; import java.util.function.BiFunction; import javax.annotation.concurrent.Immutable; @@ -239,12 +240,12 @@ public ReadObjectRequest.Builder seekReadObjectRequest(ReadObjectRequest.Builder @Override protected String fmtAsHttpRangeHeader() throws ArithmeticException { - return String.format("bytes=%d-%d", beginOffset, endOffsetInclusive()); + return String.format(Locale.US, "bytes=%d-%d", beginOffset, endOffsetInclusive()); } @Override protected ToStringHelper append(ToStringHelper tsh) { - return tsh.addValue(String.format("%d + %d", beginOffset, length)); + return tsh.addValue(String.format(Locale.US, "%d + %d", beginOffset, length)); } } @@ -324,12 +325,12 @@ public ReadObjectRequest.Builder seekReadObjectRequest(ReadObjectRequest.Builder @Override protected String fmtAsHttpRangeHeader() throws ArithmeticException { - return String.format("bytes=%d-%d", beginOffset, endOffsetInclusive()); + return String.format(Locale.US, "bytes=%d-%d", beginOffset, endOffsetInclusive()); } @Override protected ToStringHelper append(ToStringHelper tsh) { - return tsh.addValue(String.format("[%d, %d)", beginOffset, endOffsetExclusive)); + return tsh.addValue(String.format(Locale.US, "[%d, %d)", beginOffset, endOffsetExclusive)); } } @@ -409,12 +410,12 @@ public ReadObjectRequest.Builder seekReadObjectRequest(ReadObjectRequest.Builder @Override protected String fmtAsHttpRangeHeader() throws ArithmeticException { - return String.format("bytes=%d-%d", beginOffset, endOffsetInclusive); + return String.format(Locale.US, "bytes=%d-%d", beginOffset, endOffsetInclusive); } @Override protected ToStringHelper append(ToStringHelper tsh) { - return tsh.addValue(String.format("[%d, %d]", beginOffset, endOffsetInclusive)); + return tsh.addValue(String.format(Locale.US, "[%d, %d]", beginOffset, endOffsetInclusive)); } } @@ -488,9 +489,9 @@ public ReadObjectRequest.Builder seekReadObjectRequest(ReadObjectRequest.Builder @Override protected String fmtAsHttpRangeHeader() throws ArithmeticException { if (beginOffset > 0) { - return String.format("bytes=%d-", beginOffset); + return String.format(Locale.US, "bytes=%d-", beginOffset); } else if (beginOffset < 0) { - return String.format("bytes=%d", beginOffset); + return String.format(Locale.US, "bytes=%d", beginOffset); } else { return null; } @@ -498,7 +499,7 @@ protected String fmtAsHttpRangeHeader() throws ArithmeticException { @Override protected ToStringHelper append(ToStringHelper tsh) { - return tsh.addValue(String.format("[%d, +INF)", beginOffset)); + return tsh.addValue(String.format(Locale.US, "[%d, +INF)", beginOffset)); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java index e66f04eabe..8e1bea02bd 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java @@ -16,6 +16,7 @@ package com.google.cloud.storage; +import java.util.Locale; import java.util.Objects; abstract class Crc32cValue> { @@ -64,7 +65,7 @@ static Crc32cLengthKnown of(int value, long length) { } static String fmtCrc32cValue(int value1) { - return String.format("crc32c{0x%08x}", value1); + return String.format(Locale.US, "crc32c{0x%08x}", value1); } static final class Crc32cLengthUnknown extends Crc32cValue { @@ -142,7 +143,7 @@ public Crc32cLengthKnown concat(Crc32cLengthKnown other) { @Override public String toString() { - return String.format("crc32c{0x%08x (length = %d)}", value, length); + return String.format(Locale.US, "crc32c{0x%08x (length = %d)}", value, length); } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/CrossTransportUtils.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/CrossTransportUtils.java index 1c5aa1d97d..6adea4d5ce 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/CrossTransportUtils.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/CrossTransportUtils.java @@ -18,6 +18,7 @@ import com.google.cloud.storage.TransportCompatibility.Transport; import java.util.Arrays; +import java.util.Locale; import java.util.stream.Collectors; final class CrossTransportUtils { @@ -49,12 +50,20 @@ static T throwTransportOnly(Class clazz, String methodName, Transport tra break; default: throw new IllegalStateException( - String.format("Broken Java Enum: %s received value: '%s'", Transport.class, transport)); + String.format( + Locale.US, + "Broken Java Enum: %s received value: '%s'", + Transport.class, + transport)); } String message = String.format( + Locale.US, "%s#%s is only supported for %s transport. Please use %s to construct a compatible instance.", - clazz.getName(), methodName, transport, builder); + clazz.getName(), + methodName, + transport, + builder); throw new UnsupportedOperationException(message); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java index 4db4827ef4..4ad5aa0700 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java @@ -42,6 +42,7 @@ import java.nio.ByteBuffer; import java.nio.channels.ClosedChannelException; import java.nio.channels.ScatteringByteChannel; +import java.util.Locale; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; @@ -166,8 +167,10 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { } else if (metadata.getGeneration() != respMetadata.getGeneration()) { throw closeWithError( String.format( + Locale.US, "Mismatch Generation between subsequent reads. Expected %d but received %d", - metadata.getGeneration(), respMetadata.getGeneration())); + metadata.getGeneration(), + respMetadata.getGeneration())); } } ChecksummedData checksummedData = resp.getChecksummedData(); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java index 43e575a29d..1ddd72f34d 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java @@ -96,6 +96,7 @@ import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; @@ -210,10 +211,10 @@ private Tuple> resolveSettingsAndOpts() throw // unless for Direct Google Access try and strip here if we can switch (scheme) { case "http": - endpoint = String.format("%s:%s", uri.getHost(), port > 0 ? port : 80); + endpoint = String.format(Locale.US, "%s:%s", uri.getHost(), port > 0 ? port : 80); break; case "https": - endpoint = String.format("%s:%s", uri.getHost(), port > 0 ? port : 443); + endpoint = String.format(Locale.US, "%s:%s", uri.getHost(), port > 0 ? port : 443); break; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcUtils.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcUtils.java index 7e81011558..5fd7c5a274 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcUtils.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcUtils.java @@ -19,6 +19,7 @@ import com.google.api.gax.grpc.GrpcCallContext; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import java.util.Locale; final class GrpcUtils { @@ -28,7 +29,8 @@ static GrpcCallContext contextWithBucketName(String bucketName, GrpcCallContext if (bucketName != null && !bucketName.isEmpty()) { return baseContext.withExtraHeaders( ImmutableMap.of( - "x-goog-request-params", ImmutableList.of(String.format("bucket=%s", bucketName)))); + "x-goog-request-params", + ImmutableList.of(String.format(Locale.US, "bucket=%s", bucketName)))); } return baseContext; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java index d7741b7d91..a255550bb9 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; +import java.util.Locale; import java.util.function.Supplier; import javax.annotation.concurrent.Immutable; import org.checkerframework.checker.nullness.qual.Nullable; @@ -98,8 +99,10 @@ public void validate(Crc32cValue expected, List b) throws IOExcep if (!actual.eqValue(expected)) { throw new IOException( String.format( + Locale.US, "Mismatch checksum value. Expected %s actual %s", - expected.debugString(), actual.debugString())); + expected.debugString(), + actual.debugString())); } } @@ -109,8 +112,10 @@ public void validate(Crc32cValue expected, Supplier b) throws IOE if (!actual.eqValue(expected)) { throw new IOException( String.format( + Locale.US, "Mismatch checksum value. Expected %s actual %s", - expected.debugString(), actual.debugString())); + expected.debugString(), + actual.debugString())); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java index 49fc5a1949..a069c24950 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.common.base.MoreObjects; +import java.util.Locale; import java.util.Objects; import java.util.function.UnaryOperator; @@ -91,7 +92,8 @@ private Incomplete(ByteRangeSpec spec) { @Override public String getHeaderValue() { - return String.format("bytes %d-%d/*", spec.beginOffset(), spec.endOffsetInclusive()); + return String.format( + Locale.US, "bytes %d-%d/*", spec.beginOffset(), spec.endOffsetInclusive()); } @Override @@ -145,7 +147,8 @@ private Total(ByteRangeSpec spec, long size) { @Override public String getHeaderValue() { - return String.format("bytes %d-%d/%d", spec.beginOffset(), spec.endOffsetInclusive(), size); + return String.format( + Locale.US, "bytes %d-%d/%d", spec.beginOffset(), spec.endOffsetInclusive(), size); } @Override @@ -202,7 +205,7 @@ private Size(long size) { @Override public String getHeaderValue() { - return String.format("bytes */%d", size); + return String.format(Locale.US, "bytes */%d", size); } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java index e29094fd09..f21d4ce676 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java @@ -23,13 +23,14 @@ import com.google.cloud.storage.spi.v1.HttpRpcContext; import com.google.cloud.storage.spi.v1.HttpStorageRpc; import io.opencensus.trace.EndSpanOptions; +import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; import org.checkerframework.checker.nullness.qual.Nullable; final class JsonResumableSession { static final String SPAN_NAME_WRITE = - String.format("Sent.%s.write", HttpStorageRpc.class.getName()); + String.format(Locale.US, "Sent.%s.write", HttpStorageRpc.class.getName()); static final EndSpanOptions END_SPAN_OPTIONS = EndSpanOptions.builder().setSampleToLocalSpanStore(true).build(); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionQueryTask.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionQueryTask.java index dba12171ab..40b96dbe8f 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionQueryTask.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionQueryTask.java @@ -113,6 +113,7 @@ final class JsonResumableSessionQueryTask } else { HttpResponseException cause = new HttpResponseException(response); String contentType = response.getHeaders().getContentType(); + Long contentLength = response.getHeaders().getContentLength(); // If the content-range header value has run ahead of the backend, it will respond with // a 503 with plain text content // Attempt to detect this very loosely as to minimize impact of modified error message @@ -120,7 +121,9 @@ final class JsonResumableSessionQueryTask if ((!ResumableSessionFailureScenario.isOk(code) && !ResumableSessionFailureScenario.isContinue(code)) && contentType != null - && contentType.startsWith("text/plain")) { + && contentType.startsWith("text/plain") + && contentLength != null + && contentLength > 0) { String errorMessage = cause.getContent().toLowerCase(Locale.US); if (errorMessage.contains("content-range")) { throw ResumableSessionFailureScenario.SCENARIO_5.toStorageException( diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MetadataField.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MetadataField.java index fb76af6e9e..4070736c88 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MetadataField.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MetadataField.java @@ -21,6 +21,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableMap; import java.util.Comparator; +import java.util.Locale; import java.util.Map; import java.util.Objects; import org.checkerframework.checker.nullness.qual.NonNull; @@ -102,7 +103,7 @@ public long getEnd() { } String encode() { - return String.format("%04d-%04d", begin, end); + return String.format(Locale.US, "%04d-%04d", begin, end); } static PartRange decode(String s) { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/OtelStorageDecorator.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/OtelStorageDecorator.java index dc92c3420f..b1b7f65011 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/OtelStorageDecorator.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/OtelStorageDecorator.java @@ -278,7 +278,7 @@ public Blob get(String bucket, String blob, BlobGetOption... options) { Span span = tracer .spanBuilder("get") - .setAttribute("gsutil.uri", String.format("gs://%s/%s", bucket, blob)) + .setAttribute("gsutil.uri", String.format(Locale.US, "gs://%s/%s", bucket, blob)) .startSpan(); try (Scope ignore = span.makeCurrent()) { return delegate.get(bucket, blob, options); @@ -1477,7 +1477,7 @@ static Storage decorate(Storage delegate, OpenTelemetry otel, Transport transpor } private static @NonNull String fmtBucket(String bucket) { - return String.format("gs://%s/", bucket); + return String.format(Locale.US, "gs://%s/", bucket); } private static final class TracerDecorator implements Tracer { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java index b824acf4d5..4b0a06e3d0 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java @@ -63,6 +63,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; @@ -245,8 +246,10 @@ public void close() throws IOException { buildParallelCompositeUploadException( ApiExceptionFactory.createException( String.format( + Locale.US, "CRC32C Checksum mismatch. expected: [%s] but was: [%s]", - expectedCrc32c, crc32c), + expectedCrc32c, + crc32c), null, GrpcStatusCode.of(Code.DATA_LOSS), false), @@ -477,6 +480,7 @@ private ApiFuture asyncCleanupAfterFailure(Throwable originalFailure) { String message = String.format( + Locale.US, "Incomplete parallel composite upload cleanup after previous error. Unknown object ids: %s", failedGsUris); StorageException storageException = new StorageException(0, message, null); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/PostPolicyV4.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/PostPolicyV4.java index 2cd2311477..fd59632659 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/PostPolicyV4.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/PostPolicyV4.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -416,7 +417,7 @@ public String toJson() { for (int i = 0; i < jsonArray.length; i++) { char c = jsonArray[i]; if (c >= 128) { // is a unicode character - escapedJson.append(String.format("\\u%04x", (int) c)); + escapedJson.append(String.format(Locale.US, "\\u%04x", (int) c)); } else { switch (c) { case '\\': diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java index b65a6e257b..1af690af26 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java @@ -17,6 +17,8 @@ import static com.google.common.base.Preconditions.checkArgument; +import java.util.Locale; + /** * Shrink wraps a beginning, offset and limit for tracking state of an individual invocation of * {@link #read} @@ -47,6 +49,7 @@ public long read() { @Override public String toString() { - return String.format("ReadCursor{begin=%d, offset=%d, limit=%d}", beginning, offset, limit); + return String.format( + Locale.US, "ReadCursor{begin=%d, offset=%d, limit=%d}", beginning, offset, limit); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ResumableSessionFailureScenario.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResumableSessionFailureScenario.java index 390b90dcfd..b82dc6eebe 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ResumableSessionFailureScenario.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResumableSessionFailureScenario.java @@ -35,6 +35,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; @@ -145,7 +146,10 @@ static StorageException toStorageException( ResumableSessionFailureScenario.toStorageException( cause.getStatusCode(), String.format( - "%d %s", cause.getStatusCode(), statusMessage == null ? "" : statusMessage), + Locale.US, + "%d %s", + cause.getStatusCode(), + statusMessage == null ? "" : statusMessage), "", uploadId, response, @@ -368,8 +372,10 @@ private static void fmtWriteObjectRequest( sb.append("\n").append(prefix).append(t2); sb.append( String.format( + Locale.US, "checksummed_data: {range: [%d:%d]", - writeOffset, writeOffset + checksummedData.getContent().size())); + writeOffset, + writeOffset + checksummedData.getContent().size())); if (checksummedData.hasCrc32C()) { sb.append(", crc32c: ").append(checksummedData.getCrc32C()); } @@ -402,8 +408,10 @@ private static void fmtBidiWriteObjectRequest( sb.append("\n").append(prefix).append(t2); sb.append( String.format( + Locale.US, "checksummed_data: {range: [%d:%d]", - writeOffset, writeOffset + checksummedData.getContent().size())); + writeOffset, + writeOffset + checksummedData.getContent().size())); if (checksummedData.hasCrc32C()) { sb.append(", crc32c: ").append(checksummedData.getCrc32C()); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContent.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContent.java index ef215573fb..c765d61a87 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContent.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContent.java @@ -31,6 +31,7 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.Arrays; +import java.util.Locale; abstract class RewindableContent extends AbstractHttpContent { @@ -65,8 +66,11 @@ public static RewindableContent of(ByteBuffer[] srcs, int srcsOffset, int srcsLe if (!(0 <= srcsOffset && srcsOffset <= srcs.length)) { throw new ArrayIndexOutOfBoundsException( String.format( + Locale.US, "srcsOffset out of bounds (0 <= %d && %d <= %d)", - srcsOffset, srcsOffset, srcs.length)); + srcsOffset, + srcsOffset, + srcs.length)); } Preconditions.checkArgument(srcsLength >= 0, "srcsLength >= 0 (%d >= 0)", srcsLength); int end = srcsOffset + srcsLength; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java index f149db1107..e0dabea4b8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java @@ -32,6 +32,7 @@ import io.opentelemetry.api.OpenTelemetry; import java.io.IOException; import java.io.InputStream; +import java.util.Locale; import java.util.Properties; import org.checkerframework.checker.nullness.qual.NonNull; @@ -46,7 +47,10 @@ public abstract class StorageOptions extends ServiceOptions String.format( + Locale.US, "{%s} (%01.03f MiB/s) %s", prefix, ((r.numBytes * MiB) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java index 286654deaa..3111fa246b 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java @@ -322,7 +322,7 @@ public void submit() { // Here we only add a annotation to at least know how much time each batch takes. span.addAnnotation("Execute batch request"); batch.setBatchUrl( - new GenericUrl(String.format("%s/batch/storage/v1", options.getHost()))); + new GenericUrl(String.format(Locale.US, "%s/batch/storage/v1", options.getHost()))); batch.execute(); } } catch (IOException ex) { @@ -901,7 +901,7 @@ public long read( } if (position > 0) { - req.getRequestHeaders().setRange(String.format("bytes=%d-", position)); + req.getRequestHeaders().setRange(String.format(Locale.US, "bytes=%d-", position)); } MediaHttpDownloader mediaHttpDownloader = req.getMediaHttpDownloader(); mediaHttpDownloader.setDirectDownloadEnabled(true); @@ -1021,7 +1021,7 @@ public StorageObject queryCompletedResumableUpload(String uploadId, long totalBy try { GenericUrl url = new GenericUrl(uploadId); HttpRequest req = storage.getRequestFactory().buildPutRequest(url, new EmptyContent()); - req.getHeaders().setContentRange(String.format("bytes */%s", totalBytes)); + req.getHeaders().setContentRange(String.format(Locale.US, "bytes */%s", totalBytes)); req.setParser(storage.getObjectParser()); HttpResponse response = req.execute(); // If the response is 200 diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpcSpans.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpcSpans.java index dc4b05336c..8fa049d019 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpcSpans.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpcSpans.java @@ -17,6 +17,7 @@ package com.google.cloud.storage.spi.v1; import io.opencensus.trace.EndSpanOptions; +import java.util.Locale; /** Helper class for instrumenting {@link HttpStorageRpc} with Open Census APIs. */ class HttpStorageRpcSpans { @@ -102,7 +103,11 @@ class HttpStorageRpcSpans { static String getTraceSpanName(String methodDescriptor) { return String.format( - "%s.%s.%s", SPAN_NAME_CLIENT_PREFIX, HttpStorageRpc.class.getName(), methodDescriptor); + Locale.US, + "%s.%s.%s", + SPAN_NAME_CLIENT_PREFIX, + HttpStorageRpc.class.getName(), + methodDescriptor); } private HttpStorageRpcSpans() {} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/BucketNameMismatchException.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/BucketNameMismatchException.java index 0391722989..dd8063b9d6 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/BucketNameMismatchException.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/BucketNameMismatchException.java @@ -16,12 +16,16 @@ package com.google.cloud.storage.transfermanager; +import java.util.Locale; + public final class BucketNameMismatchException extends RuntimeException { public BucketNameMismatchException(String actual, String expected) { super( String.format( + Locale.US, "Bucket name in produced BlobInfo did not match bucket name from config. (%s != %s)", - actual, expected)); + actual, + expected)); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ByteRangeSpecTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ByteRangeSpecTest.java index abb5a9536b..66e1bc9688 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ByteRangeSpecTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ByteRangeSpecTest.java @@ -31,6 +31,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Arrays; +import java.util.Locale; import java.util.stream.Stream; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -644,11 +645,11 @@ public static Iterable testCases() { } private static String headerRangeOpen(long min) { - return String.format("bytes=%d-", min); + return String.format(Locale.US, "bytes=%d-", min); } private static String headerRangeClosed(long min, long max) { - return String.format("bytes=%d-%d", min, max); + return String.format(Locale.US, "bytes=%d-%d", min, max); } private static ReadObjectRequest reqOpen(long offset) { @@ -683,7 +684,7 @@ public Expectations getExpectations() { @Override public String toString() { return String.format( - "Expect that %s is applicable to %s", expectations.testNameFormat(), spec); + Locale.US, "Expect that %s is applicable to %s", expectations.testNameFormat(), spec); } static ExpectationsBuilder expectThat() { @@ -769,7 +770,7 @@ private static String fmt(@Nullable Long l) { // to the max value at a glance. In an effort to help this, for any value that is within // 20 of Long.MAX_VALUE format it as a difference. if (diff <= 20) { - return String.format("(Long.MAX_VALUE - %d)", diff); + return String.format(Locale.US, "(Long.MAX_VALUE - %d)", diff); } else { return l.toString(); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ChunkSegmenterTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ChunkSegmenterTest.java index 3a34c2f5c6..6eafeab5f8 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ChunkSegmenterTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ChunkSegmenterTest.java @@ -28,6 +28,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -253,11 +254,11 @@ static TestData create(byte[][] bs) { } static String fmt(int i) { - return String.format("0x%08x", i); + return String.format(Locale.US, "0x%08x", i); } static String fmt(long i) { - return String.format("0x%016x", i); + return String.format(Locale.US, "0x%016x", i); } } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/DataGenerator.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/DataGenerator.java index 71b4fe3ab6..e60992d9cc 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/DataGenerator.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/DataGenerator.java @@ -27,6 +27,7 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.SeekableByteChannel; import java.nio.file.Path; +import java.util.Locale; import java.util.Random; import java.util.stream.IntStream; @@ -84,7 +85,7 @@ public final DataChain dataChainOfByteBuffers( public final TmpFile tempFile(Path baseDir, long size) throws IOException { requireNonNull(baseDir, "baseDir must be non null"); checkState(size > 0, "size must be > 0"); - TmpFile bin = TmpFile.of(baseDir, String.format("%015d-", size), ".bin"); + TmpFile bin = TmpFile.of(baseDir, String.format(Locale.US, "%015d-", size), ".bin"); ReadableByteChannel src = new ReadableByteChannel() { long read = 0; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedReadableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedReadableByteChannelTest.java index 1ce92c8523..6ecdf2072d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedReadableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedReadableByteChannelTest.java @@ -31,6 +31,7 @@ import java.nio.channels.Channels; import java.nio.channels.ClosedChannelException; import java.nio.channels.ReadableByteChannel; +import java.util.Locale; import java.util.stream.IntStream; import net.jqwik.api.Arbitraries; import net.jqwik.api.Arbitrary; @@ -144,11 +145,11 @@ private static final class ReadOps { if (fullReadCount > 0 && remainingRead > 0) { dbgExpectedReadSizes = - String.format("[%s * %d, %s]", readSize, fullReadCount, remainingRead); + String.format(Locale.US, "[%s * %d, %s]", readSize, fullReadCount, remainingRead); } else if (remainingRead > 0) { - dbgExpectedReadSizes = String.format("[%s]", remainingRead); + dbgExpectedReadSizes = String.format(Locale.US, "[%s]", remainingRead); } else { - dbgExpectedReadSizes = String.format("[%s * %d]", readSize, fullReadCount); + dbgExpectedReadSizes = String.format(Locale.US, "[%s * %d]", readSize, fullReadCount); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedWritableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedWritableByteChannelTest.java index 2653d27f02..5407564a1c 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedWritableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultBufferedWritableByteChannelTest.java @@ -37,6 +37,7 @@ import java.util.Arrays; import java.util.Deque; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import net.jqwik.api.Arbitraries; @@ -562,11 +563,16 @@ static WriteOps of(int byteSize, int bufferSize, int writeSize) { if (fullWriteCount > 0 && remainingWrite > 0) { dbgExpectedWriteSizes = String.format( - "[%s * %s, %s]", fmt(writeSize), fmt(fullWriteCount), fmt(remainingWrite)); + Locale.US, + "[%s * %s, %s]", + fmt(writeSize), + fmt(fullWriteCount), + fmt(remainingWrite)); } else if (remainingWrite > 0) { - dbgExpectedWriteSizes = String.format("[%s]", fmt(remainingWrite)); + dbgExpectedWriteSizes = String.format(Locale.US, "[%s]", fmt(remainingWrite)); } else { - dbgExpectedWriteSizes = String.format("[%s * %s]", fmt(writeSize), fmt(fullWriteCount)); + dbgExpectedWriteSizes = + String.format(Locale.US, "[%s * %s]", fmt(writeSize), fmt(fullWriteCount)); } return new WriteOps( bytes, diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultRetryHandlingBehaviorTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultRetryHandlingBehaviorTest.java index 0f90c7524f..63e8af7287 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultRetryHandlingBehaviorTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/DefaultRetryHandlingBehaviorTest.java @@ -40,6 +40,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.function.Function; import javax.net.ssl.SSLException; import javax.net.ssl.SSLHandshakeException; @@ -168,8 +169,10 @@ public static Collection testCases() { */ private static String token(ThrowableCategory t, HandlerCategory h) { return String.format( + Locale.US, "new Case(ThrowableCategory.%s, HandlerCategory.%s, /*TODO*/ null, /*TODO*/ null)", - t.name(), h.name()); + t.name(), + h.name()); } /** @@ -1093,7 +1096,7 @@ private static final class RetryableException extends IOException implements Ret private final boolean isRetryable; private RetryableException(boolean isRetryable) { - super(String.format("RetryableException{isRetryable=%s}", isRetryable)); + super(String.format(Locale.US, "RetryableException{isRetryable=%s}", isRetryable)); this.isRetryable = isRetryable; } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeServer.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeServer.java index 74b1283cd8..59c0d26bee 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeServer.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeServer.java @@ -24,6 +24,7 @@ import io.grpc.netty.shaded.io.grpc.netty.NettyServerBuilder; import java.io.IOException; import java.net.InetSocketAddress; +import java.util.Locale; import java.util.concurrent.TimeUnit; final class FakeServer implements AutoCloseable { @@ -53,7 +54,7 @@ static FakeServer of(StorageGrpc.StorageImplBase service) throws IOException { InetSocketAddress address = new InetSocketAddress("localhost", 0); Server server = NettyServerBuilder.forAddress(address).addService(service).build(); server.start(); - String endpoint = String.format("%s:%d", address.getHostString(), server.getPort()); + String endpoint = String.format(Locale.US, "%s:%d", address.getHostString(), server.getPort()); GrpcStorageOptions grpcStorageOptions = StorageOptions.grpc() .setHost("https://" + endpoint) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/GenerateGrpcProtobufReflectConfig.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/GenerateGrpcProtobufReflectConfig.java index d5895413c6..e800981254 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/GenerateGrpcProtobufReflectConfig.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/GenerateGrpcProtobufReflectConfig.java @@ -27,6 +27,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Locale; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,6 +67,7 @@ public static void main(String[] args) throws IOException { .map( name -> String.format( + Locale.US, "{ \"name\": \"%s\", \"queryAllDeclaredConstructors\": true, \"queryAllPublicConstructors\": true, \"queryAllDeclaredMethods\": true, \"allPublicMethods\": true, \"allDeclaredClasses\": true, \"allPublicClasses\": true }", name))) .flatMap(s -> s) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/HttpContentRangeTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/HttpContentRangeTest.java new file mode 100644 index 0000000000..3e4764acb6 --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/HttpContentRangeTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2025 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 com.google.cloud.storage.HttpContentRange.parse; +import static com.google.cloud.storage.TestUtils.assertAll; +import static com.google.common.truth.Truth.assertThat; + +import java.util.Locale; +import java.util.Locale.Category; +import org.junit.Test; + +public final class HttpContentRangeTest { + + @Test + public void localeDoesNotImpactThings() throws Exception { + // can fail on java11+ + // https://docs.oracle.com/javase/tutorial/i18n/locale/scope.html + Locale before = Locale.getDefault(Category.FORMAT); + try { + // arabic local, also RTL instead of LTR + Locale ar = Locale.forLanguageTag("ar"); + Locale.setDefault(Category.FORMAT, ar); + assertAll( + () -> assertThat(parse("bytes 0-9/9").getHeaderValue()).isEqualTo("bytes 0-9/9"), + () -> assertThat(parse("bytes 0-9/*").getHeaderValue()).isEqualTo("bytes 0-9/*"), + () -> assertThat(parse("bytes */9").getHeaderValue()).isEqualTo("bytes */9"), + () -> assertThat(parse("bytes */*").getHeaderValue()).isEqualTo("bytes */*")); + } finally { + Locale.setDefault(Category.FORMAT, before); + assertThat(Locale.getDefault(Category.FORMAT)).isEqualTo(before); + } + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicBidiUnbufferedWritableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicBidiUnbufferedWritableByteChannelTest.java index 7c3fb1fd7d..9b6f51a442 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicBidiUnbufferedWritableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicBidiUnbufferedWritableByteChannelTest.java @@ -43,6 +43,7 @@ import io.grpc.stub.StreamObserver; import java.nio.ByteBuffer; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -880,6 +881,7 @@ private static void logUnexpectedRequest( Collector oneLine = Collectors.joining(",", "[", "]"); String msg = String.format( + Locale.US, "Unexpected Request Chain.%nexpected one of: %s%n but was: %s", writes.stream() .map(l -> l.stream().map(StorageV2ProtoUtils::fmtProto).collect(oneLine)) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedWritableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedWritableByteChannelTest.java index 326cbb1566..e4b63ab0d1 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedWritableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedWritableByteChannelTest.java @@ -47,6 +47,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; @@ -194,9 +195,9 @@ public void resumableUpload() throws IOException, InterruptedException, Executio try { ImmutableList buffers = TestUtils.subDivide(bytes, 10); for (ByteBuffer buf : buffers) { - debugMessages.add(String.format("Writing buffer. buf = %s", buf)); + debugMessages.add(String.format(Locale.US, "Writing buffer. buf = %s", buf)); int written = c.write(buf); - debugMessages.add(String.format("Wrote bytes. written = %2d", written)); + debugMessages.add(String.format(Locale.US, "Wrote bytes. written = %2d", written)); } // explicitly only close on success so we can trap the original error that maybe have // happened before we reach here. @@ -371,6 +372,7 @@ private static void logUnexpectedRequest( Collector oneLine = Collectors.joining(",", "[", "]"); String msg = String.format( + Locale.US, "Unexpected Request Chain.%nexpected one of: %s%n but was: %s", writes.stream() .map(l -> l.stream().map(StorageV2ProtoUtils::fmtProto).collect(oneLine)) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java index 52e296370b..a132d1329f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java @@ -48,6 +48,7 @@ import java.net.URI; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.Locale; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; import org.checkerframework.checker.nullness.qual.NonNull; @@ -95,7 +96,8 @@ public void emptyObjectHappyPath() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionPutTask task = new JsonResumableSessionPutTask( @@ -141,7 +143,8 @@ public void scenario7() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -222,7 +225,8 @@ public void scenario1() throws Exception { TmpFile tmpFile = DataGenerator.base64Characters().tempFile(temp.newFolder().toPath(), _256KiBL)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -291,7 +295,8 @@ public void scenario2() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -360,7 +365,8 @@ public void scenario3() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -440,7 +446,8 @@ public void scenario4() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionPutTask task = new JsonResumableSessionPutTask( @@ -520,7 +527,8 @@ public void scenario4_1() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -600,7 +608,8 @@ public void scenario4_2() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -678,7 +687,8 @@ public void scenario5() throws Exception { TmpFile tmpFile = DataGenerator.base64Characters().tempFile(temp.newFolder().toPath(), _256KiBL)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -710,7 +720,8 @@ public void _503_emptyBody() throws Exception { TmpFile tmpFile = DataGenerator.base64Characters().tempFile(temp.newFolder().toPath(), _256KiBL)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -751,7 +762,8 @@ public void jsonParseFailure() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); AtomicLong confirmedBytes = new AtomicLong(-1L); @@ -791,7 +803,8 @@ public void jsonDeserializationOnlyAttemptedWhenContentPresent() throws Exceptio try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionPutTask task = new JsonResumableSessionPutTask( diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionQueryTaskTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionQueryTaskTest.java index 8e2fb1893a..a7d9237434 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionQueryTaskTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionQueryTaskTest.java @@ -41,6 +41,7 @@ import java.math.BigInteger; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.util.Locale; import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.junit.Before; @@ -82,7 +83,8 @@ public void successfulSession() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -105,7 +107,8 @@ public void successfulSession_noObject() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -132,7 +135,8 @@ public void incompleteSession() throws Exception { }; try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -148,7 +152,8 @@ public void incompleteSession_missingRangeHeader() throws Exception { req -> new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -165,7 +170,8 @@ public void successfulSession_noJson_noStoredContentLength() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -191,7 +197,8 @@ public void successfulSession_noSize() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -219,7 +226,8 @@ public void query_badOffset() throws Exception { try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableSessionQueryTask task = new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); @@ -229,4 +237,27 @@ public void query_badOffset() throws Exception { assertThat(se.getReason()).isEqualTo("dataLoss"); } } + + @Test + public void _503_emptyBody() throws Exception { + HttpRequestHandler handler = + req -> { + FullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), APPEND_GREATER_THAN_CURRENT_SIZE); + resp.headers().set(CONTENT_TYPE, "text/plain; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + URI endpoint = fakeHttpServer.getEndpoint(); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + + JsonResumableSessionQueryTask task = + new JsonResumableSessionQueryTask(httpClientContext, jsonResumableWrite(uploadUrl)); + + StorageException se = assertThrows(StorageException.class, task::call); + assertThat(se.getCode()).isEqualTo(503); + } + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java index 2d96828b10..3bc2613652 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -111,7 +112,8 @@ public void rewindWillQueryStatusOnlyWhenDirty() throws Exception { TmpFile tmpFile = DataGenerator.base64Characters().tempFile(temp.newFolder().toPath(), _512KiBL)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableWrite resumableWrite = JsonResumableWrite.of(null, ImmutableMap.of(), uploadUrl, 0); @@ -166,7 +168,8 @@ public void retryAttemptWillReturnQueryResultIfPersistedSizeMatchesSpecifiedEndO try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableWrite resumableWrite = JsonResumableWrite.of(null, ImmutableMap.of(), uploadUrl, 0); @@ -234,7 +237,8 @@ public void rewindOfContentIsRelativeToItsBeginOffsetOfTheOverallObject() throws try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); + String uploadUrl = + String.format(Locale.US, "%s/upload/%s", endpoint.toString(), UUID.randomUUID()); JsonResumableWrite resumableWrite = JsonResumableWrite.of(null, ImmutableMap.of(), uploadUrl, 0); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java index 5055c1e217..7b5df1eb38 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java @@ -64,6 +64,7 @@ import java.util.Deque; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Random; @@ -433,7 +434,7 @@ static Arbitrary scenarioArbitrary() { int objectSize = t.get3(); int writeSize = t.get4(); return Scenario.of( - String.format("object-%d", t.hashCode()), + String.format(Locale.US, "object-%d", t.hashCode()), objectSize, writeSize, segmentSize, @@ -456,7 +457,7 @@ private static IntegerArbitrary ints() { } private static String fmt(int i) { - return String.format("% 10d (0x%08x)", i, i); + return String.format(Locale.US, "% 10d (0x%08x)", i, i); } private static final class Scenario { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncingFileChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncingFileChannelTest.java index 5fcd6429d8..cf356e0ab8 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncingFileChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncingFileChannelTest.java @@ -36,6 +36,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.List; +import java.util.Locale; import java.util.stream.Collector; import java.util.stream.Collectors; import net.jqwik.api.Arbitraries; @@ -150,7 +151,10 @@ public String toString() { .add( "\nwrites", Arrays.stream(writes) - .map(b -> String.format("%s \n %s", b.toString(), xxd(false, b.duplicate()))) + .map( + b -> + String.format( + Locale.US, "%s \n %s", b.toString(), xxd(false, b.duplicate()))) .collect(DEBUG_JOINER)) .add( "\nexpectedCumulativeContents", diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/LazyReadChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/LazyReadChannelTest.java index ef637abaeb..36c55b5390 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/LazyReadChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/LazyReadChannelTest.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ClosedChannelException; +import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; @@ -76,7 +77,7 @@ public void closingUnderlyingChannelClosesTheLazyReadChannel() throws IOExceptio } private TestSession newTestSession() { - return new TestSession(String.format("test-%02d", counter.getAndIncrement())); + return new TestSession(String.format(Locale.US, "test-%02d", counter.getAndIncrement())); } private static final class TestSession implements BufferedReadableByteChannelSession { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfigTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfigTest.java index 3ef5537277..93071b0d1c 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfigTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfigTest.java @@ -28,6 +28,7 @@ import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneId; +import java.util.Locale; import org.junit.Test; public final class ParallelCompositeUploadBlobWriteSessionConfigTest { @@ -107,7 +108,8 @@ public void partMetadataFieldDecorator_customTime() { private static StringSubject assertField(String fmt, int idx) { String[] split = fmt.split(";"); String s = split[idx]; - return assertWithMessage(String.format("Formatted name '%s', field[%d] = %s", fmt, idx, s)) + return assertWithMessage( + String.format(Locale.US, "Formatted name '%s', field[%d] = %s", fmt, idx, s)) .that(s); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java index 48bb4137e3..a4902111ff 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java @@ -62,6 +62,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.concurrent.CancellationException; @@ -949,7 +950,8 @@ private SimplisticPartNamingStrategy(String prefix) { @Override String fmtName(String ultimateObjectName, PartRange partRange) { - return String.format("%s/%s/%s.part", prefix, ultimateObjectName, partRange.encode()); + return String.format( + Locale.US, "%s/%s/%s.part", prefix, ultimateObjectName, partRange.encode()); } @Override diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ThroughputMovingWindowPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ThroughputMovingWindowPropertyTest.java index 181f51aedf..1dbcd9e5e3 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ThroughputMovingWindowPropertyTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ThroughputMovingWindowPropertyTest.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; import net.jqwik.api.Arbitraries; import net.jqwik.api.Arbitrary; @@ -190,7 +191,9 @@ public String toString() { return MoreObjects.toStringHelper(this) .add("i", i) .add("t", t) - .add("tenSecMovingAvg", String.format("%,.03f", expectedMovingAvgBytesPerSecond)) + .add( + "tenSecMovingAvg", + String.format(Locale.US, "%,.03f", expectedMovingAvgBytesPerSecond)) .toString(); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/UnifiedOptsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/UnifiedOptsTest.java index 68efe4f862..73d88580a4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/UnifiedOptsTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/UnifiedOptsTest.java @@ -30,6 +30,7 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.stream.Collectors; import javax.crypto.SecretKey; @@ -194,7 +195,8 @@ private static void validateFactoryMethodEnforceNonNull( m -> { try { String msg = - String.format("Method %s did not throw expected NullPointerException", m); + String.format( + Locale.US, "Method %s did not throw expected NullPointerException", m); try { m.invoke(null, new Object[] {null}); return new AssertionError(msg); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/V4PostPolicyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/V4PostPolicyTest.java index fc7f59f921..121da50f3d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/V4PostPolicyTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/V4PostPolicyTest.java @@ -37,6 +37,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; @@ -163,7 +164,7 @@ public void test() { for (int i = 0; i < expectedPolicyArray.length; i++) { char c = expectedPolicyArray[i]; if (c >= 128) { - escapedPolicy.append(String.format("\\u%04x", (int) c)); + escapedPolicy.append(String.format(Locale.US, "\\u%04x", (int) c)); } else { switch (c) { case '\\': @@ -218,12 +219,14 @@ public static Collection testCases() throws IOException { InputStream credentialsStream = cl.getResourceAsStream(SERVICE_ACCOUNT_JSON_RESOURCE); assertNotNull( - String.format("Unable to load service account json: %s", SERVICE_ACCOUNT_JSON_RESOURCE), + String.format( + Locale.US, "Unable to load service account json: %s", SERVICE_ACCOUNT_JSON_RESOURCE), credentialsStream); InputStream dataJson = cl.getResourceAsStream(TEST_DATA_JSON_RESOURCE); assertNotNull( - String.format("Unable to load test definition: %s", TEST_DATA_JSON_RESOURCE), dataJson); + String.format(Locale.US, "Unable to load test definition: %s", TEST_DATA_JSON_RESOURCE), + dataJson); ServiceAccountCredentials serviceAccountCredentials = ServiceAccountCredentials.fromStream(credentialsStream); 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 05a3c3973d..92509dd353 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 @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -152,12 +153,14 @@ public static Collection testCases() throws IOException { InputStream credentialsStream = cl.getResourceAsStream(SERVICE_ACCOUNT_JSON_RESOURCE); assertNotNull( - String.format("Unable to load service account json: %s", SERVICE_ACCOUNT_JSON_RESOURCE), + String.format( + Locale.US, "Unable to load service account json: %s", SERVICE_ACCOUNT_JSON_RESOURCE), credentialsStream); InputStream dataJson = cl.getResourceAsStream(TEST_DATA_JSON_RESOURCE); assertNotNull( - String.format("Unable to load test definition: %s", TEST_DATA_JSON_RESOURCE), dataJson); + String.format(Locale.US, "Unable to load test definition: %s", TEST_DATA_JSON_RESOURCE), + dataJson); ServiceAccountCredentials serviceAccountCredentials = ServiceAccountCredentials.fromStream(credentialsStream); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java index 8a415fd8f6..cb281fef57 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java @@ -42,6 +42,7 @@ import com.google.common.collect.ImmutableMap; import com.google.pubsub.v1.TopicName; import java.util.HashSet; +import java.util.Locale; import java.util.Map; /** @@ -230,7 +231,8 @@ static final class ResourceSetup { if (!resources.isEmpty()) { throw new IllegalStateException( - String.format("Unhandled Method Resource [%s]", Joiner.on(", ").join(resources))); + String.format( + Locale.US, "Unhandled Method Resource [%s]", Joiner.on(", ").join(resources))); } return f.apply(ctx, c); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java index 814729f840..91fb8029b6 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java @@ -58,6 +58,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Random; import java.util.Set; import java.util.function.BiPredicate; @@ -268,7 +269,8 @@ private RetryTests loadRetryTestsDefinition() throws IOException { InputStream dataJson = cl.getResourceAsStream(retryTestsJsonResourcePath); assertNotNull( - String.format("Unable to load test definition: %s", retryTestsJsonResourcePath), + String.format( + Locale.US, "Unable to load test definition: %s", retryTestsJsonResourcePath), dataJson); InputStreamReader reader = new InputStreamReader(dataJson, Charsets.UTF_8); @@ -290,7 +292,9 @@ private List generateTestCases( String methodName = method.getName(); RpcMethod key = RpcMethod.storage.lookup.get(methodName); assertNotNull( - String.format("Unable to resolve RpcMethod for value '%s'", methodName), key); + String.format( + Locale.US, "Unable to resolve RpcMethod for value '%s'", methodName), + key); // get all RpcMethodMappings which are defined for key List mappings = rpcMethodMappings.get(key).stream() @@ -373,6 +377,7 @@ private void validateGeneratedTestCases( if (!unusedMappings.isEmpty()) { LOGGER.warning( String.format( + Locale.US, "Declared but unused mappings with ids: [%s]", Joiner.on(", ").join(unusedMappings))); } @@ -498,7 +503,8 @@ private static Random resolveRand() { throw new IllegalStateException("Unable to generate seed"); }); String msg = - String.format("Shuffling test order using Random with seed: 0x%016X", seed); + String.format( + Locale.US, "Shuffling test order using Random with seed: 0x%016X", seed); LOGGER.info(msg); } return new Random(seed); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RetryTestFixture.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RetryTestFixture.java index 38c1f89934..028336c50c 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RetryTestFixture.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RetryTestFixture.java @@ -28,6 +28,7 @@ import com.google.cloud.storage.it.runner.registry.TestBench.RetryTestResource; import com.google.common.collect.ImmutableMap; import java.io.IOException; +import java.util.Locale; import java.util.logging.Logger; import org.junit.AssumptionViolatedException; import org.junit.rules.TestRule; @@ -192,6 +193,9 @@ private Storage newStorage(boolean forTest) { private String fmtUserAgent(String testDescriptor) { return String.format( - "%s/ (%s) java-conformance-tests/", testDescriptor, testRetryConformance.getTestName()); + Locale.US, + "%s/ (%s) java-conformance-tests/", + testDescriptor, + testRetryConformance.getTestName()); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethod.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethod.java index 2227e6bf76..4a0f8d50df 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethod.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethod.java @@ -17,6 +17,7 @@ package com.google.cloud.storage.conformance.retry; import java.util.Arrays; +import java.util.Locale; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -34,7 +35,7 @@ interface RpcMethod { */ final class storage { private static String getFullQualifiedMethodName(Enum e) { - return String.format("storage.%s.%s", e.getClass().getSimpleName(), e.name()); + return String.format(Locale.US, "storage.%s.%s", e.getClass().getSimpleName(), e.name()); } enum bucket_acl implements RpcMethod { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java index 6caecc5c76..3b4c6e6b74 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java @@ -99,6 +99,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.OptionalInt; @@ -231,6 +232,7 @@ private void reportMappingSummary() { RpcMethod rpcMethod = e.getKey(); Collection mappings = e.getValue(); return String.format( + Locale.US, "\t%s.%s: %d", rpcMethod .getClass() @@ -246,7 +248,7 @@ private void reportMappingSummary() { OptionalInt max = funcMap.values().stream().map(RpcMethodMapping::getMappingId).mapToInt(i -> i).max(); if (max.isPresent()) { - LOGGER.info(String.format("Current max mapping index is: %d%n", max.getAsInt())); + LOGGER.info(String.format(Locale.US, "Current max mapping index is: %d%n", max.getAsInt())); } else { throw new IllegalStateException("No mappings defined"); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/State.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/State.java index 6f24d3486a..bf7fcfa9ca 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/State.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/State.java @@ -37,6 +37,7 @@ import com.google.pubsub.v1.TopicName; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -345,7 +346,7 @@ public State with(List notifications) { private T getValue(Key key) { Object o = data.get(key); - requireNonNull(o, () -> String.format("%s was not found in state", key.name)); + requireNonNull(o, () -> String.format(Locale.US, "%s was not found in state", key.name)); return key.cast(o); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java index eb602c796c..7acfdee15e 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java @@ -42,6 +42,7 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Locale; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -136,24 +137,49 @@ final class TestRetryConformance { char transportTag = transport.name().toLowerCase().charAt(0); this.bucketName = String.format( + Locale.US, "%s_s%03d-%s-m%03d_bkt1_%s", - BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + BASE_ID, + scenarioId, + instructionsString.toLowerCase(), + mappingId, + transportTag); this.bucketName2 = String.format( + Locale.US, "%s_s%03d-%s-m%03d_bkt2_%s", - BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + BASE_ID, + scenarioId, + instructionsString.toLowerCase(), + mappingId, + transportTag); this.userProject = String.format( + Locale.US, "%s_s%03d-%s-m%03d_prj1_%s", - BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + BASE_ID, + scenarioId, + instructionsString.toLowerCase(), + mappingId, + transportTag); this.objectName = String.format( + Locale.US, "%s_s%03d-%s-m%03d_obj1_%s", - BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + BASE_ID, + scenarioId, + instructionsString.toLowerCase(), + mappingId, + transportTag); this.topicName = String.format( + Locale.US, "%s_s%03d-%s-m%03d_top1_%s", - BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + BASE_ID, + scenarioId, + instructionsString.toLowerCase(), + mappingId, + transportTag); // define a lazy supplier for bytes. this.lazyHelloWorldUtf8Bytes = () -> genBytes(this.method, this.instruction.getInstructionsList()); @@ -225,8 +251,13 @@ public ServiceAccountSigner getServiceAccountSigner() { public String getTestName() { String instructionsDesc = Joiner.on("_").join(instruction.getInstructionsList()); return String.format( + Locale.US, "TestRetryConformance/%s-%d-[%s]-%s-%d", - transport.name().toLowerCase(), scenarioId, instructionsDesc, method.getName(), mappingId); + transport.name().toLowerCase(), + scenarioId, + instructionsDesc, + method.getName(), + mappingId); } public Transport getTransport() { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/BucketCleaner.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/BucketCleaner.java index 91ef58296b..a5d2650295 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/BucketCleaner.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/BucketCleaner.java @@ -41,6 +41,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -137,7 +138,8 @@ public static void doCleanup(String bucketName, Storage s, StorageControlClient .sorted(Collections.reverseOrder(Comparator.comparing(Folder::getName))) .map( folder -> { - String formatted = String.format("folder = %s", folder.getName()); + String formatted = + String.format(Locale.US, "folder = %s", folder.getName()); LOGGER.warning(formatted); boolean success = true; try { @@ -173,7 +175,7 @@ public static void doCleanup(String bucketName, Storage s, StorageControlClient .map( managedFolder -> { String formatted = - String.format("managedFolder = %s", managedFolder.getName()); + String.format(Locale.US, "managedFolder = %s", managedFolder.getName()); LOGGER.warning(formatted); boolean success = true; try { @@ -214,8 +216,10 @@ public static void doCleanup(String bucketName, Storage s, StorageControlClient } else { LOGGER.warning( String.format( + Locale.US, "Unable to delete bucket %s due to previous failed %s deletes", - bucketName, failed)); + bucketName, + failed)); } LOGGER.warning("Bucket cleanup complete: " + bucketName); @@ -231,7 +235,8 @@ private static boolean getIfAnyFailedAndReport( failedDeletes.forEach( r -> LOGGER.warning( - String.format("Failed to delete %s %s/%s", resourceType, bucketName, r.name))); + String.format( + Locale.US, "Failed to delete %s %s/%s", resourceType, bucketName, r.name))); return !failedDeletes.isEmpty(); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java index 611f7fd1c9..3169a95cb0 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java @@ -33,6 +33,7 @@ import io.grpc.MethodDescriptor; import io.grpc.Status; import java.util.List; +import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import org.checkerframework.checker.nullness.qual.NonNull; @@ -77,7 +78,10 @@ public void onMessage(RespT message) { Level.CONFIG, () -> String.format( - "<<< %s{%n%s}", message.getClass().getSimpleName(), fmtProto(message))); + Locale.US, + "<<< %s{%n%s}", + message.getClass().getSimpleName(), + fmtProto(message))); super.onMessage(message); } @@ -87,8 +91,10 @@ public void onClose(Status status, Metadata trailers) { Level.CONFIG, () -> String.format( + Locale.US, "<<< status = %s, trailers = %s", - status.toString(), trailers.toString())); + status.toString(), + trailers.toString())); super.onClose(status, trailers); } }; @@ -101,7 +107,10 @@ public void sendMessage(ReqT message) { Level.CONFIG, () -> String.format( - ">>> %s{%n%s}", message.getClass().getSimpleName(), fmtProto(message))); + Locale.US, + ">>> %s{%n%s}", + message.getClass().getSimpleName(), + fmtProto(message))); super.sendMessage(message); } }; @@ -133,7 +142,8 @@ static String fmtProto(@NonNull WriteObjectRequest msg) { ByteString content = msg.getChecksummedData().getContent(); if (content.size() > 20) { WriteObjectRequest.Builder b = msg.toBuilder(); - ByteString snip = ByteString.copyFromUtf8(String.format("", content.size())); + ByteString snip = + ByteString.copyFromUtf8(String.format(Locale.US, "", content.size())); ByteString trim = content.substring(0, 20).concat(snip); b.getChecksummedDataBuilder().setContent(trim); @@ -149,7 +159,8 @@ static String fmtProto(@NonNull BidiWriteObjectRequest msg) { ByteString content = msg.getChecksummedData().getContent(); if (content.size() > 20) { BidiWriteObjectRequest.Builder b = msg.toBuilder(); - ByteString snip = ByteString.copyFromUtf8(String.format("", content.size())); + ByteString snip = + ByteString.copyFromUtf8(String.format(Locale.US, "", content.size())); ByteString trim = content.substring(0, 20).concat(snip); b.getChecksummedDataBuilder().setContent(trim); @@ -165,7 +176,8 @@ static String fmtProto(@NonNull ReadObjectResponse msg) { ByteString content = msg.getChecksummedData().getContent(); if (content.size() > 20) { ReadObjectResponse.Builder b = msg.toBuilder(); - ByteString snip = ByteString.copyFromUtf8(String.format("", content.size())); + ByteString snip = + ByteString.copyFromUtf8(String.format(Locale.US, "", content.size())); ByteString trim = content.substring(0, 20).concat(snip); b.getChecksummedDataBuilder().setContent(trim); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcRequestAuditing.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcRequestAuditing.java index 464899bc1b..6eaeaea990 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcRequestAuditing.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcRequestAuditing.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.function.Function; import java.util.stream.Stream; @@ -81,7 +82,7 @@ public IterableSubject assertRequestHeader(Metadata.Key key) { Metadata.Key key, Function, Stream> f) { Stream stream = requestHeaders.stream().map(m -> m.get(key)).filter(Objects::nonNull); ImmutableList actual = f.apply(stream).collect(ImmutableList.toImmutableList()); - return assertWithMessage(String.format("Headers %s", key.name())).that(actual); + return assertWithMessage(String.format(Locale.US, "Headers %s", key.name())).that(actual); } private final class Factory extends ClientStreamTracer.Factory { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelTest.java index 9a5160ca56..093b52595a 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelTest.java @@ -62,6 +62,7 @@ import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Arrays; +import java.util.Locale; import java.util.zip.GZIPInputStream; import org.checkerframework.checker.nullness.qual.Nullable; import org.junit.Rule; @@ -137,7 +138,7 @@ public void testLimit_largerThanOneChunk() throws IOException { @Test public void testLimit_downloadToFile() throws IOException { - String blobName = String.format("%s/src", generator.randomObjectName()); + String blobName = String.format(Locale.US, "%s/src", generator.randomObjectName()); BlobId blobId = BlobId.of(bucket.getName(), blobName); ByteBuffer content = DataGenerator.base64Characters().genByteBuffer(108); try (WriteChannel writer = storage.writer(BlobInfo.newBuilder(blobId).build())) { @@ -596,7 +597,7 @@ private void captureAndRestoreTest(@Nullable Integer position, @Nullable Integer private void doLimitTest(int srcContentSize, int rangeBegin, int rangeEnd, int chunkSize) throws IOException { - String blobName = String.format("%s/src", generator.randomObjectName()); + String blobName = String.format(Locale.US, "%s/src", generator.randomObjectName()); BlobInfo src = BlobInfo.newBuilder(bucket, blobName).build(); ByteBuffer content = DataGenerator.base64Characters().genByteBuffer(srcContentSize); ByteBuffer dup = content.duplicate(); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelV2RetryTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelV2RetryTest.java index 07ff4b0fd8..fcad8f0519 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelV2RetryTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobReadChannelV2RetryTest.java @@ -53,6 +53,7 @@ import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import java.nio.charset.StandardCharsets; +import java.util.Locale; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; @@ -195,7 +196,7 @@ public void restartingAStreamForGzipContentIsAtTheCorrectOffset() throws Excepti () -> assertThat(requests.get(0).getHeaders().get("range")).isNull(), () -> assertThat(requests.get(1).getHeaders().get("range")) - .isEqualTo(ImmutableList.of(String.format("bytes=%d-", 256 * 1024)))); + .isEqualTo(ImmutableList.of(String.format(Locale.US, "bytes=%d-", 256 * 1024)))); } } @@ -248,7 +249,7 @@ public void resumeFromCorrectOffsetWhenPartialReadSuccess() throws Exception { () -> assertThat(requests.get(0).getHeaders().get("range")).isNull(), () -> assertThat(requests.get(1).getHeaders().get("range")) - .isEqualTo(ImmutableList.of(String.format("bytes=%d-", 256 * 1024)))); + .isEqualTo(ImmutableList.of(String.format(Locale.US, "bytes=%d-", 256 * 1024)))); } } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteChannelTest.java index 2a2dd9a665..8697b07c31 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteChannelTest.java @@ -61,6 +61,7 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.Locale; import java.util.Optional; import java.util.logging.Logger; import org.junit.Test; @@ -128,7 +129,8 @@ public void testWriteChannelExistingBlob() throws IOException { DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.from(ZoneOffset.UTC)); String nowString = formatter.format(now); BucketInfo bucketInfo = BucketInfo.of(generator.randomBucketName()); - String blobPath = String.format("%s/%s/blob", generator.randomObjectName(), nowString); + String blobPath = + String.format(Locale.US, "%s/%s/blob", generator.randomObjectName(), nowString); BlobId blobId = BlobId.of(bucketInfo.getName(), blobPath); BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build(); storage.create(bucketInfo); @@ -189,7 +191,8 @@ public void restoreProperlyPlumbsBeginOffset() throws IOException { } private void doJsonUnexpectedEOFTest(int contentSize, int cappedByteCount) throws IOException { - String blobPath = String.format("%s/%s/blob", generator.randomObjectName(), NOW_STRING); + String blobPath = + String.format(Locale.US, "%s/%s/blob", generator.randomObjectName(), NOW_STRING); BucketInfo bucketInfo = BucketInfo.of(generator.randomBucketName()); BlobInfo blobInfoGen0 = BlobInfo.newBuilder(bucketInfo, blobPath, 0L).build(); @@ -199,7 +202,8 @@ private void doJsonUnexpectedEOFTest(int contentSize, int cappedByteCount) throw Method.newBuilder().setName("storage.objects.insert").build(), InstructionList.newBuilder() .addInstructions( - String.format("return-broken-stream-final-chunk-after-%dB", cappedByteCount)) + String.format( + Locale.US, "return-broken-stream-final-chunk-after-%dB", cappedByteCount)) .build(), Transport.HTTP.name()); RetryTestResource retryTest = testBench.createRetryTest(retryTestResource); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcInterceptorTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcInterceptorTest.java index 737d31dd48..1357936238 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcInterceptorTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcInterceptorTest.java @@ -44,6 +44,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; @@ -83,8 +84,9 @@ public void grpcStorageOptions_allowSpecifyingInterceptor() throws Exception { .map(m -> m.get(X_GOOG_REQUEST_PARAMS)) .collect(Collectors.toList()); - String expected = String.format("project=projects/%s", options.getProjectId()); - String expectedEncoded = String.format("project=projects%%2F%s", options.getProjectId()); + String expected = String.format(Locale.US, "project=projects/%s", options.getProjectId()); + String expectedEncoded = + String.format(Locale.US, "project=projects%%2F%s", options.getProjectId()); assertThat(requestParams).containsAnyOf(expected, expectedEncoded); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcTest.java index 9c292e885e..26a788ac09 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITGrpcTest.java @@ -46,6 +46,7 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Locale; import java.util.stream.IntStream; import java.util.stream.StreamSupport; import org.junit.Test; @@ -76,7 +77,7 @@ public void listBlobs() { String prefix = generator.randomObjectName(); List blobs = IntStream.rangeClosed(1, 10) - .mapToObj(i -> String.format("%s/%02d", prefix, i)) + .mapToObj(i -> String.format(Locale.US, "%s/%02d", prefix, i)) .map(n -> BlobInfo.newBuilder(bucketInfo, n).build()) .map(info -> storage.create(info, content, BlobTargetOption.doesNotExist())) .collect(ImmutableList.toImmutableList()); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNotificationTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNotificationTest.java index d0c41f5d56..b666a9eec4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNotificationTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNotificationTest.java @@ -37,6 +37,7 @@ import com.google.iam.v1.SetIamPolicyRequest; import java.io.IOException; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -71,7 +72,7 @@ public void setup() throws IOException { // square brackets are not acceptable characters for topic names, replace them with dash // https://cloud.google.com/pubsub/docs/admin#resource_names String name = generator.randomObjectName().replaceAll("[\\[\\]]", "-"); - topic = String.format("projects/%s/topics/%s", projectId, name).trim(); + topic = String.format(Locale.US, "projects/%s/topics/%s", projectId, name).trim(); notificationInfo = NotificationInfo.newBuilder(topic) .setCustomAttributes(CUSTOM_ATTRIBUTES) 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 46a1099a34..ec1454e470 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 @@ -87,6 +87,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Random; @@ -564,9 +565,12 @@ public void testListBlobsCurrentDirectoryIncludesBothObjectsAndSyntheticDirector String directoryName = generator.randomObjectName(); String subdirectoryName = "subdirectory"; - String uriSubDir = String.format("gs://%s/%s/%s/", bucketName, directoryName, subdirectoryName); - String uri1 = String.format("gs://%s/%s/%s/blob1", bucketName, directoryName, subdirectoryName); - String uri2 = String.format("gs://%s/%s/blob2", bucketName, directoryName); + String uriSubDir = + String.format(Locale.US, "gs://%s/%s/%s/", bucketName, directoryName, subdirectoryName); + String uri1 = + String.format( + Locale.US, "gs://%s/%s/%s/blob1", bucketName, directoryName, subdirectoryName); + String uri2 = String.format(Locale.US, "gs://%s/%s/blob2", bucketName, directoryName); BlobId id1 = BlobId.fromGsUtilUri(uri1); BlobId id2 = BlobId.fromGsUtilUri(uri2); @@ -654,7 +658,7 @@ public void testListBlobsMultiplePages() { ImmutableList expected = IntStream.rangeClosed(1, 10) - .mapToObj(i -> String.format("%s/%2d", basePath, i)) + .mapToObj(i -> String.format(Locale.US, "%s/%2d", basePath, i)) .map(name -> BlobInfo.newBuilder(bucket, name).build()) .map(info -> storage.create(info, BlobTargetOption.doesNotExist())) .map(PackagePrivateMethodWorkarounds::noAcl) @@ -1182,7 +1186,7 @@ public void testReadAndWriteChannelsWithDifferentFileSize_4MiB_plus1() throws IO } private void doTestReadAndWriteChannelsWithSize(int blobSize) throws IOException { - String blobName = String.format("%s-%d", generator.randomObjectName(), blobSize); + String blobName = String.format(Locale.US, "%s-%d", generator.randomObjectName(), blobSize); BlobInfo blob = BlobInfo.newBuilder(bucket, blobName).build(); Random rnd = new Random(); byte[] bytes = new byte[blobSize]; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITOptionRegressionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITOptionRegressionTest.java index c7032ea618..3bb53b783f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITOptionRegressionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITOptionRegressionTest.java @@ -59,6 +59,7 @@ import com.google.cloud.storage.it.runner.annotations.StorageFixture; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import java.util.Locale; import java.util.Set; import java.util.function.Function; import org.junit.Before; @@ -1189,11 +1190,11 @@ public void storage_ComposeRequest() { } private static String bucketName() { - return String.format("bucket-%03d", bucketCounter++); + return String.format(Locale.US, "bucket-%03d", bucketCounter++); } private static String objectName() { - return String.format("object-%03d", objectCounter++); + return String.format(Locale.US, "object-%03d", objectCounter++); } private static Function> splitOnCommaToSet() { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java index bd116cf172..ad118069f1 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java @@ -59,6 +59,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -98,15 +99,21 @@ public void setUp() throws Exception { baseDir = tmpDir.getRoot().toPath(); BlobInfo blobInfo1 = BlobInfo.newBuilder( - BlobId.of(bucket.getName(), String.format("%s/src", generator.randomObjectName()))) + BlobId.of( + bucket.getName(), + String.format(Locale.US, "%s/src", generator.randomObjectName()))) .build(); BlobInfo blobInfo2 = BlobInfo.newBuilder( - BlobId.of(bucket.getName(), String.format("%s/src", generator.randomObjectName()))) + BlobId.of( + bucket.getName(), + String.format(Locale.US, "%s/src", generator.randomObjectName()))) .build(); BlobInfo blobInfoChunking = BlobInfo.newBuilder( - BlobId.of(bucket.getName(), String.format("%s/src", generator.randomObjectName()))) + BlobId.of( + bucket.getName(), + String.format(Locale.US, "%s/src", generator.randomObjectName()))) .build(); Collections.addAll(blobs, blobInfo1, blobInfo2); ByteBuffer content = DataGenerator.base64Characters().genByteBuffer(108); @@ -510,7 +517,8 @@ public void downloadBlobsOneFailure() throws Exception { BlobInfo nonexistentBlob = BlobInfo.newBuilder( BlobId.of( - bucket.getName(), String.format("%s/src", generator.randomObjectName()))) + bucket.getName(), + String.format(Locale.US, "%s/src", generator.randomObjectName()))) .build(); downloadBlobs.add(nonexistentBlob); DownloadJob job = transferManager.downloadBlobs(blobs, parallelDownloadConfig); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/RequestAuditing.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/RequestAuditing.java index a802c0debb..6740d3afd6 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/RequestAuditing.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/RequestAuditing.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @@ -220,6 +221,6 @@ public IterableSubject assertRequestHeader(String headerName, FilteringPolicy fi .filter(Objects::nonNull); List actual = filter.apply(stream).collect(Collectors.toList()); - return assertWithMessage(String.format("Headers %s", headerName)).that(actual); + return assertWithMessage(String.format(Locale.US, "Headers %s", headerName)).that(actual); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/CrossRunIntersection.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/CrossRunIntersection.java index 31916326b8..a48ba9d3ce 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/CrossRunIntersection.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/CrossRunIntersection.java @@ -23,6 +23,7 @@ import com.google.cloud.storage.it.runner.annotations.CrossRun; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableSet; +import java.util.Locale; import java.util.Objects; import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.ThreadSafe; @@ -118,7 +119,7 @@ public boolean anyMatch(CrossRunIntersection other) { public String fmtSuiteName() { String t = transport != null ? transport.toString() : "NULL_TRANSPORT"; String b = backend != null ? backend.toString() : "NULL_BACKEND"; - return String.format("[%s][%s]", t, b); + return String.format(Locale.US, "[%s][%s]", t, b); } @Override diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITLeafRunner.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITLeafRunner.java index d763fcf7e6..f76aa09c3f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITLeafRunner.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITLeafRunner.java @@ -24,6 +24,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.logging.Logger; import org.checkerframework.checker.nullness.qual.Nullable; @@ -74,11 +75,14 @@ protected void validateFields(List errors) { } else { return new Exception( String.format( + Locale.US, "@Inject field '%s' must have a type compatible with one of [%s]", - f, registry.injectableTypesString())); + f, + registry.injectableTypesString())); } } else { - return new Exception(String.format("The @Inject field '%s' must be public", f)); + return new Exception( + String.format(Locale.US, "The @Inject field '%s' must be public", f)); } }) .filter(Objects::nonNull) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITRunner.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITRunner.java index d99df4b802..5121d35ce2 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITRunner.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/StorageITRunner.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.List; +import java.util.Locale; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Function; @@ -202,7 +203,7 @@ private static List computeRunners(Class klass, Registry registry) } private static String fmtParam(Object param) { - return String.format("[%s]", param.toString()); + return String.format(Locale.US, "[%s]", param.toString()); } private static String fmtParam(CrossRunIntersection c, Object param) { @@ -224,13 +225,17 @@ private static void validateBackendAnnotations(CrossRun crossRun, SingleBackend if (crossRun != null && singleBackend != null) { throw new InitializationError( String.format( + Locale.US, "Class annotated with both @%s and @%s. Pick only one.", - CrossRun.class.getSimpleName(), SingleBackend.class.getSimpleName())); + CrossRun.class.getSimpleName(), + SingleBackend.class.getSimpleName())); } else if (crossRun == null && singleBackend == null) { throw new InitializationError( String.format( + Locale.US, "Missing either of @%s and @%s.", - CrossRun.class.getSimpleName(), SingleBackend.class.getSimpleName())); + CrossRun.class.getSimpleName(), + SingleBackend.class.getSimpleName())); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/BackendResources.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/BackendResources.java index 30d15c9dd8..95482af45f 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/BackendResources.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/BackendResources.java @@ -41,6 +41,7 @@ import com.google.storage.control.v2.stub.StorageControlStubSettings; import java.io.IOException; import java.net.URI; +import java.util.Locale; import java.util.UUID; /** The set of resources which are defined for a single backend. */ @@ -147,7 +148,7 @@ static BackendResources of( case TEST_BENCH: String baseUri = Registry.getInstance().testBench().getBaseUri(); URI uri = URI.create(baseUri); - String endpoint = String.format("%s:%d", uri.getHost(), uri.getPort()); + String endpoint = String.format(Locale.US, "%s:%d", uri.getHost(), uri.getPort()); builder = StorageControlSettings.newBuilder() .setCredentialsProvider(NoCredentialsProvider.create()) @@ -181,7 +182,8 @@ static BackendResources of( TestRunScopedInstance.of( "fixture/BUCKET/[" + backend.name() + "]", () -> { - String bucketName = String.format("java-storage-grpc-%s", UUID.randomUUID()); + String bucketName = + String.format(Locale.US, "java-storage-grpc-%s", UUID.randomUUID()); protectedBucketNames.add(bucketName); return new BucketInfoShim( BucketInfo.newBuilder(bucketName) @@ -194,7 +196,8 @@ static BackendResources of( TestRunScopedInstance.of( "fixture/BUCKET/[" + backend.name() + "]/REQUESTER_PAYS", () -> { - String bucketName = String.format("java-storage-grpc-rp-%s", UUID.randomUUID()); + String bucketName = + String.format(Locale.US, "java-storage-grpc-rp-%s", UUID.randomUUID()); protectedBucketNames.add(bucketName); return new BucketInfoShim( BucketInfo.newBuilder(bucketName) @@ -208,7 +211,8 @@ static BackendResources of( TestRunScopedInstance.of( "fixture/BUCKET/[" + backend.name() + "]/VERSIONED", () -> { - String bucketName = String.format("java-storage-grpc-v-%s", UUID.randomUUID()); + String bucketName = + String.format(Locale.US, "java-storage-grpc-v-%s", UUID.randomUUID()); protectedBucketNames.add(bucketName); return new BucketInfoShim( BucketInfo.newBuilder(bucketName) @@ -222,7 +226,8 @@ static BackendResources of( TestRunScopedInstance.of( "fixture/BUCKET/[" + backend.name() + "]/HNS", () -> { - String bucketName = String.format("java-storage-grpc-hns-%s", UUID.randomUUID()); + String bucketName = + String.format(Locale.US, "java-storage-grpc-hns-%s", UUID.randomUUID()); protectedBucketNames.add(bucketName); return new BucketInfoShim( BucketInfo.newBuilder(bucketName) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Generator.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Generator.java index e056a3418d..2235433f1b 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Generator.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Generator.java @@ -16,6 +16,7 @@ package com.google.cloud.storage.it.runner.registry; +import java.util.Locale; import java.util.UUID; import java.util.WeakHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -46,8 +47,11 @@ public String randomObjectName() { } AtomicInteger counter = counters.computeIfAbsent(currentTest, (d) -> new AtomicInteger(1)); return String.format( + Locale.US, "%s.%s-%04d", - currentTest.getClassName(), currentTest.getMethodName(), counter.getAndIncrement()); + currentTest.getClassName(), + currentTest.getMethodName(), + counter.getAndIncrement()); } @Override diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/ObjectsFixture.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/ObjectsFixture.java index ef8bbddd10..2fc8b3582d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/ObjectsFixture.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/ObjectsFixture.java @@ -28,6 +28,7 @@ import com.google.cloud.storage.it.ChecksummedTestContent; import com.google.common.collect.ImmutableMap; import java.nio.charset.StandardCharsets; +import java.util.Locale; /** Globally scoped objects correlated with a specific backend and bucket */ public final class ObjectsFixture implements ManagedLifecycle { @@ -137,7 +138,7 @@ public void start() { public void stop() {} private static String objName(String name) { - return String.format("%s/%s", ObjectsFixture.class.getSimpleName(), name); + return String.format(Locale.US, "%s/%s", ObjectsFixture.class.getSimpleName(), name); } public static final class ObjectAndContent { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Registry.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Registry.java index 1cbb484a4a..9af1f004b3 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Registry.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/Registry.java @@ -37,6 +37,7 @@ import io.opentelemetry.context.Scope; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.concurrent.Executors; import java.util.function.Function; @@ -174,7 +175,8 @@ public void testStarted(Description description) { Span span = tracer .spanBuilder( - String.format("%s/%s", description.getClassName(), description.getMethodName())) + String.format( + Locale.US, "%s/%s", description.getClassName(), description.getMethodName())) .setAttribute("service.name", "test") .startSpan(); Scope scope = span.makeCurrent(); @@ -234,7 +236,8 @@ public Object resolve(FrameworkField ff, CrossRunIntersection crossRunIntersecti } } else { throw new IllegalArgumentException( - String.format("Invalid: ff: %s, crossRunIntersection: %s", ff, crossRunIntersection)); + String.format( + Locale.US, "Invalid: ff: %s, crossRunIntersection: %s", ff, crossRunIntersection)); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/TestBench.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/TestBench.java index 470006c9cc..32557a97bd 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/TestBench.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/runner/registry/TestBench.java @@ -55,6 +55,7 @@ import java.nio.file.Path; import java.time.Duration; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.logging.Level; @@ -128,7 +129,8 @@ private TestBench( request.getHeaders().setAccept("application/json"); request .getHeaders() - .setUserAgent(String.format("%s/ test-bench/", this.containerName)); + .setUserAgent( + String.format(Locale.US, "%s/ test-bench/", this.containerName)); }); } @@ -206,7 +208,7 @@ public void start() { File errFile = errPath.toFile(); LOGGER.info("Redirecting server stdout to: " + outFile.getAbsolutePath()); LOGGER.info("Redirecting server stderr to: " + errFile.getAbsolutePath()); - String dockerImage = String.format("%s:%s", dockerImageName, dockerImageTag); + String dockerImage = String.format(Locale.US, "%s:%s", dockerImageName, dockerImageTag); // First try and pull the docker image, this validates docker is available and running // on the host, as well as gives time for the image to be downloaded independently of // trying to start the container. (Below, when we first start the container we then attempt @@ -223,12 +225,15 @@ public void start() { dumpServerLogs(outPath, errPath); throw new IllegalStateException( String.format( - "Non-zero status while attempting to pull docker image '%s'", dockerImage)); + Locale.US, + "Non-zero status while attempting to pull docker image '%s'", + dockerImage)); } } catch (InterruptedException | IllegalThreadStateException e) { dumpServerLogs(outPath, errPath); throw new IllegalStateException( - String.format("Timeout while attempting to pull docker image '%s'", dockerImage)); + String.format( + Locale.US, "Timeout while attempting to pull docker image '%s'", dockerImage)); } int port = URI.create(baseUri).getPort(); @@ -243,7 +248,7 @@ public void start() { port + ":9000", "--publish", gRPCPort + ":9090", - String.format("--name=%s", containerName), + String.format(Locale.US, "--name=%s", containerName), dockerImage); process = new ProcessBuilder() @@ -533,7 +538,7 @@ public TestBench build() { gRPCBaseUri, requireNonNull(dockerImageName, "dockerImageName must be non null"), requireNonNull(dockerImageTag, "dockerImageTag must be non null"), - String.format("storage-testbench_%s", containerName)); + String.format(Locale.US, "storage-testbench_%s", containerName)); } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/IamPolicyArbitraryProvider.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/IamPolicyArbitraryProvider.java index 133aefbae3..7e9580066b 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/IamPolicyArbitraryProvider.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/IamPolicyArbitraryProvider.java @@ -23,6 +23,7 @@ import com.google.protobuf.ByteString; import com.google.type.Expr; import java.util.Collections; +import java.util.Locale; import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; import net.jqwik.api.Arbitraries; @@ -83,10 +84,10 @@ static Arbitrary member() { return Arbitraries.oneOf( Arbitraries.of("allUsers"), Arbitraries.of("allAuthenticatedUsers"), - Web.emails().map(e -> String.format("user:%s", e)), - Web.emails().map(e -> String.format("serviceAccount:%s", e)), - Web.emails().map(e -> String.format("group:%s", e)), - Web.webDomains().map(d -> String.format("domain:%s", d))); + Web.emails().map(e -> String.format(Locale.US, "user:%s", e)), + Web.emails().map(e -> String.format(Locale.US, "serviceAccount:%s", e)), + Web.emails().map(e -> String.format(Locale.US, "group:%s", e)), + Web.webDomains().map(d -> String.format(Locale.US, "domain:%s", d))); } static Arbitrary condition() { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java index 6d93b27e09..8750a2932c 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/jqwik/StorageArbitraries.java @@ -44,6 +44,7 @@ import java.nio.charset.StandardCharsets; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import java.util.Locale; import java.util.Map; import net.jqwik.api.Arbitraries; import net.jqwik.api.Arbitrary; @@ -549,11 +550,12 @@ public Arbitrary cacheControl() { } else { //noinspection ConstantConditions if (maxAge != null) { - return String.format("%s, max-age=%d", visibility, maxAge); + return String.format(Locale.US, "%s, max-age=%d", visibility, maxAge); } else if (transform != null) { - return String.format("%s, %s", visibility, transform); + return String.format(Locale.US, "%s, %s", visibility, transform); } else { - return String.format("%s, max-age=%d, %s", visibility, maxAge, transform); + return String.format( + Locale.US, "%s, max-age=%d, %s", visibility, maxAge, transform); } } }); @@ -642,7 +644,7 @@ static EntityWithId userId(String id) { } static EntityWithoutId user(String email) { - return new EntityWithoutId(String.format("user-%s", email)); + return new EntityWithoutId(String.format(Locale.US, "user-%s", email)); } static EntityWithId groupId(String id) { @@ -650,16 +652,17 @@ static EntityWithId groupId(String id) { } static EntityWithoutId group(String email) { - return new EntityWithoutId(String.format("group-%s", email)); + return new EntityWithoutId(String.format(Locale.US, "group-%s", email)); } static EntityWithoutId domain(String email) { - return new EntityWithoutId(String.format("domain-%s", email)); + return new EntityWithoutId(String.format(Locale.US, "domain-%s", email)); } static EntityWithoutId project(ProjectTeam projectTeam) { return new EntityWithoutId( - String.format("project-%s-%s", projectTeam.getTeam(), projectTeam.getProjectNumber())); + String.format( + Locale.US, "project-%s-%s", projectTeam.getTeam(), projectTeam.getProjectNumber())); } } diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml index 22c0ee2dec..3b399c0667 100644 --- a/grpc-google-cloud-storage-control-v2/pom.xml +++ b/grpc-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.49.0 + 2.50.0 grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index 3ff52a6a1f..9b204780c4 100644 --- a/grpc-google-cloud-storage-v2/pom.xml +++ b/grpc-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.49.0 + 2.50.0 grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 diff --git a/pom.xml b/pom.xml index 9e8aa054e1..0e661ab20b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.49.0 + 2.50.0 Storage Parent https://github.com/googleapis/java-storage @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.44.0 + 3.45.1 @@ -69,7 +69,7 @@ org.junit junit-bom - 5.12.0 + 5.12.1 pom import @@ -123,17 +123,17 @@ com.google.cloud google-cloud-storage - 2.49.0 + 2.50.0 com.google.apis google-api-services-storage - v1-rev20241206-2.0.0 + v1-rev20250224-2.0.0 com.google.cloud google-cloud-pubsub - 1.137.0 + 1.137.1 test @@ -145,32 +145,32 @@ com.google.api.grpc proto-google-cloud-storage-v2 - 2.49.0 + 2.50.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.49.0 + 2.50.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.49.0 + 2.50.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.49.0 + 2.50.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.49.0 + 2.50.0 com.google.cloud google-cloud-storage-control - 2.49.0 + 2.50.0 com.google.cloud diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml index 4600bd1e02..b809c4a026 100644 --- a/proto-google-cloud-storage-control-v2/pom.xml +++ b/proto-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.49.0 + 2.50.0 proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 diff --git a/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto b/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto index 28551e3ef3..9351a7d43f 100644 --- a/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto +++ b/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index 20fd6aa72b..3c5fbb1851 100644 --- a/proto-google-cloud-storage-v2/pom.xml +++ b/proto-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-v2 - 2.49.0 + 2.50.0 proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 diff --git a/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto b/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto index ef5bc011ff..1ca9e9bcde 100644 --- a/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto +++ b/proto-google-cloud-storage-v2/src/main/proto/google/storage/v2/storage.proto @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index c81c72d9ca..650d039958 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,12 +30,12 @@ com.google.cloud google-cloud-storage - 2.48.2 + 2.49.0 com.google.cloud google-cloud-storage-control - 2.48.2 + 2.49.0 @@ -66,13 +66,13 @@ com.google.cloud google-cloud-pubsub - 1.137.0 + 1.137.1 test com.google.cloud google-cloud-storage - 2.48.2 + 2.49.0 tests test diff --git a/samples/pom.xml b/samples/pom.xml index c034ce864c..65ef20b762 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -39,7 +39,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 true diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 03a841181a..639be19a93 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,12 +28,12 @@ com.google.cloud google-cloud-storage - 2.49.0 + 2.50.0 com.google.cloud google-cloud-storage-control - 2.49.0 + 2.50.0 compile @@ -58,13 +58,13 @@ com.google.cloud google-cloud-pubsub - 1.137.0 + 1.137.1 test com.google.cloud google-cloud-storage - 2.49.0 + 2.50.0 tests test diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 25f002fa3e..e04edc54d7 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -31,7 +31,7 @@ com.google.cloud libraries-bom - 26.55.0 + 26.56.0 pom import @@ -76,7 +76,7 @@ com.google.cloud google-cloud-pubsub - 1.137.0 + 1.137.1 test @@ -93,7 +93,7 @@ com.google.cloud google-cloud-storage - 2.48.2 + 2.49.0 tests test diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index dc2c577e0f..11f771a38c 100644 --- a/storage-shared-benchmarking/pom.xml +++ b/storage-shared-benchmarking/pom.xml @@ -10,7 +10,7 @@ com.google.cloud google-cloud-storage-parent - 2.49.0 + 2.50.0 @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.49.0 + 2.50.0 tests diff --git a/versions.txt b/versions.txt index ee1ae80891..9f7b89efca 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.49.0:2.49.0 -gapic-google-cloud-storage-v2:2.49.0:2.49.0 -grpc-google-cloud-storage-v2:2.49.0:2.49.0 -proto-google-cloud-storage-v2:2.49.0:2.49.0 -google-cloud-storage-control:2.49.0:2.49.0 -proto-google-cloud-storage-control-v2:2.49.0:2.49.0 -grpc-google-cloud-storage-control-v2:2.49.0:2.49.0 +google-cloud-storage:2.50.0:2.50.0 +gapic-google-cloud-storage-v2:2.50.0:2.50.0 +grpc-google-cloud-storage-v2:2.50.0:2.50.0 +proto-google-cloud-storage-v2:2.50.0:2.50.0 +google-cloud-storage-control:2.50.0:2.50.0 +proto-google-cloud-storage-control-v2:2.50.0:2.50.0 +grpc-google-cloud-storage-control-v2:2.50.0:2.50.0