#!/usr/bin/env ruby # encoding: UTF-8 require File.expand_path('../test_helper', __FILE__) class MeasureCpuTimeTest < Test::Unit::TestCase def setup # Need to use wall time for this test due to the sleep calls RubyProf::measure_mode = RubyProf::CPU_TIME end def test_mode RubyProf::measure_mode = RubyProf::CPU_TIME assert_equal(RubyProf::CPU_TIME, RubyProf::measure_mode) end def test_cpu_time_enabled_defined assert(defined?(RubyProf::CPU_TIME_ENABLED)) end def test_class_methods result = RubyProf.profile do RubyProf::C1.hello end # Length should be 3: # MeasureCpuTimeTest#test_class_methods # #hello # Kernel#sleep methods = result.threads.first.methods.sort.reverse assert_equal(3, methods.length) # Check the names assert_equal('MeasureCpuTimeTest#test_class_methods', methods[0].full_name) assert_equal('#hello', methods[1].full_name) assert_equal('Kernel#sleep', methods[2].full_name) # Check times assert_in_delta(0.1, methods[0].total_time, 0.01) assert_in_delta(0, methods[0].wait_time, 0.01) assert_in_delta(0, methods[0].self_time, 0.01) assert_in_delta(0.1, methods[1].total_time, 0.01) assert_in_delta(0, methods[1].wait_time, 0.01) assert_in_delta(0, methods[1].self_time, 0.01) assert_in_delta(0.1, methods[2].total_time, 0.01) assert_in_delta(0, methods[2].wait_time, 0.01) assert_in_delta(0.1, methods[2].self_time, 0.01) end def test_instance_methods result = RubyProf.profile do RubyProf::C1.new.hello end # Methods called # MeasureCpuTimeTest#test_instance_methods # Class.new # Class:Object#allocate # for Object#initialize # C1#hello # Kernel#sleep methods = result.threads.first.methods.sort.reverse assert_equal(RubyProf.ruby_2? ? 5 : 6, methods.length) names = methods.map(&:full_name) assert_equal('MeasureCpuTimeTest#test_instance_methods', names[0]) assert_equal('RubyProf::C1#hello', names[1]) assert_equal('Kernel#sleep', names[2]) assert_equal('Class#new', names[3]) # order can differ assert(names.include?("#{RubyProf.parent_object}#initialize")) unless RubyProf.ruby_2? assert(names.include?("#allocate")) end # Check times assert_in_delta(0.2, methods[0].total_time, 0.02) assert_in_delta(0, methods[0].wait_time, 0.02) assert_in_delta(0, methods[0].self_time, 0.02) assert_in_delta(0.2, methods[1].total_time, 0.02) assert_in_delta(0, methods[1].wait_time, 0.02) assert_in_delta(0, methods[1].self_time, 0.02) assert_in_delta(0.2, methods[2].total_time, 0.02) assert_in_delta(0, methods[2].wait_time, 0.02) assert_in_delta(0.2, methods[2].self_time, 0.02) assert_in_delta(0, methods[3].total_time, 0.01) assert_in_delta(0, methods[3].wait_time, 0.01) assert_in_delta(0, methods[3].self_time, 0.01) assert_in_delta(0, methods[4].total_time, 0.01) assert_in_delta(0, methods[4].wait_time, 0.01) assert_in_delta(0, methods[4].self_time, 0.01) unless RubyProf.ruby_2? assert_in_delta(0, methods[5].total_time, 0.01) assert_in_delta(0, methods[5].wait_time, 0.01) assert_in_delta(0, methods[5].self_time, 0.01) end end def test_module_methods result = RubyProf.profile do RubyProf::C2.hello end # Methods: # MeasureCpuTimeTest#test_module_methods # M1#hello # Kernel#sleep methods = result.threads.first.methods.sort.reverse assert_equal(3, methods.length) assert_equal('MeasureCpuTimeTest#test_module_methods', methods[0].full_name) assert_equal('RubyProf::M1#hello', methods[1].full_name) assert_equal('Kernel#sleep', methods[2].full_name) # Check times assert_in_delta(0.3, methods[0].total_time, 0.1) assert_in_delta(0, methods[0].wait_time, 0.02) assert_in_delta(0, methods[0].self_time, 0.02) assert_in_delta(0.3, methods[1].total_time, 0.1) assert_in_delta(0, methods[1].wait_time, 0.02) assert_in_delta(0, methods[1].self_time, 0.02) assert_in_delta(0.3, methods[2].total_time, 0.1) assert_in_delta(0, methods[2].wait_time, 0.02) assert_in_delta(0.3, methods[2].self_time, 0.1) end def test_module_instance_methods result = RubyProf.profile do RubyProf::C2.new.hello end # Methods: # MeasureCpuTimeTest#test_module_instance_methods # Class#new # #allocate # Object#initialize # M1#hello # Kernel#sleep methods = result.threads.first.methods.sort.reverse assert_equal(RubyProf.ruby_2? ? 5 : 6, methods.length) names = methods.map(&:full_name) assert_equal('MeasureCpuTimeTest#test_module_instance_methods', names[0]) assert_equal('RubyProf::M1#hello', names[1]) assert_equal('Kernel#sleep', names[2]) assert_equal('Class#new', names[3]) # order can differ assert(names.include?("#{RubyProf.parent_object}#initialize")) unless RubyProf.ruby_2? assert(names.include?("#allocate")) end # Check times assert_in_delta(0.3, methods[0].total_time, 0.1) assert_in_delta(0, methods[0].wait_time, 0.1) assert_in_delta(0, methods[0].self_time, 0.1) assert_in_delta(0.3, methods[1].total_time, 0.02) assert_in_delta(0, methods[1].wait_time, 0.01) assert_in_delta(0, methods[1].self_time, 0.01) assert_in_delta(0.3, methods[2].total_time, 0.02) assert_in_delta(0, methods[2].wait_time, 0.01) assert_in_delta(0.3, methods[2].self_time, 0.02) assert_in_delta(0, methods[3].total_time, 0.01) assert_in_delta(0, methods[3].wait_time, 0.01) assert_in_delta(0, methods[3].self_time, 0.01) assert_in_delta(0, methods[4].total_time, 0.01) assert_in_delta(0, methods[4].wait_time, 0.01) assert_in_delta(0, methods[4].self_time, 0.01) unless RubyProf.ruby_2? assert_in_delta(0, methods[5].total_time, 0.01) assert_in_delta(0, methods[5].wait_time, 0.01) assert_in_delta(0, methods[5].self_time, 0.01) end end def test_singleton c3 = RubyProf::C3.new class << c3 def hello end end result = RubyProf.profile do c3.hello end methods = result.threads.first.methods.sort.reverse assert_equal(2, methods.length) assert_equal('MeasureCpuTimeTest#test_singleton', methods[0].full_name) assert_equal('#hello', methods[1].full_name) assert_in_delta(0, methods[0].total_time, 0.01) assert_in_delta(0, methods[0].wait_time, 0.01) assert_in_delta(0, methods[0].self_time, 0.01) assert_in_delta(0, methods[1].total_time, 0.01) assert_in_delta(0, methods[1].wait_time, 0.01) assert_in_delta(0, methods[1].self_time, 0.01) end end