aboutsummaryrefslogblamecommitdiffstats
path: root/activesupport/test/notifications_test.rb
blob: 8f00eff10676484544e0199e7198b14656679edf (plain) (tree)
1
2
3
4
5
6
7
8
9

                       
                                                   
           
                                                              


                                                          
                                                                                                   

                                       
                                                                


                                             
                                                             




                                                          
                                                             


                                                
 
                                              
                                                             





                                           
                                                  

                  
                                                   


              
                                                     

     

                                                                                 



                                     
                                               



                                           
                                                                                 






                                             
                                                                                 




                                              
                                                        


                                            

                                                                         












                                                       
                                                        



                                                            
                                                                         




                                              
                                                        


     

                                                           









                              
                                                   


              
                                                     






                                                           
                                                    









                                                    
                                                  

                      
                                                        















                                                      
                                                    

     
require 'abstract_unit'

class NotificationsEventTest < Test::Unit::TestCase
  def setup
    @parent = ActiveSupport::Notifications::Event.new(:parent)
  end

  def test_initialization_with_name_and_parent_and_payload
    event = ActiveSupport::Notifications::Event.new(:awesome, @parent, :payload => "notifications")
    assert_equal(:awesome, event.name)
    assert_equal(@parent, event.parent)
    assert_equal({ :payload => "notifications" }, event.payload)
  end

  def test_thread_id_is_set_on_initialization
    event = ActiveSupport::Notifications::Event.new(:awesome)
    assert_equal Thread.current.object_id, event.thread_id
  end

  def test_current_time_is_set_on_initialization
    previous_time = Time.now.utc
    event = ActiveSupport::Notifications::Event.new(:awesome)
    assert_kind_of Time, event.time
    assert event.time.to_f >= previous_time.to_f
  end

  def test_duration_is_set_when_event_finishes
    event = ActiveSupport::Notifications::Event.new(:awesome)
    sleep(0.1)
    event.finish!
    assert_in_delta 100, event.duration, 30
  end
end

class NotificationsMainTest < Test::Unit::TestCase
  def setup
    @listener = []
    ActiveSupport::Notifications.register @listener
  end

  def teardown
    ActiveSupport::Notifications.unregister @listener
  end

  def test_notifications_allows_any_action_to_be_instrumented
    event = ActiveSupport::Notifications.instrument(:awesome, "notifications") do
      sleep(0.1)
    end

    assert_equal :awesome, event.name
    assert_equal "notifications", event.payload
    assert_in_delta 100, event.duration, 30
  end

  def test_block_result_is_stored
    event = ActiveSupport::Notifications.instrument(:awesome, "notifications") do
      1 + 1
    end

    assert_equal 2, event.result
  end

  def test_events_are_published_to_a_listener
    event = ActiveSupport::Notifications.instrument(:awesome, "notifications") do
      1 + 1
    end

    assert_equal 1, @listener.size
    assert_equal :awesome, @listener.last.name
    assert_equal "notifications", @listener.last.payload
  end

  def test_nested_events_can_be_instrumented
    ActiveSupport::Notifications.instrument(:awesome, "notifications") do
      ActiveSupport::Notifications.instrument(:wot, "child") do
        sleep(0.1)
      end

      assert_equal 1, @listener.size
      assert_equal :wot, @listener.first.name
      assert_equal "child", @listener.first.payload

      assert_nil @listener.first.parent.duration
      assert_in_delta 100, @listener.first.duration, 30
    end

    assert_equal 2, @listener.size
    assert_equal :awesome, @listener.last.name
    assert_equal "notifications", @listener.last.payload
    assert_in_delta 100, @listener.first.parent.duration, 30
  end

  def test_event_is_pushed_even_if_block_fails
    ActiveSupport::Notifications.instrument(:awesome, "notifications") do
      raise "OMG"
    end rescue RuntimeError

    assert_equal 1, @listener.size
    assert_equal :awesome, @listener.last.name
    assert_equal "notifications", @listener.last.payload
  end
end

class NotificationsListenerTest < Test::Unit::TestCase
  class MyListener < ActiveSupport::Notifications::Listener
    attr_reader :consumed

    def consume(event)
      @consumed ||= []
      @consumed << event
    end
  end

  def setup
    @listener = MyListener.new
    ActiveSupport::Notifications.register @listener
  end

  def teardown
    ActiveSupport::Notifications.unregister @listener
  end

  def test_thread_is_exposed_by_listener
    assert_kind_of Thread, @listener.thread
  end

  def test_event_is_consumed_when_an_action_is_instrumented
    ActiveSupport::Notifications.instrument(:sum) do
      1 + 1
    end
    sleep 0.1
    assert_equal 1, @listener.consumed.size
    assert_equal :sum, @listener.consumed.first.name
    assert_equal 2, @listener.consumed.first.result
  end

  def test_with_sevaral_consumers_and_several_events
    @another = MyListener.new
    ActiveSupport::Notifications.register @another

    1.upto(100) do |i|
      ActiveSupport::Notifications.instrument(:value) do
        i
      end
    end

    sleep 0.1

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

    assert_equal 100, @another.consumed.size
    assert_equal :value, @another.consumed.first.name
    assert_equal 1, @another.consumed.first.result
    assert_equal 100, @another.consumed.last.result
  ensure
    ActiveSupport::Notifications.unregister @another
  end
end