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     out, err = capture_subprocess_io do
144       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6'
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, 'f1554a91e925d6213ce7c3103c5110c6/', 'tmp/'
153     end
154     assert_equal '', out
155     assert_match /Error:/, err
156   end
157
158   def test_manifest_root_to_dir
159     skip "Waiting unitl #4534 is implemented"
160
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     skip "Waiting unitl #4534 is implemented"
172
173     remove_tmp_foo
174     out, err = capture_subprocess_io do
175       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp'
176     end
177     assert_equal '', err
178     assert_equal '', out
179     assert_equal 'foo', IO.read('tmp/foo')
180   end
181
182   def test_display_md5sum
183     skip "Waiting unitl #4534 is implemented"
184
185     remove_tmp_foo
186     out, err = capture_subprocess_io do
187       assert_arv_get '-r', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
188     end
189     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
190     assert_equal '', out
191     assert_equal 'foo', IO.read('tmp/foo')
192   end
193
194   def test_md5sum_nowrite
195     skip "Waiting unitl #4534 is implemented"
196
197     remove_tmp_foo
198     out, err = capture_subprocess_io do
199       assert_arv_get '-n', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
200     end
201     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
202     assert_equal '', out
203     assert_equal false, File.exists?('tmp/foo')
204   end
205
206   def test_sha1_nowrite
207     skip "Waiting unitl #4534 is implemented"
208
209     remove_tmp_foo
210     out, err = capture_subprocess_io do
211       assert_arv_get '-n', '-r', '--hash', 'sha1', @@foo_manifest_locator+'/', 'tmp/'
212     end
213     assert_equal "#{Digest::SHA1.hexdigest('foo')}  ./foo\n", err
214     assert_equal '', out
215     assert_equal false, File.exists?('tmp/foo')
216   end
217
218   def test_block_to_file
219     skip "Waiting unitl #4534 is implemented"
220
221     remove_tmp_foo
222     out, err = capture_subprocess_io do
223       assert_arv_get @@foo_manifest_locator, 'tmp/foo'
224     end
225     assert_equal '', err
226     assert_equal '', out
227
228     digest = Digest::MD5.hexdigest('foo')
229     !(IO.read('tmp/foo')).gsub!( /^(. #{digest}+3)(.*)( 0:3:foo)$/).nil?
230   end
231
232   def test_create_directory_tree
233     skip "Waiting unitl #4534 is implemented"
234
235     `rm -rf ./tmp/arv-get-test/`
236     Dir.mkdir './tmp/arv-get-test'
237     out, err = capture_subprocess_io do
238       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
239     end
240     assert_equal '', err
241     assert_equal '', out
242     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
243   end
244
245   def test_create_partial_directory_tree
246     skip "Waiting unitl #4534 is implemented"
247
248     `rm -rf ./tmp/arv-get-test/`
249     Dir.mkdir './tmp/arv-get-test'
250     out, err = capture_subprocess_io do
251       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
252                      'tmp/arv-get-test/')
253     end
254     assert_equal '', err
255     assert_equal '', out
256     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
257   end
258
259   protected
260   def assert_arv_get(*args)
261     expect = case args.first
262              when true, false
263                args.shift
264              else
265                true
266              end
267     assert_equal(expect,
268                  system(['./bin/arv-get', 'arv-get'], *args),
269                  "`arv-get #{args.join ' '}` " +
270                  "should exit #{if expect then 0 else 'non-zero' end}")
271   end
272
273   def remove_tmp_foo
274     begin
275       File.unlink('tmp/foo')
276     rescue Errno::ENOENT
277     end
278   end
279 end