Merge branch 'master' into 4823-python-sdk-writable-collection-api
[arvados.git] / sdk / cli / test / test_arv-get.rb
1 require 'minitest/autorun'
2 require 'digest/md5'
3
4 class TestArvGet < 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_help
24     out, err = capture_subprocess_io do
25       assert_arv_get '-h'
26     end
27     $stderr.write err
28     assert_equal '', err
29     assert_match /^usage:/, out
30   end
31
32   def test_file_to_dev_stdout
33     skip "Waiting unitl #4534 is implemented"
34
35     test_file_to_stdout('/dev/stdout')
36   end
37
38   def test_file_to_stdout(specify_stdout_as='-')
39     skip "Waiting unitl #4534 is implemented"
40
41     out, err = capture_subprocess_io do
42       assert_arv_get @@foo_manifest_locator + '/foo', specify_stdout_as
43     end
44     assert_equal '', err
45     assert_equal 'foo', out
46   end
47
48   def test_file_to_file
49     skip "Waiting unitl #4534 is implemented"
50
51     remove_tmp_foo
52     out, err = capture_subprocess_io do
53       assert_arv_get @@foo_manifest_locator + '/foo', 'tmp/foo'
54     end
55     assert_equal '', err
56     assert_equal '', out
57     assert_equal 'foo', IO.read('tmp/foo')
58   end
59
60   def test_file_to_file_no_overwrite_file
61     skip "Waiting unitl #4534 is implemented"
62     File.open './tmp/foo', 'wb' do |f|
63       f.write 'baz'
64     end
65     out, err = capture_subprocess_io do
66       assert_arv_get false, @@foo_manifest_locator + '/foo', 'tmp/foo'
67     end
68     assert_match /Error:/, err
69     assert_equal '', out
70     assert_equal 'baz', IO.read('tmp/foo')
71   end
72
73   def test_file_to_file_no_overwrite_file_in_dir
74     skip "Waiting unitl #4534 is implemented"
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 /Error:/, 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     skip "Waiting unitl #4534 is implemented"
88
89     File.open './tmp/foo', 'wb' do |f|
90       f.write 'baz'
91     end
92     assert_equal 'baz', IO.read('tmp/foo')
93     out, err = capture_subprocess_io do
94       assert_arv_get '-f', @@foo_manifest_locator + '/', 'tmp/'
95     end
96     assert_match '', err
97     assert_equal '', out
98     assert_equal 'foo', IO.read('tmp/foo')
99   end
100
101   def test_file_to_file_skip_existing
102     skip "Waiting unitl #4534 is implemented"
103
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     skip "Waiting unitl #4534 is implemented"
118
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     skip "Waiting unitl #4534 is implemented"
146
147     out, err = capture_subprocess_io do
148       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6'
149     end
150     assert_equal '', out
151     assert_match /Error:/, err
152   end
153
154   def test_nonexistent_manifest
155     skip "Waiting unitl #4534 is implemented"
156
157     out, err = capture_subprocess_io do
158       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6/', 'tmp/'
159     end
160     assert_equal '', out
161     assert_match /Error:/, err
162   end
163
164   def test_manifest_root_to_dir
165     skip "Waiting unitl #4534 is implemented"
166
167     remove_tmp_foo
168     out, err = capture_subprocess_io do
169       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp/'
170     end
171     assert_equal '', err
172     assert_equal '', out
173     assert_equal 'foo', IO.read('tmp/foo')
174   end
175
176   def test_manifest_root_to_dir_noslash
177     skip "Waiting unitl #4534 is implemented"
178
179     remove_tmp_foo
180     out, err = capture_subprocess_io do
181       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp'
182     end
183     assert_equal '', err
184     assert_equal '', out
185     assert_equal 'foo', IO.read('tmp/foo')
186   end
187
188   def test_display_md5sum
189     skip "Waiting unitl #4534 is implemented"
190
191     remove_tmp_foo
192     out, err = capture_subprocess_io do
193       assert_arv_get '-r', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
194     end
195     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
196     assert_equal '', out
197     assert_equal 'foo', IO.read('tmp/foo')
198   end
199
200   def test_md5sum_nowrite
201     skip "Waiting unitl #4534 is implemented"
202
203     remove_tmp_foo
204     out, err = capture_subprocess_io do
205       assert_arv_get '-n', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
206     end
207     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
208     assert_equal '', out
209     assert_equal false, File.exists?('tmp/foo')
210   end
211
212   def test_sha1_nowrite
213     skip "Waiting unitl #4534 is implemented"
214
215     remove_tmp_foo
216     out, err = capture_subprocess_io do
217       assert_arv_get '-n', '-r', '--hash', 'sha1', @@foo_manifest_locator+'/', 'tmp/'
218     end
219     assert_equal "#{Digest::SHA1.hexdigest('foo')}  ./foo\n", err
220     assert_equal '', out
221     assert_equal false, File.exists?('tmp/foo')
222   end
223
224   def test_block_to_file
225     skip "Waiting unitl #4534 is implemented"
226
227     remove_tmp_foo
228     out, err = capture_subprocess_io do
229       assert_arv_get @@foo_manifest_locator, 'tmp/foo'
230     end
231     assert_equal '', err
232     assert_equal '', out
233
234     digest = Digest::MD5.hexdigest('foo')
235     !(IO.read('tmp/foo')).gsub!( /^(. #{digest}+3)(.*)( 0:3:foo)$/).nil?
236   end
237
238   def test_create_directory_tree
239     skip "Waiting unitl #4534 is implemented"
240
241     `rm -rf ./tmp/arv-get-test/`
242     Dir.mkdir './tmp/arv-get-test'
243     out, err = capture_subprocess_io do
244       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
245     end
246     assert_equal '', err
247     assert_equal '', out
248     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
249   end
250
251   def test_create_partial_directory_tree
252     skip "Waiting unitl #4534 is implemented"
253
254     `rm -rf ./tmp/arv-get-test/`
255     Dir.mkdir './tmp/arv-get-test'
256     out, err = capture_subprocess_io do
257       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
258                      'tmp/arv-get-test/')
259     end
260     assert_equal '', err
261     assert_equal '', out
262     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
263   end
264
265   protected
266   def assert_arv_get(*args)
267     expect = case args.first
268              when true, false
269                args.shift
270              else
271                true
272              end
273     assert_equal(expect,
274                  system(['./bin/arv-get', 'arv-get'], *args),
275                  "`arv-get #{args.join ' '}` " +
276                  "should exit #{if expect then 0 else 'non-zero' end}")
277   end
278
279   def remove_tmp_foo
280     begin
281       File.unlink('tmp/foo')
282     rescue Errno::ENOENT
283     end
284   end
285 end