module Async::RSpec::Reactor

Public Instance Methods

notify_failure(exception = $!) click to toggle source
# File lib/async/rspec/reactor.rb, line 31
def notify_failure(exception = $!)
        ::RSpec::Support.notify_failure(exception)
end
run_in_reactor(reactor, duration = nil) { || ... } click to toggle source
# File lib/async/rspec/reactor.rb, line 35
def run_in_reactor(reactor, duration = nil)
        result = nil
        
        timer_task = nil
        
        if duration
                timer_task = reactor.async do |task|
                        # Wait for the timeout, at any point this task might be cancelled if the user code completes:
                        task.annotate("timer task duration=#{duration}")
                        task.sleep(duration)
                        
                        # The timeout expired, so generate an error:
                        buffer = StringIO.new
                        reactor.print_hierarchy(buffer)
                        
                        # Raise an error so it is logged:
                        raise TimeoutError, "run time exceeded duration #{duration}s:\r\n#{buffer.string}"
                end
        end
        
        reactor.run do |task|
                task.annotate(self.class)
                
                spec_task = task.async do |spec_task|
                        spec_task.annotate("running example")
                        
                        result = yield
                        
                        timer_task&.stop
                        
                        raise Async::Stop
                end
                
                begin
                        timer_task&.wait
                        spec_task.wait
                ensure
                        spec_task.stop
                end
        end.wait
        
        return result
end