aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/orchestra_test.rb
blob: 608531416c92cbcf6350cb0995a36438b39d49c4 (plain) (blame)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
require 'abstract_unit'

# Allow LittleFanout to be cleaned.
class ActiveSupport::Orchestra::LittleFanout
  def clear
    @listeners.clear
  end
end

class OrchestraEventTest < Test::Unit::TestCase
  def test_events_are_initialized_with_name_and_payload
    event = ActiveSupport::Orchestra::Event.new(:foo, :payload => :bar)
    assert_equal :foo, event.name
    assert_equal Hash[:payload => :bar], event.payload
  end

  def test_events_consumes_information_given_as_payload
    event = ActiveSupport::Orchestra::Event.new(:foo,
      :time => (time = Time.now), :result => 1, :duration => 10)

    assert_equal Hash.new, event.payload
    assert_equal time, event.time
    assert_equal 1, event.result
    assert_equal 10, event.duration
  end
end

class OrchestraMainTest < Test::Unit::TestCase
  def setup
    @events = []
    Thread.abort_on_exception = true
    ActiveSupport::Orchestra.subscribe { |event| @events << event }
  end

  def teardown
    Thread.abort_on_exception = false
    ActiveSupport::Orchestra.queue.clear
  end

  def test_orchestra_returns_action_result
    result = ActiveSupport::Orchestra.instrument(:awesome, :payload => "orchestra") do
      1 + 1
    end

    assert_equal 2, result
  end

  def test_events_are_published_to_a_listener
    ActiveSupport::Orchestra.instrument(:awesome, :payload => "orchestra") do
      1 + 1
    end

    assert_equal 1, @events.size
    assert_equal :awesome, @events.last.name
    assert_equal Hash[:payload => "orchestra"], @events.last.payload
  end

  def test_nested_events_can_be_instrumented
    ActiveSupport::Orchestra.instrument(:awesome, :payload => "orchestra") do
      ActiveSupport::Orchestra.instrument(:wot, :payload => "child") do
        sleep(0.1)
      end

      assert_equal 1, @events.size
      assert_equal :wot, @events.first.name
      assert_equal Hash[:payload => "child"], @events.first.payload
      assert_in_delta 100, @events.first.duration, 30
    end

    assert_equal 2, @events.size
    assert_equal :awesome, @events.last.name
    assert_equal Hash[:payload => "orchestra"], @events.last.payload
  end

  def test_event_is_pushed_even_if_block_fails
    ActiveSupport::Orchestra.instrument(:awesome, :payload => "orchestra") do
      raise "OMG"
    end rescue RuntimeError

    assert_equal 1, @events.size
    assert_equal :awesome, @events.last.name
    assert_equal Hash[:payload => "orchestra"], @events.last.payload
  end

  def test_subscriber_with_pattern
    @another = []
    ActiveSupport::Orchestra.subscribe(/cache/) { |event| @another << event }

    ActiveSupport::Orchestra.instrument(:something){ 0 }
    ActiveSupport::Orchestra.instrument(:cache){ 10 }

    sleep 0.1

    assert_equal 1, @another.size
    assert_equal :cache, @another.first.name
    assert_equal 10, @another.first.result
  end

  def test_with_several_consumers_and_several_events
    @another = []
    ActiveSupport::Orchestra.subscribe { |event| @another << event }

    1.upto(100) do |i|
      ActiveSupport::Orchestra.instrument(:value){ i }
    end

    sleep 0.1

    assert_equal 100, @events.size
    assert_equal :value, @events.first.name
    assert_equal 1, @events.first.result
    assert_equal 100, @events.last.result

    assert_equal 100, @another.size
    assert_equal :value, @another.first.name
    assert_equal 1, @another.first.result
    assert_equal 100, @another.last.result
  end
end