8460: Fix copy-paste errors; use html entity instead of literal utf8 bullet.
[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_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 /Local file tmp\/foo already exists/, 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 /Local file tmp\/foo already exists/, 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, 'e796ab2294f3e48ec709ffa8d6daf58c'
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, 'acbd18db4cc2f85cedef654fccc4a4d8/', '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.exist?('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.exist?('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
204     digest = Digest::MD5.hexdigest('foo')
205     !(IO.read('tmp/foo')).gsub!( /^(. #{digest}+3)(.*)( 0:3:foo)$/).nil?
206   end
207
208   def test_create_directory_tree
209     `rm -rf ./tmp/arv-get-test/`
210     Dir.mkdir './tmp/arv-get-test'
211     out, err = capture_subprocess_io do
212       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
213     end
214     assert_equal '', err
215     assert_equal '', out
216     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
217   end
218
219   def test_create_partial_directory_tree
220     `rm -rf ./tmp/arv-get-test/`
221     Dir.mkdir './tmp/arv-get-test'
222     out, err = capture_subprocess_io do
223       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
224                      'tmp/arv-get-test/')
225     end
226     assert_equal '', err
227     assert_equal '', out
228     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
229   end
230
231   protected
232   def assert_arv_get(*args)
233     expect = case args.first
234              when true, false
235                args.shift
236              else
237                true
238              end
239     assert_equal(expect,
240                  system(['./bin/arv-get', 'arv-get'], *args),
241                  "`arv-get #{args.join ' '}` " +
242                  "should exit #{if expect then 0 else 'non-zero' end}")
243   end
244
245   def remove_tmp_foo
246     begin
247       File.unlink('tmp/foo')
248     rescue Errno::ENOENT
249     end
250   end
251 end