diff --git a/README.md b/README.md
index 5f38caabf..f62c7fe81 100644
--- a/README.md
+++ b/README.md
@@ -49,20 +49,20 @@ 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:25.0.0')
+implementation platform('com.google.cloud:libraries-bom:25.1.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.5.1'
+implementation 'com.google.cloud:google-cloud-storage:2.6.0'
```
If you are using SBT, add this to your dependencies
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.5.1"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.6.0"
```
## Authentication
@@ -240,9 +240,11 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/
| Change Default Storage Class | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/ChangeDefaultStorageClass.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/ChangeDefaultStorageClass.java) |
| Configure Bucket Cors | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/ConfigureBucketCors.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/ConfigureBucketCors.java) |
| Create Bucket | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucket.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/CreateBucket.java) |
+| Create Bucket Pub Sub Notification | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketPubSubNotification.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketPubSubNotification.java) |
| Create Bucket With Storage Class And Location | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketWithStorageClassAndLocation.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketWithStorageClassAndLocation.java) |
| Create Bucket With Turbo Replication | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketWithTurboReplication.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketWithTurboReplication.java) |
| Delete Bucket | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucket.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucket.java) |
+| Delete Bucket Pub Sub Notification | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucketPubSubNotification.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucketPubSubNotification.java) |
| Disable Bucket Versioning | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/DisableBucketVersioning.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/DisableBucketVersioning.java) |
| Disable Default Event Based Hold | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/DisableDefaultEventBasedHold.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/DisableDefaultEventBasedHold.java) |
| Disable Lifecycle Management | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/DisableLifecycleManagement.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/DisableLifecycleManagement.java) |
@@ -262,10 +264,12 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/
| Get Uniform Bucket Level Access | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/GetUniformBucketLevelAccess.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/GetUniformBucketLevelAccess.java) |
| List Bucket Iam Members | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/ListBucketIamMembers.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/ListBucketIamMembers.java) |
| List Buckets | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/ListBuckets.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/ListBuckets.java) |
+| List Pub Sub Notifications | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/ListPubSubNotifications.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/ListPubSubNotifications.java) |
| Lock Retention Policy | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/LockRetentionPolicy.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/LockRetentionPolicy.java) |
| Make Bucket Public | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/MakeBucketPublic.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/MakeBucketPublic.java) |
| Print Bucket Acl | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/PrintBucketAcl.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/PrintBucketAcl.java) |
| Print Bucket Acl Filter By User | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/PrintBucketAclFilterByUser.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/PrintBucketAclFilterByUser.java) |
+| Print Pub Sub Notification | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/PrintPubSubNotification.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/PrintPubSubNotification.java) |
| Remove Bucket Cors | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/RemoveBucketCors.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/RemoveBucketCors.java) |
| Remove Bucket Default Kms Key | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/RemoveBucketDefaultKmsKey.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/RemoveBucketDefaultKmsKey.java) |
| Remove Bucket Default Owner | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/RemoveBucketDefaultOwner.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/RemoveBucketDefaultOwner.java) |
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 4ab5ccb9b..ca89a1579 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -58,6 +58,12 @@
4.5.13
test
+
+ com.google.cloud
+ google-cloud-pubsub
+ 1.116.2
+ test
+
diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml
index 36e2b626f..a2aee6e3e 100644
--- a/samples/native-image-sample/pom.xml
+++ b/samples/native-image-sample/pom.xml
@@ -58,6 +58,12 @@
1.1.3
test
+
+ com.google.cloud
+ google-cloud-pubsub
+ 1.116.2
+ test
+
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index b890f1baf..b8b167e46 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -49,6 +49,12 @@
4.5.13
test
+
+ com.google.cloud
+ google-cloud-pubsub
+ 1.116.2
+ test
+
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 54b99b747..060d827f6 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -69,5 +69,11 @@
4.5.13
test
+
+ com.google.cloud
+ google-cloud-pubsub
+ 1.106.0
+ test
+
diff --git a/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketPubSubNotification.java b/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketPubSubNotification.java
new file mode 100644
index 000000000..f68f0e2fa
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/storage/bucket/CreateBucketPubSubNotification.java
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+// [START storage_create_bucket_notifications]
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.NotificationInfo;
+import com.google.cloud.storage.NotificationInfo.EventType;
+import com.google.cloud.storage.NotificationInfo.PayloadFormat;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+import java.util.Map;
+
+public class CreateBucketPubSubNotification {
+
+ public static void createBucketPubSubNotification(
+ String bucketName,
+ String topicName,
+ Map customAttributes,
+ EventType[] eventTypes,
+ String objectNamePrefix,
+ PayloadFormat payloadFormat) {
+ // The ID to give your GCS bucket
+ // String bucketName = "your-unique-bucket-name";
+
+ // The name of the topic you would like to create a notification for
+ // String topicName = "projects/{your-project}/topics/{your-topic}";
+
+ // Any custom attributes
+ // Map customAttributes = Map.of("label", "value");
+
+ // The object name prefix for which this notification configuration applies
+ // String objectNamePrefix = "blob-";
+
+ // Desired content of the Payload
+ // PayloadFormat payloadFormat = PayloadFormat.JSON_API_V1.JSON_API_V1;
+
+ Storage storage = StorageOptions.newBuilder().build().getService();
+ NotificationInfo notificationInfo =
+ NotificationInfo.newBuilder(topicName)
+ .setCustomAttributes(customAttributes)
+ .setEventTypes(eventTypes)
+ .setObjectNamePrefix(objectNamePrefix)
+ .setPayloadFormat(payloadFormat)
+ .build();
+ Notification notification = storage.createNotification(bucketName, notificationInfo);
+ System.out.println("Successfully created notification for topic " + notification.getTopic());
+ }
+}
+// [END storage_create_bucket_notifications]
diff --git a/samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucketPubSubNotification.java b/samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucketPubSubNotification.java
new file mode 100644
index 000000000..dd59e2e18
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/storage/bucket/DeleteBucketPubSubNotification.java
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+// [START storage_delete_bucket_notification]
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+
+public class DeleteBucketPubSubNotification {
+
+ public static void deleteBucketPubSubNotification(String bucketName, String notificationId) {
+ // The ID to give your GCS bucket
+ // String bucketName = "your-unique-bucket-name";
+
+ // The NotificationId for the notification you would like to delete
+ // String notificationId = "your-unique-notification-id"
+
+ Storage storage = StorageOptions.newBuilder().build().getService();
+ boolean success = storage.deleteNotification(bucketName, notificationId);
+ if (success) {
+ System.out.println("Successfully deleted notification");
+ } else {
+ System.out.println("Failed to find notification");
+ }
+ }
+}
+// [END storage_delete_bucket_notification]
diff --git a/samples/snippets/src/main/java/com/example/storage/bucket/ListPubSubNotifications.java b/samples/snippets/src/main/java/com/example/storage/bucket/ListPubSubNotifications.java
new file mode 100644
index 000000000..b3fb614f8
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/storage/bucket/ListPubSubNotifications.java
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+// [START storage_list_bucket_notifications]
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+import java.util.List;
+
+public class ListPubSubNotifications {
+
+ public static void listPubSubNotifications(String bucketName) {
+ // The ID to give your GCS bucket
+ // String bucketName = "your-unique-bucket-name";
+
+ Storage storage = StorageOptions.newBuilder().build().getService();
+ List notificationList = storage.listNotifications(bucketName);
+ for (Notification notification : notificationList) {
+ System.out.println(
+ "Found notification " + notification.getTopic() + " for bucket " + bucketName);
+ }
+ }
+}
+// [END storage_list_bucket_notifications]
diff --git a/samples/snippets/src/main/java/com/example/storage/bucket/PrintPubSubNotification.java b/samples/snippets/src/main/java/com/example/storage/bucket/PrintPubSubNotification.java
new file mode 100644
index 000000000..083a0b551
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/storage/bucket/PrintPubSubNotification.java
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+// [START storage_print_pubsub_bucket_notification]
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+
+public class PrintPubSubNotification {
+
+ public static void printPubSubNotification(String bucketName, String notificationId) {
+ // The ID to give your GCS bucket
+ // String bucketName = "your-unique-bucket-name";
+
+ // The Pub/Sub topic you would like to find
+ // String notificationId = "your-unique-notification-id"
+
+ Storage storage = StorageOptions.newBuilder().build().getService();
+ Notification notification = storage.getNotification(bucketName, notificationId);
+ System.out.println(
+ "Found notification " + notification.getTopic() + " for bucket " + bucketName);
+ }
+}
+// [END storage_print_pubsub_bucket_notification]
diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java
new file mode 100644
index 000000000..bb28ec6db
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import com.example.storage.TestBase;
+import com.google.cloud.pubsub.v1.TopicAdminClient;
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.NotificationInfo.EventType;
+import com.google.common.collect.ImmutableMap;
+import com.google.iam.v1.Binding;
+import com.google.iam.v1.GetIamPolicyRequest;
+import com.google.iam.v1.SetIamPolicyRequest;
+import java.io.IOException;
+import java.util.Map;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CreateBucketPubSubNotificationTest extends TestBase {
+
+ private static final Notification.PayloadFormat PAYLOAD_FORMAT =
+ Notification.PayloadFormat.JSON_API_V1.JSON_API_V1;
+ private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1");
+ private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT");
+ private static final String TOPIC = String.format("projects/%s/topics/new-topic-create", PROJECT);
+ private static final String OBJECT_NAME_PREFIX = "index.html";
+ private static final EventType[] EVENT_TYPES = {
+ EventType.OBJECT_FINALIZE, EventType.OBJECT_METADATA_UPDATE
+ };
+ private static TopicAdminClient topicAdminClient;
+
+ @BeforeClass
+ public static void configureTopicAdminClient() throws IOException {
+ if (PROJECT != null) {
+ topicAdminClient = TopicAdminClient.create();
+ topicAdminClient.createTopic(TOPIC);
+ GetIamPolicyRequest getIamPolicyRequest =
+ GetIamPolicyRequest.newBuilder().setResource(TOPIC).build();
+ com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest);
+ Binding binding =
+ Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build();
+ SetIamPolicyRequest setIamPolicyRequest =
+ SetIamPolicyRequest.newBuilder()
+ .setResource(TOPIC)
+ .setPolicy(policy.toBuilder().addBindings(binding).build())
+ .build();
+ topicAdminClient.setIamPolicy(setIamPolicyRequest);
+ }
+ }
+
+ @AfterClass
+ public static void deleteTopicAndClient() {
+ /* Delete the Pub/Sub topic */
+ if (topicAdminClient != null) {
+ topicAdminClient.deleteTopic(TOPIC);
+ topicAdminClient.close();
+ }
+ }
+
+ @Test
+ public void testCreateBucketPubSubNotification() {
+ // Check that we can access project value and that topic admin client came up successfully
+ assertNotNull("Unable to determine project", PROJECT);
+ assertNotNull("Topic Admin Client did not start up", topicAdminClient);
+
+ com.example.storage.bucket.CreateBucketPubSubNotification.createBucketPubSubNotification(
+ bucketName, TOPIC, CUSTOM_ATTRIBUTES, EVENT_TYPES, OBJECT_NAME_PREFIX, PAYLOAD_FORMAT);
+ assertThat(stdOut.getCapturedOutputAsUtf8String()).contains(TOPIC);
+ }
+}
diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java
new file mode 100644
index 000000000..e094f3346
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import com.example.storage.TestBase;
+import com.google.cloud.pubsub.v1.TopicAdminClient;
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.NotificationInfo;
+import com.google.common.collect.ImmutableMap;
+import com.google.iam.v1.Binding;
+import com.google.iam.v1.GetIamPolicyRequest;
+import com.google.iam.v1.SetIamPolicyRequest;
+import java.io.IOException;
+import java.util.Map;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class DeleteBucketPubSubNotificationTest extends TestBase {
+
+ private static final Notification.PayloadFormat PAYLOAD_FORMAT =
+ Notification.PayloadFormat.JSON_API_V1.JSON_API_V1;
+ private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1");
+ private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT");
+ private static final String TOPIC = String.format("projects/%s/topics/new-topic-delete", PROJECT);
+ private static TopicAdminClient topicAdminClient;
+ private static final NotificationInfo notificationInfo =
+ NotificationInfo.newBuilder(TOPIC)
+ .setCustomAttributes(CUSTOM_ATTRIBUTES)
+ .setPayloadFormat(PAYLOAD_FORMAT)
+ .build();
+
+ @BeforeClass
+ public static void configureTopicAdminClient() throws IOException {
+ if (PROJECT != null) {
+ topicAdminClient = TopicAdminClient.create();
+ topicAdminClient.createTopic(TOPIC);
+ GetIamPolicyRequest getIamPolicyRequest =
+ GetIamPolicyRequest.newBuilder().setResource(TOPIC).build();
+ com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest);
+ Binding binding =
+ Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build();
+ SetIamPolicyRequest setIamPolicyRequest =
+ SetIamPolicyRequest.newBuilder()
+ .setResource(TOPIC)
+ .setPolicy(policy.toBuilder().addBindings(binding).build())
+ .build();
+ topicAdminClient.setIamPolicy(setIamPolicyRequest);
+ }
+ }
+
+ @AfterClass
+ public static void deleteTopicAndClient() {
+ /* Delete the Pub/Sub topic */
+ if (topicAdminClient != null) {
+ topicAdminClient.deleteTopic(TOPIC);
+ topicAdminClient.close();
+ }
+ }
+
+ @Test
+ public void testDeleteBucketPubSubNotification() {
+ // Check that we can access project value and that topic admin client came up successfully
+ assertNotNull("Unable to determine project", PROJECT);
+ assertNotNull("Topic Admin Client did not start up", topicAdminClient);
+
+ Notification notification = storage.createNotification(bucketName, notificationInfo);
+ com.example.storage.bucket.DeleteBucketPubSubNotification.deleteBucketPubSubNotification(
+ bucketName, notification.getNotificationId());
+ assertThat(stdOut.getCapturedOutputAsUtf8String())
+ .contains("Successfully deleted notification");
+ }
+
+ @Test
+ public void testNotificationNotFound() {
+ // Check that we can access project value and that topic admin client came up successfully
+ assertNotNull("Unable to determine project", PROJECT);
+ assertNotNull("Topic Admin Client did not start up", topicAdminClient);
+ Notification notification = storage.createNotification(bucketName, notificationInfo);
+ // Do a delete first.
+ storage.deleteNotification(bucketName, notification.getNotificationId());
+ // Now try to delete again.
+ com.example.storage.bucket.DeleteBucketPubSubNotification.deleteBucketPubSubNotification(
+ bucketName, notification.getNotificationId());
+ assertThat(stdOut.getCapturedOutputAsUtf8String()).contains("Failed to find notification");
+ }
+}
diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java
new file mode 100644
index 000000000..c7dee8547
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import com.example.storage.TestBase;
+import com.google.cloud.pubsub.v1.TopicAdminClient;
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.NotificationInfo;
+import com.google.common.collect.ImmutableMap;
+import com.google.iam.v1.Binding;
+import com.google.iam.v1.GetIamPolicyRequest;
+import com.google.iam.v1.SetIamPolicyRequest;
+import java.io.IOException;
+import java.util.Map;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ListPubSubNotificationsTest extends TestBase {
+
+ private static final Notification.PayloadFormat PAYLOAD_FORMAT =
+ Notification.PayloadFormat.JSON_API_V1.JSON_API_V1;
+ private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1");
+ private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT");
+ private static final String TOPIC = String.format("projects/%s/topics/new-topic-list", PROJECT);
+ private static TopicAdminClient topicAdminClient;
+
+ @BeforeClass
+ public static void configureTopicAdminClient() throws IOException {
+ if (PROJECT != null) {
+ topicAdminClient = TopicAdminClient.create();
+ topicAdminClient.createTopic(TOPIC);
+ GetIamPolicyRequest getIamPolicyRequest =
+ GetIamPolicyRequest.newBuilder().setResource(TOPIC).build();
+ com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest);
+ Binding binding =
+ Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build();
+ SetIamPolicyRequest setIamPolicyRequest =
+ SetIamPolicyRequest.newBuilder()
+ .setResource(TOPIC)
+ .setPolicy(policy.toBuilder().addBindings(binding).build())
+ .build();
+ topicAdminClient.setIamPolicy(setIamPolicyRequest);
+ }
+ }
+
+ @AfterClass
+ public static void deleteTopicAndClient() {
+ /* Delete the Pub/Sub topic */
+ if (topicAdminClient != null) {
+ topicAdminClient.deleteTopic(TOPIC);
+ topicAdminClient.close();
+ }
+ }
+
+ @Test
+ public void testListBucketPubSubNotification() {
+ // Check that we can access project value and that topic admin client came up successfully
+ assertNotNull("Unable to determine project", PROJECT);
+ assertNotNull("Topic Admin Client did not start up", topicAdminClient);
+
+ NotificationInfo notificationInfo =
+ NotificationInfo.newBuilder(TOPIC)
+ .setCustomAttributes(CUSTOM_ATTRIBUTES)
+ .setPayloadFormat(PAYLOAD_FORMAT)
+ .build();
+ storage.createNotification(bucketName, notificationInfo);
+ ListPubSubNotifications.listPubSubNotifications(bucketName);
+ assertThat(stdOut.getCapturedOutputAsUtf8String()).contains(TOPIC);
+ }
+}
diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java
new file mode 100644
index 000000000..05526675f
--- /dev/null
+++ b/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+package com.example.storage.bucket;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertNotNull;
+
+import com.example.storage.TestBase;
+import com.google.cloud.pubsub.v1.TopicAdminClient;
+import com.google.cloud.storage.Notification;
+import com.google.cloud.storage.NotificationInfo;
+import com.google.common.collect.ImmutableMap;
+import com.google.iam.v1.Binding;
+import com.google.iam.v1.GetIamPolicyRequest;
+import com.google.iam.v1.SetIamPolicyRequest;
+import java.io.IOException;
+import java.util.Map;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class PrintPubSubNotificationTest extends TestBase {
+
+ private static final Notification.PayloadFormat PAYLOAD_FORMAT =
+ Notification.PayloadFormat.JSON_API_V1.JSON_API_V1;
+ private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1");
+ private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT");
+ private static final String TOPIC = String.format("projects/%s/topics/new-topic-print", PROJECT);
+ private static TopicAdminClient topicAdminClient;
+
+ @BeforeClass
+ public static void configureTopicAdminClient() throws IOException {
+ if (PROJECT != null) {
+ topicAdminClient = TopicAdminClient.create();
+ topicAdminClient.createTopic(TOPIC);
+ GetIamPolicyRequest getIamPolicyRequest =
+ GetIamPolicyRequest.newBuilder().setResource(TOPIC).build();
+ com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest);
+ Binding binding =
+ Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build();
+ SetIamPolicyRequest setIamPolicyRequest =
+ SetIamPolicyRequest.newBuilder()
+ .setResource(TOPIC)
+ .setPolicy(policy.toBuilder().addBindings(binding).build())
+ .build();
+ topicAdminClient.setIamPolicy(setIamPolicyRequest);
+ }
+ }
+
+ @AfterClass
+ public static void deleteTopicAndClient() {
+ /* Delete the Pub/Sub topic */
+ if (topicAdminClient != null) {
+ topicAdminClient.deleteTopic(TOPIC);
+ topicAdminClient.close();
+ }
+ }
+
+ @Test
+ public void testPrintBucketPubSubNotification() {
+ // Check that we can access project value and that topic admin client came up successfully
+ assertNotNull("Unable to determine project", PROJECT);
+ assertNotNull("Topic Admin Client did not start up", topicAdminClient);
+
+ NotificationInfo notificationInfo =
+ NotificationInfo.newBuilder(TOPIC)
+ .setCustomAttributes(CUSTOM_ATTRIBUTES)
+ .setPayloadFormat(PAYLOAD_FORMAT)
+ .build();
+ Notification notification = storage.createNotification(bucketName, notificationInfo);
+ PrintPubSubNotification.printPubSubNotification(bucketName, notification.getNotificationId());
+ assertThat(stdOut.getCapturedOutputAsUtf8String()).contains(TOPIC);
+ }
+}