Improve compatibility with whput.
[arvados.git] / sdk / cli / test / test_arv-put.rb
1 require 'minitest/autorun'
2 require 'digest/md5'
3
4 class TestArvPut < Minitest::Test
5   def setup
6     begin
7       Dir.mkdir './tmp'
8       Dir.mkdir './tmp/empty_dir'
9     rescue Errno::EEXIST
10     end
11     File.open './tmp/empty_file', 'wb' do
12     end
13     File.open './tmp/foo', 'wb' do |f|
14       f.write 'foo'
15     end
16   end
17
18   def test_help
19     out, err = capture_subprocess_io do
20       assert_equal(true, arv_put('-h'),
21                    'arv-put -h exits zero')
22     end
23     $stderr.write err
24     assert_equal '', err
25     assert_match /^usage:/, out
26   end
27
28   def test_filename_arg_with_directory
29     out, err = capture_subprocess_io do
30       assert_equal(false, arv_put('--filename', 'foo', './tmp/empty_dir/.'),
31                    'arv-put --filename refuses directory')
32     end
33     assert_match /^usage:.*error:/m, err
34     assert_equal '', out
35   end
36
37   def test_filename_arg_with_multiple_files
38     out, err = capture_subprocess_io do
39       assert_equal(false, arv_put('--filename', 'foo',
40                                   './tmp/empty_file',
41                                   './tmp/empty_file'),
42                    'arv-put --filename refuses directory')
43     end
44     assert_match /^usage:.*error:/m, err
45     assert_equal '', out
46   end
47
48   def test_filename_arg_with_empty_file
49     out, err = capture_subprocess_io do
50       assert_equal true, arv_put('--filename', 'foo', './tmp/empty_file')
51     end
52     $stderr.write err
53     assert_match '', err
54     assert_equal "aa4f15cbf013142a7d98b1e273f9c661+45\n", out
55   end
56
57   def test_as_stream
58     out, err = capture_subprocess_io do
59       assert_equal true, arv_put('--as-stream', './tmp/foo')
60     end
61     $stderr.write err
62     assert_match '', err
63     assert_equal foo_manifest, out
64   end
65
66   def test_progress
67     out, err = capture_subprocess_io do
68       assert_equal true, arv_put('--manifest', '--progress', './tmp/foo')
69     end
70     assert_match /%/, err
71     assert_equal foo_manifest_locator+"\n", out
72   end
73
74   def test_batch_progress
75     out, err = capture_subprocess_io do
76       assert_equal true, arv_put('--manifest', '--batch-progress', './tmp/foo')
77     end
78     assert_match /: 0 written 3 total/, err
79     assert_match /: 3 written 3 total/, err
80     assert_equal foo_manifest_locator+"\n", out
81   end
82
83   def test_progress_and_batch_progress
84     out, err = capture_subprocess_io do
85       assert_equal(false,
86                    arv_put('--progress', '--batch-progress', './tmp/foo'),
87                    'arv-put --progress --batch-progress is contradictory')
88     end
89     assert_match /^usage:.*error:/m, err
90     assert_equal '', out
91   end
92
93   def test_read_from_implicit_stdin
94     test_read_from_stdin(specify_stdin_as='--manifest')
95   end
96
97   def test_read_from_dev_stdin
98     test_read_from_stdin(specify_stdin_as='/dev/stdin')
99   end
100
101   def test_read_from_stdin(specify_stdin_as='-')
102     out, err = capture_subprocess_io do
103       r,w = IO.pipe
104       wpid = fork do
105         r.close
106         w << 'foo'
107       end
108       w.close
109       assert_equal true, arv_put('--filename', 'foo', specify_stdin_as,
110                                  { in: r })
111       r.close
112       Process.waitpid wpid
113     end
114     $stderr.write err
115     assert_match '', err
116     assert_equal foo_manifest_locator+"\n", out
117   end
118
119   protected
120   def arv_put(*args)
121     system ['./bin/arv-put', 'arv-put'], *args
122   end
123
124   def foo_manifest
125     ". #{Digest::MD5.hexdigest('foo')}+3 0:3:foo\n"
126   end
127
128   def foo_manifest_locator
129     Digest::MD5.hexdigest(foo_manifest) + "+#{foo_manifest.length}"
130   end
131 end