From 714da03d668107b0b0fa49a8b446ab951c840c63 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Wed, 5 Nov 2025 10:18:24 +0000 Subject: [PATCH 01/10] remove references to hns from test cases --- .../acceptance/storage/bucket_test.rb | 24 +++++++++++++++++++ .../lib/google/cloud/storage/bucket.rb | 2 +- .../samples/acceptance/buckets_test.rb | 17 ++++--------- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_test.rb b/google-cloud-storage/acceptance/storage/bucket_test.rb index ea99e617db26..efea75271e6b 100644 --- a/google-cloud-storage/acceptance/storage/bucket_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_test.rb @@ -385,4 +385,28 @@ _(storage.bucket(hns_bucket_name)).must_be :nil? end + + describe "storage move file" do + let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } + let(:destination_file) { "file_2_name_#{SecureRandom.hex}.txt" } + let :create_source_file do + file_content = "A" * (3 * 1024 * 1024) # 3 MB of 'A' characters + file = StringIO.new file_content + bucket.create_file file, source_file + end + it "moves a file for bucket" do + create_source_file + bucket.move_file source_file, destination_file + refute_nil(bucket.file(destination_file)) + assert_nil(bucket.file(source_file)) + end + + it "raises error if source and destination are having same filename" do + create_source_file + exception = assert_raises Google::Cloud::InvalidArgumentError do + bucket.move_file source_file, source_file + end + assert_equal "invalid: Source and destination object names must be different.", exception.message + end + end end diff --git a/google-cloud-storage/lib/google/cloud/storage/bucket.rb b/google-cloud-storage/lib/google/cloud/storage/bucket.rb index ca8461354bb7..1c935547c185 100644 --- a/google-cloud-storage/lib/google/cloud/storage/bucket.rb +++ b/google-cloud-storage/lib/google/cloud/storage/bucket.rb @@ -3144,7 +3144,7 @@ def reload! alias refresh! reload! ## - # Moves File from source to destination path within the same HNS-enabled bucket + # Moves File from source to destination path within the bucket. # This Operation is being performed at server side # @param [String] source_file The file name in existing bucket # @param [String] destination_file The new filename to be created on bucket diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index 7afc71d14415..84395b842516 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -586,32 +586,25 @@ describe "storage move file" do let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } let(:destination_file) { "file_2_name_#{SecureRandom.hex}.txt" } - let :hns_bucket do - hierarchical_namespace = Google::Apis::StorageV1::Bucket::HierarchicalNamespace.new enabled: true - storage_client.create_bucket random_bucket_name do |b| - b.uniform_bucket_level_access = true - b.hierarchical_namespace = hierarchical_namespace - end - end let :create_source_file do file_content = "A" * (3 * 1024 * 1024) # 3 MB of 'A' characters file = StringIO.new file_content - hns_bucket.create_file file, source_file + bucket.create_file file, source_file end it "file is moved and old file is deleted" do create_source_file out, _err = capture_io do - move_object bucket_name: hns_bucket.name, source_file_name: source_file, destination_file_name: destination_file + move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: destination_file end assert_includes out, "New File #{destination_file} created\n" - refute_nil(hns_bucket.file(destination_file)) - assert_nil(hns_bucket.file(source_file)) + refute_nil(bucket.file(destination_file)) + assert_nil(bucket.file(source_file)) end it "raises error if source and destination are having same filename" do create_source_file exception = assert_raises Google::Cloud::InvalidArgumentError do - move_object bucket_name: hns_bucket.name, source_file_name: source_file, destination_file_name: source_file + move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: source_file end assert_equal "invalid: Source and destination object names must be different.", exception.message end From a0ec97fd80ee2207200e6d1a68f182ea9868df53 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Wed, 5 Nov 2025 10:39:33 +0000 Subject: [PATCH 02/10] refactor --- google-cloud-storage/acceptance/storage/bucket_test.rb | 5 ++--- google-cloud-storage/samples/acceptance/buckets_test.rb | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_test.rb b/google-cloud-storage/acceptance/storage/bucket_test.rb index efea75271e6b..34cc9c962448 100644 --- a/google-cloud-storage/acceptance/storage/bucket_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_test.rb @@ -385,13 +385,12 @@ _(storage.bucket(hns_bucket_name)).must_be :nil? end - + describe "storage move file" do let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } let(:destination_file) { "file_2_name_#{SecureRandom.hex}.txt" } let :create_source_file do - file_content = "A" * (3 * 1024 * 1024) # 3 MB of 'A' characters - file = StringIO.new file_content + file = StringIO.new "" bucket.create_file file, source_file end it "moves a file for bucket" do diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index 84395b842516..8bd9949e005a 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -587,8 +587,7 @@ let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } let(:destination_file) { "file_2_name_#{SecureRandom.hex}.txt" } let :create_source_file do - file_content = "A" * (3 * 1024 * 1024) # 3 MB of 'A' characters - file = StringIO.new file_content + file = StringIO.new "" bucket.create_file file, source_file end it "file is moved and old file is deleted" do From 45199fcb639d18f8252835c9c2eb9d828b4e302b Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Wed, 5 Nov 2025 11:02:14 +0000 Subject: [PATCH 03/10] refactor --- google-cloud-storage/acceptance/storage/bucket_test.rb | 2 +- google-cloud-storage/samples/acceptance/buckets_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-storage/acceptance/storage/bucket_test.rb b/google-cloud-storage/acceptance/storage/bucket_test.rb index 34cc9c962448..722aa9d3f40e 100644 --- a/google-cloud-storage/acceptance/storage/bucket_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_test.rb @@ -390,7 +390,7 @@ let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } let(:destination_file) { "file_2_name_#{SecureRandom.hex}.txt" } let :create_source_file do - file = StringIO.new "" + file = StringIO.new "test" bucket.create_file file, source_file end it "moves a file for bucket" do diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index 8bd9949e005a..295fc0715440 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -587,7 +587,7 @@ let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } let(:destination_file) { "file_2_name_#{SecureRandom.hex}.txt" } let :create_source_file do - file = StringIO.new "" + file = StringIO.new "test" bucket.create_file file, source_file end it "file is moved and old file is deleted" do From 5c4dff3bf48779d84fd01232893382c07046db7a Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Thu, 20 Nov 2025 13:27:47 +0000 Subject: [PATCH 04/10] check permission --- .../samples/acceptance/buckets_test.rb | 1040 ++++++++--------- .../samples/storage_move_object.rb | 4 +- 2 files changed, 523 insertions(+), 521 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index 295fc0715440..d4760bc8025d 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -61,527 +61,527 @@ let(:retention_period) { rand 1..99 } let(:bucket) { fixture_bucket } - describe "bucket lifecycle" do - it "create_bucket, create_bucket_class_location, list_buckets, get_bucket_metadata, delete_bucket" do - # create_bucket - bucket_name = random_bucket_name - refute storage_client.bucket bucket_name - - retry_resource_exhaustion do - assert_output "Created bucket: #{bucket_name}\n" do - create_bucket bucket_name: bucket_name - end - end - - refute_nil storage_client.bucket bucket_name - - # create_bucket_class_location - - secondary_bucket_name = random_bucket_name - location = "ASIA" - storage_class = "COLDLINE" - refute storage_client.bucket secondary_bucket_name - - retry_resource_exhaustion do - assert_output "Created bucket #{secondary_bucket_name} in #{location} with #{storage_class} class\n" do - create_bucket_class_location bucket_name: secondary_bucket_name - end - end - - secondary_bucket = storage_client.bucket secondary_bucket_name - refute_nil secondary_bucket - assert_equal location, secondary_bucket.location - assert_equal storage_class, secondary_bucket.storage_class - - # list_buckets - out, _err = capture_io do - list_buckets - end - - assert_includes out, "ruby-storage-samples-" - - # get_bucket_metadata - out, _err = capture_io do - get_bucket_metadata bucket_name: bucket_name - end - - assert_includes out, bucket_name - - # delete_bucket - assert_output "Deleted bucket: #{bucket_name}\n" do - delete_bucket bucket_name: bucket_name - end - - - refute storage_client.bucket bucket_name - - delete_bucket_helper bucket_name - delete_bucket_helper secondary_bucket_name - end - end - - describe "storage_create_bucket_dual_region" do - it "creates dual region bucket" do - location = "US" - region_1 = "US-EAST1" - region_2 = "US-WEST1" - location_type = "dual-region" - bucket_name = random_bucket_name - refute storage_client.bucket bucket_name - - expected = "Bucket #{bucket_name} created:\n" - expected += "- location: #{location}\n" - expected += "- location_type: #{location_type}\n" - expected += "- custom_placement_config:\n" - expected += " - data_locations: #{[region_1, region_2]}\n" - - retry_resource_exhaustion do - assert_output expected do - StorageCreateBucketDualRegion.new.storage_create_bucket_dual_region bucket_name: bucket_name, - region_1: region_1, - region_2: region_2 - end - end - - refute_nil storage_client.bucket bucket_name - - delete_bucket_helper bucket_name - end - end - - describe "storage_create_bucket_hierarchical_namespace" do - it "creates hierarchical namespace enabled bucket" do - bucket_name = random_bucket_name - refute storage_client.bucket bucket_name - - expected = "Created bucket #{bucket_name} with Hierarchical Namespace enabled.\n" - - retry_resource_exhaustion do - assert_output expected do - create_bucket_hierarchical_namespace bucket_name: bucket_name - end - end - - refute_nil storage_client.bucket bucket_name - - delete_bucket_helper bucket_name - end - end - - describe "storage_create_bucket_with_object_retention" do - it "creates a bucket with object retention enabled." do - bucket_name = random_bucket_name - refute storage_client.bucket bucket_name - - expected = "Created bucket #{bucket_name} with object retention setting: Enabled\n" - - retry_resource_exhaustion do - assert_output expected do - create_bucket_with_object_retention bucket_name: bucket_name - end - end - - refute_nil storage_client.bucket bucket_name - - file_name = "test_object_retention" - - bucket = storage_client.bucket bucket_name - - out, _err = capture_io do - set_object_retention_policy bucket_name: bucket.name, - content: "hello world", - destination_file_name: file_name - end - - assert_includes out, "Retention policy for file #{file_name}" - - file = bucket.file file_name - file.retention = { - mode: nil, - retain_until_time: nil, - override_unlocked_retention: true - } - delete_bucket_helper bucket_name - end - end - - describe "autoclass" do - it "get_autoclass, set_autoclass" do - bucket_name = random_bucket_name - refute storage_client.bucket bucket_name - - storage_client.create_bucket bucket_name, autoclass_enabled: true - - assert_output(/autoclass config set to true./) do - get_autoclass bucket_name: bucket_name - end - - assert_output(/autoclass terminal storage class set to NEARLINE./) do - get_autoclass bucket_name: bucket_name - end - - assert_output(/autoclass terminal storage class set to ARCHIVE./) do - set_autoclass bucket_name: bucket_name, toggle: true, terminal_storage_class: "ARCHIVE" - end - - assert_output(/autoclass config set to false./) do - set_autoclass bucket_name: bucket_name, toggle: false - end - - delete_bucket_helper bucket_name - end - end - - describe "cors" do - it "cors_configuration, remove_cors_configuration" do - bucket.cors { |c| c.clear } - assert bucket.cors.empty? - - # cors_configuration - assert_output "Set CORS policies for bucket #{bucket.name}\n" do - cors_configuration bucket_name: bucket.name - end - - bucket.refresh! - assert_equal 1, bucket.cors.count - rule = bucket.cors.first - assert_equal ["*"], rule.origin - assert_equal ["PUT", "POST"], rule.methods - assert_equal ["Content-Type", "x-goog-resumable"], rule.headers - assert_equal 3600, rule.max_age - - # remove_cors_configuration - assert_output "Remove CORS policies for bucket #{bucket.name}\n" do - remove_cors_configuration bucket_name: bucket.name - end - bucket.refresh! - assert bucket.cors.empty? - end - end - - describe "requester_pays" do - it "enable_requester_pays, disable_requester_pays, get_requester_pays_status" do - # enable_requester_pays - bucket.requester_pays = false - - assert_output "Requester pays has been enabled for #{bucket.name}\n" do - enable_requester_pays bucket_name: bucket.name - end - bucket.refresh! - assert bucket.requester_pays? - - # get_requester_pays_status - assert_output "Requester pays status is enabled for #{bucket.name}\n" do - get_requester_pays_status bucket_name: bucket.name - end - assert bucket.requester_pays? - - # disable_requester_pays - assert_output "Requester pays has been disabled for #{bucket.name}\n" do - disable_requester_pays bucket_name: bucket.name - end - bucket.refresh! - refute bucket.requester_pays? - - # get_requester_pays_status - assert_output "Requester pays status is disabled for #{bucket.name}\n" do - get_requester_pays_status bucket_name: bucket.name - end - refute bucket.requester_pays? - end - end - - describe "uniform_bucket_level_access" do - it "enable_uniform_bucket_level_access, get_uniform_bucket_level_access, disable_uniform_bucket_level_access" do - # enable_uniform_bucket_level_access - bucket.uniform_bucket_level_access = false - - assert_output "Uniform bucket-level access was enabled for #{bucket.name}.\n" do - enable_uniform_bucket_level_access bucket_name: bucket.name - end - - bucket.refresh! - assert bucket.uniform_bucket_level_access? - - # get_uniform_bucket_level_access - assert_output "Uniform bucket-level access is enabled for #{bucket.name}.\nBucket " \ - "will be locked on #{bucket.uniform_bucket_level_access_locked_at}.\n" do - get_uniform_bucket_level_access bucket_name: bucket.name - end - assert bucket.uniform_bucket_level_access? - - # disable_uniform_bucket_level_access - assert_output "Uniform bucket-level access was disabled for #{bucket.name}.\n" do - disable_uniform_bucket_level_access bucket_name: bucket.name - end - - bucket.refresh! - refute bucket.uniform_bucket_level_access? - - # get_uniform_bucket_level_access - assert_output "Uniform bucket-level access is disabled for #{bucket.name}.\n" do - get_uniform_bucket_level_access bucket_name: bucket.name - end - refute bucket.uniform_bucket_level_access? - - bucket.uniform_bucket_level_access = false - end - end - - describe "default Cloud KMS encryption key" do - it "set_bucket_default_kms_key, bucket_delete_default_kms_key" do - refute bucket.default_kms_key + # describe "bucket lifecycle" do + # it "create_bucket, create_bucket_class_location, list_buckets, get_bucket_metadata, delete_bucket" do + # # create_bucket + # bucket_name = random_bucket_name + # refute storage_client.bucket bucket_name + + # retry_resource_exhaustion do + # assert_output "Created bucket: #{bucket_name}\n" do + # create_bucket bucket_name: bucket_name + # end + # end + + # refute_nil storage_client.bucket bucket_name + + # # create_bucket_class_location + + # secondary_bucket_name = random_bucket_name + # location = "ASIA" + # storage_class = "COLDLINE" + # refute storage_client.bucket secondary_bucket_name + + # retry_resource_exhaustion do + # assert_output "Created bucket #{secondary_bucket_name} in #{location} with #{storage_class} class\n" do + # create_bucket_class_location bucket_name: secondary_bucket_name + # end + # end - # set_bucket_default_kms_key - assert_output "Default KMS key for #{bucket.name} was set to #{kms_key}\n" do - set_bucket_default_kms_key bucket_name: bucket.name, - default_kms_key: kms_key - end - - bucket.refresh! - assert_equal bucket.default_kms_key, kms_key - - # bucket_delete_default_kms_key - assert_output "Default KMS key was removed from #{bucket.name}\n" do - bucket_delete_default_kms_key bucket_name: bucket.name - end - - bucket.refresh! - refute bucket.default_kms_key - end - end - - describe "get bucket class and location data" do - bucket_name = random_bucket_name - location = "US" - storage_class = "COLDLINE" - - it "get_bucket_class_and_location" do - storage_client.create_bucket bucket_name, - location: location, - storage_class: storage_class - expected_output = "Bucket #{bucket_name} storage class is " \ - "#{storage_class}, and the location is #{location}\n" - assert_output expected_output do - get_bucket_class_and_location bucket_name: bucket_name - end - end - end - - describe "labels" do - it "add_bucket_label, remove_bucket_label" do - # add_bucket_label - label_key = "label_key" - label_value = "label_value" - - assert_output "Added label #{label_key} with value #{label_value} to #{bucket.name}\n" do - add_bucket_label bucket_name: bucket.name, - label_value: label_value, - label_key: label_key - end - - bucket.refresh! - assert_equal bucket.labels[label_key], label_value - - # remove_bucket_label - assert_output "Deleted label #{label_key} from #{bucket.name}\n" do - remove_bucket_label bucket_name: bucket.name, - label_key: label_key - end - - bucket.refresh! - assert bucket.labels[label_key].empty? - end - end - - describe "lifecycle management" do - let(:bucket) { create_bucket_helper random_bucket_name } - after { delete_bucket_helper bucket.name } - - it "enable_bucket_lifecycle_management, disable_bucket_lifecycle_management" do - # enable_bucket_lifecycle_management - out, _err = capture_io do - enable_bucket_lifecycle_management bucket_name: bucket.name - end - - assert_includes out, "Lifecycle management is enabled" - - # disable_bucket_lifecycle_management - out, _err = capture_io do - disable_bucket_lifecycle_management bucket_name: bucket.name - end - - assert_includes out, "Lifecycle management is disabled" - end - end - - describe "retention policy" do - let(:bucket) { create_bucket_helper random_bucket_name } - after { delete_bucket_helper bucket.name } - - it "set_retention_policy, get_retention_policy, remove_retention_policy" do - # set_retention_policy - assert_output "Retention period for #{bucket.name} is now #{retention_period} seconds.\n" do - set_retention_policy bucket_name: bucket.name, - retention_period: retention_period - end - - bucket.refresh! - assert_equal bucket.retention_period, retention_period - - # get_retention_policy - out, _err = capture_io do - get_retention_policy bucket_name: bucket.name - end - - assert_includes out, "period: #{retention_period}\n" - - # remove_retention_policy - assert_equal bucket.retention_period, retention_period - assert_output "Retention policy for #{bucket.name} has been removed.\n" do - remove_retention_policy bucket_name: bucket.name - end - - bucket.refresh! - refute bucket.retention_period - - # lock_retention_policy - bucket.retention_period = retention_period - out, _err = capture_io do - lock_retention_policy bucket_name: bucket.name - end - - assert_includes out, "Retention policy for #{bucket.name} is now locked." - bucket.refresh! - assert bucket.retention_policy_locked? - - # remove_retention_policy - assert_output "Policy is locked and retention policy can't be removed.\n" do - remove_retention_policy bucket_name: bucket.name - end - end - end - - describe "default_event_based_hold" do - it "enable_default_event_based_hold, get_default_event_based_hold, disable_default_event_based_hold" do - # enable_default_event_based_hold - assert_output "Default event-based hold was enabled for #{bucket.name}.\n" do - enable_default_event_based_hold bucket_name: bucket.name - end - - bucket.refresh! - assert bucket.default_event_based_hold? - - # get_default_event_based_hold - assert_output "Default event-based hold is enabled for #{bucket.name}.\n" do - get_default_event_based_hold bucket_name: bucket.name - end - - # disable_default_event_based_hold - bucket.update do |b| - b.default_event_based_hold = true - end - - assert_output "Default event-based hold was disabled for #{bucket.name}.\n" do - disable_default_event_based_hold bucket_name: bucket.name - end - - bucket.refresh! - refute bucket.default_event_based_hold? - - # get_default_event_based_hold - assert_output "Default event-based hold is not enabled for #{bucket.name}.\n" do - get_default_event_based_hold bucket_name: bucket.name - end - end - end - - describe "storage_class" do - it "change_default_storage_class" do - assert_equal "STANDARD", bucket.storage_class - - assert_output "Default storage class for bucket #{bucket.name} has been set to COLDLINE\n" do - change_default_storage_class bucket_name: bucket.name - end - - bucket.refresh! - assert_equal "COLDLINE", bucket.storage_class - # teardown - bucket.storage_class = "STANDARD" - end - end - - describe "versioning" do - it "enable_versioning, disable_versioning" do - # enable_versioning - bucket.versioning = false - - assert_output "Versioning was enabled for bucket #{bucket.name}\n" do - enable_versioning bucket_name: bucket.name - end - bucket.refresh! - assert bucket.versioning? - - # disable_versioning - assert_output "Versioning was disabled for bucket #{bucket.name}\n" do - disable_versioning bucket_name: bucket.name - end - bucket.refresh! - refute bucket.versioning? - end - end - - describe "website_configuration" do - let(:main_page_suffix) { "index.html" } - let(:not_found_page) { "404.html" } - - it "define_bucket_website_configuration" do - expected_out = "Static website bucket #{bucket.name} is set up to use #{main_page_suffix} as the index page " \ - "and #{not_found_page} as the 404 page\n" - - assert_output expected_out do - define_bucket_website_configuration bucket_name: bucket.name, - main_page_suffix: main_page_suffix, - not_found_page: not_found_page - end - - bucket.refresh! - assert_equal main_page_suffix, bucket.website_main - assert_equal not_found_page, bucket.website_404 - end - end - - describe "public_access_prevention" do - it "set_public_access_prevention_enforced, get_public_access_prevention, " \ - "set_public_access_prevention_inherited" do - bucket.public_access_prevention = :inherited - bucket.refresh! - _(bucket.public_access_prevention).must_equal "inherited" - - # set_public_access_prevention_enforced - assert_output "Public access prevention is set to enforced for #{bucket.name}.\n" do - set_public_access_prevention_enforced bucket_name: bucket.name - end - - bucket.refresh! - _(bucket.public_access_prevention).must_equal "enforced" - - # get_public_access_prevention - assert_output "Public access prevention is 'enforced' for #{bucket.name}.\n" do - get_public_access_prevention bucket_name: bucket.name - end - _(bucket.public_access_prevention).must_equal "enforced" - - # set_public_access_prevention_inherited - assert_output "Public access prevention is 'inherited' for #{bucket.name}.\n" do - set_public_access_prevention_inherited bucket_name: bucket.name - end - - bucket.refresh! - _(bucket.public_access_prevention).must_equal "inherited" - bucket.public_access_prevention = :inherited - end - end + # secondary_bucket = storage_client.bucket secondary_bucket_name + # refute_nil secondary_bucket + # assert_equal location, secondary_bucket.location + # assert_equal storage_class, secondary_bucket.storage_class + + # # list_buckets + # out, _err = capture_io do + # list_buckets + # end + + # assert_includes out, "ruby-storage-samples-" + + # # get_bucket_metadata + # out, _err = capture_io do + # get_bucket_metadata bucket_name: bucket_name + # end + + # assert_includes out, bucket_name + + # # delete_bucket + # assert_output "Deleted bucket: #{bucket_name}\n" do + # delete_bucket bucket_name: bucket_name + # end + + + # refute storage_client.bucket bucket_name + + # delete_bucket_helper bucket_name + # delete_bucket_helper secondary_bucket_name + # end + # end + + # describe "storage_create_bucket_dual_region" do + # it "creates dual region bucket" do + # location = "US" + # region_1 = "US-EAST1" + # region_2 = "US-WEST1" + # location_type = "dual-region" + # bucket_name = random_bucket_name + # refute storage_client.bucket bucket_name + + # expected = "Bucket #{bucket_name} created:\n" + # expected += "- location: #{location}\n" + # expected += "- location_type: #{location_type}\n" + # expected += "- custom_placement_config:\n" + # expected += " - data_locations: #{[region_1, region_2]}\n" + + # retry_resource_exhaustion do + # assert_output expected do + # StorageCreateBucketDualRegion.new.storage_create_bucket_dual_region bucket_name: bucket_name, + # region_1: region_1, + # region_2: region_2 + # end + # end + + # refute_nil storage_client.bucket bucket_name + + # delete_bucket_helper bucket_name + # end + # end + + # describe "storage_create_bucket_hierarchical_namespace" do + # it "creates hierarchical namespace enabled bucket" do + # bucket_name = random_bucket_name + # refute storage_client.bucket bucket_name + + # expected = "Created bucket #{bucket_name} with Hierarchical Namespace enabled.\n" + + # retry_resource_exhaustion do + # assert_output expected do + # create_bucket_hierarchical_namespace bucket_name: bucket_name + # end + # end + + # refute_nil storage_client.bucket bucket_name + + # delete_bucket_helper bucket_name + # end + # end + + # describe "storage_create_bucket_with_object_retention" do + # it "creates a bucket with object retention enabled." do + # bucket_name = random_bucket_name + # refute storage_client.bucket bucket_name + + # expected = "Created bucket #{bucket_name} with object retention setting: Enabled\n" + + # retry_resource_exhaustion do + # assert_output expected do + # create_bucket_with_object_retention bucket_name: bucket_name + # end + # end + + # refute_nil storage_client.bucket bucket_name + + # file_name = "test_object_retention" + + # bucket = storage_client.bucket bucket_name + + # out, _err = capture_io do + # set_object_retention_policy bucket_name: bucket.name, + # content: "hello world", + # destination_file_name: file_name + # end + + # assert_includes out, "Retention policy for file #{file_name}" + + # file = bucket.file file_name + # file.retention = { + # mode: nil, + # retain_until_time: nil, + # override_unlocked_retention: true + # } + # delete_bucket_helper bucket_name + # end + # end + + # describe "autoclass" do + # it "get_autoclass, set_autoclass" do + # bucket_name = random_bucket_name + # refute storage_client.bucket bucket_name + + # storage_client.create_bucket bucket_name, autoclass_enabled: true + + # assert_output(/autoclass config set to true./) do + # get_autoclass bucket_name: bucket_name + # end + + # assert_output(/autoclass terminal storage class set to NEARLINE./) do + # get_autoclass bucket_name: bucket_name + # end + + # assert_output(/autoclass terminal storage class set to ARCHIVE./) do + # set_autoclass bucket_name: bucket_name, toggle: true, terminal_storage_class: "ARCHIVE" + # end + + # assert_output(/autoclass config set to false./) do + # set_autoclass bucket_name: bucket_name, toggle: false + # end + + # delete_bucket_helper bucket_name + # end + # end + + # describe "cors" do + # it "cors_configuration, remove_cors_configuration" do + # bucket.cors { |c| c.clear } + # assert bucket.cors.empty? + + # # cors_configuration + # assert_output "Set CORS policies for bucket #{bucket.name}\n" do + # cors_configuration bucket_name: bucket.name + # end + + # bucket.refresh! + # assert_equal 1, bucket.cors.count + # rule = bucket.cors.first + # assert_equal ["*"], rule.origin + # assert_equal ["PUT", "POST"], rule.methods + # assert_equal ["Content-Type", "x-goog-resumable"], rule.headers + # assert_equal 3600, rule.max_age + + # # remove_cors_configuration + # assert_output "Remove CORS policies for bucket #{bucket.name}\n" do + # remove_cors_configuration bucket_name: bucket.name + # end + # bucket.refresh! + # assert bucket.cors.empty? + # end + # end + + # describe "requester_pays" do + # it "enable_requester_pays, disable_requester_pays, get_requester_pays_status" do + # # enable_requester_pays + # bucket.requester_pays = false + + # assert_output "Requester pays has been enabled for #{bucket.name}\n" do + # enable_requester_pays bucket_name: bucket.name + # end + # bucket.refresh! + # assert bucket.requester_pays? + + # # get_requester_pays_status + # assert_output "Requester pays status is enabled for #{bucket.name}\n" do + # get_requester_pays_status bucket_name: bucket.name + # end + # assert bucket.requester_pays? + + # # disable_requester_pays + # assert_output "Requester pays has been disabled for #{bucket.name}\n" do + # disable_requester_pays bucket_name: bucket.name + # end + # bucket.refresh! + # refute bucket.requester_pays? + + # # get_requester_pays_status + # assert_output "Requester pays status is disabled for #{bucket.name}\n" do + # get_requester_pays_status bucket_name: bucket.name + # end + # refute bucket.requester_pays? + # end + # end + + # describe "uniform_bucket_level_access" do + # it "enable_uniform_bucket_level_access, get_uniform_bucket_level_access, disable_uniform_bucket_level_access" do + # # enable_uniform_bucket_level_access + # bucket.uniform_bucket_level_access = false + + # assert_output "Uniform bucket-level access was enabled for #{bucket.name}.\n" do + # enable_uniform_bucket_level_access bucket_name: bucket.name + # end + + # bucket.refresh! + # assert bucket.uniform_bucket_level_access? + + # # get_uniform_bucket_level_access + # assert_output "Uniform bucket-level access is enabled for #{bucket.name}.\nBucket " \ + # "will be locked on #{bucket.uniform_bucket_level_access_locked_at}.\n" do + # get_uniform_bucket_level_access bucket_name: bucket.name + # end + # assert bucket.uniform_bucket_level_access? + + # # disable_uniform_bucket_level_access + # assert_output "Uniform bucket-level access was disabled for #{bucket.name}.\n" do + # disable_uniform_bucket_level_access bucket_name: bucket.name + # end + + # bucket.refresh! + # refute bucket.uniform_bucket_level_access? + + # # get_uniform_bucket_level_access + # assert_output "Uniform bucket-level access is disabled for #{bucket.name}.\n" do + # get_uniform_bucket_level_access bucket_name: bucket.name + # end + # refute bucket.uniform_bucket_level_access? + + # bucket.uniform_bucket_level_access = false + # end + # end + + # describe "default Cloud KMS encryption key" do + # it "set_bucket_default_kms_key, bucket_delete_default_kms_key" do + # refute bucket.default_kms_key + + # # set_bucket_default_kms_key + # assert_output "Default KMS key for #{bucket.name} was set to #{kms_key}\n" do + # set_bucket_default_kms_key bucket_name: bucket.name, + # default_kms_key: kms_key + # end + + # bucket.refresh! + # assert_equal bucket.default_kms_key, kms_key + + # # bucket_delete_default_kms_key + # assert_output "Default KMS key was removed from #{bucket.name}\n" do + # bucket_delete_default_kms_key bucket_name: bucket.name + # end + + # bucket.refresh! + # refute bucket.default_kms_key + # end + # end + + # describe "get bucket class and location data" do + # bucket_name = random_bucket_name + # location = "US" + # storage_class = "COLDLINE" + + # it "get_bucket_class_and_location" do + # storage_client.create_bucket bucket_name, + # location: location, + # storage_class: storage_class + # expected_output = "Bucket #{bucket_name} storage class is " \ + # "#{storage_class}, and the location is #{location}\n" + # assert_output expected_output do + # get_bucket_class_and_location bucket_name: bucket_name + # end + # end + # end + + # describe "labels" do + # it "add_bucket_label, remove_bucket_label" do + # # add_bucket_label + # label_key = "label_key" + # label_value = "label_value" + + # assert_output "Added label #{label_key} with value #{label_value} to #{bucket.name}\n" do + # add_bucket_label bucket_name: bucket.name, + # label_value: label_value, + # label_key: label_key + # end + + # bucket.refresh! + # assert_equal bucket.labels[label_key], label_value + + # # remove_bucket_label + # assert_output "Deleted label #{label_key} from #{bucket.name}\n" do + # remove_bucket_label bucket_name: bucket.name, + # label_key: label_key + # end + + # bucket.refresh! + # assert bucket.labels[label_key].empty? + # end + # end + + # describe "lifecycle management" do + # let(:bucket) { create_bucket_helper random_bucket_name } + # after { delete_bucket_helper bucket.name } + + # it "enable_bucket_lifecycle_management, disable_bucket_lifecycle_management" do + # # enable_bucket_lifecycle_management + # out, _err = capture_io do + # enable_bucket_lifecycle_management bucket_name: bucket.name + # end + + # assert_includes out, "Lifecycle management is enabled" + + # # disable_bucket_lifecycle_management + # out, _err = capture_io do + # disable_bucket_lifecycle_management bucket_name: bucket.name + # end + + # assert_includes out, "Lifecycle management is disabled" + # end + # end + + # describe "retention policy" do + # let(:bucket) { create_bucket_helper random_bucket_name } + # after { delete_bucket_helper bucket.name } + + # it "set_retention_policy, get_retention_policy, remove_retention_policy" do + # # set_retention_policy + # assert_output "Retention period for #{bucket.name} is now #{retention_period} seconds.\n" do + # set_retention_policy bucket_name: bucket.name, + # retention_period: retention_period + # end + + # bucket.refresh! + # assert_equal bucket.retention_period, retention_period + + # # get_retention_policy + # out, _err = capture_io do + # get_retention_policy bucket_name: bucket.name + # end + + # assert_includes out, "period: #{retention_period}\n" + + # # remove_retention_policy + # assert_equal bucket.retention_period, retention_period + # assert_output "Retention policy for #{bucket.name} has been removed.\n" do + # remove_retention_policy bucket_name: bucket.name + # end + + # bucket.refresh! + # refute bucket.retention_period + + # # lock_retention_policy + # bucket.retention_period = retention_period + # out, _err = capture_io do + # lock_retention_policy bucket_name: bucket.name + # end + + # assert_includes out, "Retention policy for #{bucket.name} is now locked." + # bucket.refresh! + # assert bucket.retention_policy_locked? + + # # remove_retention_policy + # assert_output "Policy is locked and retention policy can't be removed.\n" do + # remove_retention_policy bucket_name: bucket.name + # end + # end + # end + + # describe "default_event_based_hold" do + # it "enable_default_event_based_hold, get_default_event_based_hold, disable_default_event_based_hold" do + # # enable_default_event_based_hold + # assert_output "Default event-based hold was enabled for #{bucket.name}.\n" do + # enable_default_event_based_hold bucket_name: bucket.name + # end + + # bucket.refresh! + # assert bucket.default_event_based_hold? + + # # get_default_event_based_hold + # assert_output "Default event-based hold is enabled for #{bucket.name}.\n" do + # get_default_event_based_hold bucket_name: bucket.name + # end + + # # disable_default_event_based_hold + # bucket.update do |b| + # b.default_event_based_hold = true + # end + + # assert_output "Default event-based hold was disabled for #{bucket.name}.\n" do + # disable_default_event_based_hold bucket_name: bucket.name + # end + + # bucket.refresh! + # refute bucket.default_event_based_hold? + + # # get_default_event_based_hold + # assert_output "Default event-based hold is not enabled for #{bucket.name}.\n" do + # get_default_event_based_hold bucket_name: bucket.name + # end + # end + # end + + # describe "storage_class" do + # it "change_default_storage_class" do + # assert_equal "STANDARD", bucket.storage_class + + # assert_output "Default storage class for bucket #{bucket.name} has been set to COLDLINE\n" do + # change_default_storage_class bucket_name: bucket.name + # end + + # bucket.refresh! + # assert_equal "COLDLINE", bucket.storage_class + # # teardown + # bucket.storage_class = "STANDARD" + # end + # end + + # describe "versioning" do + # it "enable_versioning, disable_versioning" do + # # enable_versioning + # bucket.versioning = false + + # assert_output "Versioning was enabled for bucket #{bucket.name}\n" do + # enable_versioning bucket_name: bucket.name + # end + # bucket.refresh! + # assert bucket.versioning? + + # # disable_versioning + # assert_output "Versioning was disabled for bucket #{bucket.name}\n" do + # disable_versioning bucket_name: bucket.name + # end + # bucket.refresh! + # refute bucket.versioning? + # end + # end + + # describe "website_configuration" do + # let(:main_page_suffix) { "index.html" } + # let(:not_found_page) { "404.html" } + + # it "define_bucket_website_configuration" do + # expected_out = "Static website bucket #{bucket.name} is set up to use #{main_page_suffix} as the index page " \ + # "and #{not_found_page} as the 404 page\n" + + # assert_output expected_out do + # define_bucket_website_configuration bucket_name: bucket.name, + # main_page_suffix: main_page_suffix, + # not_found_page: not_found_page + # end + + # bucket.refresh! + # assert_equal main_page_suffix, bucket.website_main + # assert_equal not_found_page, bucket.website_404 + # end + # end + + # describe "public_access_prevention" do + # it "set_public_access_prevention_enforced, get_public_access_prevention, " \ + # "set_public_access_prevention_inherited" do + # bucket.public_access_prevention = :inherited + # bucket.refresh! + # _(bucket.public_access_prevention).must_equal "inherited" + + # # set_public_access_prevention_enforced + # assert_output "Public access prevention is set to enforced for #{bucket.name}.\n" do + # set_public_access_prevention_enforced bucket_name: bucket.name + # end + + # bucket.refresh! + # _(bucket.public_access_prevention).must_equal "enforced" + + # # get_public_access_prevention + # assert_output "Public access prevention is 'enforced' for #{bucket.name}.\n" do + # get_public_access_prevention bucket_name: bucket.name + # end + # _(bucket.public_access_prevention).must_equal "enforced" + + # # set_public_access_prevention_inherited + # assert_output "Public access prevention is 'inherited' for #{bucket.name}.\n" do + # set_public_access_prevention_inherited bucket_name: bucket.name + # end + + # bucket.refresh! + # _(bucket.public_access_prevention).must_equal "inherited" + # bucket.public_access_prevention = :inherited + # end + # end describe "storage move file" do let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" } diff --git a/google-cloud-storage/samples/storage_move_object.rb b/google-cloud-storage/samples/storage_move_object.rb index 727f3dc7d891..6c0762f461d5 100644 --- a/google-cloud-storage/samples/storage_move_object.rb +++ b/google-cloud-storage/samples/storage_move_object.rb @@ -27,7 +27,9 @@ def move_object bucket_name:, source_file_name:, destination_file_name: storage = Google::Cloud::Storage.new bucket = storage.bucket bucket_name, skip_lookup: true - + permissions = ["storage.objects.move"] + puts "check permissions" + puts bucket.test_permissions permissions bucket.move_file source_file_name, destination_file_name fetch_file = bucket.file destination_file_name puts "New File #{fetch_file.name} created\n" From 120d6c6ab7771a8212135fab7023db79208dc9a2 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Thu, 20 Nov 2025 13:28:20 +0000 Subject: [PATCH 05/10] check --- .../samples/acceptance/buckets_test.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index d4760bc8025d..a72ba22014e8 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -590,15 +590,15 @@ file = StringIO.new "test" bucket.create_file file, source_file end - it "file is moved and old file is deleted" do - create_source_file - out, _err = capture_io do - move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: destination_file - end - assert_includes out, "New File #{destination_file} created\n" - refute_nil(bucket.file(destination_file)) - assert_nil(bucket.file(source_file)) - end + # it "file is moved and old file is deleted" do + # create_source_file + # out, _err = capture_io do + # move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: destination_file + # end + # assert_includes out, "New File #{destination_file} created\n" + # refute_nil(bucket.file(destination_file)) + # assert_nil(bucket.file(source_file)) + # end it "raises error if source and destination are having same filename" do create_source_file From bcffaf2e9d3ed1f9aa98ca914d41786c3c82bfe1 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Thu, 20 Nov 2025 13:37:52 +0000 Subject: [PATCH 06/10] check --- .../samples/acceptance/buckets_test.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index a72ba22014e8..dc8bf5546b6b 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -590,15 +590,15 @@ file = StringIO.new "test" bucket.create_file file, source_file end - # it "file is moved and old file is deleted" do - # create_source_file - # out, _err = capture_io do - # move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: destination_file - # end + it "file is moved and old file is deleted" do + create_source_file + out, _err = capture_io do + move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: destination_file + end # assert_includes out, "New File #{destination_file} created\n" # refute_nil(bucket.file(destination_file)) # assert_nil(bucket.file(source_file)) - # end + end it "raises error if source and destination are having same filename" do create_source_file From e4e8df91d6259853672635362aa777aebdc8fae0 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Thu, 20 Nov 2025 13:40:32 +0000 Subject: [PATCH 07/10] undo check --- google-cloud-storage/samples/acceptance/buckets_test.rb | 6 +++--- google-cloud-storage/samples/storage_move_object.rb | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index dc8bf5546b6b..d4760bc8025d 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -595,9 +595,9 @@ out, _err = capture_io do move_object bucket_name: bucket.name, source_file_name: source_file, destination_file_name: destination_file end - # assert_includes out, "New File #{destination_file} created\n" - # refute_nil(bucket.file(destination_file)) - # assert_nil(bucket.file(source_file)) + assert_includes out, "New File #{destination_file} created\n" + refute_nil(bucket.file(destination_file)) + assert_nil(bucket.file(source_file)) end it "raises error if source and destination are having same filename" do diff --git a/google-cloud-storage/samples/storage_move_object.rb b/google-cloud-storage/samples/storage_move_object.rb index 6c0762f461d5..61887bba6a23 100644 --- a/google-cloud-storage/samples/storage_move_object.rb +++ b/google-cloud-storage/samples/storage_move_object.rb @@ -27,9 +27,6 @@ def move_object bucket_name:, source_file_name:, destination_file_name: storage = Google::Cloud::Storage.new bucket = storage.bucket bucket_name, skip_lookup: true - permissions = ["storage.objects.move"] - puts "check permissions" - puts bucket.test_permissions permissions bucket.move_file source_file_name, destination_file_name fetch_file = bucket.file destination_file_name puts "New File #{fetch_file.name} created\n" From f99c6c6593dadb34fb90d32e316b8288b0e321dd Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Mon, 29 Jun 2026 13:47:22 +0530 Subject: [PATCH 08/10] blank commit --- google-cloud-storage/acceptance/storage/bucket_test.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/google-cloud-storage/acceptance/storage/bucket_test.rb b/google-cloud-storage/acceptance/storage/bucket_test.rb index 722aa9d3f40e..36e22bb5a778 100644 --- a/google-cloud-storage/acceptance/storage/bucket_test.rb +++ b/google-cloud-storage/acceptance/storage/bucket_test.rb @@ -393,6 +393,7 @@ file = StringIO.new "test" bucket.create_file file, source_file end + it "moves a file for bucket" do create_source_file bucket.move_file source_file, destination_file From eec750f84b00c8a00867ddb095ec5252f94e89c0 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Mon, 29 Jun 2026 17:38:29 +0530 Subject: [PATCH 09/10] blank commit --- google-cloud-storage/samples/storage_move_object.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/google-cloud-storage/samples/storage_move_object.rb b/google-cloud-storage/samples/storage_move_object.rb index 61887bba6a23..1edadaa131a4 100644 --- a/google-cloud-storage/samples/storage_move_object.rb +++ b/google-cloud-storage/samples/storage_move_object.rb @@ -28,6 +28,7 @@ def move_object bucket_name:, source_file_name:, destination_file_name: storage = Google::Cloud::Storage.new bucket = storage.bucket bucket_name, skip_lookup: true bucket.move_file source_file_name, destination_file_name + fetch_file = bucket.file destination_file_name puts "New File #{fetch_file.name} created\n" end From bd3ca60374f0d46b7499f0a9d3bee28ad66639bf Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Mon, 29 Jun 2026 12:53:19 +0000 Subject: [PATCH 10/10] undo commenting --- .../samples/acceptance/buckets_test.rb | 1040 ++++++++--------- 1 file changed, 520 insertions(+), 520 deletions(-) diff --git a/google-cloud-storage/samples/acceptance/buckets_test.rb b/google-cloud-storage/samples/acceptance/buckets_test.rb index d4760bc8025d..295fc0715440 100644 --- a/google-cloud-storage/samples/acceptance/buckets_test.rb +++ b/google-cloud-storage/samples/acceptance/buckets_test.rb @@ -61,527 +61,527 @@ let(:retention_period) { rand 1..99 } let(:bucket) { fixture_bucket } - # describe "bucket lifecycle" do - # it "create_bucket, create_bucket_class_location, list_buckets, get_bucket_metadata, delete_bucket" do - # # create_bucket - # bucket_name = random_bucket_name - # refute storage_client.bucket bucket_name - - # retry_resource_exhaustion do - # assert_output "Created bucket: #{bucket_name}\n" do - # create_bucket bucket_name: bucket_name - # end - # end - - # refute_nil storage_client.bucket bucket_name - - # # create_bucket_class_location - - # secondary_bucket_name = random_bucket_name - # location = "ASIA" - # storage_class = "COLDLINE" - # refute storage_client.bucket secondary_bucket_name - - # retry_resource_exhaustion do - # assert_output "Created bucket #{secondary_bucket_name} in #{location} with #{storage_class} class\n" do - # create_bucket_class_location bucket_name: secondary_bucket_name - # end - # end + describe "bucket lifecycle" do + it "create_bucket, create_bucket_class_location, list_buckets, get_bucket_metadata, delete_bucket" do + # create_bucket + bucket_name = random_bucket_name + refute storage_client.bucket bucket_name + + retry_resource_exhaustion do + assert_output "Created bucket: #{bucket_name}\n" do + create_bucket bucket_name: bucket_name + end + end + + refute_nil storage_client.bucket bucket_name + + # create_bucket_class_location + + secondary_bucket_name = random_bucket_name + location = "ASIA" + storage_class = "COLDLINE" + refute storage_client.bucket secondary_bucket_name + + retry_resource_exhaustion do + assert_output "Created bucket #{secondary_bucket_name} in #{location} with #{storage_class} class\n" do + create_bucket_class_location bucket_name: secondary_bucket_name + end + end + + secondary_bucket = storage_client.bucket secondary_bucket_name + refute_nil secondary_bucket + assert_equal location, secondary_bucket.location + assert_equal storage_class, secondary_bucket.storage_class + + # list_buckets + out, _err = capture_io do + list_buckets + end + + assert_includes out, "ruby-storage-samples-" + + # get_bucket_metadata + out, _err = capture_io do + get_bucket_metadata bucket_name: bucket_name + end + + assert_includes out, bucket_name + + # delete_bucket + assert_output "Deleted bucket: #{bucket_name}\n" do + delete_bucket bucket_name: bucket_name + end + + + refute storage_client.bucket bucket_name + + delete_bucket_helper bucket_name + delete_bucket_helper secondary_bucket_name + end + end + + describe "storage_create_bucket_dual_region" do + it "creates dual region bucket" do + location = "US" + region_1 = "US-EAST1" + region_2 = "US-WEST1" + location_type = "dual-region" + bucket_name = random_bucket_name + refute storage_client.bucket bucket_name + + expected = "Bucket #{bucket_name} created:\n" + expected += "- location: #{location}\n" + expected += "- location_type: #{location_type}\n" + expected += "- custom_placement_config:\n" + expected += " - data_locations: #{[region_1, region_2]}\n" + + retry_resource_exhaustion do + assert_output expected do + StorageCreateBucketDualRegion.new.storage_create_bucket_dual_region bucket_name: bucket_name, + region_1: region_1, + region_2: region_2 + end + end + + refute_nil storage_client.bucket bucket_name + + delete_bucket_helper bucket_name + end + end + + describe "storage_create_bucket_hierarchical_namespace" do + it "creates hierarchical namespace enabled bucket" do + bucket_name = random_bucket_name + refute storage_client.bucket bucket_name + + expected = "Created bucket #{bucket_name} with Hierarchical Namespace enabled.\n" + + retry_resource_exhaustion do + assert_output expected do + create_bucket_hierarchical_namespace bucket_name: bucket_name + end + end + + refute_nil storage_client.bucket bucket_name + + delete_bucket_helper bucket_name + end + end + + describe "storage_create_bucket_with_object_retention" do + it "creates a bucket with object retention enabled." do + bucket_name = random_bucket_name + refute storage_client.bucket bucket_name + + expected = "Created bucket #{bucket_name} with object retention setting: Enabled\n" + + retry_resource_exhaustion do + assert_output expected do + create_bucket_with_object_retention bucket_name: bucket_name + end + end + + refute_nil storage_client.bucket bucket_name + + file_name = "test_object_retention" + + bucket = storage_client.bucket bucket_name + + out, _err = capture_io do + set_object_retention_policy bucket_name: bucket.name, + content: "hello world", + destination_file_name: file_name + end + + assert_includes out, "Retention policy for file #{file_name}" + + file = bucket.file file_name + file.retention = { + mode: nil, + retain_until_time: nil, + override_unlocked_retention: true + } + delete_bucket_helper bucket_name + end + end + + describe "autoclass" do + it "get_autoclass, set_autoclass" do + bucket_name = random_bucket_name + refute storage_client.bucket bucket_name + + storage_client.create_bucket bucket_name, autoclass_enabled: true + + assert_output(/autoclass config set to true./) do + get_autoclass bucket_name: bucket_name + end + + assert_output(/autoclass terminal storage class set to NEARLINE./) do + get_autoclass bucket_name: bucket_name + end + + assert_output(/autoclass terminal storage class set to ARCHIVE./) do + set_autoclass bucket_name: bucket_name, toggle: true, terminal_storage_class: "ARCHIVE" + end + + assert_output(/autoclass config set to false./) do + set_autoclass bucket_name: bucket_name, toggle: false + end + + delete_bucket_helper bucket_name + end + end + + describe "cors" do + it "cors_configuration, remove_cors_configuration" do + bucket.cors { |c| c.clear } + assert bucket.cors.empty? + + # cors_configuration + assert_output "Set CORS policies for bucket #{bucket.name}\n" do + cors_configuration bucket_name: bucket.name + end + + bucket.refresh! + assert_equal 1, bucket.cors.count + rule = bucket.cors.first + assert_equal ["*"], rule.origin + assert_equal ["PUT", "POST"], rule.methods + assert_equal ["Content-Type", "x-goog-resumable"], rule.headers + assert_equal 3600, rule.max_age + + # remove_cors_configuration + assert_output "Remove CORS policies for bucket #{bucket.name}\n" do + remove_cors_configuration bucket_name: bucket.name + end + bucket.refresh! + assert bucket.cors.empty? + end + end + + describe "requester_pays" do + it "enable_requester_pays, disable_requester_pays, get_requester_pays_status" do + # enable_requester_pays + bucket.requester_pays = false + + assert_output "Requester pays has been enabled for #{bucket.name}\n" do + enable_requester_pays bucket_name: bucket.name + end + bucket.refresh! + assert bucket.requester_pays? + + # get_requester_pays_status + assert_output "Requester pays status is enabled for #{bucket.name}\n" do + get_requester_pays_status bucket_name: bucket.name + end + assert bucket.requester_pays? + + # disable_requester_pays + assert_output "Requester pays has been disabled for #{bucket.name}\n" do + disable_requester_pays bucket_name: bucket.name + end + bucket.refresh! + refute bucket.requester_pays? + + # get_requester_pays_status + assert_output "Requester pays status is disabled for #{bucket.name}\n" do + get_requester_pays_status bucket_name: bucket.name + end + refute bucket.requester_pays? + end + end + + describe "uniform_bucket_level_access" do + it "enable_uniform_bucket_level_access, get_uniform_bucket_level_access, disable_uniform_bucket_level_access" do + # enable_uniform_bucket_level_access + bucket.uniform_bucket_level_access = false + + assert_output "Uniform bucket-level access was enabled for #{bucket.name}.\n" do + enable_uniform_bucket_level_access bucket_name: bucket.name + end + + bucket.refresh! + assert bucket.uniform_bucket_level_access? + + # get_uniform_bucket_level_access + assert_output "Uniform bucket-level access is enabled for #{bucket.name}.\nBucket " \ + "will be locked on #{bucket.uniform_bucket_level_access_locked_at}.\n" do + get_uniform_bucket_level_access bucket_name: bucket.name + end + assert bucket.uniform_bucket_level_access? + + # disable_uniform_bucket_level_access + assert_output "Uniform bucket-level access was disabled for #{bucket.name}.\n" do + disable_uniform_bucket_level_access bucket_name: bucket.name + end + + bucket.refresh! + refute bucket.uniform_bucket_level_access? + + # get_uniform_bucket_level_access + assert_output "Uniform bucket-level access is disabled for #{bucket.name}.\n" do + get_uniform_bucket_level_access bucket_name: bucket.name + end + refute bucket.uniform_bucket_level_access? + + bucket.uniform_bucket_level_access = false + end + end + + describe "default Cloud KMS encryption key" do + it "set_bucket_default_kms_key, bucket_delete_default_kms_key" do + refute bucket.default_kms_key - # secondary_bucket = storage_client.bucket secondary_bucket_name - # refute_nil secondary_bucket - # assert_equal location, secondary_bucket.location - # assert_equal storage_class, secondary_bucket.storage_class - - # # list_buckets - # out, _err = capture_io do - # list_buckets - # end - - # assert_includes out, "ruby-storage-samples-" - - # # get_bucket_metadata - # out, _err = capture_io do - # get_bucket_metadata bucket_name: bucket_name - # end - - # assert_includes out, bucket_name - - # # delete_bucket - # assert_output "Deleted bucket: #{bucket_name}\n" do - # delete_bucket bucket_name: bucket_name - # end - - - # refute storage_client.bucket bucket_name - - # delete_bucket_helper bucket_name - # delete_bucket_helper secondary_bucket_name - # end - # end - - # describe "storage_create_bucket_dual_region" do - # it "creates dual region bucket" do - # location = "US" - # region_1 = "US-EAST1" - # region_2 = "US-WEST1" - # location_type = "dual-region" - # bucket_name = random_bucket_name - # refute storage_client.bucket bucket_name - - # expected = "Bucket #{bucket_name} created:\n" - # expected += "- location: #{location}\n" - # expected += "- location_type: #{location_type}\n" - # expected += "- custom_placement_config:\n" - # expected += " - data_locations: #{[region_1, region_2]}\n" - - # retry_resource_exhaustion do - # assert_output expected do - # StorageCreateBucketDualRegion.new.storage_create_bucket_dual_region bucket_name: bucket_name, - # region_1: region_1, - # region_2: region_2 - # end - # end - - # refute_nil storage_client.bucket bucket_name - - # delete_bucket_helper bucket_name - # end - # end - - # describe "storage_create_bucket_hierarchical_namespace" do - # it "creates hierarchical namespace enabled bucket" do - # bucket_name = random_bucket_name - # refute storage_client.bucket bucket_name - - # expected = "Created bucket #{bucket_name} with Hierarchical Namespace enabled.\n" - - # retry_resource_exhaustion do - # assert_output expected do - # create_bucket_hierarchical_namespace bucket_name: bucket_name - # end - # end - - # refute_nil storage_client.bucket bucket_name - - # delete_bucket_helper bucket_name - # end - # end - - # describe "storage_create_bucket_with_object_retention" do - # it "creates a bucket with object retention enabled." do - # bucket_name = random_bucket_name - # refute storage_client.bucket bucket_name - - # expected = "Created bucket #{bucket_name} with object retention setting: Enabled\n" - - # retry_resource_exhaustion do - # assert_output expected do - # create_bucket_with_object_retention bucket_name: bucket_name - # end - # end - - # refute_nil storage_client.bucket bucket_name - - # file_name = "test_object_retention" - - # bucket = storage_client.bucket bucket_name - - # out, _err = capture_io do - # set_object_retention_policy bucket_name: bucket.name, - # content: "hello world", - # destination_file_name: file_name - # end - - # assert_includes out, "Retention policy for file #{file_name}" - - # file = bucket.file file_name - # file.retention = { - # mode: nil, - # retain_until_time: nil, - # override_unlocked_retention: true - # } - # delete_bucket_helper bucket_name - # end - # end - - # describe "autoclass" do - # it "get_autoclass, set_autoclass" do - # bucket_name = random_bucket_name - # refute storage_client.bucket bucket_name - - # storage_client.create_bucket bucket_name, autoclass_enabled: true - - # assert_output(/autoclass config set to true./) do - # get_autoclass bucket_name: bucket_name - # end - - # assert_output(/autoclass terminal storage class set to NEARLINE./) do - # get_autoclass bucket_name: bucket_name - # end - - # assert_output(/autoclass terminal storage class set to ARCHIVE./) do - # set_autoclass bucket_name: bucket_name, toggle: true, terminal_storage_class: "ARCHIVE" - # end - - # assert_output(/autoclass config set to false./) do - # set_autoclass bucket_name: bucket_name, toggle: false - # end - - # delete_bucket_helper bucket_name - # end - # end - - # describe "cors" do - # it "cors_configuration, remove_cors_configuration" do - # bucket.cors { |c| c.clear } - # assert bucket.cors.empty? - - # # cors_configuration - # assert_output "Set CORS policies for bucket #{bucket.name}\n" do - # cors_configuration bucket_name: bucket.name - # end - - # bucket.refresh! - # assert_equal 1, bucket.cors.count - # rule = bucket.cors.first - # assert_equal ["*"], rule.origin - # assert_equal ["PUT", "POST"], rule.methods - # assert_equal ["Content-Type", "x-goog-resumable"], rule.headers - # assert_equal 3600, rule.max_age - - # # remove_cors_configuration - # assert_output "Remove CORS policies for bucket #{bucket.name}\n" do - # remove_cors_configuration bucket_name: bucket.name - # end - # bucket.refresh! - # assert bucket.cors.empty? - # end - # end - - # describe "requester_pays" do - # it "enable_requester_pays, disable_requester_pays, get_requester_pays_status" do - # # enable_requester_pays - # bucket.requester_pays = false - - # assert_output "Requester pays has been enabled for #{bucket.name}\n" do - # enable_requester_pays bucket_name: bucket.name - # end - # bucket.refresh! - # assert bucket.requester_pays? - - # # get_requester_pays_status - # assert_output "Requester pays status is enabled for #{bucket.name}\n" do - # get_requester_pays_status bucket_name: bucket.name - # end - # assert bucket.requester_pays? - - # # disable_requester_pays - # assert_output "Requester pays has been disabled for #{bucket.name}\n" do - # disable_requester_pays bucket_name: bucket.name - # end - # bucket.refresh! - # refute bucket.requester_pays? - - # # get_requester_pays_status - # assert_output "Requester pays status is disabled for #{bucket.name}\n" do - # get_requester_pays_status bucket_name: bucket.name - # end - # refute bucket.requester_pays? - # end - # end - - # describe "uniform_bucket_level_access" do - # it "enable_uniform_bucket_level_access, get_uniform_bucket_level_access, disable_uniform_bucket_level_access" do - # # enable_uniform_bucket_level_access - # bucket.uniform_bucket_level_access = false - - # assert_output "Uniform bucket-level access was enabled for #{bucket.name}.\n" do - # enable_uniform_bucket_level_access bucket_name: bucket.name - # end - - # bucket.refresh! - # assert bucket.uniform_bucket_level_access? - - # # get_uniform_bucket_level_access - # assert_output "Uniform bucket-level access is enabled for #{bucket.name}.\nBucket " \ - # "will be locked on #{bucket.uniform_bucket_level_access_locked_at}.\n" do - # get_uniform_bucket_level_access bucket_name: bucket.name - # end - # assert bucket.uniform_bucket_level_access? - - # # disable_uniform_bucket_level_access - # assert_output "Uniform bucket-level access was disabled for #{bucket.name}.\n" do - # disable_uniform_bucket_level_access bucket_name: bucket.name - # end - - # bucket.refresh! - # refute bucket.uniform_bucket_level_access? - - # # get_uniform_bucket_level_access - # assert_output "Uniform bucket-level access is disabled for #{bucket.name}.\n" do - # get_uniform_bucket_level_access bucket_name: bucket.name - # end - # refute bucket.uniform_bucket_level_access? - - # bucket.uniform_bucket_level_access = false - # end - # end - - # describe "default Cloud KMS encryption key" do - # it "set_bucket_default_kms_key, bucket_delete_default_kms_key" do - # refute bucket.default_kms_key - - # # set_bucket_default_kms_key - # assert_output "Default KMS key for #{bucket.name} was set to #{kms_key}\n" do - # set_bucket_default_kms_key bucket_name: bucket.name, - # default_kms_key: kms_key - # end - - # bucket.refresh! - # assert_equal bucket.default_kms_key, kms_key - - # # bucket_delete_default_kms_key - # assert_output "Default KMS key was removed from #{bucket.name}\n" do - # bucket_delete_default_kms_key bucket_name: bucket.name - # end - - # bucket.refresh! - # refute bucket.default_kms_key - # end - # end - - # describe "get bucket class and location data" do - # bucket_name = random_bucket_name - # location = "US" - # storage_class = "COLDLINE" - - # it "get_bucket_class_and_location" do - # storage_client.create_bucket bucket_name, - # location: location, - # storage_class: storage_class - # expected_output = "Bucket #{bucket_name} storage class is " \ - # "#{storage_class}, and the location is #{location}\n" - # assert_output expected_output do - # get_bucket_class_and_location bucket_name: bucket_name - # end - # end - # end - - # describe "labels" do - # it "add_bucket_label, remove_bucket_label" do - # # add_bucket_label - # label_key = "label_key" - # label_value = "label_value" - - # assert_output "Added label #{label_key} with value #{label_value} to #{bucket.name}\n" do - # add_bucket_label bucket_name: bucket.name, - # label_value: label_value, - # label_key: label_key - # end - - # bucket.refresh! - # assert_equal bucket.labels[label_key], label_value - - # # remove_bucket_label - # assert_output "Deleted label #{label_key} from #{bucket.name}\n" do - # remove_bucket_label bucket_name: bucket.name, - # label_key: label_key - # end - - # bucket.refresh! - # assert bucket.labels[label_key].empty? - # end - # end - - # describe "lifecycle management" do - # let(:bucket) { create_bucket_helper random_bucket_name } - # after { delete_bucket_helper bucket.name } - - # it "enable_bucket_lifecycle_management, disable_bucket_lifecycle_management" do - # # enable_bucket_lifecycle_management - # out, _err = capture_io do - # enable_bucket_lifecycle_management bucket_name: bucket.name - # end - - # assert_includes out, "Lifecycle management is enabled" - - # # disable_bucket_lifecycle_management - # out, _err = capture_io do - # disable_bucket_lifecycle_management bucket_name: bucket.name - # end - - # assert_includes out, "Lifecycle management is disabled" - # end - # end - - # describe "retention policy" do - # let(:bucket) { create_bucket_helper random_bucket_name } - # after { delete_bucket_helper bucket.name } - - # it "set_retention_policy, get_retention_policy, remove_retention_policy" do - # # set_retention_policy - # assert_output "Retention period for #{bucket.name} is now #{retention_period} seconds.\n" do - # set_retention_policy bucket_name: bucket.name, - # retention_period: retention_period - # end - - # bucket.refresh! - # assert_equal bucket.retention_period, retention_period - - # # get_retention_policy - # out, _err = capture_io do - # get_retention_policy bucket_name: bucket.name - # end - - # assert_includes out, "period: #{retention_period}\n" - - # # remove_retention_policy - # assert_equal bucket.retention_period, retention_period - # assert_output "Retention policy for #{bucket.name} has been removed.\n" do - # remove_retention_policy bucket_name: bucket.name - # end - - # bucket.refresh! - # refute bucket.retention_period - - # # lock_retention_policy - # bucket.retention_period = retention_period - # out, _err = capture_io do - # lock_retention_policy bucket_name: bucket.name - # end - - # assert_includes out, "Retention policy for #{bucket.name} is now locked." - # bucket.refresh! - # assert bucket.retention_policy_locked? - - # # remove_retention_policy - # assert_output "Policy is locked and retention policy can't be removed.\n" do - # remove_retention_policy bucket_name: bucket.name - # end - # end - # end - - # describe "default_event_based_hold" do - # it "enable_default_event_based_hold, get_default_event_based_hold, disable_default_event_based_hold" do - # # enable_default_event_based_hold - # assert_output "Default event-based hold was enabled for #{bucket.name}.\n" do - # enable_default_event_based_hold bucket_name: bucket.name - # end - - # bucket.refresh! - # assert bucket.default_event_based_hold? - - # # get_default_event_based_hold - # assert_output "Default event-based hold is enabled for #{bucket.name}.\n" do - # get_default_event_based_hold bucket_name: bucket.name - # end - - # # disable_default_event_based_hold - # bucket.update do |b| - # b.default_event_based_hold = true - # end - - # assert_output "Default event-based hold was disabled for #{bucket.name}.\n" do - # disable_default_event_based_hold bucket_name: bucket.name - # end - - # bucket.refresh! - # refute bucket.default_event_based_hold? - - # # get_default_event_based_hold - # assert_output "Default event-based hold is not enabled for #{bucket.name}.\n" do - # get_default_event_based_hold bucket_name: bucket.name - # end - # end - # end - - # describe "storage_class" do - # it "change_default_storage_class" do - # assert_equal "STANDARD", bucket.storage_class - - # assert_output "Default storage class for bucket #{bucket.name} has been set to COLDLINE\n" do - # change_default_storage_class bucket_name: bucket.name - # end - - # bucket.refresh! - # assert_equal "COLDLINE", bucket.storage_class - # # teardown - # bucket.storage_class = "STANDARD" - # end - # end - - # describe "versioning" do - # it "enable_versioning, disable_versioning" do - # # enable_versioning - # bucket.versioning = false - - # assert_output "Versioning was enabled for bucket #{bucket.name}\n" do - # enable_versioning bucket_name: bucket.name - # end - # bucket.refresh! - # assert bucket.versioning? - - # # disable_versioning - # assert_output "Versioning was disabled for bucket #{bucket.name}\n" do - # disable_versioning bucket_name: bucket.name - # end - # bucket.refresh! - # refute bucket.versioning? - # end - # end - - # describe "website_configuration" do - # let(:main_page_suffix) { "index.html" } - # let(:not_found_page) { "404.html" } - - # it "define_bucket_website_configuration" do - # expected_out = "Static website bucket #{bucket.name} is set up to use #{main_page_suffix} as the index page " \ - # "and #{not_found_page} as the 404 page\n" - - # assert_output expected_out do - # define_bucket_website_configuration bucket_name: bucket.name, - # main_page_suffix: main_page_suffix, - # not_found_page: not_found_page - # end - - # bucket.refresh! - # assert_equal main_page_suffix, bucket.website_main - # assert_equal not_found_page, bucket.website_404 - # end - # end - - # describe "public_access_prevention" do - # it "set_public_access_prevention_enforced, get_public_access_prevention, " \ - # "set_public_access_prevention_inherited" do - # bucket.public_access_prevention = :inherited - # bucket.refresh! - # _(bucket.public_access_prevention).must_equal "inherited" - - # # set_public_access_prevention_enforced - # assert_output "Public access prevention is set to enforced for #{bucket.name}.\n" do - # set_public_access_prevention_enforced bucket_name: bucket.name - # end - - # bucket.refresh! - # _(bucket.public_access_prevention).must_equal "enforced" - - # # get_public_access_prevention - # assert_output "Public access prevention is 'enforced' for #{bucket.name}.\n" do - # get_public_access_prevention bucket_name: bucket.name - # end - # _(bucket.public_access_prevention).must_equal "enforced" - - # # set_public_access_prevention_inherited - # assert_output "Public access prevention is 'inherited' for #{bucket.name}.\n" do - # set_public_access_prevention_inherited bucket_name: bucket.name - # end - - # bucket.refresh! - # _(bucket.public_access_prevention).must_equal "inherited" - # bucket.public_access_prevention = :inherited - # end - # end + # set_bucket_default_kms_key + assert_output "Default KMS key for #{bucket.name} was set to #{kms_key}\n" do + set_bucket_default_kms_key bucket_name: bucket.name, + default_kms_key: kms_key + end + + bucket.refresh! + assert_equal bucket.default_kms_key, kms_key + + # bucket_delete_default_kms_key + assert_output "Default KMS key was removed from #{bucket.name}\n" do + bucket_delete_default_kms_key bucket_name: bucket.name + end + + bucket.refresh! + refute bucket.default_kms_key + end + end + + describe "get bucket class and location data" do + bucket_name = random_bucket_name + location = "US" + storage_class = "COLDLINE" + + it "get_bucket_class_and_location" do + storage_client.create_bucket bucket_name, + location: location, + storage_class: storage_class + expected_output = "Bucket #{bucket_name} storage class is " \ + "#{storage_class}, and the location is #{location}\n" + assert_output expected_output do + get_bucket_class_and_location bucket_name: bucket_name + end + end + end + + describe "labels" do + it "add_bucket_label, remove_bucket_label" do + # add_bucket_label + label_key = "label_key" + label_value = "label_value" + + assert_output "Added label #{label_key} with value #{label_value} to #{bucket.name}\n" do + add_bucket_label bucket_name: bucket.name, + label_value: label_value, + label_key: label_key + end + + bucket.refresh! + assert_equal bucket.labels[label_key], label_value + + # remove_bucket_label + assert_output "Deleted label #{label_key} from #{bucket.name}\n" do + remove_bucket_label bucket_name: bucket.name, + label_key: label_key + end + + bucket.refresh! + assert bucket.labels[label_key].empty? + end + end + + describe "lifecycle management" do + let(:bucket) { create_bucket_helper random_bucket_name } + after { delete_bucket_helper bucket.name } + + it "enable_bucket_lifecycle_management, disable_bucket_lifecycle_management" do + # enable_bucket_lifecycle_management + out, _err = capture_io do + enable_bucket_lifecycle_management bucket_name: bucket.name + end + + assert_includes out, "Lifecycle management is enabled" + + # disable_bucket_lifecycle_management + out, _err = capture_io do + disable_bucket_lifecycle_management bucket_name: bucket.name + end + + assert_includes out, "Lifecycle management is disabled" + end + end + + describe "retention policy" do + let(:bucket) { create_bucket_helper random_bucket_name } + after { delete_bucket_helper bucket.name } + + it "set_retention_policy, get_retention_policy, remove_retention_policy" do + # set_retention_policy + assert_output "Retention period for #{bucket.name} is now #{retention_period} seconds.\n" do + set_retention_policy bucket_name: bucket.name, + retention_period: retention_period + end + + bucket.refresh! + assert_equal bucket.retention_period, retention_period + + # get_retention_policy + out, _err = capture_io do + get_retention_policy bucket_name: bucket.name + end + + assert_includes out, "period: #{retention_period}\n" + + # remove_retention_policy + assert_equal bucket.retention_period, retention_period + assert_output "Retention policy for #{bucket.name} has been removed.\n" do + remove_retention_policy bucket_name: bucket.name + end + + bucket.refresh! + refute bucket.retention_period + + # lock_retention_policy + bucket.retention_period = retention_period + out, _err = capture_io do + lock_retention_policy bucket_name: bucket.name + end + + assert_includes out, "Retention policy for #{bucket.name} is now locked." + bucket.refresh! + assert bucket.retention_policy_locked? + + # remove_retention_policy + assert_output "Policy is locked and retention policy can't be removed.\n" do + remove_retention_policy bucket_name: bucket.name + end + end + end + + describe "default_event_based_hold" do + it "enable_default_event_based_hold, get_default_event_based_hold, disable_default_event_based_hold" do + # enable_default_event_based_hold + assert_output "Default event-based hold was enabled for #{bucket.name}.\n" do + enable_default_event_based_hold bucket_name: bucket.name + end + + bucket.refresh! + assert bucket.default_event_based_hold? + + # get_default_event_based_hold + assert_output "Default event-based hold is enabled for #{bucket.name}.\n" do + get_default_event_based_hold bucket_name: bucket.name + end + + # disable_default_event_based_hold + bucket.update do |b| + b.default_event_based_hold = true + end + + assert_output "Default event-based hold was disabled for #{bucket.name}.\n" do + disable_default_event_based_hold bucket_name: bucket.name + end + + bucket.refresh! + refute bucket.default_event_based_hold? + + # get_default_event_based_hold + assert_output "Default event-based hold is not enabled for #{bucket.name}.\n" do + get_default_event_based_hold bucket_name: bucket.name + end + end + end + + describe "storage_class" do + it "change_default_storage_class" do + assert_equal "STANDARD", bucket.storage_class + + assert_output "Default storage class for bucket #{bucket.name} has been set to COLDLINE\n" do + change_default_storage_class bucket_name: bucket.name + end + + bucket.refresh! + assert_equal "COLDLINE", bucket.storage_class + # teardown + bucket.storage_class = "STANDARD" + end + end + + describe "versioning" do + it "enable_versioning, disable_versioning" do + # enable_versioning + bucket.versioning = false + + assert_output "Versioning was enabled for bucket #{bucket.name}\n" do + enable_versioning bucket_name: bucket.name + end + bucket.refresh! + assert bucket.versioning? + + # disable_versioning + assert_output "Versioning was disabled for bucket #{bucket.name}\n" do + disable_versioning bucket_name: bucket.name + end + bucket.refresh! + refute bucket.versioning? + end + end + + describe "website_configuration" do + let(:main_page_suffix) { "index.html" } + let(:not_found_page) { "404.html" } + + it "define_bucket_website_configuration" do + expected_out = "Static website bucket #{bucket.name} is set up to use #{main_page_suffix} as the index page " \ + "and #{not_found_page} as the 404 page\n" + + assert_output expected_out do + define_bucket_website_configuration bucket_name: bucket.name, + main_page_suffix: main_page_suffix, + not_found_page: not_found_page + end + + bucket.refresh! + assert_equal main_page_suffix, bucket.website_main + assert_equal not_found_page, bucket.website_404 + end + end + + describe "public_access_prevention" do + it "set_public_access_prevention_enforced, get_public_access_prevention, " \ + "set_public_access_prevention_inherited" do + bucket.public_access_prevention = :inherited + bucket.refresh! + _(bucket.public_access_prevention).must_equal "inherited" + + # set_public_access_prevention_enforced + assert_output "Public access prevention is set to enforced for #{bucket.name}.\n" do + set_public_access_prevention_enforced bucket_name: bucket.name + end + + bucket.refresh! + _(bucket.public_access_prevention).must_equal "enforced" + + # get_public_access_prevention + assert_output "Public access prevention is 'enforced' for #{bucket.name}.\n" do + get_public_access_prevention bucket_name: bucket.name + end + _(bucket.public_access_prevention).must_equal "enforced" + + # set_public_access_prevention_inherited + assert_output "Public access prevention is 'inherited' for #{bucket.name}.\n" do + set_public_access_prevention_inherited bucket_name: bucket.name + end + + bucket.refresh! + _(bucket.public_access_prevention).must_equal "inherited" + bucket.public_access_prevention = :inherited + end + end describe "storage move file" do let(:source_file) { "file_1_name_#{SecureRandom.hex}.txt" }