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
|
#!/usr/bin/env ruby
# encoding: UTF-8
require File.expand_path('../test_helper', __FILE__)
require 'timeout'
require 'set'
begin
require 'fiber'
rescue LoadError
end
# -- Tests ----
class FiberTest < TestCase
def fiber_test
@fiber_ids << Fiber.current.object_id
enum = Enumerator.new do |yielder|
[1,2].each do |x|
@fiber_ids << Fiber.current.object_id
sleep 0.1
yielder.yield x
end
end
while true
begin
enum.next
rescue StopIteration
break
end
end
sleep 0.1
end
def setup
# Need to use wall time for this test due to the sleep calls
RubyProf::measure_mode = RubyProf::WALL_TIME
@fiber_ids = Set.new
@root_fiber = Fiber.current.object_id
@thread_id = Thread.current.object_id
end
def test_fibers
result = RubyProf.profile { fiber_test }
profiled_fiber_ids = result.threads.map(&:fiber_id)
assert_equal(2, result.threads.length)
assert_equal([@thread_id], result.threads.map(&:id).uniq)
assert_equal(@fiber_ids, Set.new(profiled_fiber_ids))
assert profiled_fiber_ids.include?(@root_fiber)
assert(root_fiber_profile = result.threads.detect{|t| t.fiber_id == @root_fiber})
assert(enum_fiber_profile = result.threads.detect{|t| t.fiber_id != @root_fiber})
assert_in_delta(0.3, root_fiber_profile.total_time, 0.05)
assert_in_delta(0.2, enum_fiber_profile.total_time, 0.05)
assert(method_next = root_fiber_profile.methods.detect{|m| m.full_name == "Enumerator#next"})
assert(method_each = enum_fiber_profile.methods.detect{|m| m.full_name == "Enumerator#each"})
assert_in_delta(0.2, method_next.total_time, 0.05)
assert_in_delta(0.2, method_each.total_time, 0.05)
end
def test_merged_fibers
result = RubyProf.profile(merge_fibers: true) { fiber_test }
assert_equal(1, result.threads.length)
profile = result.threads.first
assert_equal 0, profile.fiber_id
assert_in_delta(0.3, profile.total_time, 0.05)
assert(method_next = profile.methods.detect{|m| m.full_name == "Enumerator#next"})
assert(method_each = profile.methods.detect{|m| m.full_name == "Enumerator#each"})
assert_in_delta(0.2, method_next.total_time, 0.05)
assert_in_delta(0.2, method_each.total_time, 0.05)
end
end
|