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