Fail gracefully when fetching a raw block that does not exist
[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_dir
55     out, err = capture_subprocess_io do
56       assert_arv_get false, @@foo_manifest_locator + '/foo', 'tmp/'
57     end
58     assert_equal '', out
59     assert_match /^usage:/, err
60   end
61
62   def test_dir_to_file
63     out, err = capture_subprocess_io do
64       assert_arv_get false, @@foo_manifest_locator + '/', 'tmp/foo'
65     end
66     assert_equal '', out
67     assert_match /^usage:/, err
68   end
69
70   def test_dir_to_empty_string
71     out, err = capture_subprocess_io do
72       assert_arv_get false, @@foo_manifest_locator + '/', ''
73     end
74     assert_equal '', out
75     assert_match /^usage:/, err
76   end
77
78   def test_nonexistent_block
79     out, err = capture_subprocess_io do
80       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6'
81     end
82     assert_equal '', out
83     assert_match /^ERROR:/, err
84   end
85
86   def test_nonexistent_manifest
87     out, err = capture_subprocess_io do
88       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6/', 'tmp/'
89     end
90     assert_equal '', out
91     assert_match /^ERROR:/, err
92   end
93
94   def test_manifest_root_to_dir
95     remove_tmp_foo
96     out, err = capture_subprocess_io do
97       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp/'
98     end
99     assert_equal '', err
100     assert_equal '', out
101     assert_equal 'foo', IO.read('tmp/foo')
102   end
103
104   def test_manifest_root_to_dir_noslash
105     remove_tmp_foo
106     out, err = capture_subprocess_io do
107       assert_arv_get '-r', @@foo_manifest_locator + '/', '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_display_md5sum
115     remove_tmp_foo
116     out, err = capture_subprocess_io do
117       assert_arv_get '-r', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
118     end
119     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
120     assert_equal '', out
121     assert_equal 'foo', IO.read('tmp/foo')
122   end
123
124   def test_md5sum_nowrite
125     remove_tmp_foo
126     out, err = capture_subprocess_io do
127       assert_arv_get '-n', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
128     end
129     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
130     assert_equal '', out
131     assert_equal false, File.exists?('tmp/foo')
132   end
133
134   def test_sha1_nowrite
135     remove_tmp_foo
136     out, err = capture_subprocess_io do
137       assert_arv_get '-n', '-r', '--hash', 'sha1', @@foo_manifest_locator+'/', 'tmp/'
138     end
139     assert_equal "#{Digest::SHA1.hexdigest('foo')}  ./foo\n", err
140     assert_equal '', out
141     assert_equal false, File.exists?('tmp/foo')
142   end
143
144   def test_block_to_file
145     remove_tmp_foo
146     out, err = capture_subprocess_io do
147       assert_arv_get @@foo_manifest_locator, 'tmp/foo'
148     end
149     assert_equal '', err
150     assert_equal '', out
151     assert_equal foo_manifest, IO.read('tmp/foo')
152   end
153
154   def test_create_directory_tree
155     `rm -rf ./tmp/arv-get-test/`
156     Dir.mkdir './tmp/arv-get-test'
157     out, err = capture_subprocess_io do
158       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
159     end
160     assert_equal '', err
161     assert_equal '', out
162     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
163   end
164
165   def test_create_partial_directory_tree
166     `rm -rf ./tmp/arv-get-test/`
167     Dir.mkdir './tmp/arv-get-test'
168     out, err = capture_subprocess_io do
169       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
170                      'tmp/arv-get-test/')
171     end
172     assert_equal '', err
173     assert_equal '', out
174     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
175   end
176
177   protected
178   def assert_arv_get(*args)
179     expect = case args.first
180              when true, false
181                args.shift
182              else
183                true
184              end
185     assert_equal(expect,
186                  system(['./bin/arv-get', 'arv-get'], *args),
187                  "`arv-get #{args.join ' '}` " +
188                  "should exit #{if expect then 0 else 'non-zero' end}")
189   end
190
191   def foo_manifest
192     ". #{Digest::MD5.hexdigest('foo')}+3 0:3:foo\n"
193   end
194
195   def remove_tmp_foo
196     begin
197       File.unlink('tmp/foo')
198     rescue Errno::ENOENT
199     end
200   end
201 end