X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a9b4a906124081439326fedc1a1e73fae9c2f40b..82a9595a6a35c648fff62c2497d858f1ab062578:/sdk/ruby/test/test_collection.rb diff --git a/sdk/ruby/test/test_collection.rb b/sdk/ruby/test/test_collection.rb index 3dd1ab3971..8b747c3652 100644 --- a/sdk/ruby/test/test_collection.rb +++ b/sdk/ruby/test/test_collection.rb @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + require "arvados/collection" require "minitest/autorun" require "sdk_fixtures" @@ -11,6 +15,10 @@ class CollectionTest < Minitest::Test "./s1 #{TWO_BY_TWO_BLOCKS.last} 0:5:f1 5:4:f3\n"] TWO_BY_TWO_MANIFEST_S = TWO_BY_TWO_MANIFEST_A.join("") + def abcde_blocks + ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+9", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb+9", "cccccccccccccccccccccccccccccccc+9", "dddddddddddddddddddddddddddddddd+9", "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee+9"] + end + ### .new def test_empty_construction @@ -28,6 +36,29 @@ class CollectionTest < Minitest::Test end end + def test_range_edge_cases + [ + ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:file1\n", + ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:file1 0:0:file2\n", + ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:file1 0:0:file1\n", + ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:file1 0:0:file2 0:0:file1\n", + ". 0cc175b9c0f1b6a831c399e269772661+1 0:0:file1 1:0:file2 1:0:file1\n", + ].each do |txt| + coll = Arv::Collection.new(txt) + coll.normalize + assert_match(/ 0:0:file1/, coll.manifest_text) + end + [ + ". d41d8cd98f00b204e9800998ecf8427e+0 1:0:file1\n", + ". 0cc175b9c0f1b6a831c399e269772661+1 0:0:file1 2:0:file2 1:0:file1\n", + ].each do |txt| + assert_raises(RangeError) do + coll = Arv::Collection.new(txt) + coll.normalize + end + end + end + def test_non_manifest_construction_error ["word", ". abc def", ". #{random_block} 0:", ". / !"].each do |m_text| assert_raises(ArgumentError, @@ -141,12 +172,12 @@ class CollectionTest < Minitest::Test test_normalization_file_spans_two_whole_blocks("2:3:f1 2:3:f1", 1) end - def test_normalization_dedups_locators + def test_normalization_handles_duplicate_locator blocks = random_blocks(2, 5) coll = Arv::Collection.new(". %s %s 1:8:f1 11:8:f1\n" % [blocks.join(" "), blocks.reverse.join(" ")]) coll.normalize - assert_equal(". #{blocks.join(' ')} 1:8:f1 6:4:f1 0:4:f1\n", + assert_equal(". #{blocks.join(' ')} #{blocks[0]} 1:8:f1 6:8:f1\n", coll.manifest_text) end @@ -223,13 +254,17 @@ class CollectionTest < Minitest::Test assert_equal(expected.join(""), coll.manifest_text) end - def test_copy_stream_over_file_raises_ENOTDIR + def test_copy_stream_over_file_raises_ENOTDIR(source="./s1", target="./f2") coll = Arv::Collection.new(TWO_BY_TWO_MANIFEST_S) assert_raises(Errno::ENOTDIR) do - coll.cp_r("./s1", "./f2") + coll.cp_r(source, target) end end + def test_copy_file_under_file_raises_ENOTDIR + test_copy_stream_over_file_raises_ENOTDIR("./f1", "./f2/newfile") + end + def test_copy_stream_over_nonempty_stream_merges_and_overwrites blocks = random_blocks(3, 9) manifest_a = @@ -323,6 +358,20 @@ class CollectionTest < Minitest::Test assert_equal(expect_lines.join(""), coll.manifest_text) end + def test_copy_file_into_new_stream_with_implicit_filename + coll = Arv::Collection.new(SIMPLEST_MANIFEST) + coll.cp_r("./simple.txt", "./new/") + assert_equal(SIMPLEST_MANIFEST + SIMPLEST_MANIFEST.sub(". ", "./new "), + coll.manifest_text) + end + + def test_copy_file_into_new_stream_with_explicit_filename + coll = Arv::Collection.new(SIMPLEST_MANIFEST) + coll.cp_r("./simple.txt", "./new/newfile.txt") + new_line = SIMPLEST_MANIFEST.sub(". ", "./new ").sub(":simple", ":newfile") + assert_equal(SIMPLEST_MANIFEST + new_line, coll.manifest_text) + end + def test_copy_stream_contents_into_root coll = Arv::Collection.new(TWO_BY_TWO_MANIFEST_S) coll.cp_r("./s1/", ".") @@ -363,6 +412,34 @@ class CollectionTest < Minitest::Test dst_coll.manifest_text) end + def test_copy_root_into_empty_collection + block = random_block(8) + src_coll = Arv::Collection.new(". #{block} 0:8:f1\n") + dst_coll = Arv::Collection.new() + dst_coll.cp_r("./", ".", src_coll) + assert_equal(". %s 0:8:f1\n" % + [block], + dst_coll.manifest_text) + end + + def test_copy_with_repeated_blocks + blocks = abcde_blocks + src_coll = Arv::Collection.new(". #{blocks[0]} #{blocks[1]} #{blocks[2]} #{blocks[0]} #{blocks[1]} #{blocks[2]} #{blocks[3]} #{blocks[4]} 27:27:f1\n") + dst_coll = Arv::Collection.new() + dst_coll.cp_r("f1", "./", src_coll) + assert_equal(". #{blocks[0]} #{blocks[1]} #{blocks[2]} 0:27:f1\n", dst_coll.manifest_text, "mangled by cp_r") + end + + def test_copy_with_repeated_split_blocks + blocks = abcde_blocks + src_coll = Arv::Collection.new(". #{blocks[0]} #{blocks[1]} #{blocks[2]} #{blocks[0]} #{blocks[1]} #{blocks[2]} #{blocks[3]} #{blocks[4]} 20:27:f1\n") + dst_coll = Arv::Collection.new() + src_coll.normalize + assert_equal(". #{blocks[2]} #{blocks[0]} #{blocks[1]} #{blocks[2]} 2:27:f1\n", src_coll.manifest_text, "mangled by normalize()") + dst_coll.cp_r("f1", "./", src_coll) + assert_equal(". #{blocks[2]} #{blocks[0]} #{blocks[1]} #{blocks[2]} 2:27:f1\n", dst_coll.manifest_text, "mangled by cp_r") + end + def test_copy_empty_source_path_raises_ArgumentError(src="", dst="./s1") coll = Arv::Collection.new(SIMPLEST_MANIFEST) assert_raises(ArgumentError) do @@ -374,6 +451,71 @@ class CollectionTest < Minitest::Test test_copy_empty_source_path_raises_ArgumentError(".", "") end + ### .each_file_path + + def test_each_file_path + coll = Arv::Collection.new(TWO_BY_TWO_MANIFEST_S) + if block_given? + result = yield(coll) + else + result = [] + coll.each_file_path { |path| result << path } + end + assert_equal(["./f1", "./f2", "./s1/f1", "./s1/f3"], result.sort) + end + + def test_each_file_path_without_block + test_each_file_path { |coll| coll.each_file_path.to_a } + end + + def test_each_file_path_empty_collection + assert_empty(Arv::Collection.new.each_file_path.to_a) + end + + def test_each_file_path_after_collection_emptied + coll = Arv::Collection.new(SIMPLEST_MANIFEST) + coll.rm("simple.txt") + assert_empty(coll.each_file_path.to_a) + end + + def test_each_file_path_deduplicates_manifest_listings + coll = Arv::Collection.new(MULTIBLOCK_FILE_MANIFEST) + assert_equal(["./repfile", "./s1/repfile", "./s1/uniqfile", + "./uniqfile", "./uniqfile2"], + coll.each_file_path.to_a.sort) + end + + ### .exist? + + def test_exist(test_method=:assert, path="f2") + coll = Arv::Collection.new(TWO_BY_TWO_MANIFEST_S) + send(test_method, coll.exist?(path)) + end + + def test_file_not_exist + test_exist(:refute, "f3") + end + + def test_stream_exist + test_exist(:assert, "s1") + end + + def test_file_inside_stream_exist + test_exist(:assert, "s1/f1") + end + + def test_path_inside_stream_not_exist + test_exist(:refute, "s1/f2") + end + + def test_path_under_file_not_exist + test_exist(:refute, "f2/nonexistent") + end + + def test_deep_substreams_not_exist + test_exist(:refute, "a/b/c/d/e/f/g") + end + ### .rename def test_simple_file_rename