Merge branch '19109-upload-secondary' refs #19109
[arvados.git] / sdk / cli / test / test_arv-keep-get.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 require 'minitest/autorun'
6 require 'digest/md5'
7
8 class TestArvKeepGet < Minitest::Test
9   def setup
10     begin
11       Dir.mkdir './tmp'
12     rescue Errno::EEXIST
13     end
14     @@foo_manifest_locator ||= `echo -n foo | ./bin/arv-put --filename foo --no-progress -`.strip
15     @@baz_locator ||= `echo -n baz | ./bin/arv-put --as-raw --no-progress -`.strip
16     @@multilevel_manifest_locator ||= `echo -n baz | ./bin/arv-put --filename foo/bar/baz --no-progress -`.strip
17   end
18
19   def test_no_args
20     out, err = capture_subprocess_io do
21       assert_arv_get false
22     end
23     assert_equal '', out
24     assert_match(/^usage:/, err)
25   end
26
27   def test_get_version
28     out, err = capture_subprocess_io do
29       assert_arv_get '--version'
30     end
31     # python3 handles action='version' differently than python2
32     # https://dev.arvados.org/issues/15888#note-23
33     assert_empty(err, "STDERR not expected: '#{err}'")
34     assert_match(/[0-9]+\.[0-9]+\.[0-9]+/, out, "Version information incorrect: '#{out}'")
35   end
36
37   def test_help
38     out, err = capture_subprocess_io do
39       assert_arv_get '-h'
40     end
41     $stderr.write err
42     assert_equal '', err
43     assert_match(/^usage:/, out)
44   end
45
46   def test_file_to_dev_stdout
47     test_file_to_stdout('/dev/stdout')
48   end
49
50   def test_file_to_stdout(specify_stdout_as='-')
51     out, err = capture_subprocess_io do
52       assert_arv_get @@foo_manifest_locator + '/foo', specify_stdout_as
53     end
54     assert_equal '', err
55     assert_equal 'foo', out
56   end
57
58   def test_file_to_file
59     remove_tmp_foo
60     out, err = capture_subprocess_io do
61       assert_arv_get @@foo_manifest_locator + '/foo', 'tmp/foo'
62     end
63     assert_equal '', err
64     assert_equal '', out
65     assert_equal 'foo', IO.read('tmp/foo')
66   end
67
68   def test_file_to_file_no_overwrite_file
69     File.open './tmp/foo', 'wb' do |f|
70       f.write 'baz'
71     end
72     out, err = capture_subprocess_io do
73       assert_arv_get false, @@foo_manifest_locator + '/foo', 'tmp/foo'
74     end
75     assert_match(/Local file tmp\/foo already exists/, err)
76     assert_equal '', out
77     assert_equal 'baz', IO.read('tmp/foo')
78   end
79
80   def test_file_to_file_no_overwrite_file_in_dir
81     File.open './tmp/foo', 'wb' do |f|
82       f.write 'baz'
83     end
84     out, err = capture_subprocess_io do
85       assert_arv_get false, @@foo_manifest_locator + '/', 'tmp/'
86     end
87     assert_match(/Local file tmp\/foo already exists/, err)
88     assert_equal '', out
89     assert_equal 'baz', IO.read('tmp/foo')
90   end
91
92   def test_file_to_file_force_overwrite
93     File.open './tmp/foo', 'wb' do |f|
94       f.write 'baz'
95     end
96     assert_equal 'baz', IO.read('tmp/foo')
97     out, err = capture_subprocess_io do
98       assert_arv_get '-f', @@foo_manifest_locator + '/', 'tmp/'
99     end
100     assert_match '', err
101     assert_equal '', out
102     assert_equal 'foo', IO.read('tmp/foo')
103   end
104
105   def test_file_to_file_skip_existing
106     File.open './tmp/foo', 'wb' do |f|
107       f.write 'baz'
108     end
109     assert_equal 'baz', IO.read('tmp/foo')
110     out, err = capture_subprocess_io do
111       assert_arv_get '--skip-existing', @@foo_manifest_locator + '/', 'tmp/'
112     end
113     assert_match '', err
114     assert_equal '', out
115     assert_equal 'baz', IO.read('tmp/foo')
116   end
117
118   def test_file_to_dir
119     remove_tmp_foo
120     out, err = capture_subprocess_io do
121       assert_arv_get @@foo_manifest_locator + '/foo', 'tmp/'
122     end
123     assert_equal '', err
124     assert_equal '', out
125     assert_equal 'foo', IO.read('tmp/foo')
126   end
127
128   def test_dir_to_file
129     out, err = capture_subprocess_io do
130       assert_arv_get false, @@foo_manifest_locator + '/', 'tmp/foo'
131     end
132     assert_equal '', out
133     assert_match(/^usage:/, err)
134   end
135
136   def test_dir_to_empty_string
137     out, err = capture_subprocess_io do
138       assert_arv_get false, @@foo_manifest_locator + '/', ''
139     end
140     assert_equal '', out
141     assert_match(/^usage:/, err)
142   end
143
144   def test_nonexistent_block
145     out, err = capture_subprocess_io do
146       assert_arv_get false, 'e796ab2294f3e48ec709ffa8d6daf58c'
147     end
148     assert_equal '', out
149     assert_match(/ERROR:/, err)
150   end
151
152   def test_nonexistent_manifest
153     out, err = capture_subprocess_io do
154       assert_arv_get false, 'acbd18db4cc2f85cedef654fccc4a4d8/', 'tmp/'
155     end
156     assert_equal '', out
157     assert_match(/ERROR:/, err)
158   end
159
160   def test_manifest_root_to_dir
161     remove_tmp_foo
162     out, err = capture_subprocess_io do
163       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp/'
164     end
165     assert_equal '', err
166     assert_equal '', out
167     assert_equal 'foo', IO.read('tmp/foo')
168   end
169
170   def test_manifest_root_to_dir_noslash
171     remove_tmp_foo
172     out, err = capture_subprocess_io do
173       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp'
174     end
175     assert_equal '', err
176     assert_equal '', out
177     assert_equal 'foo', IO.read('tmp/foo')
178   end
179
180   def test_display_md5sum
181     remove_tmp_foo
182     out, err = capture_subprocess_io do
183       assert_arv_get '-r', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
184     end
185     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
186     assert_equal '', out
187     assert_equal 'foo', IO.read('tmp/foo')
188   end
189
190   def test_md5sum_nowrite
191     remove_tmp_foo
192     out, err = capture_subprocess_io do
193       assert_arv_get '-n', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
194     end
195     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
196     assert_equal '', out
197     assert_equal false, File.exist?('tmp/foo')
198   end
199
200   def test_sha1_nowrite
201     remove_tmp_foo
202     out, err = capture_subprocess_io do
203       assert_arv_get '-n', '-r', '--hash', 'sha1', @@foo_manifest_locator+'/', 'tmp/'
204     end
205     assert_equal "#{Digest::SHA1.hexdigest('foo')}  ./foo\n", err
206     assert_equal '', out
207     assert_equal false, File.exist?('tmp/foo')
208   end
209
210   def test_block_to_file
211     remove_tmp_foo
212     out, err = capture_subprocess_io do
213       assert_arv_get @@foo_manifest_locator, 'tmp/foo'
214     end
215     assert_equal '', err
216     assert_equal '', out
217
218     digest = Digest::MD5.hexdigest('foo')
219     !(IO.read('tmp/foo')).gsub!( /^(. #{digest}+3)(.*)( 0:3:foo)$/).nil?
220   end
221
222   def test_create_directory_tree
223     `rm -rf ./tmp/arv-get-test/`
224     Dir.mkdir './tmp/arv-get-test'
225     out, err = capture_subprocess_io do
226       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
227     end
228     assert_equal '', err
229     assert_equal '', out
230     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
231   end
232
233   def test_create_partial_directory_tree
234     `rm -rf ./tmp/arv-get-test/`
235     Dir.mkdir './tmp/arv-get-test'
236     out, err = capture_subprocess_io do
237       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
238                      'tmp/arv-get-test/')
239     end
240     assert_equal '', err
241     assert_equal '', out
242     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
243   end
244
245   protected
246   def assert_arv_get(*args)
247     expect = case args.first
248              when true, false
249                args.shift
250              else
251                true
252              end
253     assert_equal(expect,
254                  system(['./bin/arv-get', 'arv-get'], *args),
255                  "`arv-get #{args.join ' '}` " +
256                  "should exit #{if expect then 0 else 'non-zero' end}")
257   end
258
259   def remove_tmp_foo
260     begin
261       File.unlink('tmp/foo')
262     rescue Errno::ENOENT
263     end
264   end
265 end