diff options
Diffstat (limited to 'Library/Homebrew/test/cask/system_command_spec.rb')
| -rw-r--r-- | Library/Homebrew/test/cask/system_command_spec.rb | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/Library/Homebrew/test/cask/system_command_spec.rb b/Library/Homebrew/test/cask/system_command_spec.rb new file mode 100644 index 000000000..8d1180bea --- /dev/null +++ b/Library/Homebrew/test/cask/system_command_spec.rb @@ -0,0 +1,139 @@ +describe Hbc::SystemCommand, :cask do + describe "when the exit code is 0" do + describe "its result" do + subject { described_class.run("/usr/bin/true") } + + it { is_expected.to be_a_success } + its(:exit_status) { is_expected.to eq(0) } + end + end + + describe "when the exit code is 1" do + let(:command) { "/usr/bin/false" } + + describe "and the command must succeed" do + it "throws an error" do + expect { + described_class.run!(command) + }.to raise_error(Hbc::CaskCommandFailedError) + end + end + + describe "and the command does not have to succeed" do + describe "its result" do + subject { described_class.run(command) } + + it { is_expected.not_to be_a_success } + its(:exit_status) { is_expected.to eq(1) } + end + end + end + + describe "given a pathname" do + let(:command) { "/bin/ls" } + let(:path) { Pathname(Dir.mktmpdir) } + + before do + FileUtils.touch(path.join("somefile")) + end + + describe "its result" do + subject { described_class.run(command, args: [path]) } + + it { is_expected.to be_a_success } + its(:stdout) { is_expected.to eq("somefile\n") } + end + end + + describe "with both STDOUT and STDERR output from upstream" do + let(:command) { "/bin/bash" } + let(:options) { + { args: [ + "-c", + "for i in $(seq 1 2 5); do echo $i; echo $(($i + 1)) >&2; done", + ] } + } + + shared_examples "it returns '1 2 3 4 5 6'" do + describe "its result" do + subject { shutup { described_class.run(command, options) } } + + it { is_expected.to be_a_success } + its(:stdout) { is_expected.to eq([1, 3, 5, nil].join("\n")) } + its(:stderr) { is_expected.to eq([2, 4, 6, nil].join("\n")) } + end + end + + describe "with default options" do + it "echoes only STDERR" do + expected = [2, 4, 6].map { |i| "==> #{i}\n" }.join("") + expect { + described_class.run(command, options) + }.to output(expected).to_stdout + end + + include_examples("it returns '1 2 3 4 5 6'") + end + + describe "with print_stdout" do + before do + options.merge!(print_stdout: true) + end + + it "echoes both STDOUT and STDERR" do + (1..6).each do |i| + expect { + described_class.run(command, options) + }.to output(/==> #{ i }/).to_stdout + end + end + + include_examples("it returns '1 2 3 4 5 6'") + end + + describe "without print_stderr" do + before do + options.merge!(print_stderr: false) + end + + it "echoes nothing" do + expect { + described_class.run(command, options) + }.to output("").to_stdout + end + + include_examples("it returns '1 2 3 4 5 6'") + end + + describe "with print_stdout but without print_stderr" do + before do + options.merge!(print_stdout: true, print_stderr: false) + end + + it "echoes only STDOUT" do + expected = [1, 3, 5].map { |i| "==> #{i}\n" }.join("") + expect { + described_class.run(command, options) + }.to output(expected).to_stdout + end + + include_examples("it returns '1 2 3 4 5 6'") + end + end + + describe "with a very long STDERR output" do + let(:command) { "/bin/bash" } + let(:options) { + { args: [ + "-c", + "for i in $(seq 1 2 100000); do echo $i; echo $(($i + 1)) >&2; done", + ] } + } + + it "returns without deadlocking" do + wait(15).for { + shutup { described_class.run(command, options) } + }.to be_a_success + end + end +end |
