Merge branch 'master' into 4156-cli-tests
[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     File.open './tmp/foo', 'wb' do |f|
62       f.write 'baz'
63     end
64     out, err = capture_subprocess_io do
65       assert_arv_get false, @@foo_manifest_locator + '/foo', 'tmp/foo'
66     end
67 #    assert_match /^ERROR:/, err
68     assert_equal '', out
69     assert_equal 'baz', IO.read('tmp/foo')
70   end
71
72   def test_file_to_file_no_overwrite_file_in_dir
73     File.open './tmp/foo', 'wb' do |f|
74       f.write 'baz'
75     end
76     out, err = capture_subprocess_io do
77       assert_arv_get false, @@foo_manifest_locator + '/', 'tmp/'
78     end
79 #    assert_match /^ERROR:/, err
80     assert_equal '', out
81     assert_equal 'baz', IO.read('tmp/foo')
82   end
83
84   def test_file_to_file_force_overwrite
85     skip "Waiting unitl #4534 is implemented"
86
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     skip "Waiting unitl #4534 is implemented"
101
102     File.open './tmp/foo', 'wb' do |f|
103       f.write 'baz'
104     end
105     assert_equal 'baz', IO.read('tmp/foo')
106     out, err = capture_subprocess_io do
107       assert_arv_get '--skip-existing', @@foo_manifest_locator + '/', 'tmp/'
108     end
109     assert_match '', err
110     assert_equal '', out
111     assert_equal 'baz', IO.read('tmp/foo')
112   end
113
114   def test_file_to_dir
115     skip "Waiting unitl #4534 is implemented"
116
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     skip "Waiting unitl #4534 is implemented"
144
145     out, err = capture_subprocess_io do
146       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6'
147     end
148     assert_equal '', out
149     assert_match /Error:/, err
150   end
151
152   def test_nonexistent_manifest
153     skip "Waiting unitl #4534 is implemented"
154
155     out, err = capture_subprocess_io do
156       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6/', 'tmp/'
157     end
158     assert_equal '', out
159     assert_match /Error:/, err
160   end
161
162   def test_manifest_root_to_dir
163     skip "Waiting unitl #4534 is implemented"
164
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_manifest_root_to_dir_noslash
175     skip "Waiting unitl #4534 is implemented"
176
177     remove_tmp_foo
178     out, err = capture_subprocess_io do
179       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp'
180     end
181     assert_equal '', err
182     assert_equal '', out
183     assert_equal 'foo', IO.read('tmp/foo')
184   end
185
186   def test_display_md5sum
187     skip "Waiting unitl #4534 is implemented"
188
189     remove_tmp_foo
190     out, err = capture_subprocess_io do
191       assert_arv_get '-r', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
192     end
193     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
194     assert_equal '', out
195     assert_equal 'foo', IO.read('tmp/foo')
196   end
197
198   def test_md5sum_nowrite
199     skip "Waiting unitl #4534 is implemented"
200
201     remove_tmp_foo
202     out, err = capture_subprocess_io do
203       assert_arv_get '-n', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
204     end
205     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
206     assert_equal '', out
207     assert_equal false, File.exists?('tmp/foo')
208   end
209
210   def test_sha1_nowrite
211     skip "Waiting unitl #4534 is implemented"
212
213     remove_tmp_foo
214     out, err = capture_subprocess_io do
215       assert_arv_get '-n', '-r', '--hash', 'sha1', @@foo_manifest_locator+'/', 'tmp/'
216     end
217     assert_equal "#{Digest::SHA1.hexdigest('foo')}  ./foo\n", err
218     assert_equal '', out
219     assert_equal false, File.exists?('tmp/foo')
220   end
221
222   def test_block_to_file
223     skip "Waiting unitl #4534 is implemented"
224
225     remove_tmp_foo
226     out, err = capture_subprocess_io do
227       assert_arv_get @@foo_manifest_locator, 'tmp/foo'
228     end
229     assert_equal '', err
230     assert_equal '', out
231
232     digest = Digest::MD5.hexdigest('foo')
233     !(IO.read('tmp/foo')).gsub!( /^(. #{digest}+3)(.*)( 0:3:foo)$/).nil?
234   end
235
236   def test_create_directory_tree
237     skip "Waiting unitl #4534 is implemented"
238
239     `rm -rf ./tmp/arv-get-test/`
240     Dir.mkdir './tmp/arv-get-test'
241     out, err = capture_subprocess_io do
242       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
243     end
244     assert_equal '', err
245     assert_equal '', out
246     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
247   end
248
249   def test_create_partial_directory_tree
250     skip "Waiting unitl #4534 is implemented"
251
252     `rm -rf ./tmp/arv-get-test/`
253     Dir.mkdir './tmp/arv-get-test'
254     out, err = capture_subprocess_io do
255       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
256                      'tmp/arv-get-test/')
257     end
258     assert_equal '', err
259     assert_equal '', out
260     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
261   end
262
263   protected
264   def assert_arv_get(*args)
265     expect = case args.first
266              when true, false
267                args.shift
268              else
269                true
270              end
271     assert_equal(expect,
272                  system(['./bin/arv-get', 'arv-get'], *args),
273                  "`arv-get #{args.join ' '}` " +
274                  "should exit #{if expect then 0 else 'non-zero' end}")
275   end
276
277   def remove_tmp_foo
278     begin
279       File.unlink('tmp/foo')
280     rescue Errno::ENOENT
281     end
282   end
283 end