class RxRspec::AsyncRunner
Public Class Methods
new(timeout)
click to toggle source
# File lib/rx-rspec/async_runner.rb, line 7 def initialize(timeout) @timeout = timeout end
Public Instance Methods
await_done(&block)
click to toggle source
# File lib/rx-rspec/async_runner.rb, line 11 def await_done(&block) condition = ConditionVariable.new deadline = Time.now + @timeout done_args = nil error = nil Thread.new do done = Proc.new do |*args| done_args = args unless done_args condition.signal end begin block.call(done) rescue => e error = e done.call end end.join(@timeout) gate = Mutex.new while Time.now < deadline && done_args.nil? gate.synchronize { condition.wait(gate, deadline - Time.now) } end if error raise error elsif done_args.nil? RSpec::Expectations.fail_with("Timeout after #{@timeout} seconds") end if done_args.nil? || done_args.size == 0 nil else done_args end end