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