Fail more gracefully on some common error conditions
[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_manifest
79     out, err = capture_subprocess_io do
80       assert_arv_get false, 'f1554a91e925d6213ce7c3103c5110c6/', 'tmp/'
81     end
82     assert_equal '', out
83     assert_match /^ERROR:/, err
84   end
85
86   def test_manifest_root_to_dir
87     remove_tmp_foo
88     out, err = capture_subprocess_io do
89       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp/'
90     end
91     assert_equal '', err
92     assert_equal '', out
93     assert_equal 'foo', IO.read('tmp/foo')
94   end
95
96   def test_manifest_root_to_dir_noslash
97     remove_tmp_foo
98     out, err = capture_subprocess_io do
99       assert_arv_get '-r', @@foo_manifest_locator + '/', 'tmp'
100     end
101     assert_equal '', err
102     assert_equal '', out
103     assert_equal 'foo', IO.read('tmp/foo')
104   end
105
106   def test_display_md5sum
107     remove_tmp_foo
108     out, err = capture_subprocess_io do
109       assert_arv_get '-r', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
110     end
111     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
112     assert_equal '', out
113     assert_equal 'foo', IO.read('tmp/foo')
114   end
115
116   def test_md5sum_nowrite
117     remove_tmp_foo
118     out, err = capture_subprocess_io do
119       assert_arv_get '-n', '--md5sum', @@foo_manifest_locator + '/', 'tmp/'
120     end
121     assert_equal "#{Digest::MD5.hexdigest('foo')}  ./foo\n", err
122     assert_equal '', out
123     assert_equal false, File.exists?('tmp/foo')
124   end
125
126   def test_sha1_nowrite
127     remove_tmp_foo
128     out, err = capture_subprocess_io do
129       assert_arv_get '-n', '-r', '--hash', 'sha1', @@foo_manifest_locator+'/', 'tmp/'
130     end
131     assert_equal "#{Digest::SHA1.hexdigest('foo')}  ./foo\n", err
132     assert_equal '', out
133     assert_equal false, File.exists?('tmp/foo')
134   end
135
136   def test_block_to_file
137     remove_tmp_foo
138     out, err = capture_subprocess_io do
139       assert_arv_get @@foo_manifest_locator, 'tmp/foo'
140     end
141     assert_equal '', err
142     assert_equal '', out
143     assert_equal foo_manifest, IO.read('tmp/foo')
144   end
145
146   def test_create_directory_tree
147     `rm -rf ./tmp/arv-get-test/`
148     Dir.mkdir './tmp/arv-get-test'
149     out, err = capture_subprocess_io do
150       assert_arv_get @@multilevel_manifest_locator + '/', 'tmp/arv-get-test/'
151     end
152     assert_equal '', err
153     assert_equal '', out
154     assert_equal 'baz', IO.read('tmp/arv-get-test/foo/bar/baz')
155   end
156
157   def test_create_partial_directory_tree
158     `rm -rf ./tmp/arv-get-test/`
159     Dir.mkdir './tmp/arv-get-test'
160     out, err = capture_subprocess_io do
161       assert_arv_get(@@multilevel_manifest_locator + '/foo/',
162                      'tmp/arv-get-test/')
163     end
164     assert_equal '', err
165     assert_equal '', out
166     assert_equal 'baz', IO.read('tmp/arv-get-test/bar/baz')
167   end
168
169   protected
170   def assert_arv_get(*args)
171     expect = case args.first
172              when true, false
173                args.shift
174              else
175                true
176              end
177     assert_equal(expect,
178                  system(['./bin/arv-get', 'arv-get'], *args),
179                  "`arv-get #{args.join ' '}` " +
180                  "should exit #{if expect then 0 else 'non-zero' end}")
181   end
182
183   def foo_manifest
184     ". #{Digest::MD5.hexdigest('foo')}+3 0:3:foo\n"
185   end
186
187   def remove_tmp_foo
188     begin
189       File.unlink('tmp/foo')
190     rescue Errno::ENOENT
191     end
192   end
193 end