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) { |spec_task| ... } 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:\n#{buffer.string}"
                end
        end
        
        spec_task = reactor.async do |spec_task|
                spec_task.annotate("running example")
                
                result = yield(spec_task)
                
                # We are finished, so stop the timer task if it was started:
                timer_task&.stop
                
                # Now stop the entire reactor:
                raise Async::Stop
        end
        
        begin
                timer_task&.wait
                spec_task.wait
        ensure
                spec_task.stop
        end
        
        return result
end