From 08bdac77f91da9005c944c80c09d54f12a2adc7b Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Tue, 21 Feb 2023 19:40:11 +0000
Subject: [PATCH 1/9] chore(main): release 2.19.1-SNAPSHOT (#1909)
:robot: I have created a release *beep* *boop*
---
### Updating meta-information for bleeding-edge SNAPSHOT release.
---
This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please).
---
gapic-google-cloud-storage-v2/pom.xml | 4 ++--
google-cloud-storage-bom/pom.xml | 10 +++++-----
google-cloud-storage/pom.xml | 4 ++--
grpc-google-cloud-storage-v2/pom.xml | 4 ++--
pom.xml | 10 +++++-----
proto-google-cloud-storage-v2/pom.xml | 4 ++--
samples/snapshot/pom.xml | 2 +-
versions.txt | 8 ++++----
8 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml
index fc55e6fe8e..3ac7d3f95c 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.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
gapic-google-cloud-storage-v2
GRPC library for gapic-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.19.0
+ 2.19.1-SNAPSHOT
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index 1505352df3..4938b41831 100644
--- a/google-cloud-storage-bom/pom.xml
+++ b/google-cloud-storage-bom/pom.xml
@@ -19,7 +19,7 @@
4.0.0
com.google.cloud
google-cloud-storage-bom
- 2.19.0
+ 2.19.1-SNAPSHOT
pom
com.google.cloud
@@ -69,22 +69,22 @@
com.google.cloud
google-cloud-storage
- 2.19.0
+ 2.19.1-SNAPSHOT
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 85711efe46..f31e4b0f89 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-storage
- 2.19.0
+ 2.19.1-SNAPSHOT
jar
Google Cloud Storage
https://github.com/googleapis/java-storage
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-storage-parent
- 2.19.0
+ 2.19.1-SNAPSHOT
google-cloud-storage
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index 8b57b3a205..0b1c0a83a8 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.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
grpc-google-cloud-storage-v2
GRPC library for grpc-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.19.0
+ 2.19.1-SNAPSHOT
diff --git a/pom.xml b/pom.xml
index 6dacccc441..668934f2d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-storage-parent
pom
- 2.19.0
+ 2.19.1-SNAPSHOT
Storage Parent
https://github.com/googleapis/java-storage
@@ -70,7 +70,7 @@
com.google.cloud
google-cloud-storage
- 2.19.0
+ 2.19.1-SNAPSHOT
com.google.apis
@@ -111,17 +111,17 @@
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
com.google.cloud
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index 280ea5168c..bb14d85474 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.19.0-alpha
+ 2.19.1-alpha-SNAPSHOT
proto-google-cloud-storage-v2
PROTO library for proto-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.19.0
+ 2.19.1-SNAPSHOT
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 3c54d5f8c6..da0d51f08f 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
google-cloud-storage
- 2.19.0
+ 2.19.1-SNAPSHOT
diff --git a/versions.txt b/versions.txt
index e7532a00ca..c879991aaf 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,7 +1,7 @@
# Format:
# module:released-version:current-version
-google-cloud-storage:2.19.0:2.19.0
-gapic-google-cloud-storage-v2:2.19.0-alpha:2.19.0-alpha
-grpc-google-cloud-storage-v2:2.19.0-alpha:2.19.0-alpha
-proto-google-cloud-storage-v2:2.19.0-alpha:2.19.0-alpha
+google-cloud-storage:2.19.0:2.19.1-SNAPSHOT
+gapic-google-cloud-storage-v2:2.19.0-alpha:2.19.1-alpha-SNAPSHOT
+grpc-google-cloud-storage-v2:2.19.0-alpha:2.19.1-alpha-SNAPSHOT
+proto-google-cloud-storage-v2:2.19.0-alpha:2.19.1-alpha-SNAPSHOT
From baa7d198be2b0f249777c588ce646c670785c5b2 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 21 Feb 2023 19:59:03 +0000
Subject: [PATCH 2/9] chore(deps): update dependency
com.google.cloud:google-cloud-storage to v2.19.0 (#1910)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* chore(deps): update dependency com.google.cloud:google-cloud-storage to v2.19.0
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot
---
README.md | 6 +++---
samples/install-without-bom/pom.xml | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index df1385830e..618d86adf8 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ If you are using Maven without BOM, add this to your dependencies:
com.google.cloud
google-cloud-storage
- 2.18.0
+ 2.19.0
```
@@ -56,13 +56,13 @@ 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.18.0'
+implementation 'com.google.cloud:google-cloud-storage:2.19.0'
```
If you are using SBT, add this to your dependencies:
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.18.0"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.19.0"
```
## Authentication
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index fc1445db25..17f5542eef 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -30,7 +30,7 @@
com.google.cloud
google-cloud-storage
- 2.18.0
+ 2.19.0
From dda8aaa80735593dcc4d759418368f3c678f1cf9 Mon Sep 17 00:00:00 2001
From: BenWhitehead
Date: Tue, 21 Feb 2023 18:19:17 -0500
Subject: [PATCH 3/9] test: add new StorageNativeCanaryTest (#1872)
Update native-image related config to be specific for this class.
Update maven config to explicitly configure this new class as its only class for test when run under -Pnative
---
google-cloud-storage/pom.xml | 10 +
.../cloud/storage/it/StorageNativeCanary.java | 182 ++++++++++++++++++
.../cloud/storage/native-image.properties | 27 +--
.../google/cloud/storage/reflect-config.json | 5 -
4 files changed, 193 insertions(+), 31 deletions(-)
create mode 100644 google-cloud-storage/src/test/java/com/google/cloud/storage/it/StorageNativeCanary.java
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index f31e4b0f89..8f3a52fc71 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -340,5 +340,15 @@
+
+ native
+
+
+ com.google.cloud.storage.it.StorageNativeCanary
+
+
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/StorageNativeCanary.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/StorageNativeCanary.java
new file mode 100644
index 0000000000..534764d9b1
--- /dev/null
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/StorageNativeCanary.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2023 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.it;
+
+import static com.google.cloud.storage.TestUtils.assertAll;
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.api.gax.paging.Page;
+import com.google.cloud.ReadChannel;
+import com.google.cloud.WriteChannel;
+import com.google.cloud.storage.Blob;
+import com.google.cloud.storage.BlobId;
+import com.google.cloud.storage.BlobInfo;
+import com.google.cloud.storage.BucketInfo;
+import com.google.cloud.storage.DataGenerator;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.Storage.BlobListOption;
+import com.google.cloud.storage.Storage.BlobSourceOption;
+import com.google.cloud.storage.Storage.BlobWriteOption;
+import com.google.cloud.storage.StorageOptions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteStreams;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.channels.Channels;
+import java.nio.channels.WritableByteChannel;
+import java.util.List;
+import java.util.UUID;
+import org.junit.Test;
+
+// Intentionally avoid StorageITRunner here. It touches lots of code at a semi-static level making
+// native-test have a hard time.
+public final class StorageNativeCanary {
+
+ private static final int _256KiB = 256 * 1024;
+ private static final byte[] bytes = DataGenerator.base64Characters().genBytes(512 * 1024);
+
+ @Test
+ public void canary_happyPath_http() throws Exception {
+ assertBehaviorOfPrimaryStorageActions(StorageOptions.http().build().getService());
+ }
+
+ @Test
+ public void canary_happyPath_grpc() throws Exception {
+ assertBehaviorOfPrimaryStorageActions(StorageOptions.grpc().build().getService());
+ }
+
+ /**
+ * When testing on Native Image, we're primarily wanting to verify the primary code paths are
+ * properly detected by the native image compiler.
+ *
+ *
For Storage, we have a few "primary code paths" we want to ensure are validated:
+ *
+ *
+ * - Can a (Unary) Request Succeed?
+ *
- Can a (ServerStream) Object Read Request Succeed?
+ *
- Can a (ClientStream) Object Write Request Succeed?
+ *
- Can a (Page over Unary) Paginated Request Succeed?
+ *
+ *
+ * To validate this, our happy path test is as follows:
+ *
+ *
+ * - Create a temporary bucket (Unary)
+ *
- Insert two (2) objects (Unary, ServerStream)
+ *
- List all objects, using a pageSize of 1 (Page over Unary)
+ *
- Read all bytes of each object (ServerStream)
+ *
- Delete each object (Unary)
+ *
- Delete temporary bucket (Unary)
+ *
+ */
+ private static void assertBehaviorOfPrimaryStorageActions(Storage storage) throws Exception {
+ // create a temporary bucket
+ try (TemporaryBucket temporaryBucket =
+ TemporaryBucket.newBuilder()
+ .setStorage(storage)
+ .setBucketInfo(BucketInfo.of("java-storage-grpc-" + UUID.randomUUID()))
+ .build()) {
+ String bucketName = temporaryBucket.getBucket().getName();
+ String obj1Name = UUID.randomUUID().toString();
+ String obj2Name = UUID.randomUUID().toString();
+
+ // insert 2 objects
+ BlobInfo info1 = BlobInfo.newBuilder(bucketName, obj1Name).build();
+ BlobInfo info2 = BlobInfo.newBuilder(bucketName, obj2Name).build();
+ uploadUsingWriter(storage, info1);
+ uploadUsingWriter(storage, info2);
+
+ // list objects
+ Page page = storage.list(bucketName, BlobListOption.pageSize(1));
+ List blobs = ImmutableList.copyOf(page.iterateAll());
+
+ // read all bytes of each object
+ List actual =
+ blobs.stream()
+ .map(info -> readAll(storage, info))
+ .collect(ImmutableList.toImmutableList());
+
+ List deletes =
+ blobs.stream()
+ .map(b -> storage.delete(b.getBlobId(), BlobSourceOption.generationMatch()))
+ .collect(ImmutableList.toImmutableList());
+
+ assertAll(
+ () -> {
+ List actualNames =
+ actual.stream()
+ .map(BlobWithContent::getInfo)
+ .map(BlobInfo::getBlobId)
+ .map(BlobId::getName)
+ .collect(ImmutableList.toImmutableList());
+
+ assertThat(actualNames).containsExactly(info1.getName(), info2.getName());
+ },
+ () -> assertThat(actual.get(0).getContent()).isEqualTo(bytes),
+ () -> assertThat(actual.get(1).getContent()).isEqualTo(bytes),
+ () -> assertThat(deletes.get(0)).isTrue(),
+ () -> assertThat(deletes.get(1)).isTrue());
+ }
+ }
+
+ private static void uploadUsingWriter(Storage storage, BlobInfo info) throws IOException {
+ try (WriteChannel writeChannel = storage.writer(info, BlobWriteOption.doesNotExist())) {
+ // set our size to the smallest resumable size, so we can send multiple requests
+ writeChannel.setChunkSize(_256KiB);
+ ByteStreams.copy(Channels.newChannel(new ByteArrayInputStream(bytes)), writeChannel);
+ }
+ }
+
+ private static BlobWithContent readAll(Storage storage, BlobInfo info) {
+ try (ReadChannel readChannel =
+ storage.reader(info.getBlobId(), BlobSourceOption.generationMatch());
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ WritableByteChannel writeChannel = Channels.newChannel(outputStream)) {
+ // only buffer up to half the object
+ readChannel.setChunkSize(_256KiB);
+ ByteStreams.copy(readChannel, writeChannel);
+ return new BlobWithContent(info, outputStream.toByteArray());
+ } catch (IOException e) {
+ throw new RuntimeIOException(e);
+ }
+ }
+
+ private static final class BlobWithContent {
+ private final BlobInfo info;
+ private final byte[] content;
+
+ private BlobWithContent(BlobInfo info, byte[] content) {
+ this.info = info;
+ this.content = content;
+ }
+
+ public BlobInfo getInfo() {
+ return info;
+ }
+
+ public byte[] getContent() {
+ return content;
+ }
+ }
+
+ private static final class RuntimeIOException extends RuntimeException {
+ private RuntimeIOException(IOException cause) {
+ super(cause);
+ }
+ }
+}
diff --git a/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/native-image.properties b/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/native-image.properties
index 0bb3e83ecc..dd22e6513f 100644
--- a/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/native-image.properties
+++ b/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/native-image.properties
@@ -5,29 +5,4 @@
# build time. Initializing these classes explicitly at build time results in a
# successful build.
Args = \
- --initialize-at-build-time=com.google.cloud.conformance.storage.v1,\
- com.google.protobuf,\
- com.google.auth.oauth2,\
- com.google.cloud.storage.conformance.retry,\
- com.google.common.base.Charsets,\
- com.google.gson.stream.JsonReader,\
- com.google.api.client.util,\
- com.google.api.client.http.javanet.NetHttpTransport,\
- com.google.api.client.http.HttpTransport,\
- com.google.api.client.json.JsonParser$1,\
- com.google.api.client.json.gson.GsonParser$1,\
- com.google.common.io.BaseEncoding,\
- com.google.common.math.IntMath$1,\
- com.google.common.collect.Platform,\
- com.google.gson.Gson,\
- com.google.common.truth,\
- com.google.common.collect,\
- com.google.gson.internal.reflect,\
- com.google.gson.internal.bind,\
- com.google.gson.internal,\
- com.google.gson.internal.sql.SqlTypesSupport,\
- com.google.gson.FieldNamingPolicy$3,\
- com.google.gson.LongSerializationPolicy$2,\
- net.jqwik
-
-
+ --initialize-at-build-time=net.jqwik
diff --git a/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/reflect-config.json b/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/reflect-config.json
index 06d0837d78..3076bc85fe 100644
--- a/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/reflect-config.json
+++ b/google-cloud-storage/src/test/resources/META-INF/native-image/com/google/cloud/storage/reflect-config.json
@@ -14,9 +14,4 @@
"allDeclaredFields":true,
"allDeclaredMethods":true,
"methods":[{"name":"","parameterTypes":[] }]}
-,
-{
- "name":"com.google.cloud.storage.conformance.retry.TestBench$RetryTestResource",
- "allDeclaredFields":true,
- "methods":[{"name":"","parameterTypes":[] }]}
]
From dd7122234b0ffc01a426cadce981ef6ba27e031a Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Wed, 22 Feb 2023 11:11:33 -0500
Subject: [PATCH 4/9] build(deps): update releasetool version for release
scripts (#1768) (#1911)
This should fix release script reporting back to the release PRs
Source-Link: https://github.com/googleapis/synthtool/commit/4c15ec0960687db8e6da43535fa1ee0e92fbb817
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:e62f3ea524b11c1cd6ff7f80362736d86c0056631346b5b106a421686fce2726
Co-authored-by: Owl Bot
---
.github/.OwlBot.lock.yaml | 2 +-
.kokoro/requirements.in | 2 +-
.kokoro/requirements.txt | 12 ++++++++----
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 090264303f..a5361a30a3 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -13,4 +13,4 @@
# limitations under the License.
docker:
image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest
- digest: sha256:5ee35ee919254a3d1e7d4f8abbf1b8c8869ade317ceb2e4df709af1b4b3e9ca1
+ digest: sha256:e62f3ea524b11c1cd6ff7f80362736d86c0056631346b5b106a421686fce2726
diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in
index b19a8dbfdd..2092cc741d 100644
--- a/.kokoro/requirements.in
+++ b/.kokoro/requirements.in
@@ -1,5 +1,5 @@
gcp-docuploader
-gcp-releasetool
+gcp-releasetool>=1.10.5 # required for compatibility with cryptography>=39.x
wheel
setuptools
typing-extensions
diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt
index cfadd22ce9..c80f0a87cc 100644
--- a/.kokoro/requirements.txt
+++ b/.kokoro/requirements.txt
@@ -1,5 +1,5 @@
#
-# This file is autogenerated by pip-compile with Python 3.9
+# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# pip-compile --allow-unsafe --generate-hashes requirements.in
@@ -126,9 +126,9 @@ gcp-docuploader==0.6.4 \
--hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \
--hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf
# via -r requirements.in
-gcp-releasetool==1.9.1 \
- --hash=sha256:952f4055d5d986b070ae2a71c4410b250000f9cc5a1e26398fcd55a5bbc5a15f \
- --hash=sha256:d0d3c814a97c1a237517e837d8cfa668ced8df4b882452578ecef4a4e79c583b
+gcp-releasetool==1.10.5 \
+ --hash=sha256:174b7b102d704b254f2a26a3eda2c684fd3543320ec239baf771542a2e58e109 \
+ --hash=sha256:e29d29927fe2ca493105a82958c6873bb2b90d503acac56be2c229e74de0eec9
# via -r requirements.in
google-api-core==2.8.2 \
--hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \
@@ -374,6 +374,10 @@ secretstorage==3.3.3 \
--hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \
--hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99
# via keyring
+setuptools==67.3.2 \
+ --hash=sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012 \
+ --hash=sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48
+ # via -r requirements.in
six==1.16.0 \
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
From 69eaaf0321d61a3b0c5faede445390e80e949821 Mon Sep 17 00:00:00 2001
From: BenWhitehead
Date: Mon, 27 Feb 2023 19:21:44 -0500
Subject: [PATCH 5/9] chore: ignore Update related gRPC tests which are failing
due to b/270215524 (#1917)
When b/270215524 is fixed and rolled out we should be able to revert this
---
.../java/com/google/cloud/storage/it/ITAccessTest.java | 4 ++++
.../cloud/storage/it/ITBucketLifecycleRulesTest.java | 2 ++
.../com/google/cloud/storage/it/ITBucketLifecycleTest.java | 1 +
.../java/com/google/cloud/storage/it/ITBucketTest.java | 5 +++++
.../test/java/com/google/cloud/storage/it/ITKmsTest.java | 2 ++
.../google/cloud/storage/it/ITNestedUpdateMaskTest.java | 2 ++
.../java/com/google/cloud/storage/it/ITObjectTest.java | 7 +++++++
7 files changed, 23 insertions(+)
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITAccessTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITAccessTest.java
index ab09709fcc..776aaa9dbd 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITAccessTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITAccessTest.java
@@ -345,6 +345,7 @@ private void doTestUniformBucketLevelAccessAclImpact(IamConfiguration iamConfigu
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testEnableAndDisableUniformBucketLevelAccessOnExistingBucket() throws Exception {
String bpoBucket = generator.randomBucketName();
BucketInfo.IamConfiguration ublaDisabledIamConfiguration =
@@ -492,6 +493,7 @@ public void testUnspecifiedPublicAccessPreventionOnBucket() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void changingPAPDoesNotAffectUBLA() throws Exception {
String bucketName = generator.randomBucketName();
try (TemporaryBucket tempB =
@@ -534,6 +536,7 @@ public void changingPAPDoesNotAffectUBLA() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void changingUBLADoesNotAffectPAP() throws Exception {
String bucketName = generator.randomBucketName();
try (TemporaryBucket tempB =
@@ -615,6 +618,7 @@ public void testRetentionPolicyNoLock() throws Exception {
@Test
@SuppressWarnings({"unchecked", "deprecation"})
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testEnableAndDisableBucketPolicyOnlyOnExistingBucket() throws Exception {
String bpoBucket = generator.randomBucketName();
try (TemporaryBucket tempB =
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleRulesTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleRulesTest.java
index d7f14d8282..6c0ff8f727 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleRulesTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleRulesTest.java
@@ -47,6 +47,7 @@ public final class ITBucketLifecycleRulesTest {
@Inject public Storage storage;
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void deleteRule_addingALabelToABucketWithASingleDeleteRuleOnlyModifiesTheLabels()
throws Exception {
LifecycleRule d1 =
@@ -89,6 +90,7 @@ public void condition_ageDays_0_shouldWork() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void deleteRule_modifyingLifecycleRulesMatchesLastOperation() throws Exception {
BucketInfo info;
{
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleTest.java
index 7ffbbbf156..0248753963 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketLifecycleTest.java
@@ -126,6 +126,7 @@ public void testGetBucketAbortMPULifecycle() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testDeleteLifecycleRules() throws Exception {
String bucketName = generator.randomBucketName();
BucketInfo bucketInfo =
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketTest.java
index 616aee62a3..ad12ed5484 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketTest.java
@@ -148,6 +148,7 @@ public void testBucketCustomPlacmentConfigDualRegion() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testBucketLogging() throws Exception {
String logsBucketName = generator.randomBucketName();
String loggingBucketName = generator.randomBucketName();
@@ -189,6 +190,7 @@ public void testBucketLogging() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testRemoveBucketCORS() {
String bucketName = generator.randomBucketName();
List origins = ImmutableList.of(Cors.Origin.of("http://cloud.google.com"));
@@ -237,6 +239,7 @@ public void testRemoveBucketCORS() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testRpoConfig() {
String rpoBucket = generator.randomBucketName();
try {
@@ -259,6 +262,7 @@ public void testRetentionPolicyLock() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testRetentionPolicyLockRequesterPays() {
retentionPolicyLockRequesterPays(true);
}
@@ -386,6 +390,7 @@ public void testEnableDisableBucketDefaultEventBasedHold() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testCreateBucketWithAutoclass() {
String bucketName = generator.randomBucketName();
storage.create(
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITKmsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITKmsTest.java
index f187a436bc..48f0304150 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITKmsTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITKmsTest.java
@@ -69,6 +69,7 @@ public class ITKmsTest {
@Inject public KmsFixture kms;
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testClearBucketDefaultKmsKeyName() {
String bucketName = generator.randomBucketName();
Bucket remoteBucket =
@@ -87,6 +88,7 @@ public void testClearBucketDefaultKmsKeyName() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testUpdateBucketDefaultKmsKeyName() {
String bucketName = generator.randomBucketName();
Bucket remoteBucket =
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNestedUpdateMaskTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNestedUpdateMaskTest.java
index 8e3b944d99..04a767ae6a 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNestedUpdateMaskTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITNestedUpdateMaskTest.java
@@ -113,6 +113,7 @@ public ImmutableList parameters() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testBucketLabels() throws Exception {
BucketInfo bucket = newBucketInfo(param.initial);
try (TemporaryBucket tempB =
@@ -125,6 +126,7 @@ public void testBucketLabels() throws Exception {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testBlobMetadata() {
BlobInfo blob = newBlobInfo(param.initial);
Blob gen1 = storage.create(blob, BlobTargetOption.doesNotExist());
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 f2afbb2db8..b210427028 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
@@ -571,6 +571,7 @@ public void testListBlobsMultiplePages() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testUpdateBlob() {
String blobName = "test-update-blob";
BlobInfo blob = BlobInfo.newBuilder(bucket, blobName).build();
@@ -584,6 +585,7 @@ public void testUpdateBlob() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testUpdateBlobReplaceMetadata() {
String blobName = "test-update-blob-replace-metadata";
ImmutableMap metadata = ImmutableMap.of("k1", "a");
@@ -605,6 +607,7 @@ public void testUpdateBlobReplaceMetadata() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testUpdateBlobMergeMetadata() {
String blobName = "test-update-blob-merge-metadata";
ImmutableMap metadata = ImmutableMap.of("k1", "a");
@@ -625,6 +628,7 @@ public void testUpdateBlobMergeMetadata() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testUpdateBlobUnsetMetadata() {
String blobName = "test-update-blob-unset-metadata";
@@ -1260,6 +1264,7 @@ public void testEnableDisableTemporaryHold() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testAttemptObjectDeleteWithEventBasedHold() {
String blobName = generator.randomObjectName();
BlobInfo blobInfo = BlobInfo.newBuilder(bucket, blobName).setEventBasedHold(true).build();
@@ -1276,6 +1281,7 @@ public void testAttemptObjectDeleteWithEventBasedHold() {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testAttemptDeletionObjectTemporaryHold() {
String blobName = generator.randomObjectName();
BlobInfo blobInfo = BlobInfo.newBuilder(bucket, blobName).setTemporaryHold(true).build();
@@ -1404,6 +1410,7 @@ public void testAutoContentTypeWriter() throws IOException {
}
@Test
+ @CrossRun.Ignore(transports = Transport.GRPC) // todo(b/270215524)
public void testBlobTimeStorageClassUpdated() {
String blobName = generator.randomObjectName();
From 5eddf0465d17af8db8ed6d194f99e53386c69b34 Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 28 Feb 2023 14:46:01 +0000
Subject: [PATCH 6/9] chore(deps): update dependency
com.google.cloud:libraries-bom to v26.9.0 (#1914)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* chore(deps): update dependency com.google.cloud:libraries-bom to v26.9.0
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot
---
README.md | 4 ++--
samples/native-image-sample/pom.xml | 2 +-
samples/snippets/pom.xml | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 618d86adf8..be5103dc34 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.8.0
+ 26.9.0
pom
import
@@ -49,7 +49,7 @@ If you are using Maven without 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.8.0')
+implementation platform('com.google.cloud:libraries-bom:26.9.0')
implementation 'com.google.cloud:google-cloud-storage'
```
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index 4359633399..64da8eb736 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -29,7 +29,7 @@
com.google.cloud
libraries-bom
- 26.8.0
+ 26.9.0
pom
import
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index bf9fa2f67a..fbee8c67a1 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -31,7 +31,7 @@
com.google.cloud
libraries-bom
- 26.8.0
+ 26.9.0
pom
import
From b4cdb374f2c9808b65cb244e5333720547378ddc Mon Sep 17 00:00:00 2001
From: Mend Renovate
Date: Tue, 28 Feb 2023 17:19:57 +0000
Subject: [PATCH 7/9] test(deps): update cross product test dependencies
(#1913)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* test(deps): update cross product test dependencies
* 🦉 Updates from OwlBot post-processor
See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md
---------
Co-authored-by: Owl Bot
---
google-cloud-storage/pom.xml | 2 +-
pom.xml | 2 +-
samples/install-without-bom/pom.xml | 2 +-
samples/native-image-sample/pom.xml | 2 +-
samples/snapshot/pom.xml | 2 +-
samples/snippets/pom.xml | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 8f3a52fc71..e56545d9b5 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -16,7 +16,7 @@
google-cloud-storage
- 1.105.2
+ 1.105.4
5.9.2
diff --git a/pom.xml b/pom.xml
index 668934f2d0..ab909ea948 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,7 +80,7 @@
com.google.cloud
google-cloud-pubsub
- 1.123.2
+ 1.123.4
test
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 17f5542eef..ce26e7f675 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -61,7 +61,7 @@
com.google.cloud
google-cloud-pubsub
- 1.123.2
+ 1.123.4
test
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index 64da8eb736..7405fb48ea 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -61,7 +61,7 @@
com.google.cloud
google-cloud-pubsub
- 1.123.2
+ 1.123.4
test
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index da0d51f08f..bec5ea7938 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -52,7 +52,7 @@
com.google.cloud
google-cloud-pubsub
- 1.123.2
+ 1.123.4
test
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index fbee8c67a1..9bfef478c8 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -72,7 +72,7 @@
com.google.cloud
google-cloud-pubsub
- 1.123.2
+ 1.123.4
test
From 6df546945211a767f73190773ab2754bf7842e75 Mon Sep 17 00:00:00 2001
From: BenWhitehead
Date: Wed, 1 Mar 2023 13:07:50 -0500
Subject: [PATCH 8/9] feat: allow specifying a negative offset to ReadChannel
(#1916)
GCS Supports negative offsets in ranged reads and is documented in https://cloud.google.com/storage/docs/json_api/v1/parameters#range
Update the ReadChannel returned from Storage.reader to allow providing a negative value to `seek`.
NOTE: `seek` to a negative offset will be ignored by GCS if `limit` is also specified
---
.../cloud/storage/BaseStorageReadChannel.java | 4 +++-
.../google/cloud/storage/ByteRangeSpec.java | 4 +++-
.../GapicUnbufferedReadableByteChannel.java | 1 -
.../cloud/storage/StorageReadChannel.java | 1 -
.../cloud/storage/ByteRangeSpecTest.java | 14 +++++++++++++
.../storage/it/ITBlobReadChannelTest.java | 21 +++++++++++++++++++
6 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BaseStorageReadChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BaseStorageReadChannel.java
index 77a010752f..60ab4990d4 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BaseStorageReadChannel.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BaseStorageReadChannel.java
@@ -88,7 +88,9 @@ public final synchronized int read(ByteBuffer dst) throws IOException {
throw new ClosedChannelException();
}
long diff = byteRangeSpec.length();
- if (diff <= 0) {
+ // the check on beginOffset >= 0 used to be a precondition on seek(long)
+ // move it here to preserve existing behavior while allowing new negative offsets
+ if (diff <= 0 && byteRangeSpec.beginOffset() >= 0) {
return -1;
}
try {
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 3b501eee48..96929b30a0 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
@@ -472,6 +472,8 @@ public ReadObjectRequest.Builder seekReadObjectRequest(ReadObjectRequest.Builder
protected String fmtAsHttpRangeHeader() throws ArithmeticException {
if (beginOffset > 0) {
return String.format("bytes=%d-", beginOffset);
+ } else if (beginOffset < 0) {
+ return String.format("bytes=%d", beginOffset);
} else {
return null;
}
@@ -510,7 +512,7 @@ long length() throws ArithmeticException {
@Override
ByteRangeSpec withNewBeginOffset(long beginOffset) {
- if (beginOffset > 0) {
+ if (beginOffset != 0) {
return new LeftClosedByteRangeSpec(beginOffset);
} else {
return this;
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 feb7d45ccc..4b19c3f998 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
@@ -173,7 +173,6 @@ private static final class ReadCursor {
private final long limit;
private ReadCursor(long beginning, long limit) {
- checkArgument(0 <= beginning && beginning <= limit, "0 <= %d <= %d", beginning, limit);
this.limit = limit;
this.beginning = beginning;
this.offset = beginning;
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageReadChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageReadChannel.java
index 18539da4d2..40630ad937 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageReadChannel.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageReadChannel.java
@@ -41,7 +41,6 @@ default ByteRangeSpec getByteRangeSpec() {
@SuppressWarnings("resource")
@Override
default void seek(long position) throws IOException {
- checkArgument(position >= 0, "position must be >= 0");
try {
setByteRangeSpec(getByteRangeSpec().withNewBeginOffset(position));
} catch (StorageException e) {
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 dce7190d1a..abb5a9536b 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
@@ -45,6 +45,20 @@ public final class ByteRangeSpecTest {
public static final class Behavior {
+ @Test
+ public void negativeBeginOffset() throws Exception {
+ ByteRangeSpec rel = ByteRangeSpec.relativeLength(-5L, null);
+ ByteRangeSpec exO = ByteRangeSpec.explicit(-5L, null);
+ ByteRangeSpec exC = ByteRangeSpec.explicitClosed(-5L, null);
+ threeWayEqual(exO, exC, rel);
+ }
+
+ @Test
+ public void negativeBeginOffset_fromNull() {
+ ByteRangeSpec spec = ByteRangeSpec.nullRange().withNewBeginOffset(-5L);
+ assertThat(spec.getHttpRangeHeader()).isEqualTo("bytes=-5");
+ }
+
@Test
public void beginNonNullZero_endNonNullNonInfinity() throws Exception {
ByteRangeSpec rel = ByteRangeSpec.relativeLength(0L, 52L);
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 ebbff00f41..bf4427096a 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
@@ -459,6 +459,27 @@ public void readingLastByteReturnsOneByte_seekOnly() throws IOException {
}
}
+ @Test
+ public void readingLastByteReturnsOneByte_seekOnly_negativeOffset() throws IOException {
+ int length = 10;
+ byte[] bytes = DataGenerator.base64Characters().genBytes(length);
+
+ BlobInfo info1 = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build();
+ Blob gen1 = storage.create(info1, bytes, BlobTargetOption.doesNotExist());
+
+ byte[] expected1 = Arrays.copyOfRange(bytes, 9, 10);
+ String xxdExpected1 = xxd(expected1);
+ try (ReadChannel reader = storage.reader(gen1.getBlobId());
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ WritableByteChannel writer = Channels.newChannel(baos)) {
+ reader.seek(-1);
+ ByteStreams.copy(reader, writer);
+ byte[] bytes1 = baos.toByteArray();
+ String xxd1 = xxd(bytes1);
+ assertThat(xxd1).isEqualTo(xxdExpected1);
+ }
+ }
+
@Test
public void readingLastByteReturnsOneByte_seekAndLimit() throws IOException {
int length = 10;
From e652c8a57158d942e894ae137dfbfc64a39a8416 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Mon, 6 Mar 2023 13:38:11 -0800
Subject: [PATCH 9/9] chore(main): release 2.20.0 (#1918)
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
CHANGELOG.md | 7 +++++++
gapic-google-cloud-storage-v2/pom.xml | 4 ++--
google-cloud-storage-bom/pom.xml | 10 +++++-----
google-cloud-storage/pom.xml | 4 ++--
grpc-google-cloud-storage-v2/pom.xml | 4 ++--
pom.xml | 10 +++++-----
proto-google-cloud-storage-v2/pom.xml | 4 ++--
samples/snapshot/pom.xml | 2 +-
versions.txt | 8 ++++----
9 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 541a101ca8..1579564da1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [2.20.0](https://github.com/googleapis/java-storage/compare/v2.19.0...v2.20.0) (2023-03-01)
+
+
+### Features
+
+* Allow specifying a negative offset to ReadChannel ([#1916](https://github.com/googleapis/java-storage/issues/1916)) ([6df5469](https://github.com/googleapis/java-storage/commit/6df546945211a767f73190773ab2754bf7842e75))
+
## [2.19.0](https://github.com/googleapis/java-storage/compare/v2.18.0...v2.19.0) (2023-02-21)
diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml
index 3ac7d3f95c..0e102154f3 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.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
gapic-google-cloud-storage-v2
GRPC library for gapic-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.19.1-SNAPSHOT
+ 2.20.0
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index 4938b41831..f1b1e0f211 100644
--- a/google-cloud-storage-bom/pom.xml
+++ b/google-cloud-storage-bom/pom.xml
@@ -19,7 +19,7 @@
4.0.0
com.google.cloud
google-cloud-storage-bom
- 2.19.1-SNAPSHOT
+ 2.20.0
pom
com.google.cloud
@@ -69,22 +69,22 @@
com.google.cloud
google-cloud-storage
- 2.19.1-SNAPSHOT
+ 2.20.0
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index e56545d9b5..65388950ed 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-storage
- 2.19.1-SNAPSHOT
+ 2.20.0
jar
Google Cloud Storage
https://github.com/googleapis/java-storage
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-storage-parent
- 2.19.1-SNAPSHOT
+ 2.20.0
google-cloud-storage
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index 0b1c0a83a8..87c2556182 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.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
grpc-google-cloud-storage-v2
GRPC library for grpc-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.19.1-SNAPSHOT
+ 2.20.0
diff --git a/pom.xml b/pom.xml
index ab909ea948..c0e825bee2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-storage-parent
pom
- 2.19.1-SNAPSHOT
+ 2.20.0
Storage Parent
https://github.com/googleapis/java-storage
@@ -70,7 +70,7 @@
com.google.cloud
google-cloud-storage
- 2.19.1-SNAPSHOT
+ 2.20.0
com.google.apis
@@ -111,17 +111,17 @@
com.google.api.grpc
proto-google-cloud-storage-v2
- 2.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
com.google.api.grpc
grpc-google-cloud-storage-v2
- 2.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
com.google.api.grpc
gapic-google-cloud-storage-v2
- 2.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
com.google.cloud
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index bb14d85474..ea4cc62899 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.19.1-alpha-SNAPSHOT
+ 2.20.0-alpha
proto-google-cloud-storage-v2
PROTO library for proto-google-cloud-storage-v2
com.google.cloud
google-cloud-storage-parent
- 2.19.1-SNAPSHOT
+ 2.20.0
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index bec5ea7938..3fc4ee23f8 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
google-cloud-storage
- 2.19.1-SNAPSHOT
+ 2.20.0
diff --git a/versions.txt b/versions.txt
index c879991aaf..a0087184b4 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,7 +1,7 @@
# Format:
# module:released-version:current-version
-google-cloud-storage:2.19.0:2.19.1-SNAPSHOT
-gapic-google-cloud-storage-v2:2.19.0-alpha:2.19.1-alpha-SNAPSHOT
-grpc-google-cloud-storage-v2:2.19.0-alpha:2.19.1-alpha-SNAPSHOT
-proto-google-cloud-storage-v2:2.19.0-alpha:2.19.1-alpha-SNAPSHOT
+google-cloud-storage:2.20.0:2.20.0
+gapic-google-cloud-storage-v2:2.20.0-alpha:2.20.0-alpha
+grpc-google-cloud-storage-v2:2.20.0-alpha:2.20.0-alpha
+proto-google-cloud-storage-v2:2.20.0-alpha:2.20.0-alpha