Add --as-stream test.
[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_no_args
19     out, err = capture_subprocess_io do
20       assert_equal(false, arv_put,
21                    'arv-put without args exits non-zero')
22     end
23     assert_equal '', out
24     assert_match /^usage:/, err
25   end
26
27   def test_help
28     out, err = capture_subprocess_io do
29       assert_equal(true, arv_put('-h'),
30                    'arv-put -h exits zero')
31     end
32     $stderr.write err
33     assert_equal '', err
34     assert_match /^usage:/, out
35   end
36
37   def test_filename_arg_with_directory
38     out, err = capture_subprocess_io do
39       assert_equal(false, arv_put('--filename', 'foo', './tmp/empty_dir/.'),
40                    'arv-put --filename refuses directory')
41     end
42     assert_match /^usage:.*error:/m, err
43     assert_equal '', out
44   end
45
46   def test_filename_arg_with_multiple_files
47     out, err = capture_subprocess_io do
48       assert_equal(false, arv_put('--filename', 'foo',
49                                   './tmp/empty_file',
50                                   './tmp/empty_file'),
51                    'arv-put --filename refuses directory')
52     end
53     assert_match /^usage:.*error:/m, err
54     assert_equal '', out
55   end
56
57   def test_filename_arg_with_empty_file
58     out, err = capture_subprocess_io do
59       assert_equal true, arv_put('--filename', 'foo', './tmp/empty_file')
60     end
61     $stderr.write err
62     assert_match '', err
63     assert_equal "aa4f15cbf013142a7d98b1e273f9c661+45\n", out
64   end
65
66   def test_as_stream
67     out, err = capture_subprocess_io do
68       assert_equal true, arv_put('--as-stream', './tmp/foo')
69     end
70     $stderr.write err
71     assert_match '', err
72     assert_equal foo_manifest, out
73   end
74
75   def test_progress
76     out, err = capture_subprocess_io do
77       assert_equal true, arv_put('--progress', './tmp/foo')
78     end
79     assert_match /%/, err
80     assert_equal foo_manifest_locator+"\n", out
81   end
82
83   def test_batch_progress
84     out, err = capture_subprocess_io do
85       assert_equal true, arv_put('--batch-progress', './tmp/foo')
86     end
87     assert_match /: 0 written 3 total/, err
88     assert_match /: 3 written 3 total/, err
89     assert_equal foo_manifest_locator+"\n", out
90   end
91
92   def test_progress_and_batch_progress
93     out, err = capture_subprocess_io do
94       assert_equal(false,
95                    arv_put('--progress', '--batch-progress', './tmp/foo'),
96                    'arv-put --progress --batch-progress is contradictory')
97     end
98     assert_match /^usage:.*error:/m, err
99     assert_equal '', out
100   end
101
102   def test_read_from_dev_stdin
103     test_read_from_stdin(specify_stdin_as='/dev/stdin')
104   end
105
106   def test_read_from_stdin(specify_stdin_as='-')
107     out, err = capture_subprocess_io do
108       r,w = IO.pipe
109       wpid = fork do
110         r.close
111         w << 'foo'
112       end
113       w.close
114       assert_equal true, arv_put('--filename', 'foo', specify_stdin_as,
115                                  { in: r })
116       r.close
117       Process.waitpid wpid
118     end
119     $stderr.write err
120     assert_match '', err
121     assert_equal foo_manifest_locator+"\n", out
122   end
123
124   protected
125   def arv_put(*args)
126     system ['./bin/arv-put', 'arv-put'], *args
127   end
128
129   def foo_manifest
130     ". #{Digest::MD5.hexdigest('foo')}+3 0:3:foo\n"
131   end
132
133   def foo_manifest_locator
134     Digest::MD5.hexdigest(foo_manifest) + "+#{foo_manifest.length}"
135   end
136 end