diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 88d9b926..8807efca 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -1,3 +1,16 @@ +# Copyright 2022 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. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:5b8c790f57cca57e6b37ba25f79291265c218cea3e6ba9714b001910ab3f1419 + digest: sha256:7c853edc4136ae8f19f9d46d4569d38de2e446db2eea057f32e412bdba255846 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9939f547..04142504 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -21,7 +21,7 @@ If you are still having issues, please include as much information as possible: General, Core, and Other are also allowed as types 2. OS type and version: 3. Java version: -4. storage_nio version(s): +4. version(s): #### Steps to reproduce diff --git a/.github/workflows/approve-readme.yaml b/.github/workflows/approve-readme.yaml index 7513acae..c5132427 100644 --- a/.github/workflows/approve-readme.yaml +++ b/.github/workflows/approve-readme.yaml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest if: github.repository_owner == 'googleapis' && github.head_ref == 'autosynth-readme' steps: - - uses: actions/github-script@v3 + - uses: actions/github-script@v5 with: github-token: ${{secrets.YOSHI_APPROVER_TOKEN}} script: | diff --git a/.github/workflows/auto-release.yaml b/.github/workflows/auto-release.yaml index 9b4fd4d8..59c7cadd 100644 --- a/.github/workflows/auto-release.yaml +++ b/.github/workflows/auto-release.yaml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest if: contains(github.head_ref, 'release-please') steps: - - uses: actions/github-script@v3 + - uses: actions/github-script@v5 with: github-token: ${{secrets.YOSHI_APPROVER_TOKEN}} debug: true diff --git a/.kokoro/nightly/java11-integration.cfg b/.kokoro/nightly/java11-integration.cfg new file mode 100644 index 00000000..58049cc3 --- /dev/null +++ b/.kokoro/nightly/java11-integration.cfg @@ -0,0 +1,37 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-public-resources/java11014" +} + +env_vars: { + key: "JOB_TYPE" + value: "integration" +} +# TODO: remove this after we've migrated all tests and scripts +env_vars: { + key: "GCLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "GOOGLE_CLOUD_PROJECT" + value: "gcloud-devel" +} + +env_vars: { + key: "ENABLE_FLAKYBOT" + value: "true" +} + +env_vars: { + key: "GOOGLE_APPLICATION_CREDENTIALS" + value: "secret_manager/java-it-service-account" +} + +env_vars: { + key: "SECRET_MANAGER_KEYS" + value: "java-it-service-account" +} diff --git a/.repo-metadata.json b/.repo-metadata.json index 7cded627..e71769ae 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -1,10 +1,10 @@ { - "name": "storage_nio", + "api_shortname": "storage_nio", "name_pretty": "NIO Filesystem Provider for Google Cloud Storage", "api_description": "provides a Google Cloud Storage extension for Java's NIO Filesystem.", "product_documentation": "https://cloud.google.com/storage/docs", "client_documentation": "https://cloud.google.com/java/docs/reference/google-cloud-nio/latest/history", - "release_level": "beta", + "release_level": "preview", "language": "java", "repo": "googleapis/java-storage-nio", "repo_short": "java-storage-nio", diff --git a/CHANGELOG.md b/CHANGELOG.md index f68ed234..6cabe897 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +### [0.123.19](https://github.com/googleapis/java-storage-nio/compare/v0.123.18...v0.123.19) (2022-02-03) + + +### Dependencies + +* **java:** update actions/github-script action to v5 ([#1339](https://github.com/googleapis/java-storage-nio/issues/1339)) ([#800](https://github.com/googleapis/java-storage-nio/issues/800)) ([4c82c37](https://github.com/googleapis/java-storage-nio/commit/4c82c37860af4e0ae43e31446e35b6b3bae7ebbb)) +* update actions/github-script action to v5 ([#799](https://github.com/googleapis/java-storage-nio/issues/799)) ([40febb2](https://github.com/googleapis/java-storage-nio/commit/40febb21b20c414c7e9443e95245e469cdafef76)) +* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.7.0 ([#802](https://github.com/googleapis/java-storage-nio/issues/802)) ([2beefb6](https://github.com/googleapis/java-storage-nio/commit/2beefb699619f72f2a3d50cd0d63140d15d08a0b)) +* update dependency com.google.cloud:google-cloud-storage to v2.2.3 ([#786](https://github.com/googleapis/java-storage-nio/issues/786)) ([b82657c](https://github.com/googleapis/java-storage-nio/commit/b82657ca045dee5e3a73f89a8f087cd957fb370f)) +* update dependency com.google.cloud:google-cloud-storage to v2.3.0 ([#796](https://github.com/googleapis/java-storage-nio/issues/796)) ([e822be5](https://github.com/googleapis/java-storage-nio/commit/e822be5c411420c79ead2276904126b8e3ad022f)) + ### [0.123.18](https://www.github.com/googleapis/java-storage-nio/compare/v0.123.17...v0.123.18) (2022-01-07) diff --git a/google-cloud-nio-examples/pom.xml b/google-cloud-nio-examples/pom.xml index 3fd31d6c..c6ef9813 100644 --- a/google-cloud-nio-examples/pom.xml +++ b/google-cloud-nio-examples/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-nio-examples - 0.123.18 + 0.123.19 jar Google Cloud NIO Examples https://github.com/googleapis/java-storage-nio @@ -13,7 +13,7 @@ com.google.cloud google-cloud-nio-parent - 0.123.18 + 0.123.19 diff --git a/google-cloud-nio-retrofit/pom.xml b/google-cloud-nio-retrofit/pom.xml index 2b88df7e..fadd0173 100644 --- a/google-cloud-nio-retrofit/pom.xml +++ b/google-cloud-nio-retrofit/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-nio-retrofit - 0.123.18 + 0.123.19 jar Google Cloud NIO Retrofit Example https://github.com/googleapis/java-storage-nio @@ -12,7 +12,7 @@ com.google.cloud google-cloud-nio-parent - 0.123.18 + 0.123.19 google-cloud-nio-retrofit diff --git a/google-cloud-nio/pom.xml b/google-cloud-nio/pom.xml index e99d33d2..b76f3099 100644 --- a/google-cloud-nio/pom.xml +++ b/google-cloud-nio/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-nio - 0.123.18 + 0.123.19 jar Google Cloud NIO https://github.com/googleapis/java-storage-nio @@ -12,7 +12,7 @@ com.google.cloud google-cloud-nio-parent - 0.123.18 + 0.123.19 google-cloud-nio @@ -80,12 +80,7 @@ org.mockito mockito-core - 4.2.0 - test - - org.hamcrest - hamcrest-core - 1.3 + 4.3.1 test diff --git a/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageReadFileChannelTest.java b/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageReadFileChannelTest.java index c6bd9ad4..6bcfaa68 100644 --- a/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageReadFileChannelTest.java +++ b/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageReadFileChannelTest.java @@ -15,14 +15,11 @@ */ package com.google.cloud.storage.contrib.nio; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; +import static com.google.common.truth.Truth.assertThat; import com.google.cloud.testing.junit4.MultipleAttemptsRule; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; import java.nio.channels.SeekableByteChannel; import org.junit.Before; import org.junit.Rule; @@ -122,67 +119,67 @@ public void before() throws IOException { @Test public void testRead() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.read(buffer), is(equalTo(1))); - assertThat(fileChannel.position(), is(equalTo(1L))); - assertThat(buffer.get(0), is(equalTo((byte) 1))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.read(buffer)).isEqualTo(1); + assertThat(fileChannel.position()).isEqualTo(1L); + assertThat(buffer.get(0)).isEqualTo((byte) 1); } @Test public void testReadArray() throws IOException { ByteBuffer[] buffers = new ByteBuffer[] {ByteBuffer.allocate(1), ByteBuffer.allocate(1), ByteBuffer.allocate(1)}; - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.read(buffers), is(equalTo(3L))); - assertThat(fileChannel.position(), is(equalTo(3L))); - assertThat(buffers[0].get(0), is(equalTo((byte) 1))); - assertThat(buffers[1].get(0), is(equalTo((byte) 2))); - assertThat(buffers[2].get(0), is(equalTo((byte) 3))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.read(buffers)).isEqualTo(3L); + assertThat(fileChannel.position()).isEqualTo(3L); + assertThat(buffers[0].get(0)).isEqualTo((byte) 1); + assertThat(buffers[1].get(0)).isEqualTo((byte) 2); + assertThat(buffers[2].get(0)).isEqualTo((byte) 3); } @Test public void testPosition() throws IOException { - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.position(1L), is(equalTo((FileChannel) fileChannel))); - assertThat(fileChannel.position(), is(equalTo(1L))); - assertThat(fileChannel.position(0L), is(equalTo((FileChannel) fileChannel))); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.position(100L), is(equalTo((FileChannel) fileChannel))); - assertThat(fileChannel.position(), is(equalTo(100L))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.position(1L)).isEqualTo(fileChannel); + assertThat(fileChannel.position()).isEqualTo(1L); + assertThat(fileChannel.position(0L)).isEqualTo(fileChannel); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.position(100L)).isEqualTo(fileChannel); + assertThat(fileChannel.position()).isEqualTo(100L); } @Test public void testSize() throws IOException { - assertThat(fileChannel.size(), is(equalTo(3L))); + assertThat(fileChannel.size()).isEqualTo(3L); } @Test public void testTransferTo() throws IOException { SeekableByteChannelImpl target = new SeekableByteChannelImpl(ByteBuffer.allocate(100)); - assertThat(fileChannel.transferTo(0L, 3L, target), is(equalTo(3L))); - assertThat(target.position(), is(equalTo(3L))); + assertThat(fileChannel.transferTo(0L, 3L, target)).isEqualTo(3L); + assertThat(target.position()).isEqualTo(3L); ByteBuffer dst = ByteBuffer.allocate(3); target.position(0L); target.read(dst); - assertThat(dst.get(0), is(equalTo((byte) 1))); - assertThat(dst.get(1), is(equalTo((byte) 2))); - assertThat(dst.get(2), is(equalTo((byte) 3))); + assertThat(dst.get(0)).isEqualTo((byte) 1); + assertThat(dst.get(1)).isEqualTo((byte) 2); + assertThat(dst.get(2)).isEqualTo((byte) 3); } @Test public void testReadOnPosition() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.read(buffer, 1L), is(equalTo(1))); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(buffer.get(0), is(equalTo((byte) 2))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.read(buffer, 1L)).isEqualTo(1); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(buffer.get(0)).isEqualTo((byte) 2); } @Test public void testReadBeyondEnd() throws IOException { fileChannel.position(3L); - assertThat(fileChannel.read(ByteBuffer.allocate(1)), is(equalTo(-1))); + assertThat(fileChannel.read(ByteBuffer.allocate(1))).isEqualTo(-1); fileChannel.position(2L); - assertThat(fileChannel.read(ByteBuffer.allocate(2)), is(equalTo(1))); + assertThat(fileChannel.read(ByteBuffer.allocate(2))).isEqualTo(1); } } diff --git a/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageWriteFileChannelTest.java b/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageWriteFileChannelTest.java index 685efe22..f0e3a4da 100644 --- a/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageWriteFileChannelTest.java +++ b/google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageWriteFileChannelTest.java @@ -15,14 +15,11 @@ */ package com.google.cloud.storage.contrib.nio; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; +import static com.google.common.truth.Truth.assertThat; import com.google.cloud.testing.junit4.MultipleAttemptsRule; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; import java.nio.channels.SeekableByteChannel; import org.junit.Before; import org.junit.Rule; @@ -123,10 +120,10 @@ public void before() throws IOException { public void testWrite() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1); buffer.put((byte) 100).position(0); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.write(buffer), is(equalTo(1))); - assertThat(fileChannel.position(), is(equalTo(1L))); - assertThat(data.get(0), is(equalTo((byte) 100))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.write(buffer)).isEqualTo(1); + assertThat(fileChannel.position()).isEqualTo(1L); + assertThat(data.get(0)).isEqualTo((byte) 100); } @Test @@ -136,34 +133,34 @@ public void testWriteArray() throws IOException { buffers[0].put((byte) 10).position(0); buffers[1].put((byte) 20).position(0); buffers[2].put((byte) 30).position(0); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.write(buffers), is(equalTo(3L))); - assertThat(fileChannel.position(), is(equalTo(3L))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.write(buffers)).isEqualTo(3L); + assertThat(fileChannel.position()).isEqualTo(3L); - assertThat(data.get(0), is(equalTo((byte) 10))); - assertThat(data.get(1), is(equalTo((byte) 20))); - assertThat(data.get(2), is(equalTo((byte) 30))); + assertThat(data.get(0)).isEqualTo((byte) 10); + assertThat(data.get(1)).isEqualTo((byte) 20); + assertThat(data.get(2)).isEqualTo((byte) 30); } @Test public void testPosition() throws IOException { - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.position(1L), is(equalTo((FileChannel) fileChannel))); - assertThat(fileChannel.position(), is(equalTo(1L))); - assertThat(fileChannel.position(0L), is(equalTo((FileChannel) fileChannel))); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.position(100L), is(equalTo((FileChannel) fileChannel))); - assertThat(fileChannel.position(), is(equalTo(100L))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.position(1L)).isEqualTo(fileChannel); + assertThat(fileChannel.position()).isEqualTo(1L); + assertThat(fileChannel.position(0L)).isEqualTo(fileChannel); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.position(100L)).isEqualTo(fileChannel); + assertThat(fileChannel.position()).isEqualTo(100L); } @Test public void testSizeAndTruncate() throws IOException { - assertThat(fileChannel.size(), is(equalTo(3L))); + assertThat(fileChannel.size()).isEqualTo(3L); fileChannel.truncate(1L); - assertThat(fileChannel.size(), is(equalTo(1L))); + assertThat(fileChannel.size()).isEqualTo(1L); fileChannel.truncate(10L); - assertThat(fileChannel.size(), is(equalTo(1L))); - assertThat(fileChannel.position(), is(equalTo(0L))); + assertThat(fileChannel.size()).isEqualTo(1L); + assertThat(fileChannel.position()).isEqualTo(0L); } @Test @@ -172,32 +169,32 @@ public void testTransferFrom() throws IOException { src.write(ByteBuffer.wrap(new byte[] {10, 20, 30})); src.position(0L); fileChannel.position(0L); - assertThat(fileChannel.transferFrom(src, 0L, 3L), is(equalTo(3L))); - assertThat(src.position(), is(equalTo(3L))); + assertThat(fileChannel.transferFrom(src, 0L, 3L)).isEqualTo(3L); + assertThat(src.position()).isEqualTo(3L); - assertThat(data.get(0), is(equalTo((byte) 10))); - assertThat(data.get(1), is(equalTo((byte) 20))); - assertThat(data.get(2), is(equalTo((byte) 30))); + assertThat(data.get(0)).isEqualTo((byte) 10); + assertThat(data.get(1)).isEqualTo((byte) 20); + assertThat(data.get(2)).isEqualTo((byte) 30); } @Test public void testWriteOnPosition() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1); buffer.put((byte) 100).position(0); - assertThat(fileChannel.position(), is(equalTo(0L))); - assertThat(fileChannel.write(buffer, 0), is(equalTo(1))); - assertThat(data.get(0), is(equalTo((byte) 100))); + assertThat(fileChannel.position()).isEqualTo(0L); + assertThat(fileChannel.write(buffer, 0)).isEqualTo(1); + assertThat(data.get(0)).isEqualTo((byte) 100); } @Test public void testWriteBeyondEnd() throws IOException { fileChannel.position(3L); ByteBuffer src = ByteBuffer.wrap(new byte[] {10, 20, 30}); - assertThat(fileChannel.write(src), is(equalTo(3))); - assertThat(fileChannel.position(), is(equalTo(6L))); + assertThat(fileChannel.write(src)).isEqualTo(3); + assertThat(fileChannel.position()).isEqualTo(6L); fileChannel.position(3L); - assertThat(data.get(3), is(equalTo((byte) 10))); - assertThat(data.get(4), is(equalTo((byte) 20))); - assertThat(data.get(5), is(equalTo((byte) 30))); + assertThat(data.get(3)).isEqualTo((byte) 10); + assertThat(data.get(4)).isEqualTo((byte) 20); + assertThat(data.get(5)).isEqualTo((byte) 30); } } diff --git a/pom.xml b/pom.xml index b004ae8b..839045b3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-nio-parent pom - 0.123.18 + 0.123.19 Storage Parent https://github.com/googleapis/java-storage-nio @@ -14,7 +14,7 @@ com.google.cloud google-cloud-shared-config - 1.2.4 + 1.2.6 @@ -70,7 +70,7 @@ com.google.cloud google-cloud-shared-dependencies - 2.6.0 + 2.7.0 pom import @@ -78,7 +78,7 @@ com.google.cloud google-cloud-storage - 2.2.2 + 2.3.0 com.google.apis diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index e24e10c9..12784faf 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-nio - 0.123.17 + 0.123.18 @@ -53,7 +53,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.2.0 + 3.3.0 add-snippets-source diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index e930834c..2ff7bf5b 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,7 @@ com.google.cloud google-cloud-nio - 0.123.18 + 0.123.19 @@ -52,7 +52,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.2.0 + 3.3.0 add-snippets-source diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 917f86e1..1790b3cc 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -30,7 +30,7 @@ com.google.cloud libraries-bom - 24.1.2 + 24.2.0 pom import diff --git a/versions.txt b/versions.txt index 7210fd27..a87b0439 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -google-cloud-nio:0.123.18:0.123.18 \ No newline at end of file +google-cloud-nio:0.123.19:0.123.19 \ No newline at end of file