diff options
Diffstat (limited to 'spec/ruby/core/process/detach_spec.rb')
| -rw-r--r-- | spec/ruby/core/process/detach_spec.rb | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/spec/ruby/core/process/detach_spec.rb b/spec/ruby/core/process/detach_spec.rb index 1c27ed9c2c..33c674394e 100644 --- a/spec/ruby/core/process/detach_spec.rb +++ b/spec/ruby/core/process/detach_spec.rb @@ -5,7 +5,7 @@ describe "Process.detach" do it "returns a thread" do pid = Process.fork { Process.exit! } thr = Process.detach(pid) - thr.should be_kind_of(Thread) + thr.should.is_a?(Thread) thr.join end @@ -15,7 +15,7 @@ describe "Process.detach" do thr.join status = thr.value - status.should be_kind_of(Process::Status) + status.should.is_a?(Process::Status) status.pid.should == pid end @@ -23,7 +23,7 @@ describe "Process.detach" do it "reaps the child process's status automatically" do pid = Process.fork { Process.exit! } Process.detach(pid).join - -> { Process.waitpid(pid) }.should raise_error(Errno::ECHILD) + -> { Process.waitpid(pid) }.should.raise(Errno::ECHILD) end end @@ -42,5 +42,40 @@ describe "Process.detach" do thr.pid.should == pid end + + it "tolerates not existing child process pid" do + # Use a value that is close to the INT_MAX (pid usually is signed int). + # It should (at least) be greater than allowed pid limit value that depends on OS. + pid_not_existing = 2.pow(30) + + # Check that there is no a child process with this hardcoded pid. + # Command `kill 0 pid`: + # - returns "1" if a process exists and + # - raises Errno::ESRCH otherwise + -> { Process.kill(0, pid_not_existing) }.should.raise(Errno::ESRCH) + + thr = Process.detach(pid_not_existing) + thr.join + + thr.should.is_a?(Thread) + end + + it "calls #to_int to implicitly convert non-Integer pid to Integer" do + pid = MockObject.new('mock-enumerable') + pid.should_receive(:to_int).and_return(100500) + + Process.detach(pid).join + end + + it "raises TypeError when pid argument does not have #to_int method" do + -> { Process.detach(Object.new) }.should.raise(TypeError, "no implicit conversion of Object into Integer") + end + + it "raises TypeError when #to_int returns non-Integer value" do + pid = MockObject.new('mock-enumerable') + pid.should_receive(:to_int).and_return(:symbol) + + -> { Process.detach(pid) }.should raise_consistent_error(TypeError, "can't convert MockObject into Integer (MockObject#to_int gives Symbol)") + end end end |
