File: rspec.rb

package info (click to toggle)
ruby-em-spec 0.2.7-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 172 kB
  • sloc: ruby: 500; makefile: 3
file content (72 lines) | stat: -rw-r--r-- 1,429 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
require 'eventmachine'
require File.dirname(__FILE__) + '/../ext/fiber18'

module EventMachine
  module SpecHelper
    
    SpecTimeoutExceededError = Class.new(RuntimeError)
    
    def self.included(cls)
      ::RSpec::Core::ExampleGroup.instance_eval "
      @@_em_default_time_to_finish = nil
      def self.default_timeout(timeout)
        @@_em_default_time_to_finish = timeout
      end
      "
    end
    
    def timeout(time_to_run)
      EM.cancel_timer(@_em_timer) if @_em_timer
      @_em_timer = EM.add_timer(time_to_run) { done; raise SpecTimeoutExceededError.new }
    end
    
    def em(time_to_run = @@_em_default_time_to_finish, &block)
      em_spec_exception = nil

      EM.run do
        timeout(time_to_run) if time_to_run
        @_em_spec_fiber = Fiber.new do
          begin
            block.call
          rescue Exception => em_spec_exception
            done
          end
          Fiber.yield
        end  

        @_em_spec_fiber.resume
      end

      raise em_spec_exception if em_spec_exception
    end

    def done
      EM.next_tick{
        finish_em_spec_fiber
      }
    end

    private

    def finish_em_spec_fiber
      EM.stop_event_loop if EM.reactor_running?
      @_em_spec_fiber.resume if @_em_spec_fiber.alive?
    end
    
  end
  
  module Spec

    include SpecHelper

    def instance_eval(&block)
      em do
        super(&block)
      end
    end

  end
  
end