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