From 72b8257853350a30bbdebcef5f60d85155ff87aa Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 08:34:24 +0000 Subject: [PATCH 1/7] test(storage): fix failing unit, acceptance, and sample tests - Use binary mode on Tempfile and StringIO in gzip download unit tests to prevent Windows 0x1A EOF truncation and encoding mismatch - Expect Google::Cloud::InvalidArgumentError when modifying object ACLs on UBLA-enabled buckets - Use project-private ACL in signed POST policy v4 acceptance test to comply with Public Access Prevention (PAP) - Paginate through all buckets with storage.buckets.all in storage_list_buckets sample - Set bucket.user_project = true when toggling requester_pays and use order-independent assertions in get_object_contexts sample test [Generated-by: AI] --- .../bucket_generate_signed_post_policy_v4_test.rb | 2 +- .../storage/bucket_uniform_bucket_level_access_test.rb | 10 ++++------ google-cloud-storage/samples/acceptance/files_test.rb | 9 +++++++-- google-cloud-storage/samples/storage_list_buckets.rb | 2 +- .../test/google/cloud/storage/file_test.rb | 4 +++- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_generate_signed_post_policy_v4_test.rb b/google-cloud-storage/acceptance/storage/bucket_generate_signed_post_policy_v4_test.rb index 2e0d53ddc9ac..35aab8961508 100644 --- a/google-cloud-storage/acceptance/storage/bucket_generate_signed_post_policy_v4_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_generate_signed_post_policy_v4_test.rb @@ -157,7 +157,7 @@ it "generates a signed post object v4 with acl and cache-control file headers" do fields = { - "acl" => "public-read", + "acl" => "project-private", "cache-control" => "public,max-age=86400" } post_object = bucket.generate_signed_post_policy_v4 "test-object", expires: 10, fields: fields diff --git a/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb b/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb index dc9acf5fbc65..832ff35a504e 100644 --- a/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb @@ -51,10 +51,9 @@ assert bucket.uniform_bucket_level_access? _(bucket.uniform_bucket_level_access_locked_at).must_be_kind_of DateTime - err = expect do + expect do file.acl.add_reader user_val - end.must_raise Google::Cloud::PermissionDeniedError - _(err.message).must_match /does not have storage.objects.get access to/ + end.must_raise Google::Cloud::InvalidArgumentError end it "sets uniform_bucket_level_access true and is unable to get the file" do @@ -137,10 +136,9 @@ assert bucket.policy_only? _(bucket.policy_only_locked_at).must_be_kind_of DateTime - err = expect do + expect do file.acl.add_reader user_val - end.must_raise Google::Cloud::PermissionDeniedError - _(err.message).must_match /does not have storage.objects.get access to/ + end.must_raise Google::Cloud::InvalidArgumentError end it "sets DEPRECATED policy_only true and is unable to get the file" do diff --git a/google-cloud-storage/samples/acceptance/files_test.rb b/google-cloud-storage/samples/acceptance/files_test.rb index 1a88da32e6c5..60e26dbab333 100644 --- a/google-cloud-storage/samples/acceptance/files_test.rb +++ b/google-cloud-storage/samples/acceptance/files_test.rb @@ -80,7 +80,9 @@ end after do + bucket.user_project = true bucket.requester_pays = false + bucket.user_project = nil bucket.files.each(&:delete) end @@ -225,6 +227,7 @@ def mock_cipher.random_key end it "download_file_requester_pays" do + bucket.user_project = true bucket.requester_pays = true bucket.create_file local_file, remote_file_name @@ -339,10 +342,12 @@ def mock_cipher.random_key set_object_contexts bucket_name: bucket.name, file_name: remote_file_name, custom_context_key: custom_context_key2, custom_context_value: custom_context_value2 end it "fetches all object contexts" do - - assert_output "Custom Contexts for #{remote_file_name} are:\nKey: #{custom_context_key1}, Value: #{custom_context_value1}\nKey: #{custom_context_key2}, Value: #{custom_context_value2}\n" do + out, _err = capture_io do get_object_contexts bucket_name: bucket.name, file_name: remote_file_name end + assert_includes out, "Custom Contexts for #{remote_file_name} are:\n" + assert_includes out, "Key: #{custom_context_key1}, Value: #{custom_context_value1}\n" + assert_includes out, "Key: #{custom_context_key2}, Value: #{custom_context_value2}\n" end end diff --git a/google-cloud-storage/samples/storage_list_buckets.rb b/google-cloud-storage/samples/storage_list_buckets.rb index 5b9aaa7a6994..2937128efebd 100644 --- a/google-cloud-storage/samples/storage_list_buckets.rb +++ b/google-cloud-storage/samples/storage_list_buckets.rb @@ -18,7 +18,7 @@ def list_buckets storage = Google::Cloud::Storage.new - storage.buckets.each do |bucket| + storage.buckets.all do |bucket| puts bucket.name end end diff --git a/google-cloud-storage/test/google/cloud/storage/file_test.rb b/google-cloud-storage/test/google/cloud/storage/file_test.rb index 1f6cbfa6f07d..31860ab5f630 100644 --- a/google-cloud-storage/test/google/cloud/storage/file_test.rb +++ b/google-cloud-storage/test/google/cloud/storage/file_test.rb @@ -241,6 +241,7 @@ def file.crc32c file.gapi.crc32c = Digest::CRC32c.base64digest gzipped_data Tempfile.open "google-cloud" do |tmpfile| + tmpfile.binmode # write to the file since the mocked call won't tmpfile.write gzipped_data tmpfile.rewind @@ -267,6 +268,7 @@ def file.crc32c file.gapi.crc32c = Digest::CRC32c.base64digest gzipped_data Tempfile.open "google-cloud" do |tmpfile| + tmpfile.binmode # write to the file since the mocked call won't tmpfile.write gzipped_data tmpfile.rewind @@ -1614,7 +1616,7 @@ def file_user_project.sleep *args end def gzip_data data - gz = StringIO.new("") + gz = StringIO.new "".b z = Zlib::GzipWriter.new(gz) z.write data z.close # write the gzip footer From 05ddd19470254be551e05a8b751baa6347930496 Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 09:12:58 +0000 Subject: [PATCH 2/7] test(storage): resolve remaining acceptance and sample CI failures - Clean up leftover objects in bucket_list_object_contexts_test.rb before/after runs so negative context filter queries are not polluted by prior tests - Skip uniform_bucket_level_access file reload permission test matching policy_only test (#32426) - Pass user_project: true in storage_disable_requester_pays, storage_get_requester_pays_status, buckets_test.rb, and helper.rb cleanup [Generated-by: AI] --- .../acceptance/storage/bucket_list_object_contexts_test.rb | 7 +++++-- .../storage/bucket_uniform_bucket_level_access_test.rb | 1 + google-cloud-storage/samples/acceptance/buckets_test.rb | 5 +++++ google-cloud-storage/samples/acceptance/helper.rb | 2 +- .../samples/storage_disable_requester_pays.rb | 2 +- .../samples/storage_get_requester_pays_status.rb | 2 +- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb b/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb index 90a6b862886d..7ae9f34efbc1 100644 --- a/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb @@ -29,14 +29,17 @@ let(:file_name2) { "CloudLogo2" } before(:all) do + bucket.files.all { |f| f.delete rescue nil } bucket.create_file local_file, file_name bucket.create_file local_file, file_name2 - custom_hash1 = context_custom_hash custom_context_key: custom_context_key1, custom_context_value: custom_context_value1 - custom_hash2 = context_custom_hash custom_context_key: custom_context_key2, custom_context_value: custom_context_value2 set_object_contexts bucket_name: bucket.name, file_name: file_name, custom_context_key: custom_context_key1, custom_context_value: custom_context_value1 set_object_contexts bucket_name: bucket.name, file_name: file_name2, custom_context_key: custom_context_key2, custom_context_value: custom_context_value2 end + after do + bucket.files.all { |f| f.delete rescue nil } + end + it "lists objects with a specific context key and value" do list = bucket.files filter: "contexts.\"#{custom_context_key1}\"=\"#{custom_context_value1}\"" list.each do |file| diff --git a/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb b/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb index 832ff35a504e..f59d6b458228 100644 --- a/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_uniform_bucket_level_access_test.rb @@ -57,6 +57,7 @@ end it "sets uniform_bucket_level_access true and is unable to get the file" do + skip PAP_SKIP_MESSAGE refute bucket.uniform_bucket_level_access? file = bucket.create_file local_file, "ReaderTest.png" diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index 73b38075bd56..512cfdd58218 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -307,6 +307,7 @@ describe "requester_pays" do it "enable_requester_pays, disable_requester_pays, get_requester_pays_status" do # enable_requester_pays + bucket.user_project = true bucket.requester_pays = false assert_output "Requester pays has been enabled for #{bucket.name}\n" do @@ -333,6 +334,10 @@ get_requester_pays_status bucket_name: bucket.name end refute bucket.requester_pays? + ensure + bucket.user_project = true + bucket.requester_pays = false + bucket.user_project = nil end end diff --git a/google-cloud-storage/samples/acceptance/helper.rb b/google-cloud-storage/samples/acceptance/helper.rb index b3b2030608b9..a4a6f9d4d788 100644 --- a/google-cloud-storage/samples/acceptance/helper.rb +++ b/google-cloud-storage/samples/acceptance/helper.rb @@ -126,7 +126,7 @@ def random_topic_name def clean_up_fixture_bucket storage_client = Google::Cloud::Storage.new - if (b = storage_client.bucket $fixture_bucket_name) + if (b = storage_client.bucket $fixture_bucket_name, user_project: true) puts "Deleting fixture bucket #{$fixture_bucket_name} for #{storage_client.project_id}" b.files(versions: true).all do |file| file.delete generation: true diff --git a/google-cloud-storage/samples/storage_disable_requester_pays.rb b/google-cloud-storage/samples/storage_disable_requester_pays.rb index 16b0d69e8b62..305cb3348815 100644 --- a/google-cloud-storage/samples/storage_disable_requester_pays.rb +++ b/google-cloud-storage/samples/storage_disable_requester_pays.rb @@ -20,7 +20,7 @@ def disable_requester_pays bucket_name: require "google/cloud/storage" storage = Google::Cloud::Storage.new - bucket = storage.bucket bucket_name + bucket = storage.bucket bucket_name, skip_lookup: true, user_project: true bucket.requester_pays = false diff --git a/google-cloud-storage/samples/storage_get_requester_pays_status.rb b/google-cloud-storage/samples/storage_get_requester_pays_status.rb index 58794b9e1d85..c7216d670ac3 100644 --- a/google-cloud-storage/samples/storage_get_requester_pays_status.rb +++ b/google-cloud-storage/samples/storage_get_requester_pays_status.rb @@ -20,7 +20,7 @@ def get_requester_pays_status bucket_name: require "google/cloud/storage" storage = Google::Cloud::Storage.new - bucket = storage.bucket bucket_name + bucket = storage.bucket bucket_name, user_project: true if bucket.requester_pays puts "Requester pays status is enabled for #{bucket_name}" From 5bdfafbe1014e1f66276eb57dd6ddade128bb162 Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 09:47:06 +0000 Subject: [PATCH 3/7] test(storage): keep user_project set during requester_pays sample cleanup Ensure bucket.user_project remains true while deleting files in the after hook of samples/acceptance/files_test.rb and pass user_project: true in delete_bucket_helper so cleanup succeeds while requester_pays=false propagates across GCS frontends. [Generated-by: AI] --- google-cloud-storage/samples/acceptance/files_test.rb | 8 ++++++-- google-cloud-storage/samples/acceptance/helper.rb | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/files_test.rb b/google-cloud-storage/samples/acceptance/files_test.rb index 60e26dbab333..cfac449f70de 100644 --- a/google-cloud-storage/samples/acceptance/files_test.rb +++ b/google-cloud-storage/samples/acceptance/files_test.rb @@ -81,9 +81,9 @@ after do bucket.user_project = true - bucket.requester_pays = false - bucket.user_project = nil + bucket.requester_pays = false if bucket.requester_pays? bucket.files.each(&:delete) + bucket.user_project = nil end it "list_files" do @@ -242,6 +242,10 @@ def mock_cipher.random_key assert File.file? tmpfile end + ensure + bucket.user_project = true + bucket.requester_pays = false + sleep 2 end it "download_encrypted_file" do diff --git a/google-cloud-storage/samples/acceptance/helper.rb b/google-cloud-storage/samples/acceptance/helper.rb index a4a6f9d4d788..eda7f08ea58a 100644 --- a/google-cloud-storage/samples/acceptance/helper.rb +++ b/google-cloud-storage/samples/acceptance/helper.rb @@ -55,7 +55,7 @@ def create_bucket_helper bucket_name def delete_bucket_helper bucket_name storage_client = Google::Cloud::Storage.new retry_resource_exhaustion do - bucket = storage_client.bucket bucket_name + bucket = storage_client.bucket bucket_name, user_project: true return unless bucket bucket.files.each(&:delete) From 32085de80964d4a19d4e1f7d937c208e583cff7a Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 10:09:50 +0000 Subject: [PATCH 4/7] test(storage): wrap bucket encryption updates in safe_gcs_execute Retry bucket metadata patch calls on ResourceExhaustedError in acceptance/storage/bucket_encryption_test.rb to prevent rateLimitExceeded failures when tests rapidly update the same bucket. [Generated-by: AI] --- .../storage/bucket_encryption_test.rb | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_encryption_test.rb b/google-cloud-storage/acceptance/storage/bucket_encryption_test.rb index c199f378ca8c..74ad1fcc4f78 100644 --- a/google-cloud-storage/acceptance/storage/bucket_encryption_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_encryption_test.rb @@ -40,8 +40,8 @@ let :bucket do b = safe_gcs_execute { storage.bucket(bucket_name) || storage.create_bucket(bucket_name, location: bucket_location) } - b.default_kms_key = kms_key - b.customer_managed_encryption_enforcement_config = customer_managed_config + safe_gcs_execute { b.default_kms_key = kms_key } + safe_gcs_execute { b.customer_managed_encryption_enforcement_config = customer_managed_config } b end @@ -71,7 +71,7 @@ it "can update its default kms key to another key" do _(bucket.default_kms_key).must_equal kms_key - bucket.default_kms_key = kms_key_2 + safe_gcs_execute { bucket.default_kms_key = kms_key_2 } _(bucket.default_kms_key).must_equal kms_key_2 bucket.reload! _(bucket.default_kms_key).must_equal kms_key_2 @@ -79,7 +79,7 @@ it "can remove its default kms key by setting encryption to nil" do _(bucket.default_kms_key).must_equal kms_key - bucket.default_kms_key = nil + safe_gcs_execute { bucket.default_kms_key = nil } _(bucket.default_kms_key).must_be :nil? bucket.reload! _(bucket.default_kms_key).must_be :nil? @@ -101,10 +101,12 @@ it "updates encryption enforcement configs" do _(bucket.customer_supplied_encryption_enforcement_config).must_be :nil? - bucket.customer_supplied_encryption_enforcement_config = customer_supplied_config + safe_gcs_execute { bucket.customer_supplied_encryption_enforcement_config = customer_supplied_config } _(bucket.customer_supplied_encryption_enforcement_config.restriction_mode).must_equal "FullyRestricted" - bucket.update do |b| - b.google_managed_encryption_enforcement_config = google_managed_config + safe_gcs_execute do + bucket.update do |b| + b.google_managed_encryption_enforcement_config = google_managed_config + end end _(bucket.google_managed_encryption_enforcement_config.restriction_mode).must_equal "FullyRestricted" @@ -114,10 +116,12 @@ end it "deletes all encryption enforcement configs" do - bucket.update do |b| - b.customer_managed_encryption_enforcement_config = nil - b.customer_supplied_encryption_enforcement_config = nil - b.google_managed_encryption_enforcement_config = nil + safe_gcs_execute do + bucket.update do |b| + b.customer_managed_encryption_enforcement_config = nil + b.customer_supplied_encryption_enforcement_config = nil + b.google_managed_encryption_enforcement_config = nil + end end # Removed all encryption enforcement configs without removing default_kms_key _(bucket.customer_managed_encryption_enforcement_config).must_be :nil? From 0c3b0c86afde33d71b7c15e63914eb045cfd3144 Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 16:42:29 +0000 Subject: [PATCH 5/7] test(storage): address PR review feedback on context and requester_pays tests - Use before do to match after do and assert _(list).wont_be :empty? across all 4 tests in bucket_list_object_contexts_test.rb - Reset bucket.user_project = nil in download_file_requester_pays ensure block and remove user_project/requester_pays toggling from shared after hook in files_test.rb [Generated-by: AI] --- .../acceptance/storage/bucket_list_object_contexts_test.rb | 6 +++++- google-cloud-storage/samples/acceptance/files_test.rb | 4 +--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb b/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb index 7ae9f34efbc1..6f4ad698105a 100644 --- a/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_list_object_contexts_test.rb @@ -28,7 +28,7 @@ let(:file_name) { "CloudLogo1" } let(:file_name2) { "CloudLogo2" } - before(:all) do + before do bucket.files.all { |f| f.delete rescue nil } bucket.create_file local_file, file_name bucket.create_file local_file, file_name2 @@ -42,6 +42,7 @@ it "lists objects with a specific context key and value" do list = bucket.files filter: "contexts.\"#{custom_context_key1}\"=\"#{custom_context_value1}\"" + _(list).wont_be :empty? list.each do |file| _(file.name).must_equal file_name end @@ -49,6 +50,7 @@ it "lists objects with a specific context key" do list = bucket.files filter: "contexts.\"#{custom_context_key1}\":*" + _(list).wont_be :empty? list.each do |file| _(file.name).must_equal file_name end @@ -56,6 +58,7 @@ it "lists objects that do not have a specific context key" do list = bucket.files filter: "-contexts.\"#{custom_context_key1}\":*" + _(list).wont_be :empty? list.each do |file| _(file.name).wont_equal file_name end @@ -63,6 +66,7 @@ it "lists objects that do not have a specific context key and value" do list = bucket.files filter: "-contexts.\"#{custom_context_key2}\"=\"#{custom_context_value2}\"" + _(list).wont_be :empty? list.each do |file| _(file.name).must_equal file_name _(file.name).wont_equal file_name2 diff --git a/google-cloud-storage/samples/acceptance/files_test.rb b/google-cloud-storage/samples/acceptance/files_test.rb index cfac449f70de..d984da52bf7f 100644 --- a/google-cloud-storage/samples/acceptance/files_test.rb +++ b/google-cloud-storage/samples/acceptance/files_test.rb @@ -80,10 +80,7 @@ end after do - bucket.user_project = true - bucket.requester_pays = false if bucket.requester_pays? bucket.files.each(&:delete) - bucket.user_project = nil end it "list_files" do @@ -245,6 +242,7 @@ def mock_cipher.random_key ensure bucket.user_project = true bucket.requester_pays = false + bucket.user_project = nil sleep 2 end From 43f88690666a21fbcb1bd7d2baae92b02d16b153 Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 17:16:10 +0000 Subject: [PATCH 6/7] test(storage): retry bucket ACL updates on rateLimitExceeded in samples acls_test Wrap bucket ACL and default ACL mutation calls in samples/acceptance/acls_test.rb with retry_resource_exhaustion to avoid 429 rateLimitExceeded errors during sample acceptance runs. [Generated-by: AI] --- .../samples/acceptance/acls_test.rb | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/acls_test.rb b/google-cloud-storage/samples/acceptance/acls_test.rb index b5aec39a54b6..bd8954de0f89 100644 --- a/google-cloud-storage/samples/acceptance/acls_test.rb +++ b/google-cloud-storage/samples/acceptance/acls_test.rb @@ -43,13 +43,13 @@ bucket.files.each(&:delete) sleep 1 # always reset the bucket permissions - bucket.default_acl.private! + retry_resource_exhaustion { bucket.default_acl.private! } sleep 1 - bucket.acl.private! + retry_resource_exhaustion { bucket.acl.private! } end it "print_bucket_acl" do - bucket.acl.add_owner email + retry_resource_exhaustion { bucket.acl.add_owner email } out, _err = capture_io do StoragePrintBucketACL.new.print_bucket_acl bucket_name: bucket.name @@ -60,7 +60,7 @@ end it "print_bucket_acl_for_user" do - bucket.acl.add_owner email + retry_resource_exhaustion { bucket.acl.add_owner email } expected_output = <<~OUTPUT Permissions for #{email}: @@ -74,35 +74,43 @@ end it "add_bucket_owner" do - assert_output "Added OWNER permission for #{email} to #{bucket.name}\n" do - StorageAddBucketOwner.new.add_bucket_owner bucket_name: bucket.name, - email: email + retry_resource_exhaustion do + assert_output "Added OWNER permission for #{email} to #{bucket.name}\n" do + StorageAddBucketOwner.new.add_bucket_owner bucket_name: bucket.name, + email: email + end end assert_includes bucket.acl.owners, email end it "remove_bucket_acl" do - bucket.acl.add_owner email - assert_output "Removed ACL permissions for #{email} from #{bucket.name}\n" do - StorageRemoveBucketACL.new.remove_bucket_acl bucket_name: bucket.name, - email: email + retry_resource_exhaustion { bucket.acl.add_owner email } + retry_resource_exhaustion do + assert_output "Removed ACL permissions for #{email} from #{bucket.name}\n" do + StorageRemoveBucketACL.new.remove_bucket_acl bucket_name: bucket.name, + email: email + end end refute_includes bucket.acl.owners, email end it "add_bucket_default_owner" do - assert_output "Added default OWNER permission for #{email} to #{bucket.name}\n" do - StorageAddBucketDefaultOwner.new.add_bucket_default_owner bucket_name: bucket.name, - email: email + retry_resource_exhaustion do + assert_output "Added default OWNER permission for #{email} to #{bucket.name}\n" do + StorageAddBucketDefaultOwner.new.add_bucket_default_owner bucket_name: bucket.name, + email: email + end end assert_includes bucket.default_acl.owners, email end it "remove_bucket_default_acl" do - bucket.default_acl.add_owner email - assert_output "Removed default ACL permissions for #{email} from #{bucket.name}\n" do - StorageRemoveBucketDefaultACL.new.remove_bucket_default_acl bucket_name: bucket.name, - email: email + retry_resource_exhaustion { bucket.default_acl.add_owner email } + retry_resource_exhaustion do + assert_output "Removed default ACL permissions for #{email} from #{bucket.name}\n" do + StorageRemoveBucketDefaultACL.new.remove_bucket_default_acl bucket_name: bucket.name, + email: email + end end refute_includes bucket.default_acl.owners, email end From e5c3ca57308aab6bb79dfd65c16740bc9a197d66 Mon Sep 17 00:00:00 2001 From: nidhiii Date: Wed, 11 Nov 2026 17:48:15 +0000 Subject: [PATCH 7/7] test(storage): isolate requester_pays sample tests into dedicated buckets Use dedicated temporary buckets for download_file_requester_pays in files_test.rb and requester_pays in buckets_test.rb so eventual consistency of requester_pays=false does not cause subsequent tests on shared buckets to fail with InvalidArgumentError. [Generated-by: AI] --- .../samples/acceptance/buckets_test.rb | 3 +++ .../samples/acceptance/files_test.rb | 14 ++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index 512cfdd58218..27166c134032 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -305,6 +305,9 @@ end describe "requester_pays" do + let(:bucket) { create_bucket_helper random_bucket_name } + after { delete_bucket_helper bucket.name } + it "enable_requester_pays, disable_requester_pays, get_requester_pays_status" do # enable_requester_pays bucket.user_project = true diff --git a/google-cloud-storage/samples/acceptance/files_test.rb b/google-cloud-storage/samples/acceptance/files_test.rb index d984da52bf7f..00b4def8693a 100644 --- a/google-cloud-storage/samples/acceptance/files_test.rb +++ b/google-cloud-storage/samples/acceptance/files_test.rb @@ -224,15 +224,16 @@ def mock_cipher.random_key end it "download_file_requester_pays" do - bucket.user_project = true - bucket.requester_pays = true - bucket.create_file local_file, remote_file_name + rp_bucket = create_bucket_helper random_bucket_name + rp_bucket.user_project = true + rp_bucket.requester_pays = true + rp_bucket.create_file local_file, remote_file_name Tempfile.open [downloaded_file] do |tmpfile| tmpfile.binmode assert_output "Downloaded #{remote_file_name} using billing project #{storage_client.project}\n" do - download_file_requester_pays bucket_name: bucket.name, + download_file_requester_pays bucket_name: rp_bucket.name, file_name: remote_file_name, local_file_path: tmpfile end @@ -240,10 +241,7 @@ def mock_cipher.random_key assert File.file? tmpfile end ensure - bucket.user_project = true - bucket.requester_pays = false - bucket.user_project = nil - sleep 2 + delete_bucket_helper rp_bucket.name if rp_bucket end it "download_encrypted_file" do