diff options
Diffstat (limited to 'spec/ruby/library/monitor/synchronize_spec.rb')
-rw-r--r-- | spec/ruby/library/monitor/synchronize_spec.rb | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/spec/ruby/library/monitor/synchronize_spec.rb b/spec/ruby/library/monitor/synchronize_spec.rb index d851b98d6c..d78393eb3a 100644 --- a/spec/ruby/library/monitor/synchronize_spec.rb +++ b/spec/ruby/library/monitor/synchronize_spec.rb @@ -7,24 +7,35 @@ describe "Monitor#synchronize" do monitor = Monitor.new 10.times do - locked = false + wait_q = Queue.new + continue_q = Queue.new thread = Thread.new do begin monitor.synchronize do - locked = true + wait_q << true # Do not wait here, we are trying to interrupt the ensure part of #synchronize end - sleep # wait for exception if it did not happen yet + continue_q.pop rescue exc_class monitor.should_not.mon_locked? :ok end end - Thread.pass until locked + wait_q.pop thread.raise exc_class, "interrupt" + continue_q << true thread.value.should == :ok end end + + it "raises a LocalJumpError if not passed a block" do + -> { Monitor.new.synchronize }.should raise_error(LocalJumpError) + end + + it "raises a thread error if the monitor is not owned on exiting the block" do + monitor = Monitor.new + -> { monitor.synchronize { monitor.exit } }.should raise_error(ThreadError) + end end |