File: evented_notification_test.rb

package info (click to toggle)
rails 2%3A7.2.2.1%2Bdfsg-7
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 43,352 kB
  • sloc: ruby: 349,799; javascript: 30,703; yacc: 46; sql: 43; sh: 29; makefile: 27
file content (205 lines) | stat: -rw-r--r-- 6,161 bytes parent folder | download | duplicates (2)
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# frozen_string_literal: true

require_relative "../abstract_unit"

module ActiveSupport
  module Notifications
    class EventedTest < ActiveSupport::TestCase
      # we expect all exception types to be handled, so test with the most basic type
      class BadListenerException < Exception; end

      class Listener
        attr_reader :events

        def initialize
          @events = []
        end

        def start(name, id, payload)
          @events << [:start, name, id, payload]
        end

        def finish(name, id, payload)
          @events << [:finish, name, id, payload]
        end
      end

      class ListenerWithTimedSupport < Listener
        def call(name, start, finish, id, payload)
          @events << [:call, name, start, finish, id, payload]
        end
      end

      class BadStartListener < Listener
        def start(name, id, payload)
          raise BadListenerException
        end

        def finish(name, id, payload)
        end
      end

      class BadFinishListener < Listener
        def start(name, id, payload)
        end

        def finish(name, id, payload)
          raise BadListenerException
        end
      end

      def test_evented_listener
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe "hi", listener
        notifier.start  "hi", 1, {}
        notifier.start  "hi", 2, {}
        notifier.finish "hi", 2, {}
        notifier.finish "hi", 1, {}

        assert_equal 4, listener.events.length
        assert_equal [
          [:start, "hi", 1, {}],
          [:start, "hi", 2, {}],
          [:finish, "hi", 2, {}],
          [:finish, "hi", 1, {}],
        ], listener.events
      end

      def test_evented_listener_no_events
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe "hi", listener
        notifier.start  "world", 1, {}
        assert_equal 0, listener.events.length
      end

      def test_listen_to_everything
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe nil, listener
        notifier.start  "hello", 1, {}
        notifier.start  "world", 1, {}
        notifier.finish  "world", 1, {}
        notifier.finish  "hello", 1, {}

        assert_equal 4, listener.events.length
        assert_equal [
          [:start,  "hello", 1, {}],
          [:start,  "world", 1, {}],
          [:finish,  "world", 1, {}],
          [:finish,  "hello", 1, {}],
        ], listener.events
      end

      def test_listen_start_multiple_exception_consistency
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe nil, BadStartListener.new
        notifier.subscribe nil, BadStartListener.new
        notifier.subscribe nil, listener

        error = assert_raises InstrumentationSubscriberError do
          notifier.start  "hello", 1, {}
        end
        assert_instance_of BadListenerException, error.cause

        error = assert_raises InstrumentationSubscriberError do
          notifier.start  "world", 1, {}
        end
        assert_instance_of BadListenerException, error.cause

        notifier.finish  "world", 1, {}
        notifier.finish  "hello", 1, {}

        assert_equal 4, listener.events.length
        assert_equal [
          [:start,  "hello", 1, {}],
          [:start,  "world", 1, {}],
          [:finish,  "world", 1, {}],
          [:finish,  "hello", 1, {}],
        ], listener.events
      end

      def test_listen_finish_multiple_exception_consistency
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe nil, BadFinishListener.new
        notifier.subscribe nil, BadFinishListener.new
        notifier.subscribe(nil) { |*args| raise "foo" }
        notifier.subscribe(nil) { |obj| raise "foo" }
        notifier.subscribe(nil, monotonic: true) { |obj| raise "foo" }
        notifier.subscribe nil, listener

        notifier.start  "hello", 1, {}
        notifier.start  "world", 1, {}
        error = assert_raises InstrumentationSubscriberError do
          notifier.finish  "world", 1, {}
        end
        assert_equal 5, error.exceptions.count
        assert_instance_of BadListenerException, error.cause

        error = assert_raises InstrumentationSubscriberError do
          notifier.finish  "hello", 1, {}
        end
        assert_equal 5, error.exceptions.count
        assert_instance_of BadListenerException, error.cause

        assert_equal 4, listener.events.length
        assert_equal [
          [:start,  "hello", 1, {}],
          [:start,  "world", 1, {}],
          [:finish,  "world", 1, {}],
          [:finish,  "hello", 1, {}],
        ], listener.events
      end

      def test_evented_listener_priority
        notifier = Fanout.new
        listener = ListenerWithTimedSupport.new
        notifier.subscribe "hi", listener

        notifier.start "hi", 1, {}
        notifier.finish "hi", 1, {}

        assert_equal [
          [:start, "hi", 1, {}],
          [:finish, "hi", 1, {}]
        ], listener.events
      end

      def test_listen_to_regexp
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe(/[a-z]*.world/, listener)
        notifier.start("hi.world", 1, {})
        notifier.finish("hi.world", 2, {})
        notifier.start("hello.world", 1, {})
        notifier.finish("hello.world", 2, {})

        assert_equal [
          [:start, "hi.world", 1, {}],
          [:finish, "hi.world", 2, {}],
          [:start, "hello.world", 1, {}],
          [:finish, "hello.world", 2, {}]
        ], listener.events
      end

      def test_listen_to_regexp_with_exclusions
        notifier = Fanout.new
        listener = Listener.new
        notifier.subscribe(/[a-z]*.world/, listener)
        notifier.unsubscribe("hi.world")
        notifier.start("hi.world", 1, {})
        notifier.finish("hi.world", 2, {})
        notifier.start("hello.world", 1, {})
        notifier.finish("hello.world", 2, {})

        assert_equal [
          [:start, "hello.world", 1, {}],
          [:finish, "hello.world", 2, {}]
        ], listener.events
      end
    end
  end
end