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

                       






                                            
                                               



                                                                       

     


                                                                
 



                                        


     
                                              
           
                
                                    
                                                                   


              
                                     
                                        

     

                                                                                      


           
                          


                                             
                                                                             


           

              

                                            
                                                                    


                                            

                                                                             
             

         

                

                                           
                                                                   

       

              

                                            
                                                                    
                                                  


                                              
                                                                             


                           

              

                                            
                                                                    
     
 








                                                                          

                                  












                                                                            
 
                                                        
                                                    
 
              


                                            
                                         

     


                                                                    

                      
                                                      



             








                                            

     
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

    sleep(0.1)

    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
        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 => "orchestra"], @events.last.payload
    assert_in_delta 100, @events.last.duration, 70
  end

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

    sleep(0.1)

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

  def test_event_is_pushed_even_without_block
    ActiveSupport::Orchestra.instrument(:awesome, :payload => "orchestra")
    sleep(0.1)

    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(: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::Orchestra.subscribe(/cache/){ |event| @another << event }

    ActiveSupport::Orchestra.instrument(:something){ 0 }
    ActiveSupport::Orchestra.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::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