aboutsummaryrefslogblamecommitdiffstats
path: root/activesupport/test/orchestra_test.rb
blob: 683cc36f6a669ab405872b47f8bb34730dd4e78b (plain) (tree)
































































































































































                                                                                           
require 'abstract_unit'

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

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

  def test_thread_id_is_set_on_initialization
    event = ActiveSupport::Orchestra::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::Orchestra::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::Orchestra::Event.new(:awesome)
    sleep(0.1)
    event.finish!
    assert_in_delta 100, event.duration, 30
  end
end

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

  def teardown
    ActiveSupport::Orchestra.unregister @listener
  end

  def test_orchestra_allows_any_action_to_be_instrumented
    event = ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do
      sleep(0.1)
    end

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

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

    assert_equal 2, event.result
  end

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

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

  def test_nested_events_can_be_instrumented
    ActiveSupport::Orchestra.instrument(:awesome, "orchestra") do
      ActiveSupport::Orchestra.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 "orchestra", @listener.last.payload
    assert_in_delta 100, @listener.first.parent.duration, 30
  end

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

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

class OrchestraListenerTest < Test::Unit::TestCase
  class MyListener < ActiveSupport::Orchestra::Listener
    attr_reader :consumed

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

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

  def teardown
    ActiveSupport::Orchestra.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::Orchestra.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::Orchestra.register @another

    1.upto(100) do |i|
      ActiveSupport::Orchestra.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::Orchestra.unregister @another
  end
end