aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/notifications_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/test/notifications_test.rb')
-rw-r--r--activesupport/test/notifications_test.rb164
1 files changed, 164 insertions, 0 deletions
diff --git a/activesupport/test/notifications_test.rb b/activesupport/test/notifications_test.rb
new file mode 100644
index 0000000000..561ee2b0ba
--- /dev/null
+++ b/activesupport/test/notifications_test.rb
@@ -0,0 +1,164 @@
+require 'abstract_unit'
+
+# Allow LittleFanout to be cleaned.
+class ActiveSupport::Notifications::LittleFanout
+ def clear
+ @listeners.clear
+ end
+end
+
+class NotificationsEventTest < Test::Unit::TestCase
+ def test_events_are_initialized_with_name_and_payload
+ event = event(: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 = event(: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
+
+ def test_event_is_parent_based_on_time_frame
+ parent = event(:foo, :time => Time.utc(2009), :duration => 10000)
+ child = event(:foo, :time => Time.utc(2009, 01, 01, 0, 0, 1), :duration => 1000)
+ not_child = event(:foo, :time => Time.utc(2009, 01, 01, 0, 0, 1), :duration => 10000)
+
+ assert parent.parent_of?(child)
+ assert !child.parent_of?(parent)
+ assert !parent.parent_of?(not_child)
+ assert !not_child.parent_of?(parent)
+ end
+
+ protected
+
+ def event(*args)
+ ActiveSupport::Notifications::Event.new(*args)
+ end
+end
+
+class NotificationsMainTest < Test::Unit::TestCase
+ def setup
+ @events = []
+ Thread.abort_on_exception = true
+ ActiveSupport::Notifications.subscribe { |event| @events << event }
+ end
+
+ def teardown
+ Thread.abort_on_exception = false
+ ActiveSupport::Notifications.queue.clear
+ end
+
+ def test_notifications_returns_action_result
+ result = ActiveSupport::Notifications.instrument(:awesome, :payload => "notifications") do
+ 1 + 1
+ end
+
+ assert_equal 2, result
+ end
+
+ def test_events_are_published_to_a_listener
+ ActiveSupport::Notifications.instrument(:awesome, :payload => "notifications") do
+ 1 + 1
+ end
+
+ sleep(0.1)
+
+ assert_equal 1, @events.size
+ assert_equal :awesome, @events.last.name
+ assert_equal Hash[:payload => "notifications"], @events.last.payload
+ end
+
+ def test_nested_events_can_be_instrumented
+ ActiveSupport::Notifications.instrument(:awesome, :payload => "notifications") do
+ ActiveSupport::Notifications.instrument(:wot, :payload => "child") do
+ 1 + 1
+ end
+
+ sleep(0.1)
+
+ assert_equal 1, @events.size
+ assert_equal :wot, @events.first.name
+ assert_equal Hash[:payload => "child"], @events.first.payload
+ end
+
+ sleep(0.1)
+
+ assert_equal 2, @events.size
+ assert_equal :awesome, @events.last.name
+ assert_equal Hash[:payload => "notifications"], @events.last.payload
+ assert_in_delta 100, @events.last.duration, 70
+ end
+
+ def test_event_is_pushed_even_if_block_fails
+ ActiveSupport::Notifications.instrument(:awesome, :payload => "notifications") do
+ raise "OMG"
+ end rescue RuntimeError
+
+ sleep(0.1)
+
+ assert_equal 1, @events.size
+ assert_equal :awesome, @events.last.name
+ assert_equal Hash[:payload => "notifications"], @events.last.payload
+ end
+
+ def test_event_is_pushed_even_without_block
+ ActiveSupport::Notifications.instrument(:awesome, :payload => "notifications")
+ sleep(0.1)
+
+ assert_equal 1, @events.size
+ assert_equal :awesome, @events.last.name
+ assert_equal Hash[:payload => "notifications"], @events.last.payload
+ end
+
+ def test_subscriber_with_pattern
+ @another = []
+ ActiveSupport::Notifications.subscribe("cache"){ |event| @another << event }
+ ActiveSupport::Notifications.instrument(:cache){ 1 }
+
+ sleep(0.1)
+
+ assert_equal 1, @another.size
+ assert_equal :cache, @another.first.name
+ assert_equal 1, @another.first.result
+ end
+
+ def test_subscriber_with_pattern_as_regexp
+ @another = []
+ ActiveSupport::Notifications.subscribe(/cache/){ |event| @another << event }
+
+ ActiveSupport::Notifications.instrument(:something){ 0 }
+ ActiveSupport::Notifications.instrument(:cache){ 1 }
+
+ sleep(0.1)
+
+ assert_equal 1, @another.size
+ assert_equal :cache, @another.first.name
+ assert_equal 1, @another.first.result
+ end
+
+ def test_with_several_consumers_and_several_events
+ @another = []
+ ActiveSupport::Notifications.subscribe { |event| @another << event }
+
+ 1.upto(100) do |i|
+ ActiveSupport::Notifications.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