X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/91ef36eeea827569ec3745696e233aad0f8063aa..72d7d41944006d1f48f570784dafe56b9812b0c8:/services/api/test/unit/collection_test.rb diff --git a/services/api/test/unit/collection_test.rb b/services/api/test/unit/collection_test.rb index a28893e011..de0f1d360c 100644 --- a/services/api/test/unit/collection_test.rb +++ b/services/api/test/unit/collection_test.rb @@ -185,12 +185,29 @@ class CollectionTest < ActiveSupport::TestCase c.reload assert_equal 'foobar', c.name assert_equal 2, c.version + # Simulate a keep-balance run and trigger a new versionable update + # This tests bug #18005 + assert_nil c.replication_confirmed + assert_nil c.replication_confirmed_at + # Updates without validations/callbacks + c.update_column('modified_at', fifteen_min_ago) + c.update_column('replication_confirmed_at', Time.now) + c.update_column('replication_confirmed', 2) + c.reload + assert_equal fifteen_min_ago.to_i, c.modified_at.to_i + assert_not_nil c.replication_confirmed_at + assert_not_nil c.replication_confirmed + # Make the versionable update + c.update_attributes!({'name' => 'foobarbaz'}) + c.reload + assert_equal 'foobarbaz', c.name + assert_equal 3, c.version end end - test "preserve_version=false assignment is ignored while being true and not producing a new version" do + test "preserve_version updates" do Rails.configuration.Collections.CollectionVersioning = true - Rails.configuration.Collections.PreserveVersionIfIdle = 3600 + Rails.configuration.Collections.PreserveVersionIfIdle = -1 # disabled act_as_user users(:active) do # Set up initial collection c = create_collection 'foo', Encoding::US_ASCII @@ -199,28 +216,61 @@ class CollectionTest < ActiveSupport::TestCase assert_equal false, c.preserve_version # This update shouldn't produce a new version, as the idle time is not up c.update_attributes!({ - 'name' => 'bar', - 'preserve_version' => true + 'name' => 'bar' }) c.reload assert_equal 1, c.version assert_equal 'bar', c.name + assert_equal false, c.preserve_version + # This update should produce a new version, even if the idle time is not up + # and also keep the preserve_version=true flag to persist it. + c.update_attributes!({ + 'name' => 'baz', + 'preserve_version' => true + }) + c.reload + assert_equal 2, c.version + assert_equal 'baz', c.name assert_equal true, c.preserve_version # Make sure preserve_version is not disabled after being enabled, unless # a new version is created. + # This is a non-versionable update c.update_attributes!({ 'preserve_version' => false, 'replication_desired' => 2 }) c.reload - assert_equal 1, c.version + assert_equal 2, c.version assert_equal 2, c.replication_desired assert_equal true, c.preserve_version - c.update_attributes!({'name' => 'foobar'}) + # This is a versionable update + c.update_attributes!({ + 'preserve_version' => false, + 'name' => 'foobar' + }) c.reload - assert_equal 2, c.version + assert_equal 3, c.version assert_equal false, c.preserve_version assert_equal 'foobar', c.name + # Flipping only 'preserve_version' to true doesn't create a new version + c.update_attributes!({'preserve_version' => true}) + c.reload + assert_equal 3, c.version + assert_equal true, c.preserve_version + end + end + + test "preserve_version updates don't change modified_at timestamp" do + act_as_user users(:active) do + c = create_collection 'foo', Encoding::US_ASCII + assert c.valid? + assert_equal false, c.preserve_version + modified_at = c.modified_at.to_f + c.update_attributes!({'preserve_version' => true}) + c.reload + assert_equal true, c.preserve_version + assert_equal modified_at, c.modified_at.to_f, + 'preserve_version updates should not trigger modified_at changes' end end @@ -660,6 +710,19 @@ class CollectionTest < ActiveSupport::TestCase end end + test "storage_classes_desired default respects config" do + saved = Rails.configuration.DefaultStorageClasses + Rails.configuration.DefaultStorageClasses = ["foo"] + begin + act_as_user users(:active) do + c = Collection.create! + assert_equal ["foo"], c.storage_classes_desired + end + ensure + Rails.configuration.DefaultStorageClasses = saved + end + end + test "storage_classes_desired cannot be empty" do act_as_user users(:active) do c = collections(:collection_owned_by_active) @@ -793,7 +856,7 @@ class CollectionTest < ActiveSupport::TestCase test "clear replication_confirmed* when introducing a new block in manifest" do c = collections(:replication_desired_2_confirmed_2) act_as_user users(:active) do - assert c.update_attributes(manifest_text: collections(:user_agreement).signed_manifest_text) + assert c.update_attributes(manifest_text: collections(:user_agreement).signed_manifest_text_only_for_tests) assert_nil c.replication_confirmed assert_nil c.replication_confirmed_at end @@ -802,7 +865,7 @@ class CollectionTest < ActiveSupport::TestCase test "don't clear replication_confirmed* when just renaming a file" do c = collections(:replication_desired_2_confirmed_2) act_as_user users(:active) do - new_manifest = c.signed_manifest_text.sub(':bar', ':foo') + new_manifest = c.signed_manifest_text_only_for_tests.sub(':bar', ':foo') assert c.update_attributes(manifest_text: new_manifest) assert_equal 2, c.replication_confirmed assert_not_nil c.replication_confirmed_at @@ -812,13 +875,13 @@ class CollectionTest < ActiveSupport::TestCase test "don't clear replication_confirmed* when just deleting a data block" do c = collections(:replication_desired_2_confirmed_2) act_as_user users(:active) do - new_manifest = c.signed_manifest_text + new_manifest = c.signed_manifest_text_only_for_tests new_manifest.sub!(/ \S+:bar/, '') new_manifest.sub!(/ acbd\S+/, '') # Confirm that we did just remove a block from the manifest (if # not, this test would pass without testing the relevant case): - assert_operator new_manifest.length+40, :<, c.signed_manifest_text.length + assert_operator new_manifest.length+40, :<, c.signed_manifest_text_only_for_tests.length assert c.update_attributes(manifest_text: new_manifest) assert_equal 2, c.replication_confirmed @@ -832,7 +895,7 @@ class CollectionTest < ActiveSupport::TestCase c = Collection.create!(manifest_text: ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:x\n", name: 'foo') c.update_attributes! trash_at: (t0 + 1.hours) c.reload - sig_exp = /\+A[0-9a-f]{40}\@([0-9]+)/.match(c.signed_manifest_text)[1].to_i + sig_exp = /\+A[0-9a-f]{40}\@([0-9]+)/.match(c.signed_manifest_text_only_for_tests)[1].to_i assert_operator sig_exp.to_i, :<=, (t0 + 1.hours).to_i end end @@ -842,7 +905,7 @@ class CollectionTest < ActiveSupport::TestCase c = Collection.create!(manifest_text: ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:x\n", name: 'foo', trash_at: db_current_time + 1.years) - sig_exp = /\+A[0-9a-f]{40}\@([0-9]+)/.match(c.signed_manifest_text)[1].to_i + sig_exp = /\+A[0-9a-f]{40}\@([0-9]+)/.match(c.signed_manifest_text_only_for_tests)[1].to_i expect_max_sig_exp = db_current_time.to_i + Rails.configuration.Collections.BlobSigningTTL.to_i assert_operator c.trash_at.to_i, :>, expect_max_sig_exp assert_operator sig_exp.to_i, :<=, expect_max_sig_exp