17464: Add upload/download permission checks and logging
[arvados.git] / sdk / cli / test / test_arv-keep-put.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: Apache-2.0
4
5 require 'minitest/autorun'
6 require 'digest/md5'
7
8 class TestArvKeepPut < Minitest::Test
9   def setup
10     begin Dir.mkdir './tmp' rescue Errno::EEXIST end
11     begin Dir.mkdir './tmp/empty_dir' rescue Errno::EEXIST end
12     File.open './tmp/empty_file', 'wb' do
13     end
14     File.open './tmp/foo', 'wb' do |f|
15       f.write 'foo'
16     end
17   end
18
19   def test_help
20     out, err = capture_subprocess_io do
21       assert arv_put('-h'), 'arv-put -h exits zero'
22     end
23     $stderr.write err
24     assert_empty err
25     assert_match(/^usage:/, out)
26   end
27
28   def test_raw_stdin
29     out, err = capture_subprocess_io do
30       r,w = IO.pipe
31       wpid = fork do
32         r.close
33         w << 'foo'
34       end
35       w.close
36       assert arv_put('--raw', {in: r})
37       r.close
38       Process.waitpid wpid
39     end
40     $stderr.write err
41     assert_match '', err
42     assert_equal "acbd18db4cc2f85cedef654fccc4a4d8+3\n", out
43   end
44
45   def test_raw_file
46     out, err = capture_subprocess_io do
47       assert arv_put('--no-cache', '--raw', './tmp/foo')
48     end
49     $stderr.write err
50     assert_match '', err
51     assert_equal "acbd18db4cc2f85cedef654fccc4a4d8+3\n", out
52   end
53
54   def test_raw_empty_file
55     out, err = capture_subprocess_io do
56       assert arv_put('--raw', './tmp/empty_file')
57     end
58     $stderr.write err
59     assert_match '', err
60     assert_equal "d41d8cd98f00b204e9800998ecf8427e+0\n", out
61   end
62
63   def test_filename_arg_with_directory
64     out, err = capture_subprocess_io do
65       assert_equal(false, arv_put('--filename', 'foo', './tmp/empty_dir/.'),
66                    'arv-put --filename refuses directory')
67     end
68     assert_match(/^usage:.*error:/m, err)
69     assert_empty out
70   end
71
72   def test_filename_arg_with_multiple_files
73     out, err = capture_subprocess_io do
74       assert_equal(false, arv_put('--filename', 'foo',
75                                   './tmp/empty_file',
76                                   './tmp/empty_file'),
77                    'arv-put --filename refuses directory')
78     end
79     assert_match(/^usage:.*error:/m, err)
80     assert_empty out
81   end
82
83   def test_filename_arg_with_empty_file
84     out, err = capture_subprocess_io do
85       assert arv_put('--filename', 'foo', './tmp/empty_file')
86     end
87     $stderr.write err
88     assert_match '', err
89     assert match_collection_uuid(out)
90   end
91
92   def test_as_stream
93     out, err = capture_subprocess_io do
94       assert arv_put('--no-cache', '--as-stream', './tmp/foo')
95     end
96     $stderr.write err
97     assert_match '', err
98     assert_equal foo_manifest, out
99   end
100
101   def test_progress
102     out, err = capture_subprocess_io do
103       assert arv_put('--no-cache', '--manifest', '--progress', './tmp/foo')
104     end
105     assert_match(/%/, err)
106     assert match_collection_uuid(out)
107   end
108
109   def test_batch_progress
110     out, err = capture_subprocess_io do
111       assert arv_put('--no-cache', '--manifest', '--batch-progress', './tmp/foo')
112     end
113     assert_match(/: 0 written 3 total/, err)
114     assert_match(/: 3 written 3 total/, err)
115     assert match_collection_uuid(out)
116   end
117
118   def test_progress_and_batch_progress
119     out, err = capture_subprocess_io do
120       assert_equal(false,
121                    arv_put('--progress', '--batch-progress', './tmp/foo'),
122                    'arv-put --progress --batch-progress is contradictory')
123     end
124     assert_match(/^usage:.*error:/m, err)
125     assert_empty out
126   end
127
128   def test_read_from_implicit_stdin
129     test_read_from_stdin(specify_stdin_as='--manifest')
130   end
131
132   def test_read_from_dev_stdin
133     test_read_from_stdin(specify_stdin_as='/dev/stdin')
134   end
135
136   def test_read_from_stdin(specify_stdin_as='-')
137     out, err = capture_subprocess_io do
138       r,w = IO.pipe
139       wpid = fork do
140         r.close
141         w << 'foo'
142       end
143       w.close
144       assert arv_put('--filename', 'foo', specify_stdin_as,
145                                  { in: r })
146       r.close
147       Process.waitpid wpid
148     end
149     $stderr.write err
150     assert_match '', err
151     assert match_collection_uuid(out)
152   end
153
154   def test_read_from_implicit_stdin_implicit_manifest
155     test_read_from_stdin_implicit_manifest(specify_stdin_as=nil,
156                                            expect_filename='stdin')
157   end
158
159   def test_read_from_dev_stdin_implicit_manifest
160     test_read_from_stdin_implicit_manifest(specify_stdin_as='/dev/stdin')
161   end
162
163   def test_read_from_stdin_implicit_manifest(specify_stdin_as='-',
164                                              expect_filename=nil)
165     expect_filename = expect_filename || specify_stdin_as.split('/').last
166     out, err = capture_subprocess_io do
167       r,w = IO.pipe
168       wpid = fork do
169         r.close
170         w << 'foo'
171       end
172       w.close
173       args = []
174       args.push specify_stdin_as if specify_stdin_as
175       assert arv_put(*args, { in: r })
176       r.close
177       Process.waitpid wpid
178     end
179     $stderr.write err
180     assert_match '', err
181     assert match_collection_uuid(out)
182   end
183
184   protected
185   def arv_put(*args)
186     system ['./bin/arv-put', 'arv-put'], *args
187   end
188
189   def foo_manifest(filename='foo')
190     ". #{Digest::MD5.hexdigest('foo')}+3 0:3:#{filename}\n"
191   end
192
193   def foo_manifest_locator(filename='foo')
194     Digest::MD5.hexdigest(foo_manifest(filename)) +
195       "+#{foo_manifest(filename).length}"
196   end
197
198   def match_collection_uuid(uuid)
199     /^([0-9a-z]{5}-4zz18-[0-9a-z]{15})?$/.match(uuid)
200   end
201 end