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