summaryrefslogtreecommitdiff
path: root/spec/ruby/shared/process
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/shared/process')
-rw-r--r--spec/ruby/shared/process/abort.rb12
-rw-r--r--spec/ruby/shared/process/exit.rb42
-rw-r--r--spec/ruby/shared/process/fork.rb39
3 files changed, 54 insertions, 39 deletions
diff --git a/spec/ruby/shared/process/abort.rb b/spec/ruby/shared/process/abort.rb
index 935637e1c2..19f9f1e6a5 100644
--- a/spec/ruby/shared/process/abort.rb
+++ b/spec/ruby/shared/process/abort.rb
@@ -8,29 +8,29 @@ describe :process_abort, shared: true do
end
it "raises a SystemExit exception" do
- -> { @object.abort }.should raise_error(SystemExit)
+ -> { @object.abort }.should.raise(SystemExit)
end
it "sets the exception message to the given message" do
- -> { @object.abort "message" }.should raise_error { |e| e.message.should == "message" }
+ -> { @object.abort "message" }.should.raise { |e| e.message.should == "message" }
end
it "sets the exception status code of 1" do
- -> { @object.abort }.should raise_error { |e| e.status.should == 1 }
+ -> { @object.abort }.should.raise { |e| e.status.should == 1 }
end
it "prints the specified message to STDERR" do
- -> { @object.abort "a message" }.should raise_error(SystemExit)
+ -> { @object.abort "a message" }.should.raise(SystemExit)
$stderr.should =~ /a message/
end
it "coerces the argument with #to_str" do
str = mock('to_str')
str.should_receive(:to_str).any_number_of_times.and_return("message")
- -> { @object.abort str }.should raise_error(SystemExit, "message")
+ -> { @object.abort str }.should.raise(SystemExit, "message")
end
it "raises TypeError when given a non-String object" do
- -> { @object.abort 123 }.should raise_error(TypeError)
+ -> { @object.abort 123 }.should.raise(TypeError)
end
end
diff --git a/spec/ruby/shared/process/exit.rb b/spec/ruby/shared/process/exit.rb
index e633afc73a..cacf2f8774 100644
--- a/spec/ruby/shared/process/exit.rb
+++ b/spec/ruby/shared/process/exit.rb
@@ -1,13 +1,13 @@
describe :process_exit, shared: true do
it "raises a SystemExit with status 0" do
- -> { @object.exit }.should raise_error(SystemExit) { |e|
+ -> { @object.exit }.should.raise(SystemExit) { |e|
e.status.should == 0
}
end
it "raises a SystemExit with the specified status" do
[-2**16, -2**8, -8, -1, 0, 1 , 8, 2**8, 2**16].each do |value|
- -> { @object.exit(value) }.should raise_error(SystemExit) { |e|
+ -> { @object.exit(value) }.should.raise(SystemExit) { |e|
e.status.should == value
}
end
@@ -15,33 +15,39 @@ describe :process_exit, shared: true do
it "raises a SystemExit with the specified boolean status" do
{ true => 0, false => 1 }.each do |value, status|
- -> { @object.exit(value) }.should raise_error(SystemExit) { |e|
+ -> { @object.exit(value) }.should.raise(SystemExit) { |e|
e.status.should == status
}
end
end
+ it "raises a SystemExit with message 'exit'" do
+ -> { @object.exit }.should.raise(SystemExit) { |e|
+ e.message.should == "exit"
+ }
+ end
+
it "tries to convert the passed argument to an Integer using #to_int" do
obj = mock('5')
obj.should_receive(:to_int).and_return(5)
- -> { @object.exit(obj) }.should raise_error(SystemExit) { |e|
+ -> { @object.exit(obj) }.should.raise(SystemExit) { |e|
e.status.should == 5
}
end
it "converts the passed Float argument to an Integer" do
{ -2.2 => -2, -0.1 => 0, 5.5 => 5, 827.999 => 827 }.each do |value, status|
- -> { @object.exit(value) }.should raise_error(SystemExit) { |e|
+ -> { @object.exit(value) }.should.raise(SystemExit) { |e|
e.status.should == status
}
end
end
it "raises TypeError if can't convert the argument to an Integer" do
- -> { @object.exit(Object.new) }.should raise_error(TypeError)
- -> { @object.exit('0') }.should raise_error(TypeError)
- -> { @object.exit([0]) }.should raise_error(TypeError)
- -> { @object.exit(nil) }.should raise_error(TypeError)
+ -> { @object.exit(Object.new) }.should.raise(TypeError)
+ -> { @object.exit('0') }.should.raise(TypeError)
+ -> { @object.exit([0]) }.should.raise(TypeError)
+ -> { @object.exit(nil) }.should.raise(TypeError)
end
it "raises the SystemExit in the main thread if it reaches the top-level handler of another thread" do
@@ -69,35 +75,41 @@ describe :process_exit, shared: true do
ScratchPad.recorded.should == [:in_thread, :in_main]
# the thread also keeps the exception as its value
- -> { t.value }.should raise_error(SystemExit)
+ -> { t.value }.should.raise(SystemExit)
end
end
describe :process_exit!, shared: true do
it "exits with the given status" do
- out = ruby_exe("#{@object}.send(:exit!, 21)", args: '2>&1')
+ out = ruby_exe("#{@object}.send(:exit!, 21)", args: '2>&1', exit_status: 21)
out.should == ""
$?.exitstatus.should == 21
end
it "exits when called from a thread" do
- out = ruby_exe("Thread.new { #{@object}.send(:exit!, 21) }.join; sleep", args: '2>&1')
+ out = ruby_exe("Thread.new { #{@object}.send(:exit!, 21) }.join; sleep", args: '2>&1', exit_status: 21)
out.should == ""
$?.exitstatus.should == 21
end
it "exits when called from a fiber" do
- out = ruby_exe("Fiber.new { #{@object}.send(:exit!, 21) }.resume", args: '2>&1')
+ out = ruby_exe("Fiber.new { #{@object}.send(:exit!, 21) }.resume", args: '2>&1', exit_status: 21)
out.should == ""
$?.exitstatus.should == 21
end
it "skips at_exit handlers" do
- out = ruby_exe("at_exit { STDERR.puts 'at_exit' }; #{@object}.send(:exit!, 21)", args: '2>&1')
+ out = ruby_exe("at_exit { STDERR.puts 'at_exit' }; #{@object}.send(:exit!, 21)", args: '2>&1', exit_status: 21)
out.should == ""
$?.exitstatus.should == 21
end
+ it "skips ensure clauses" do
+ out = ruby_exe("begin; STDERR.puts 'before'; #{@object}.send(:exit!, 21); ensure; STDERR.puts 'ensure'; end", args: '2>&1', exit_status: 21)
+ out.should == "before\n"
+ $?.exitstatus.should == 21
+ end
+
it "overrides the original exception and exit status when called from #at_exit" do
code = <<-RUBY
at_exit do
@@ -107,7 +119,7 @@ describe :process_exit!, shared: true do
end
raise 'original error'
RUBY
- out = ruby_exe(code, args: '2>&1')
+ out = ruby_exe(code, args: '2>&1', exit_status: 21)
out.should == "in at_exit\n$! is RuntimeError:original error\n"
$?.exitstatus.should == 21
end
diff --git a/spec/ruby/shared/process/fork.rb b/spec/ruby/shared/process/fork.rb
index 11e18d7b1c..dd595cd93e 100644
--- a/spec/ruby/shared/process/fork.rb
+++ b/spec/ruby/shared/process/fork.rb
@@ -3,12 +3,12 @@ describe :process_fork, shared: true do
it "returns false from #respond_to?" do
# Workaround for Kernel::Method being public and losing the "non-respond_to? magic"
mod = @object.class.name == "KernelSpecs::Method" ? Object.new : @object
- mod.respond_to?(:fork).should be_false
- mod.respond_to?(:fork, true).should be_false
+ mod.respond_to?(:fork).should == false
+ mod.respond_to?(:fork, true).should == false
end
it "raises a NotImplementedError when called" do
- -> { @object.fork }.should raise_error(NotImplementedError)
+ -> { @object.fork }.should.raise(NotImplementedError)
end
end
@@ -23,31 +23,31 @@ describe :process_fork, shared: true do
end
it "returns status zero" do
- pid = Process.fork { exit! 0 }
+ pid = @object.fork { exit! 0 }
_, result = Process.wait2(pid)
result.exitstatus.should == 0
end
it "returns status zero" do
- pid = Process.fork { exit 0 }
+ pid = @object.fork { exit 0 }
_, result = Process.wait2(pid)
result.exitstatus.should == 0
end
it "returns status zero" do
- pid = Process.fork {}
+ pid = @object.fork {}
_, result = Process.wait2(pid)
result.exitstatus.should == 0
end
it "returns status non-zero" do
- pid = Process.fork { exit! 42 }
+ pid = @object.fork { exit! 42 }
_, result = Process.wait2(pid)
result.exitstatus.should == 42
end
it "returns status non-zero" do
- pid = Process.fork { exit 42 }
+ pid = @object.fork { exit 42 }
_, result = Process.wait2(pid)
result.exitstatus.should == 42
end
@@ -74,16 +74,19 @@ describe :process_fork, shared: true do
it "marks threads from the parent as killed" do
t = Thread.new { sleep }
- pid = @object.fork {
- touch(@file) do |f|
- f.write Thread.current.alive?
- f.write t.alive?
- end
- Process.exit!
- }
- Process.waitpid(pid)
- t.kill
- t.join
+ begin
+ pid = @object.fork {
+ touch(@file) do |f|
+ f.write Thread.current.alive?
+ f.write t.alive?
+ end
+ Process.exit!
+ }
+ Process.waitpid(pid)
+ ensure
+ t.kill
+ t.join
+ end
File.read(@file).should == "truefalse"
end
end