From 63a542f83223c10df3cfd2a006ff95cb938efc39 Mon Sep 17 00:00:00 2001 From: Charlie Savage Date: Sat, 6 Jan 2024 21:40:49 -0800 Subject: [PATCH] Initial ruby 3.3.0 support. Fixes #327 --- .github/workflows/testing.yml | 2 +- ext/ruby_prof/rp_method.c | 2 +- lib/ruby-prof/exclude_common_methods.rb | 402 ++-- ruby-prof.gemspec | 131 +- test/enumerable_test.rb | 42 +- test/exclude_methods_test.rb | 406 ++-- test/line_number_test.rb | 423 ++-- test/measure_allocations_test.rb | 1741 ++++++++++------ test/measure_memory_test.rb | 2480 +++++++++++++---------- test/measure_wall_time_test.rb | 988 +++++---- test/method_info_test.rb | 190 +- test/recursive_test.rb | 1047 ++++++---- 12 files changed, 4665 insertions(+), 3189 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1d745bed..f3ee62c9 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -12,7 +12,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - ruby: ['2.7', '3.0', '3.1', '3.2'] + ruby: ['3.0', '3.1', '3.2', '3.3'] include: - { os: windows-latest , ruby: mswin } runs-on: ${{ matrix.os }} diff --git a/ext/ruby_prof/rp_method.c b/ext/ruby_prof/rp_method.c index 2630f41e..7464c764 100644 --- a/ext/ruby_prof/rp_method.c +++ b/ext/ruby_prof/rp_method.c @@ -21,7 +21,7 @@ VALUE resolve_klass(VALUE klass, unsigned int* klass_flags) { /* We have come across a singleton object. First figure out what it is attached to.*/ - VALUE attached = rb_iv_get(klass, "__attached__"); + VALUE attached = rb_class_attached_object(klass); switch (BUILTIN_TYPE(attached)) { diff --git a/lib/ruby-prof/exclude_common_methods.rb b/lib/ruby-prof/exclude_common_methods.rb index d4b8ba3c..1a88ac6d 100644 --- a/lib/ruby-prof/exclude_common_methods.rb +++ b/lib/ruby-prof/exclude_common_methods.rb @@ -1,198 +1,204 @@ -require 'set' - -# :enddoc: -module RubyProf - module ExcludeCommonMethods - ENUMERABLE_NAMES = Enumerable.instance_methods(false) - - def self.apply!(profile) - ## - # Kernel Methods - ## - - exclude_methods(profile, Kernel, [ - :dup, - :initialize_dup, - :tap, - :send, - :public_send, - ]) - - ## - # Fundamental Types - ## - - exclude_methods(profile, BasicObject, :"!=") - exclude_methods(profile, Method, :"[]") - exclude_methods(profile, Module, :new) - exclude_methods(profile, Class, :new) - exclude_methods(profile, Proc, :call, :yield) - exclude_methods(profile, Range, :each) - exclude_methods(profile, Integer, :times) - - ## - # Value Types - ## - - exclude_methods(profile, String, [ - :sub, - :sub!, - :gsub, - :gsub!, - ]) - - ## - # Emumerables - ## - - exclude_enumerable(profile, Enumerable) - exclude_enumerable(profile, Enumerator) - - ## - # Collections - ## - - exclude_enumerable(profile, Array, [ - :each_index, - :map!, - :select!, - :reject!, - :collect!, - :sort!, - :sort_by!, - :index, - :delete_if, - :keep_if, - :drop_while, - :uniq, - :uniq!, - :"==", - :eql?, - :hash, - :to_json, - :as_json, - :encode_json, - ]) - - exclude_enumerable(profile, Hash, [ - :dup, - :initialize_dup, - :fetch, - :"[]", - :"[]=", - :each_key, - :each_value, - :each_pair, - :map!, - :select!, - :reject!, - :collect!, - :delete_if, - :keep_if, - :slice, - :slice!, - :except, - :except!, - :"==", - :eql?, - :hash, - :to_json, - :as_json, - :encode_json, - ]) - - exclude_enumerable(profile, Set, [ - :map!, - :select!, - :reject!, - :collect!, - :classify, - :delete_if, - :keep_if, - :divide, - :"==", - :eql?, - :hash, - :to_json, - :as_json, - :encode_json, - ]) - - ## - # Garbage Collection - ## - - exclude_singleton_methods(profile, GC, [ - :start - ]) - - ## - # Unicorn - ## - - if defined?(Unicorn) - exclude_methods(profile, Unicorn::HttpServer, :process_client) - end - - if defined?(Unicorn::OobGC) - exclude_methods(profile, Unicorn::OobGC, :process_client) - end - - ## - # New Relic - ## - - if defined?(NewRelic::Agent) - if defined?(NewRelic::Agent::Instrumentation::MiddlewareTracing) - exclude_methods(profile, NewRelic::Agent::Instrumentation::MiddlewareTracing, [ - :call - ]) - end - - if defined?(NewRelic::Agent::MethodTracerHelpers) - exclude_methods(profile, NewRelic::Agent::MethodTracerHelpers, [ - :trace_execution_scoped, - :log_errors, - ]) - - exclude_singleton_methods(profile, NewRelic::Agent::MethodTracerHelpers, [ - :trace_execution_scoped, - :log_errors, - ]) - end - - if defined?(NewRelic::Agent::MethodTracer) - exclude_methods(profile, NewRelic::Agent::MethodTracer, [ - :trace_execution_scoped, - :trace_execution_unscoped, - ]) - end - end - - ## - # Miscellaneous Methods - ## - - if defined?(Mustache) - exclude_methods(profile, Mustache::Context, [ - :fetch - ]) - end - end - - private - - def self.exclude_enumerable(profile, mod, *method_or_methods) - exclude_methods(profile, mod, [:each, *method_or_methods]) - exclude_methods(profile, mod, ENUMERABLE_NAMES) - end - - def self.exclude_methods(profile, mod, *method_or_methods) - profile.exclude_methods!(mod, method_or_methods) - end - - def self.exclude_singleton_methods(profile, mod, *method_or_methods) - profile.exclude_singleton_methods!(mod, method_or_methods) - end - end -end +require 'set' + +# :enddoc: +module RubyProf + module ExcludeCommonMethods + ENUMERABLE_NAMES = Enumerable.instance_methods(false) + + def self.apply!(profile) + ## + # Kernel Methods + ## + + exclude_methods(profile, Kernel, [ + :dup, + :initialize_dup, + :tap, + :send, + :public_send, + ]) + + ## + # Fundamental Types + ## + + exclude_methods(profile, BasicObject, :!=) + exclude_methods(profile, Kernel, :"block_given?") + exclude_methods(profile, Method, :[]) + exclude_methods(profile, Module, :new) + exclude_methods(profile, Class, :new) + exclude_methods(profile, Proc, :call, :yield) + exclude_methods(profile, Range, :each) + + ## + # Value Types + ## + + exclude_methods(profile, Integer, [ + :times, + :succ, + :< + ]) + + exclude_methods(profile, String, [ + :sub, + :sub!, + :gsub, + :gsub!, + ]) + + ## + # Emumerables + ## + + exclude_enumerable(profile, Enumerable) + exclude_enumerable(profile, Enumerator) + + ## + # Collections + ## + + exclude_enumerable(profile, Array, [ + :each_index, + :map!, + :select!, + :reject!, + :collect!, + :sort!, + :sort_by!, + :index, + :delete_if, + :keep_if, + :drop_while, + :uniq, + :uniq!, + :"==", + :eql?, + :hash, + :to_json, + :as_json, + :encode_json, + ]) + + exclude_enumerable(profile, Hash, [ + :dup, + :initialize_dup, + :fetch, + :"[]", + :"[]=", + :each_key, + :each_value, + :each_pair, + :map!, + :select!, + :reject!, + :collect!, + :delete_if, + :keep_if, + :slice, + :slice!, + :except, + :except!, + :"==", + :eql?, + :hash, + :to_json, + :as_json, + :encode_json, + ]) + + exclude_enumerable(profile, Set, [ + :map!, + :select!, + :reject!, + :collect!, + :classify, + :delete_if, + :keep_if, + :divide, + :"==", + :eql?, + :hash, + :to_json, + :as_json, + :encode_json, + ]) + + ## + # Garbage Collection + ## + + exclude_singleton_methods(profile, GC, [ + :start + ]) + + ## + # Unicorn + ## + + if defined?(Unicorn) + exclude_methods(profile, Unicorn::HttpServer, :process_client) + end + + if defined?(Unicorn::OobGC) + exclude_methods(profile, Unicorn::OobGC, :process_client) + end + + ## + # New Relic + ## + + if defined?(NewRelic::Agent) + if defined?(NewRelic::Agent::Instrumentation::MiddlewareTracing) + exclude_methods(profile, NewRelic::Agent::Instrumentation::MiddlewareTracing, [ + :call + ]) + end + + if defined?(NewRelic::Agent::MethodTracerHelpers) + exclude_methods(profile, NewRelic::Agent::MethodTracerHelpers, [ + :trace_execution_scoped, + :log_errors, + ]) + + exclude_singleton_methods(profile, NewRelic::Agent::MethodTracerHelpers, [ + :trace_execution_scoped, + :log_errors, + ]) + end + + if defined?(NewRelic::Agent::MethodTracer) + exclude_methods(profile, NewRelic::Agent::MethodTracer, [ + :trace_execution_scoped, + :trace_execution_unscoped, + ]) + end + end + + ## + # Miscellaneous Methods + ## + + if defined?(Mustache) + exclude_methods(profile, Mustache::Context, [ + :fetch + ]) + end + end + + private + + def self.exclude_enumerable(profile, mod, *method_or_methods) + exclude_methods(profile, mod, [:each, *method_or_methods]) + exclude_methods(profile, mod, ENUMERABLE_NAMES) + end + + def self.exclude_methods(profile, mod, *method_or_methods) + profile.exclude_methods!(mod, method_or_methods) + end + + def self.exclude_singleton_methods(profile, mod, *method_or_methods) + profile.exclude_singleton_methods!(mod, method_or_methods) + end + end +end diff --git a/ruby-prof.gemspec b/ruby-prof.gemspec index a3bf3d9e..b57bd4c6 100644 --- a/ruby-prof.gemspec +++ b/ruby-prof.gemspec @@ -1,64 +1,67 @@ -# -*- encoding: utf-8 -*- - -$:.push File.expand_path("../lib", __FILE__) -require "ruby-prof/version" - -Gem::Specification.new do |spec| - spec.name = "ruby-prof" - - spec.homepage = "https://github.com/ruby-prof/ruby-prof/" - spec.summary = "Fast Ruby profiler" - spec.description = <<-EOF -ruby-prof is a fast code profiler for Ruby. It is a C extension and -therefore is many times faster than the standard Ruby profiler. It -supports both flat and graph profiles. For each method, graph profiles -show how long the method ran, which methods called it and which -methods it called. RubyProf generate both text and html and can output -it to standard out or to a file. -EOF - spec.license = 'BSD-2-Clause' - spec.version = RubyProf::VERSION - - spec.metadata = { - "bug_tracker_uri" => "https://github.com/ruby-prof/ruby-prof/issues", - "changelog_uri" => "https://github.com/ruby-prof/ruby-prof/blob/master/CHANGES", - "documentation_uri" => "https://ruby-prof.github.io/", - "source_code_uri" => "https://github.com/ruby-prof/ruby-prof/tree/v#{spec.version}", - } - - spec.author = "Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes" - spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de" - spec.platform = Gem::Platform::RUBY - spec.require_path = "lib" - spec.bindir = "bin" - spec.executables = ["ruby-prof", "ruby-prof-check-trace"] - spec.extensions = ["ext/ruby_prof/extconf.rb"] - spec.files = Dir['CHANGES', - 'LICENSE', - 'Rakefile', - 'README.md', - 'ruby-prof.gemspec', - 'bin/ruby-prof', - 'bin/ruby-prof-check-trace', - 'doc/**/*', - 'examples/*', - 'ext/ruby_prof/extconf.rb', - 'ext/ruby_prof/*.c', - 'ext/ruby_prof/*.h', - 'ext/ruby_prof/vc/*.sln', - 'ext/ruby_prof/vc/*.vcxproj', - 'lib/ruby-prof.rb', - 'lib/unprof.rb', - 'lib/ruby-prof/*.rb', - 'lib/ruby-prof/assets/*', - 'lib/ruby-prof/profile/*.rb', - 'lib/ruby-prof/printers/*.rb', - 'test/*.rb'] - - spec.test_files = Dir["test/test_*.rb"] - spec.required_ruby_version = '>= 2.7.0' - spec.date = Time.now.strftime('%Y-%m-%d') - spec.homepage = 'https://github.com/ruby-prof/ruby-prof' - spec.add_development_dependency('minitest') - spec.add_development_dependency('rake-compiler') -end +# -*- encoding: utf-8 -*- + +$:.push File.expand_path("../lib", __FILE__) +require "ruby-prof/version" + +Gem::Specification.new do |spec| + spec.name = "ruby-prof" + + spec.homepage = "https://github.com/ruby-prof/ruby-prof/" + spec.summary = "Fast Ruby profiler" + spec.description = <<-EOF +ruby-prof is a fast code profiler for Ruby. It is a C extension and +therefore is many times faster than the standard Ruby profiler. It +supports both flat and graph profiles. For each method, graph profiles +show how long the method ran, which methods called it and which +methods it called. RubyProf generate both text and html and can output +it to standard out or to a file. +EOF + spec.license = 'BSD-2-Clause' + spec.version = RubyProf::VERSION + + spec.metadata = { + "bug_tracker_uri" => "https://github.com/ruby-prof/ruby-prof/issues", + "changelog_uri" => "https://github.com/ruby-prof/ruby-prof/blob/master/CHANGES", + "documentation_uri" => "https://ruby-prof.github.io/", + "source_code_uri" => "https://github.com/ruby-prof/ruby-prof/tree/v#{spec.version}", + } + + spec.author = "Shugo Maeda, Charlie Savage, Roger Pack, Stefan Kaes" + spec.email = "shugo@ruby-lang.org, cfis@savagexi.com, rogerdpack@gmail.com, skaes@railsexpress.de" + spec.platform = Gem::Platform::RUBY + spec.require_path = "lib" + spec.bindir = "bin" + spec.executables = ["ruby-prof", "ruby-prof-check-trace"] + spec.extensions = ["ext/ruby_prof/extconf.rb"] + spec.files = Dir['CHANGES', + 'LICENSE', + 'Rakefile', + 'README.md', + 'ruby-prof.gemspec', + 'bin/ruby-prof', + 'bin/ruby-prof-check-trace', + 'doc/**/*', + 'examples/*', + 'ext/ruby_prof/extconf.rb', + 'ext/ruby_prof/*.c', + 'ext/ruby_prof/*.h', + 'ext/ruby_prof/vc/*.sln', + 'ext/ruby_prof/vc/*.vcxproj', + 'lib/ruby-prof.rb', + 'lib/unprof.rb', + 'lib/ruby-prof/*.rb', + 'lib/ruby-prof/assets/*', + 'lib/ruby-prof/profile/*.rb', + 'lib/ruby-prof/printers/*.rb', + 'test/*.rb'] + + spec.test_files = Dir["test/test_*.rb"] + spec.required_ruby_version = '>= 3.0.0' + spec.date = Time.now.strftime('%Y-%m-%d') + spec.homepage = 'https://github.com/ruby-prof/ruby-prof' + spec.add_development_dependency('minitest') + spec.add_development_dependency('rake-compiler') + + spec.add_runtime_dependency('excon') + spec.add_runtime_dependency('benchmark-ips') +end diff --git a/test/enumerable_test.rb b/test/enumerable_test.rb index f09dedbd..15be75ff 100644 --- a/test/enumerable_test.rb +++ b/test/enumerable_test.rb @@ -1,21 +1,21 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) - -# -- Test for bug -# http://github.com/rdp/ruby-prof/issues#issue/12 - -class EnumerableTest < TestCase - def test_enumerable - result = RubyProf::Profile.profile do - 3.times { [1,2,3].any? {|n| n} } - end - methods = if RUBY_VERSION >= "2.2.0" - %w(EnumerableTest#test_enumerable Integer#times Array#any?) - else - %w(EnumerableTest#test_enumerable Integer#times Enumerable#any? Array#each) - end - assert_equal(methods, result.threads.first.methods.map(&:full_name)) - end -end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) + +# -- Test for bug +# http://github.com/rdp/ruby-prof/issues#issue/12 + +class EnumerableTest < TestCase + def test_enumerable + result = RubyProf::Profile.profile do + 3.times { [1,2,3].any? {|n| n} } + end + methods = if RUBY_VERSION >= "3.3.0" + %w(EnumerableTest#test_enumerable Integer#times Kernel#block_given? Integer#< Array#any? Integer#succ) + else + %w(EnumerableTest#test_enumerable Integer#times Array#any?) + end + assert_equal(methods, result.threads.first.methods.map(&:full_name)) + end +end diff --git a/test/exclude_methods_test.rb b/test/exclude_methods_test.rb index f741b55d..f40c950c 100644 --- a/test/exclude_methods_test.rb +++ b/test/exclude_methods_test.rb @@ -1,146 +1,260 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) - -module ExcludeMethodsModule - def c - 1.times { |i| ExcludeMethodsModule.d } - end - - def self.d - 1.times { |i| ExcludeMethodsClass.e } - end -end - -class ExcludeMethodsClass - include ExcludeMethodsModule - - def a - 1.times { |i| b } - end - - def b - 1.times { |i| c; self.class.e } - end - - def self.e - 1.times { |i| f } - end - - def self.f - sleep 0.1 - end -end - -class ExcludeMethodsTest < TestCase - def test_methods_can_be_profiled - obj = ExcludeMethodsClass.new - prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME) - - result = prf.profile {obj.a} - methods = result.threads.first.methods.sort.reverse - assert_equal(10, methods.count) - assert_equal('ExcludeMethodsTest#test_methods_can_be_profiled', methods[0].full_name) - assert_equal('ExcludeMethodsClass#a', methods[1].full_name) - assert_equal('Integer#times', methods[2].full_name) - assert_equal('ExcludeMethodsClass#b', methods[3].full_name) - assert_equal('#e', methods[4].full_name) - assert_equal('#f', methods[5].full_name) - assert_equal('Kernel#sleep', methods[6].full_name) - assert_equal('ExcludeMethodsModule#c', methods[7].full_name) - assert_equal('#d', methods[8].full_name) - assert_equal('Kernel#class', methods[9].full_name) - end - - def test_methods_can_be_hidden1 - obj = ExcludeMethodsClass.new - prf = RubyProf::Profile.new - - prf.exclude_methods!(Integer, :times) - - result = prf.profile {obj.a} - methods = result.threads.first.methods.sort.reverse - - assert_equal(9, methods.count) - assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden1', methods[0].full_name) - assert_equal('ExcludeMethodsClass#a', methods[1].full_name) - assert_equal('ExcludeMethodsClass#b', methods[2].full_name) - assert_equal('#e', methods[3].full_name) - assert_equal('#f', methods[4].full_name) - assert_equal('Kernel#sleep', methods[5].full_name) - assert_equal('ExcludeMethodsModule#c', methods[6].full_name) - assert_equal('#d', methods[7].full_name) - assert_equal('Kernel#class', methods[8].full_name) - end - - def test_methods_can_be_hidden2 - obj = ExcludeMethodsClass.new - prf = RubyProf::Profile.new - - prf.exclude_methods!(Integer, :times) - prf.exclude_methods!(ExcludeMethodsClass.singleton_class, :f) - prf.exclude_methods!(ExcludeMethodsModule.singleton_class, :d) - - result = prf.profile {obj.a} - methods = result.threads.first.methods.sort.reverse - - assert_equal(7, methods.count) - assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden2', methods[0].full_name) - assert_equal('ExcludeMethodsClass#a', methods[1].full_name) - assert_equal('ExcludeMethodsClass#b', methods[2].full_name) - assert_equal('#e', methods[3].full_name) - assert_equal('Kernel#sleep', methods[4].full_name) - assert_equal('ExcludeMethodsModule#c', methods[5].full_name) - assert_equal('Kernel#class', methods[6].full_name) - end - - def test_exclude_common_methods1 - obj = ExcludeMethodsClass.new - prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME) - - prf.exclude_common_methods! - - result = prf.profile {obj.a} - methods = result.threads.first.methods.sort.reverse - - assert_equal(9, methods.count) - assert_equal('ExcludeMethodsTest#test_exclude_common_methods1', methods[0].full_name) - assert_equal('ExcludeMethodsClass#a', methods[1].full_name) - assert_equal('ExcludeMethodsClass#b', methods[2].full_name) - assert_equal('#e', methods[3].full_name) - assert_equal('#f', methods[4].full_name) - assert_equal('Kernel#sleep', methods[5].full_name) - assert_equal('ExcludeMethodsModule#c', methods[6].full_name) - assert_equal('#d', methods[7].full_name) - assert_equal('Kernel#class', methods[8].full_name) - end - - def test_exclude_common_methods2 - obj = ExcludeMethodsClass.new - - result = RubyProf::Profile.profile(exclude_common: true) { 5.times {obj.a} } - methods = result.threads.first.methods.sort.reverse - - assert_equal(9, methods.count) - assert_equal('ExcludeMethodsTest#test_exclude_common_methods2', methods[0].full_name) - assert_equal('ExcludeMethodsClass#a', methods[1].full_name) - assert_equal('ExcludeMethodsClass#b', methods[2].full_name) - end - - private - - def assert_method_has_been_excluded(result, excluded_method) - result.threads.each do |thread| - thread.methods.each do |method| - method.call_trees.each do |ci| - assert(ci.target != excluded_method, "broken self") - assert(ci.parent.target != excluded_method, "broken parent") if ci.parent - ci.children.each do |callee| - assert(callee.target != excluded_method, "broken kid") - end - end - end - end - end -end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) + +module ExcludeMethodsModule + def c + 1.times { |i| ExcludeMethodsModule.d } + end + + def self.d + 1.times { |i| ExcludeMethodsClass.e } + end +end + +class ExcludeMethodsClass + include ExcludeMethodsModule + + def a + 1.times { |i| b } + end + + def b + 1.times { |i| c; self.class.e } + end + + def self.e + 1.times { |i| f } + end + + def self.f + sleep 0.1 + end +end + +class ExcludeMethodsTest < TestCase + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') + def test_methods_can_be_profiled + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME) + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + assert_equal(10, methods.count) + assert_equal('ExcludeMethodsTest#test_methods_can_be_profiled', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('Integer#times', methods[2].full_name) + assert_equal('ExcludeMethodsClass#b', methods[3].full_name) + assert_equal('#e', methods[4].full_name) + assert_equal('#f', methods[5].full_name) + assert_equal('Kernel#sleep', methods[6].full_name) + assert_equal('ExcludeMethodsModule#c', methods[7].full_name) + assert_equal('#d', methods[8].full_name) + assert_equal('Kernel#class', methods[9].full_name) + end + + def test_methods_can_be_hidden1 + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new + + prf.exclude_methods!(Integer, :times) + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + + assert_equal(9, methods.count) + assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden1', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('#f', methods[4].full_name) + assert_equal('Kernel#sleep', methods[5].full_name) + assert_equal('ExcludeMethodsModule#c', methods[6].full_name) + assert_equal('#d', methods[7].full_name) + assert_equal('Kernel#class', methods[8].full_name) + end + + def test_methods_can_be_hidden2 + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new + + prf.exclude_methods!(Integer, :times) + prf.exclude_methods!(ExcludeMethodsClass.singleton_class, :f) + prf.exclude_methods!(ExcludeMethodsModule.singleton_class, :d) + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + + assert_equal(7, methods.count) + assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden2', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('Kernel#sleep', methods[4].full_name) + assert_equal('ExcludeMethodsModule#c', methods[5].full_name) + assert_equal('Kernel#class', methods[6].full_name) + end + + def test_exclude_common_methods1 + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME) + + prf.exclude_common_methods! + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + + assert_equal(9, methods.count) + assert_equal('ExcludeMethodsTest#test_exclude_common_methods1', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('#f', methods[4].full_name) + assert_equal('Kernel#sleep', methods[5].full_name) + assert_equal('ExcludeMethodsModule#c', methods[6].full_name) + assert_equal('#d', methods[7].full_name) + assert_equal('Kernel#class', methods[8].full_name) + end + + def test_exclude_common_methods2 + obj = ExcludeMethodsClass.new + + result = RubyProf::Profile.profile(exclude_common: true) { 5.times {obj.a} } + methods = result.threads.first.methods.sort.reverse + + assert_equal(9, methods.count) + assert_equal('ExcludeMethodsTest#test_exclude_common_methods2', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + end + else + def test_methods_can_be_profiled + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME) + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + assert_equal(13, methods.count) + assert_equal('ExcludeMethodsTest#test_methods_can_be_profiled', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('Integer#times', methods[2].full_name) + assert_equal('ExcludeMethodsClass#b', methods[3].full_name) + assert_equal('#e', methods[4].full_name) + assert_equal('#f', methods[5].full_name) + assert_equal('Kernel#sleep', methods[6].full_name) + assert_equal('ExcludeMethodsModule#c', methods[7].full_name) + assert_equal('#d', methods[8].full_name) + assert_equal('Integer#succ', methods[9].full_name) + assert_equal('Integer#<', methods[10].full_name) + assert_equal('Kernel#block_given?', methods[11].full_name) + assert_equal('Kernel#class', methods[12].full_name) + end + + def test_methods_can_be_hidden1 + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new + + prf.exclude_methods!(Integer, :times) + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + + assert_equal(12, methods.count) + assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden1', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('#f', methods[4].full_name) + assert_equal('Kernel#sleep', methods[5].full_name) + assert_equal('ExcludeMethodsModule#c', methods[6].full_name) + assert_equal('#d', methods[7].full_name) + assert_equal('Integer#succ', methods[8].full_name) + assert_equal('Integer#<', methods[9].full_name) + assert_equal('Kernel#block_given?', methods[10].full_name) + assert_equal('Kernel#class', methods[11].full_name) + end + + def test_methods_can_be_hidden2 + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new + + prf.exclude_methods!(Integer, :times) + prf.exclude_methods!(ExcludeMethodsClass.singleton_class, :f) + prf.exclude_methods!(ExcludeMethodsModule.singleton_class, :d) + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + + assert_equal(10, methods.count) + assert_equal('ExcludeMethodsTest#test_methods_can_be_hidden2', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('Kernel#sleep', methods[4].full_name) + assert_equal('ExcludeMethodsModule#c', methods[5].full_name) + assert_equal('Integer#succ', methods[6].full_name) + assert_equal('Integer#succ', methods[7].full_name) + assert_equal('Integer#<', methods[8].full_name) + assert_equal('Kernel#class', methods[9].full_name) + end + + def test_exclude_common_methods1 + obj = ExcludeMethodsClass.new + prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME) + + prf.exclude_common_methods! + + result = prf.profile {obj.a} + methods = result.threads.first.methods.sort.reverse + + assert_equal(9, methods.count) + assert_equal('ExcludeMethodsTest#test_exclude_common_methods1', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('#f', methods[4].full_name) + assert_equal('Kernel#sleep', methods[5].full_name) + assert_equal('ExcludeMethodsModule#c', methods[6].full_name) + assert_equal('#d', methods[7].full_name) + assert_equal('Kernel#class', methods[8].full_name) + end + + def test_exclude_common_methods2 + obj = ExcludeMethodsClass.new + + result = RubyProf::Profile.profile(exclude_common: true) { 5.times {obj.a} } + methods = result.threads.first.methods.sort.reverse + + assert_equal(9, methods.count) + assert_equal('ExcludeMethodsTest#test_exclude_common_methods2', methods[0].full_name) + assert_equal('ExcludeMethodsClass#a', methods[1].full_name) + assert_equal('ExcludeMethodsClass#b', methods[2].full_name) + assert_equal('#e', methods[3].full_name) + assert_equal('#f', methods[4].full_name) + assert_equal('Kernel#sleep', methods[5].full_name) + assert_equal('ExcludeMethodsModule#c', methods[6].full_name) + assert_equal('ExcludeMethodsModule#d', methods[7].full_name) + assert_equal('ExcludeMethodsClass#b', methods[8].full_name) + assert_equal('ExcludeMethodsClass#b', methods[9].full_name) + assert_equal('ExcludeMethodsClass#b', methods[10].full_name) + assert_equal('ExcludeMethodsClass#b', methods[11].full_name) + end + end + + private + + def assert_method_has_been_excluded(result, excluded_method) + result.threads.each do |thread| + thread.methods.each do |method| + method.call_trees.each do |ci| + assert(ci.target != excluded_method, "broken self") + assert(ci.parent.target != excluded_method, "broken parent") if ci.parent + ci.children.each do |callee| + assert(callee.target != excluded_method, "broken kid") + end + end + end + end + end +end diff --git a/test/line_number_test.rb b/test/line_number_test.rb index 119fff2f..5ee5b3f8 100644 --- a/test/line_number_test.rb +++ b/test/line_number_test.rb @@ -1,134 +1,289 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) - -class LineNumbers - def method_1 - method_2 - _filler = 1 - method_3 - end - - def method_2 - _filler = 1 - 2.times do |i| - _filler = 2 - method_3 - end - end - - def method_3 - method_4 - end - - def method_4 - end -end - -# -- Tests ---- -class LineNumbersTest < TestCase - def test_function_line_no - numbers = LineNumbers.new - - result = RubyProf::Profile.profile do - numbers.method_1 - end - - # Sort methods by name to have stable results - methods = result.threads.first.methods.sort_by(&:full_name) - assert_equal(6, methods.length) - - # Method 0 - method = methods[0] - assert_equal('Integer#times', method.full_name) - assert_equal(0, method.line) - - assert_equal(1, method.call_trees.callers.count) - call_tree = method.call_trees.callers[0] - assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name) - assert_equal(15, call_tree.line) - - assert_equal(1, method.call_trees.callees.count) - call_tree = method.call_trees.callees[0] - assert_equal('LineNumbers#method_3', call_tree.target.full_name) - assert_equal(17, call_tree.line) - - # Method 1 - method = methods[1] - assert_equal('LineNumbers#method_1', method.full_name) - assert_equal(7, method.line) - - assert_equal(1, method.call_trees.callers.count) - call_tree = method.call_trees.callers[0] - assert_equal('LineNumbersTest#test_function_line_no', call_tree.parent.target.full_name) - assert_equal(35, call_tree.line) - - assert_equal(2, method.call_trees.callees.count) - call_tree = method.call_trees.callees[0] - assert_equal('LineNumbers#method_2', call_tree.target.full_name) - assert_equal(8, call_tree.line) - - call_tree = method.call_trees.callees[1] - assert_equal('LineNumbers#method_3', call_tree.target.full_name) - assert_equal(10, call_tree.line) - - # Method 2 - method = methods[2] - assert_equal('LineNumbers#method_2', method.full_name) - assert_equal(13, method.line) - - assert_equal(1, method.call_trees.callers.count) - call_tree = method.call_trees.callers[0] - assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name) - assert_equal(8, call_tree.line) - - assert_equal(1, method.call_trees.callees.count) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - assert_equal(15, call_tree.line) - - # Method 3 - method = methods[3] - assert_equal('LineNumbers#method_3', method.full_name) - assert_equal(21, method.line) - - assert_equal(2, method.call_trees.callers.count) - call_tree = method.call_trees.callers[0] - assert_equal('Integer#times', call_tree.parent.target.full_name) - assert_equal(17, call_tree.line) - - call_tree = method.call_trees.callers[1] - assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name) - assert_equal(10, call_tree.line) - - assert_equal(1, method.call_trees.callees.count) - call_tree = method.call_trees.callees[0] - assert_equal('LineNumbers#method_4', call_tree.target.full_name) - assert_equal(22, call_tree.line) - - # Method 4 - method = methods[4] - assert_equal('LineNumbers#method_4', method.full_name) - assert_equal(25, method.line) - - assert_equal(1, method.call_trees.callers.count) - call_tree = method.call_trees.callers[0] - assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name) - assert_equal(22, call_tree.line) - - assert_equal(0, method.call_trees.callees.count) - - # Method 5 - method = methods[5] - assert_equal('LineNumbersTest#test_function_line_no', method.full_name) - assert_equal(35, method.line) - - assert_equal(0, method.call_trees.callers.count) - - assert_equal(1, method.call_trees.callees.count) - call_tree = method.call_trees.callees[0] - assert_equal('LineNumbers#method_1', call_tree.target.full_name) - assert_equal(35, call_tree.line) - end -end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) + +class LineNumbers + def method_1 + method_2 + _filler = 1 + method_3 + end + + def method_2 + _filler = 1 + 2.times do |i| + _filler = 2 + method_3 + end + end + + def method_3 + method_4 + end + + def method_4 + end +end + +# -- Tests ---- +class LineNumbersTest < TestCase + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') + def test_function_line_no + numbers = LineNumbers.new + + result = RubyProf::Profile.profile do + numbers.method_1 + end + + # Sort methods by name to have stable results + methods = result.threads.first.methods.sort_by(&:full_name) + assert_equal(6, methods.length) + + # Method 0 + method = methods[0] + assert_equal('Integer#times', method.full_name) + assert_equal(0, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name) + assert_equal(15, call_tree.line) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_3', call_tree.target.full_name) + assert_equal(17, call_tree.line) + + # Method 1 + method = methods[1] + assert_equal('LineNumbers#method_1', method.full_name) + assert_equal(7, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbersTest#test_function_line_no', call_tree.parent.target.full_name) + assert_equal(35, call_tree.line) + + assert_equal(2, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_2', call_tree.target.full_name) + assert_equal(8, call_tree.line) + + call_tree = method.call_trees.callees[1] + assert_equal('LineNumbers#method_3', call_tree.target.full_name) + assert_equal(10, call_tree.line) + + # Method 2 + method = methods[2] + assert_equal('LineNumbers#method_2', method.full_name) + assert_equal(13, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name) + assert_equal(8, call_tree.line) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(15, call_tree.line) + + # Method 3 + method = methods[3] + assert_equal('LineNumbers#method_3', method.full_name) + assert_equal(21, method.line) + + assert_equal(2, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(17, call_tree.line) + + call_tree = method.call_trees.callers[1] + assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name) + assert_equal(10, call_tree.line) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_4', call_tree.target.full_name) + assert_equal(22, call_tree.line) + + # Method 4 + method = methods[4] + assert_equal('LineNumbers#method_4', method.full_name) + assert_equal(25, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name) + assert_equal(22, call_tree.line) + + assert_equal(0, method.call_trees.callees.count) + + # Method 5 + method = methods[5] + assert_equal('LineNumbersTest#test_function_line_no', method.full_name) + assert_equal(35, method.line) + + assert_equal(0, method.call_trees.callers.count) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_1', call_tree.target.full_name) + assert_equal(35, call_tree.line) + end + else + def test_function_line_no + numbers = LineNumbers.new + + result = RubyProf::Profile.profile do + numbers.method_1 + end + + # Sort methods by name to have stable results + methods = result.threads.first.methods.sort_by(&:full_name) + assert_equal(9, methods.length) + + # Method 0 + method = methods[0] + assert_equal('Integer#<', method.full_name) + assert_equal(0, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(236, call_tree.line) + + assert_equal(0, method.call_trees.callees.count) + + # Method 1 + method = methods[1] + assert_equal('Integer#succ', method.full_name) + assert_equal(0, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(238, call_tree.line) + + assert_equal(0, method.call_trees.callees.count) + + # Method 2 + method = methods[2] + assert_equal('Integer#times', method.full_name) + assert_equal(231, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name) + assert_equal(15, call_tree.line) + + assert_equal(4, method.call_trees.callees.count) + + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#block_given?', call_tree.target.full_name) + assert_equal(232, call_tree.line) + + call_tree = method.call_trees.callees[1] + assert_equal('Integer#<', call_tree.target.full_name) + assert_equal(236, call_tree.line) + + call_tree = method.call_trees.callees[2] + assert_equal('LineNumbers#method_3', call_tree.target.full_name) + assert_equal(17, call_tree.line) + + call_tree = method.call_trees.callees[3] + assert_equal('Integer#succ', call_tree.target.full_name) + assert_equal(238, call_tree.line) + + # Method 3 + method = methods[3] + assert_equal('Kernel#block_given?', method.full_name) + assert_equal(0, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(232, call_tree.line) + + assert_equal(0, method.call_trees.callees.count) + + # Method 4 + method = methods[4] + assert_equal('LineNumbers#method_1', method.full_name) + assert_equal(7, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbersTest#test_function_line_no', call_tree.parent.target.full_name) + assert_equal(140, call_tree.line) + + assert_equal(2, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_2', call_tree.target.full_name) + assert_equal(8, call_tree.line) + + call_tree = method.call_trees.callees[1] + assert_equal('LineNumbers#method_3', call_tree.target.full_name) + assert_equal(10, call_tree.line) + + # Method 5 + method = methods[5] + assert_equal('LineNumbers#method_2', method.full_name) + assert_equal(13, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name) + assert_equal(8, call_tree.line) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(15, call_tree.line) + + # Method 6 + method = methods[6] + assert_equal('LineNumbers#method_3', method.full_name) + assert_equal(21, method.line) + + assert_equal(2, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(17, call_tree.line) + + call_tree = method.call_trees.callers[1] + assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name) + assert_equal(10, call_tree.line) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_4', call_tree.target.full_name) + assert_equal(22, call_tree.line) + + # Method 7 + method = methods[7] + assert_equal('LineNumbers#method_4', method.full_name) + assert_equal(25, method.line) + + assert_equal(1, method.call_trees.callers.count) + call_tree = method.call_trees.callers[0] + assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name) + assert_equal(22, call_tree.line) + + assert_equal(0, method.call_trees.callees.count) + + # Method 8 + method = methods[8] + assert_equal('LineNumbersTest#test_function_line_no', method.full_name) + assert_equal(140, method.line) + + assert_equal(0, method.call_trees.callers.count) + + assert_equal(1, method.call_trees.callees.count) + call_tree = method.call_trees.callees[0] + assert_equal('LineNumbers#method_1', call_tree.target.full_name) + assert_equal(140, call_tree.line) + end + end +end diff --git a/test/measure_allocations_test.rb b/test/measure_allocations_test.rb index 3144b861..205846dd 100644 --- a/test/measure_allocations_test.rb +++ b/test/measure_allocations_test.rb @@ -1,660 +1,1081 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) -require_relative './measure_allocations' - -class MeasureAllocationsTest < TestCase - def test_allocations - result = RubyProf::Profile.profile(measure_mode: RubyProf::ALLOCATIONS, track_allocations: true) do - allocator = Allocator.new - allocator.run - end - - thread = result.threads.first - assert_in_delta(20, thread.total_time, 1) - - methods = result.threads.first.methods.sort.reverse - if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') - assert_equal(12, methods.length) - - # Method 0 - method = methods[0] - assert_equal('MeasureAllocationsTest#test_allocations', method.full_name) - assert_in_delta(20, method.total_time, 1) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_in_delta(20, method.children_time, 1) - - assert_equal(0, method.call_trees.callers.length) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#run', call_tree.target.full_name) - assert_equal(19, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(19, call_tree.children_time) - - # Method 1 - method = methods[1] - assert_equal('Allocator#run',method.full_name) - assert_equal(19, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(19, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) - assert_equal(19, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(19, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Allocator#make_arrays', call_tree.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#make_hashes', call_tree.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(5, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Allocator#make_strings', call_tree.target.full_name) - assert_equal(4, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(3, call_tree.children_time) - - # Method 2 - method = methods[2] - assert_equal('Class#new', method.full_name) - assert_equal(18, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(17, method.self_time) - assert_equal(1, method.children_time) - - assert_equal(4, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callers[1] - assert_equal('Integer#times', call_tree.parent.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(10, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callers[2] - assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(5, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callers[3] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(2, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(1, call_tree.children_time) - - assert_equal(4, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('BasicObject#initialize', call_tree.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Array#initialize', call_tree.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Hash#initialize', call_tree.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[3] - assert_equal('String#initialize', call_tree.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 3 - method = methods[3] - assert_equal('Allocator#make_arrays', method.full_name) - assert_equal(10, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(10, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - # Method 4 - method = methods[4] - assert_equal('Integer#times', method.full_name) - assert_equal(10, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(10, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(10, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 5 - method = methods[5] - assert_equal('Allocator#make_hashes', method.full_name) - assert_equal(5, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(5, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(5, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(5, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 6 - method = methods[6] - assert_equal('Allocator#make_strings', method.full_name) - assert_equal(4, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(1, method.self_time) - assert_equal(3, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(4, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(3, call_tree.children_time) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('String#*', call_tree.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(2, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(1, call_tree.children_time) - - # Method 7 - method = methods[7] - assert_equal('String#*', method.full_name) - assert_equal(1, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(1, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 8 - method = methods[8] - assert_equal('String#initialize', method.full_name) - assert_equal(1, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(1, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 9 - method = methods[9] - assert_equal('BasicObject#initialize', method.full_name) - assert_equal(0, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 10 - method = methods[10] - assert_equal('Hash#initialize', method.full_name) - assert_equal(0, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - else - assert_equal(13, methods.length) - - # Method 0 - method = methods[0] - assert_equal('MeasureAllocationsTest#test_allocations', method.full_name) - assert_in_delta(20, method.total_time, 1) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_in_delta(20, method.children_time, 1) - - assert_equal(0, method.call_trees.callers.length) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#run', call_tree.target.full_name) - assert_equal(19, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(19, call_tree.children_time) - - # Method 1 - method = methods[1] - assert_equal('Allocator#run',method.full_name) - assert_equal(19, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(19, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) - assert_equal(19, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(19, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Allocator#make_arrays', call_tree.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#make_hashes', call_tree.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(5, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Allocator#make_strings', call_tree.target.full_name) - assert_equal(4, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(3, call_tree.children_time) - - # Method 2 - method = methods[2] - assert_equal('Allocator#make_arrays', method.full_name) - assert_equal(10, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(10, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - # Method 3 - method = methods[3] - assert_equal('Integer#times', method.full_name) - assert_equal(10, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(10, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(10, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('#new', call_tree.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(10, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 4 - method = methods[4] - assert_equal('#new', method.full_name) - assert_equal(10, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(10, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Integer#times', call_tree.parent.target.full_name) - assert_equal(10, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(10, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Array#initialize', call_tree.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 5 - method = methods[5] - assert_equal('Class#new', method.full_name) - assert_equal(8, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(7, method.self_time) - assert_equal(1, method.children_time) - - assert_equal(3, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callers[1] - assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(5, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callers[2] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(2, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(1, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('BasicObject#initialize', call_tree.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Hash#initialize', call_tree.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('String#initialize', call_tree.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 6 - method = methods[6] - assert_equal('Allocator#make_hashes', method.full_name) - assert_equal(5, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(5, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(5, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(5, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(5, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - # Method 7 - method = methods[7] - assert_equal('Allocator#make_strings', method.full_name) - assert_equal(4, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(1, method.self_time) - assert_equal(3, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(4, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(3, call_tree.children_time) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('String#*', call_tree.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(2, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(1, call_tree.children_time) - - # Method 8 - method = methods[8] - assert_equal('String#*', method.full_name) - assert_equal(1, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(1, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 9 - method = methods[9] - assert_equal('String#initialize', method.full_name) - assert_equal(1, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(1, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(1, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(1, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 10 - method = methods[10] - assert_equal('BasicObject#initialize', method.full_name) - assert_equal(0, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 11 - method = methods[11] - assert_equal('Hash#initialize', method.full_name) - assert_equal(0, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - - # Method 12 - method = methods[12] - assert_equal('Array#initialize', method.full_name) - assert_equal(0, method.total_time) - assert_equal(0, method.wait_time) - assert_equal(0, method.self_time) - assert_equal(0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('#new', call_tree.parent.target.full_name) - assert_equal(0, call_tree.total_time) - assert_equal(0, call_tree.wait_time) - assert_equal(0, call_tree.self_time) - assert_equal(0, call_tree.children_time) - - assert_equal(0, method.call_trees.callees.length) - end - end -end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) +require_relative './measure_allocations' + +class MeasureAllocationsTest < TestCase + def test_allocations + result = RubyProf::Profile.profile(measure_mode: RubyProf::ALLOCATIONS, track_allocations: true) do + allocator = Allocator.new + allocator.run + end + + thread = result.threads.first + assert_in_delta(20, thread.total_time, 1) + + methods = result.threads.first.methods.sort.reverse + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') + assert_equal(12, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureAllocationsTest#test_allocations', method.full_name) + assert_in_delta(20, method.total_time, 1) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_in_delta(20, method.children_time, 1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(19, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(19, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(19, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(19, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) + assert_equal(19, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(19, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(5, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(4, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(3, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Class#new', method.full_name) + assert_equal(18, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(17, method.self_time) + assert_equal(1, method.children_time) + + assert_equal(4, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(10, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callers[2] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(5, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callers[3] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(2, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(1, call_tree.children_time) + + assert_equal(4, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[3] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(10, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('Integer#times', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(10, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(10, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(5, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(5, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(5, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(5, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(4, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(3, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(4, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(3, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(2, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(1, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('String#*', method.full_name) + assert_equal(1, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 8 + method = methods[8] + assert_equal('String#initialize', method.full_name) + assert_equal(1, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 9 + method = methods[9] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3') + assert_equal(13, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureAllocationsTest#test_allocations', method.full_name) + assert_in_delta(20, method.total_time, 1) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_in_delta(20, method.children_time, 1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(19, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(19, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(19, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(19, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) + assert_equal(19, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(19, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(5, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(4, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(3, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(10, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Integer#times', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(10, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('#new', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(10, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('#new', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(10, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(10, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Class#new', method.full_name) + assert_equal(8, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(7, method.self_time) + assert_equal(1, method.children_time) + + assert_equal(3, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(5, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callers[2] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(2, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(1, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(5, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(5, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(5, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(5, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(4, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(3, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(4, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(3, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(2, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(1, call_tree.children_time) + + # Method 8 + method = methods[8] + assert_equal('String#*', method.full_name) + assert_equal(1, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 9 + method = methods[9] + assert_equal('String#initialize', method.full_name) + assert_equal(1, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 11 + method = methods[11] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 12 + method = methods[12] + assert_equal('Array#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + else + assert_equal(17, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureAllocationsTest#test_allocations', method.full_name) + assert_in_delta(20, method.total_time, 1) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_in_delta(20, method.children_time, 1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(19, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(19, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(19, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(19, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) + assert_equal(19, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(19, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(5, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(4, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(3, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(10, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Integer#times', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(10, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(10, call_tree.children_time) + + assert_equal(4, method.call_trees.callees.length) + + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#block_given?', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Integer#<', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('#new', call_tree.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(10, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[3] + assert_equal('Integer#succ', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('#new', method.full_name) + assert_equal(10, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(10, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(10, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(10, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Class#new', method.full_name) + assert_equal(6, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(6, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureAllocationsTest#test_allocations', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(5, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(5, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(5, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(5, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(5, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(5, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(4, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(3, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(4, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(3, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('#new', call_tree.target.full_name) + assert_equal(2, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(1, call_tree.children_time) + + # Method 8 + method = methods[8] + assert_equal('#new', method.full_name) + assert_equal(2, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(1, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(2, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(1, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + + call_tree = method.call_trees.callees[0] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 9 + method = methods[9] + assert_equal('String#*', method.full_name) + assert_equal(1, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('String#initialize', method.full_name) + assert_equal(1, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(1, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('#new', call_tree.parent.target.full_name) + assert_equal(1, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(1, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 11 + method = methods[11] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 12 + method = methods[12] + assert_equal('Kernel#block_given?', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 13 + method = methods[13] + assert_equal('Integer#succ', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 14 + method = methods[14] + assert_equal('Integer#<', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 15 + method = methods[15] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 16 + method = methods[16] + assert_equal('Array#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + end + end +end diff --git a/test/measure_memory_test.rb b/test/measure_memory_test.rb index 01cbec6c..633eba76 100755 --- a/test/measure_memory_test.rb +++ b/test/measure_memory_test.rb @@ -1,1024 +1,1456 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) -require_relative './measure_allocations' - -class MeasureMemoryTest < TestCase - if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.0') - def test_memory - result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do - allocator = Allocator.new - allocator.run - end - - thread = result.threads.first - - assert_in_delta(800, thread.total_time, 1) - methods = result.threads.first.methods.sort.reverse - assert_equal(12, methods.length) - - # Method 0 - method = methods[0] - assert_equal('MeasureMemoryTest#test_memory', method.full_name) - assert_in_delta(800, method.total_time, 1) - - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_in_delta(800, method.children_time, 1) - assert_equal(0, method.call_trees.callers.length) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#run', call_tree.target.full_name) - assert_equal(760.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(760.0, call_tree.children_time) - - # Method 1 - method = methods[1] - assert_equal('Allocator#run',method.full_name) - assert_equal(760.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(760.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) - assert_equal(760.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(760.0, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Allocator#make_arrays', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#make_hashes', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(200.0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Allocator#make_strings', call_tree.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40, call_tree.self_time) - assert_equal(120.0, call_tree.children_time) - - # Method 2 - method = methods[2] - assert_equal('Class#new', method.full_name) - assert_equal(720.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(680.0, method.self_time) - assert_equal(40.0, method.children_time) - - assert_equal(4, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[1] - assert_equal('Integer#times', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(400.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[2] - assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(200.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[3] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(80.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(40.0, call_tree.children_time) - - assert_equal(4, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('BasicObject#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Array#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Hash#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[3] - assert_equal('String#initialize', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 3 - method = methods[3] - assert_equal('Allocator#make_arrays', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(400.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - # Method 4 - method = methods[4] - assert_equal('Integer#times', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(400.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(400.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 5 - method = methods[5] - assert_equal('Allocator#make_hashes', method.full_name) - assert_equal(200.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(200.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(200.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(200.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 6 - method = methods[6] - assert_equal('Allocator#make_strings', method.full_name) - assert_equal(160.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(120.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(120.0, call_tree.children_time) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('String#*', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(80.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(40.0, call_tree.children_time) - - # Method 7 - method = methods[7] - assert_equal('String#*', method.full_name) - assert_equal(40.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 8 - method = methods[8] - assert_equal('String#initialize', method.full_name) - assert_equal(40.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 9 - method = methods[9] - assert_equal('BasicObject#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 10 - method = methods[10] - assert_equal('Hash#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 11 - method = methods[11] - assert_equal('Array#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - end - elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') - def test_memory - result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do - allocator = Allocator.new - allocator.run - end - - thread = result.threads.first - - assert_in_delta(800, thread.total_time, 1) - methods = result.threads.first.methods.sort.reverse - assert_equal(12, methods.length) - - # Method 0 - method = methods[0] - assert_equal('MeasureMemoryTest#test_memory', method.full_name) - assert_in_delta(800, method.total_time, 1) - - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_in_delta(800, method.children_time, 1) - assert_equal(0, method.call_trees.callers.length) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#run', call_tree.target.full_name) - assert_equal(760.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(760.0, call_tree.children_time) - - # Method 1 - method = methods[1] - assert_equal('Allocator#run',method.full_name) - assert_equal(760.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(760.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) - assert_equal(760.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(760.0, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Allocator#make_arrays', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#make_hashes', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(200.0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Allocator#make_strings', call_tree.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(120.0, call_tree.children_time) - - # Method 2 - method = methods[2] - assert_equal('Class#new', method.full_name) - assert_equal(720.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(680.0, method.self_time) - assert_equal(40.0, method.children_time) - - assert_equal(4, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[1] - assert_equal('Integer#times', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(400.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[2] - assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(200.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[3] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(80.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(40.0, call_tree.children_time) - - assert_equal(4, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('BasicObject#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Array#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Hash#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[3] - assert_equal('String#initialize', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 3 - method = methods[3] - assert_equal('Allocator#make_arrays', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(400.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - # Method 4 - method = methods[4] - assert_equal('Integer#times', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(400.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(400.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 5 - method = methods[5] - assert_equal('Allocator#make_hashes', method.full_name) - assert_equal(200.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(200.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(200.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(200.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 6 - method = methods[6] - assert_equal('Allocator#make_strings', method.full_name) - assert_equal(160.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(120.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(120.0, call_tree.children_time) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('String#*', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(80.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(40.0, call_tree.children_time) - - # Method 7 - method = methods[7] - assert_equal('String#*', method.full_name) - assert_equal(40.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 8 - method = methods[8] - assert_equal('String#initialize', method.full_name) - assert_equal(40.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 9 - method = methods[9] - assert_equal('BasicObject#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 10 - method = methods[10] - assert_equal('Hash#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 11 - method = methods[11] - assert_equal('Array#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - end - else - def test_memory - result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do - allocator = Allocator.new - allocator.run - end - - thread = result.threads.first - - assert_in_delta(1040, thread.total_time, 1) - methods = result.threads.first.methods.sort.reverse - assert_equal(13, methods.length) - - # Method 0 - method = methods[0] - assert_equal('MeasureMemoryTest#test_memory', method.full_name) - assert_in_delta(1040, method.total_time, 1) - - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_in_delta(1040, method.children_time, 1) - assert_equal(0, method.call_trees.callers.length) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#run', call_tree.target.full_name) - assert_equal(1000.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(1000.0, call_tree.children_time) - - # Method 1 - method = methods[1] - assert_equal('Allocator#run',method.full_name) - assert_equal(1000.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(1000.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) - assert_equal(1000.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(1000.0, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Allocator#make_arrays', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Allocator#make_hashes', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(200.0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('Allocator#make_strings', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(360.0, call_tree.children_time) - - # Method 2 - method = methods[2] - assert_equal('Class#new', method.full_name) - assert_equal(440.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(280.0, method.self_time) - assert_equal(160.0, method.children_time) - - assert_equal(3, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) - assert_equal(40.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[1] - assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(200.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callers[2] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(160.0, call_tree.children_time) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('BasicObject#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Hash#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[2] - assert_equal('String#initialize', call_tree.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(160.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 3 - method = methods[3] - assert_equal('Allocator#make_strings', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(40.0, method.self_time) - assert_equal(360.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(360.0, call_tree.children_time) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('String#*', call_tree.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(160.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - call_tree = method.call_trees.callees[1] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(40.0, call_tree.self_time) - assert_equal(160.0, call_tree.children_time) - - # Method 4 - method = methods[4] - assert_equal('Allocator#make_arrays', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(400.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - # Method 5 - method = methods[5] - assert_equal('Integer#times', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(400.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(400.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('#new', call_tree.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(400.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 6 - method = methods[6] - assert_equal('#new', method.full_name) - assert_equal(400.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(400.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Integer#times', call_tree.parent.target.full_name) - assert_equal(400.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(400.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Array#initialize', call_tree.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 7 - method = methods[7] - assert_equal('Allocator#make_hashes', method.full_name) - assert_equal(200.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(200.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#run', call_tree.parent.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(200.0, call_tree.children_time) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Class#new', call_tree.target.full_name) - assert_equal(200.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(200.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - # Method 8 - method = methods[8] - assert_equal('String#*', method.full_name) - assert_equal(160.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(160.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(160.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 9 - method = methods[9] - assert_equal('String#initialize', method.full_name) - assert_equal(160.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(160.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(160.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(160.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 10 - method = methods[10] - assert_equal('BasicObject#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 11 - method = methods[11] - assert_equal('Hash#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Class#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - - # Method 12 - method = methods[12] - assert_equal('Array#initialize', method.full_name) - assert_equal(0.0, method.total_time) - assert_equal(0.0, method.wait_time) - assert_equal(0.0, method.self_time) - assert_equal(0.0, method.children_time) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('#new', call_tree.parent.target.full_name) - assert_equal(0.0, call_tree.total_time) - assert_equal(0.0, call_tree.wait_time) - assert_equal(0.0, call_tree.self_time) - assert_equal(0.0, call_tree.children_time) - - assert_equal(0.0, method.call_trees.callees.length) - end - end -end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) +require_relative './measure_allocations' + +class MeasureMemoryTest < TestCase + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.0') + def test_memory + result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do + allocator = Allocator.new + allocator.run + end + + thread = result.threads.first + + assert_in_delta(800, thread.total_time, 1) + methods = result.threads.first.methods.sort.reverse + assert_equal(12, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureMemoryTest#test_memory', method.full_name) + assert_in_delta(800, method.total_time, 1) + + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_in_delta(800, method.children_time, 1) + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(760.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(760.0, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(760.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(760.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(760.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(760.0, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(200.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40, call_tree.self_time) + assert_equal(120.0, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Class#new', method.full_name) + assert_equal(720.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(680.0, method.self_time) + assert_equal(40.0, method.children_time) + + assert_equal(4, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[2] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(200.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[3] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(80.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(40.0, call_tree.children_time) + + assert_equal(4, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[3] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('Integer#times', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(200.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(200.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(200.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(200.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(160.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(120.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(120.0, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(80.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(40.0, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('String#*', method.full_name) + assert_equal(40.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 8 + method = methods[8] + assert_equal('String#initialize', method.full_name) + assert_equal(40.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 9 + method = methods[9] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 11 + method = methods[11] + assert_equal('Array#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + end + elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') + def test_memory + result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do + allocator = Allocator.new + allocator.run + end + + thread = result.threads.first + + assert_in_delta(800, thread.total_time, 1) + methods = result.threads.first.methods.sort.reverse + assert_equal(12, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureMemoryTest#test_memory', method.full_name) + assert_in_delta(800, method.total_time, 1) + + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_in_delta(800, method.children_time, 1) + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(760.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(760.0, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(760.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(760.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(760.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(760.0, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(200.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(120.0, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Class#new', method.full_name) + assert_equal(720.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(680.0, method.self_time) + assert_equal(40.0, method.children_time) + + assert_equal(4, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[2] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(200.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[3] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(80.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(40.0, call_tree.children_time) + + assert_equal(4, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[3] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('Integer#times', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(200.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(200.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(200.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(200.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(160.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(120.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(120.0, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(80.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(40.0, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('String#*', method.full_name) + assert_equal(40.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 8 + method = methods[8] + assert_equal('String#initialize', method.full_name) + assert_equal(40.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 9 + method = methods[9] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 11 + method = methods[11] + assert_equal('Array#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + end + elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3') + def test_memory + result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do + allocator = Allocator.new + allocator.run + end + + thread = result.threads.first + + assert_in_delta(1040, thread.total_time, 1) + methods = result.threads.first.methods.sort.reverse + assert_equal(13, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureMemoryTest#test_memory', method.full_name) + assert_in_delta(1040, method.total_time, 1) + + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_in_delta(1040, method.children_time, 1) + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(1000.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(1000.0, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(1000.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(1000.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(1000.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(1000.0, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(200.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(360.0, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Class#new', method.full_name) + assert_equal(440.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(280.0, method.self_time) + assert_equal(160.0, method.children_time) + + assert_equal(3, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(200.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[2] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(160.0, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(160.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(360.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(360.0, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(160.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(160.0, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Integer#times', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('#new', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('#new', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(400.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(200.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(200.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(200.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(200.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 8 + method = methods[8] + assert_equal('String#*', method.full_name) + assert_equal(160.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(160.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(160.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 9 + method = methods[9] + assert_equal('String#initialize', method.full_name) + assert_equal(160.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(160.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(160.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 11 + method = methods[11] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + + # Method 12 + method = methods[12] + assert_equal('Array#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + end + else + def test_memory + result = RubyProf::Profile.profile(measure_mode: RubyProf::MEMORY) do + allocator = Allocator.new + allocator.run + end + + thread = result.threads.first + + assert_in_delta(1640, thread.total_time, 1) + methods = result.threads.first.methods.sort.reverse + assert_equal(17, methods.length) + + # Method 0 + method = methods[0] + assert_equal('MeasureMemoryTest#test_memory', method.full_name) + assert_in_delta(1640, method.total_time, 1) + + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_in_delta(1640, method.children_time, 1) + assert_equal(0, method.call_trees.callers.length) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#run', call_tree.target.full_name) + assert_equal(1600.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(1600.0, call_tree.children_time) + + # Method 1 + method = methods[1] + assert_equal('Allocator#run',method.full_name) + assert_equal(1600.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(1600.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(1600.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(1600.0, call_tree.children_time) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Allocator#make_arrays', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Allocator#make_hashes', call_tree.target.full_name) + assert_equal(800.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(800.0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('Allocator#make_strings', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(360.0, call_tree.children_time) + + # Method 2 + method = methods[2] + assert_equal('Class#new', method.full_name) + assert_equal(840.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(840.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('MeasureMemoryTest#test_memory', call_tree.parent.target.full_name) + assert_equal(40.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callers[1] + assert_equal('Allocator#make_hashes', call_tree.parent.target.full_name) + assert_equal(800.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(800.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('BasicObject#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Hash#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('Allocator#make_hashes', method.full_name) + assert_equal(800.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(800.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(800.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(800.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Class#new', call_tree.target.full_name) + assert_equal(800.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(800.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 4 + method = methods[4] + assert_equal('Allocator#make_strings', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(40.0, method.self_time) + assert_equal(360.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(360.0, call_tree.children_time) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('String#*', call_tree.target.full_name) + assert_equal(160.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(160.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('#new', call_tree.target.full_name) + assert_equal(200.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(40.0, call_tree.self_time) + assert_equal(160.0, call_tree.children_time) + + # Method 5 + method = methods[5] + assert_equal('Allocator#make_arrays', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#run', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + # Method 6 + method = methods[6] + assert_equal('Integer#times', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(400.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_arrays', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(400.0, call_tree.children_time) + + assert_equal(4, method.call_trees.callees.length) + + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#block_given?', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Integer#<', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('#new', call_tree.target.full_name) + assert_equal(400, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(400, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + call_tree = method.call_trees.callees[3] + assert_equal('Integer#succ', call_tree.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 7 + method = methods[7] + assert_equal('#new', method.full_name) + assert_equal(400.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(400.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(400.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(400.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Array#initialize', call_tree.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + # Method 8 + method = methods[8] + assert_equal('#new', method.full_name) + assert_equal(200, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(40, method.self_time) + assert_equal(160, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(200, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(40, call_tree.self_time) + assert_equal(160, call_tree.children_time) + + assert_equal(1, method.call_trees.callees.length) + + call_tree = method.call_trees.callees[0] + assert_equal('String#initialize', call_tree.target.full_name) + assert_equal(160, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(160, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + # Method 9 + method = methods[9] + assert_equal('String#*', method.full_name) + assert_equal(160, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(160, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Allocator#make_strings', call_tree.parent.target.full_name) + assert_equal(160, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(160, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 10 + method = methods[10] + assert_equal('String#initialize', method.full_name) + assert_equal(160, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(160, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('#new', call_tree.parent.target.full_name) + assert_equal(160, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(160, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 11 + method = methods[11] + assert_equal('BasicObject#initialize', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 12 + method = methods[12] + assert_equal('Kernel#block_given?', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 13 + method = methods[13] + assert_equal('Integer#succ', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 14 + method = methods[14] + assert_equal('Integer#<', method.full_name) + assert_equal(0, method.total_time) + assert_equal(0, method.wait_time) + assert_equal(0, method.self_time) + assert_equal(0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + assert_equal(0, call_tree.total_time) + assert_equal(0, call_tree.wait_time) + assert_equal(0, call_tree.self_time) + assert_equal(0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 15 + method = methods[15] + assert_equal('Hash#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Class#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0, method.call_trees.callees.length) + + # Method 16 + method = methods[16] + assert_equal('Array#initialize', method.full_name) + assert_equal(0.0, method.total_time) + assert_equal(0.0, method.wait_time) + assert_equal(0.0, method.self_time) + assert_equal(0.0, method.children_time) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('#new', call_tree.parent.target.full_name) + assert_equal(0.0, call_tree.total_time) + assert_equal(0.0, call_tree.wait_time) + assert_equal(0.0, call_tree.self_time) + assert_equal(0.0, call_tree.children_time) + + assert_equal(0.0, method.call_trees.callees.length) + end + end +end diff --git a/test/measure_wall_time_test.rb b/test/measure_wall_time_test.rb index 67b24b12..567a9dd5 100644 --- a/test/measure_wall_time_test.rb +++ b/test/measure_wall_time_test.rb @@ -1,421 +1,569 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) -require_relative './measure_times' - -class MeasureWallTimeTest < TestCase - def setup - # OSX on github actions are very slow so double the deltas to avoid test failures - @delta_multiplier = self.osx? && ENV["GITHUB_ACTIONS"] ? 4 : 1 - end - - def test_class_methods - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - RubyProf::C1.sleep_wait - end - - thread = result.threads.first - assert_in_delta(0.1, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(3, methods.length) - - # Check the names - assert_equal('MeasureWallTimeTest#test_class_methods', methods[0].full_name) - assert_equal('#sleep_wait', methods[1].full_name) - assert_equal('Kernel#sleep', methods[2].full_name) - - # Check times - assert_in_delta(0.1, methods[0].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[0].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[0].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0.1, methods[1].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[1].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0.1, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.1, methods[2].self_time, 0.03 * @delta_multiplier) - end - - def test_class_methods_threaded - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - background_thread = Thread.new do - RubyProf::C1.sleep_wait - end - background_thread.join - end - - assert_equal(2, result.threads.count) - - thread = result.threads.first - assert_in_delta(0.1, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(4, methods.length) - - # Check times - assert_equal('MeasureWallTimeTest#test_class_methods_threaded', methods[0].full_name) - assert_in_delta(0.1, methods[0].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.1, methods[0].children_time, 0.03 * @delta_multiplier) - - assert_equal('Thread#join', methods[1].full_name) - assert_in_delta(0.1, methods[1].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.1, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].children_time, 0.03 * @delta_multiplier) - - assert_equal('#new', methods[2].full_name) - assert_in_delta(0.0, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) - - assert_equal('Thread#initialize', methods[3].full_name) - assert_in_delta(0.0, methods[3].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].children_time, 0.03 * @delta_multiplier) - - thread = result.threads.last - assert_in_delta(0.1, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(4, methods.length) - - methods = result.threads.last.methods.sort.reverse - assert_equal(3, methods.length) - - # Check times - assert_equal('MeasureWallTimeTest#test_class_methods_threaded', methods[0].full_name) - assert_in_delta(0.1, methods[0].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.1, methods[0].children_time, 0.03 * @delta_multiplier) - - assert_equal('#sleep_wait', methods[1].full_name) - assert_in_delta(0.1, methods[1].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.1, methods[1].children_time, 0.03 * @delta_multiplier) - - assert_equal('Kernel#sleep', methods[2].full_name) - assert_in_delta(0.1, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.1, methods[2].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) - end - - def test_instance_methods - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - RubyProf::C1.new.sleep_wait - end - - thread = result.threads.first - assert_in_delta(0.2, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(5, methods.length) - names = methods.map(&:full_name) - - # order can differ - assert(names.include?("BasicObject#initialize")) - - # Check times - method = methods[0] - assert_equal('MeasureWallTimeTest#test_instance_methods', method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) - - method = methods[1] - assert_equal('RubyProf::C1#sleep_wait', method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) - - method = methods[2] - assert_equal('Kernel#sleep', method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, method.self_time, 0.03 * @delta_multiplier) - - method = methods[3] - assert_equal('Class#new', method.full_name) - assert_in_delta(0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) - - method = methods[4] - assert_equal('BasicObject#initialize', method.full_name) - assert_in_delta(0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) - end - - def test_instance_methods_block - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - 1.times { RubyProf::C1.new.sleep_wait } - end - - methods = result.threads.first.methods.sort.reverse - assert_equal(6, methods.length) - - # Check times - method = methods[0] - assert_equal("MeasureWallTimeTest#test_instance_methods_block", method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) - - method = methods[1] - assert_equal("Integer#times", method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) - - method = methods[2] - assert_equal("RubyProf::C1#sleep_wait", method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) - - method = methods[3] - assert_equal("Kernel#sleep", method.full_name) - assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - - method = methods[4] - assert_equal("Class#new", method.full_name) - assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - - method = methods[5] - assert_equal("BasicObject#initialize", method.full_name) - assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - end - - def test_instance_methods_threaded - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - background_thread = Thread.new do - RubyProf::C1.new.sleep_wait - end - background_thread.join - end - - assert_equal(2, result.threads.count) - - thread = result.threads.first - assert_in_delta(0.2, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(4, methods.length) - - # Check times - assert_equal('MeasureWallTimeTest#test_instance_methods_threaded', methods[0].full_name) - assert_in_delta(0.2, methods[0].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, methods[0].children_time, 0.03 * @delta_multiplier) - - assert_equal('Thread#join', methods[1].full_name) - assert_in_delta(0.2, methods[1].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].children_time, 0.03 * @delta_multiplier) - - assert_equal('#new', methods[2].full_name) - assert_in_delta(0.0, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) - - assert_equal('Thread#initialize', methods[3].full_name) - assert_in_delta(0.0, methods[3].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].children_time, 0.03 * @delta_multiplier) - - thread = result.threads.last - assert_in_delta(0.2, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(4, methods.length) - - methods = result.threads.last.methods.sort.reverse - assert_equal(5, methods.length) - - # Check times - assert_equal('MeasureWallTimeTest#test_instance_methods_threaded', methods[0].full_name) - assert_in_delta(0.2, methods[0].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, methods[0].children_time, 0.03 * @delta_multiplier) - - assert_equal('RubyProf::C1#sleep_wait', methods[1].full_name) - assert_in_delta(0.2, methods[1].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, methods[1].children_time, 0.03 * @delta_multiplier) - - assert_equal('Kernel#sleep', methods[2].full_name) - assert_in_delta(0.2, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.2, methods[2].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) - - assert_equal('Class#new', methods[3].full_name) - assert_in_delta(0.0, methods[3].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[3].children_time, 0.03 * @delta_multiplier) - - assert_equal('BasicObject#initialize', methods[4].full_name) - assert_in_delta(0.0, methods[4].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[4].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[4].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[4].children_time, 0.03 * @delta_multiplier) - end - - def test_module_methods - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - RubyProf::C2.sleep_wait - end - - thread = result.threads.first - assert_in_delta(0.3, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(3, methods.length) - - assert_equal('MeasureWallTimeTest#test_module_methods', methods[0].full_name) - assert_equal('RubyProf::M1#sleep_wait', 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.03 * @delta_multiplier) - assert_in_delta(0, methods[0].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0.3, methods[1].total_time, 0.1) - assert_in_delta(0, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[1].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0.3, methods[2].total_time, 0.1) - assert_in_delta(0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.3, methods[2].self_time, 0.1) - end - - def test_module_instance_methods - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - RubyProf::C2.new.sleep_wait - end - - thread = result.threads.first - assert_in_delta(0.3, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(5, methods.length) - names = methods.map(&:full_name) - assert_equal('MeasureWallTimeTest#test_module_instance_methods', names[0]) - assert_equal('RubyProf::M1#sleep_wait', names[1]) - assert_equal('Kernel#sleep', names[2]) - assert_equal('Class#new', names[3]) - - # order can differ - assert(names.include?("BasicObject#initialize")) - - # 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.03 * @delta_multiplier) - assert_in_delta(0, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[1].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0.3, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.3, methods[2].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0, methods[3].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[3].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[3].self_time, 0.03 * @delta_multiplier) - - assert_in_delta(0, methods[4].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[4].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0, methods[4].self_time, 0.03 * @delta_multiplier) - end - - def test_singleton_methods - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - RubyProf::C3.instance.sleep_wait - end - - thread = result.threads.first - assert_in_delta(0.3, thread.total_time, 0.03 * @delta_multiplier) - - methods = result.threads.first.methods.sort.reverse - assert_equal(7, methods.length) - - assert_equal('MeasureWallTimeTest#test_singleton_methods', methods[0].full_name) - assert_in_delta(0.3, methods[0].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.3, methods[0].children_time, 0.03 * @delta_multiplier) - - assert_equal('RubyProf::C3#sleep_wait', methods[1].full_name) - assert_in_delta(0.3, methods[1].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.3, methods[1].children_time, 0.03 * @delta_multiplier) - - assert_equal('Kernel#sleep', methods[2].full_name) - assert_in_delta(0.3, methods[2].total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.3, methods[2].self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) - - method = methods.detect {|a_method| a_method.full_name == 'Singleton::SingletonClassMethods#instance'} - assert_equal('Singleton::SingletonClassMethods#instance', method.full_name) - assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - - method = methods.detect {|a_method| a_method.full_name == 'Thread::Mutex#synchronize'} - assert_equal('Thread::Mutex#synchronize', method.full_name) - assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - - method = methods.detect {|a_method| a_method.full_name == 'Class#new'} - assert_equal('Class#new', method.full_name) - assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - - method = methods.detect {|a_method| a_method.full_name == 'BasicObject#initialize'} - assert_equal('BasicObject#initialize', method.full_name) - assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) - assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) - end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) +require_relative './measure_times' + +class MeasureWallTimeTest < TestCase + def setup + # OSX on github actions are very slow so double the deltas to avoid test failures + @delta_multiplier = self.osx? && ENV["GITHUB_ACTIONS"] ? 4 : 1 + end + + def test_class_methods + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + RubyProf::C1.sleep_wait + end + + thread = result.threads.first + assert_in_delta(0.1, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(3, methods.length) + + # Check the names + assert_equal('MeasureWallTimeTest#test_class_methods', methods[0].full_name) + assert_equal('#sleep_wait', methods[1].full_name) + assert_equal('Kernel#sleep', methods[2].full_name) + + # Check times + assert_in_delta(0.1, methods[0].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[0].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[0].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0.1, methods[1].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[1].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0.1, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.1, methods[2].self_time, 0.03 * @delta_multiplier) + end + + def test_class_methods_threaded + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + background_thread = Thread.new do + RubyProf::C1.sleep_wait + end + background_thread.join + end + + assert_equal(2, result.threads.count) + + thread = result.threads.first + assert_in_delta(0.1, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(4, methods.length) + + # Check times + assert_equal('MeasureWallTimeTest#test_class_methods_threaded', methods[0].full_name) + assert_in_delta(0.1, methods[0].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.1, methods[0].children_time, 0.03 * @delta_multiplier) + + assert_equal('Thread#join', methods[1].full_name) + assert_in_delta(0.1, methods[1].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.1, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].children_time, 0.03 * @delta_multiplier) + + assert_equal('#new', methods[2].full_name) + assert_in_delta(0.0, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) + + assert_equal('Thread#initialize', methods[3].full_name) + assert_in_delta(0.0, methods[3].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].children_time, 0.03 * @delta_multiplier) + + thread = result.threads.last + assert_in_delta(0.1, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(4, methods.length) + + methods = result.threads.last.methods.sort.reverse + assert_equal(3, methods.length) + + # Check times + assert_equal('MeasureWallTimeTest#test_class_methods_threaded', methods[0].full_name) + assert_in_delta(0.1, methods[0].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.1, methods[0].children_time, 0.03 * @delta_multiplier) + + assert_equal('#sleep_wait', methods[1].full_name) + assert_in_delta(0.1, methods[1].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.1, methods[1].children_time, 0.03 * @delta_multiplier) + + assert_equal('Kernel#sleep', methods[2].full_name) + assert_in_delta(0.1, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.1, methods[2].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) + end + + def test_instance_methods + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + RubyProf::C1.new.sleep_wait + end + + thread = result.threads.first + assert_in_delta(0.2, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(5, methods.length) + names = methods.map(&:full_name) + + # order can differ + assert(names.include?("BasicObject#initialize")) + + # Check times + method = methods[0] + assert_equal('MeasureWallTimeTest#test_instance_methods', method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) + + method = methods[1] + assert_equal('RubyProf::C1#sleep_wait', method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) + + method = methods[2] + assert_equal('Kernel#sleep', method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.self_time, 0.03 * @delta_multiplier) + + method = methods[3] + assert_equal('Class#new', method.full_name) + assert_in_delta(0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) + + method = methods[4] + assert_equal('BasicObject#initialize', method.full_name) + assert_in_delta(0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, method.self_time, 0.03 * @delta_multiplier) + end + + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2') + def test_instance_methods_block + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + 1.times { RubyProf::C1.new.sleep_wait } + end + + methods = result.threads.first.methods.sort.reverse + assert_equal(6, methods.length) + + # Check times + method = methods[0] + assert_equal("MeasureWallTimeTest#test_instance_methods_block", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[1] + assert_equal("Integer#times", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[2] + assert_equal("RubyProf::C1#sleep_wait", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[3] + assert_equal("Kernel#sleep", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[4] + assert_equal("Class#new", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[5] + assert_equal("BasicObject#initialize", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + end + elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3') + def test_instance_methods_block + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + 1.times { RubyProf::C1.new.sleep_wait } + end + + methods = result.threads.first.methods.sort.reverse + assert_equal(9, methods.length) + + # Check times + method = methods[0] + assert_equal("MeasureWallTimeTest#test_instance_methods_block", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[1] + assert_equal("Integer#times", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[2] + assert_equal("RubyProf::C1#sleep_wait", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[3] + assert_equal("Kernel#sleep", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[4] + assert_equal("Integer#succ", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[5] + assert_equal("Class#new", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[6] + assert_equal("Integer#<", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[7] + assert_equal("Kernel#block_given?", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[8] + assert_equal("BasicObject#initialize", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + end + else + def test_instance_methods_block + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + 1.times { RubyProf::C1.new.sleep_wait } + end + + methods = result.threads.first.methods.sort.reverse + assert_equal(9, methods.length) + + # Check times + method = methods[0] + assert_equal("MeasureWallTimeTest#test_instance_methods_block", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[1] + assert_equal("Integer#times", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[2] + assert_equal("RubyProf::C1#sleep_wait", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.children_time, 0.03 * @delta_multiplier) + + method = methods[3] + assert_equal("Kernel#sleep", method.full_name) + assert_in_delta(0.2, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[4] + assert_equal("Integer#succ", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[5] + assert_equal("Class#new", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[6] + assert_equal("Integer#<", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[7] + assert_equal("Kernel#block_given?", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods[8] + assert_equal("BasicObject#initialize", method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + end + end + + def test_instance_methods_threaded + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + background_thread = Thread.new do + RubyProf::C1.new.sleep_wait + end + background_thread.join + end + + assert_equal(2, result.threads.count) + + thread = result.threads.first + assert_in_delta(0.2, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(4, methods.length) + + # Check times + assert_equal('MeasureWallTimeTest#test_instance_methods_threaded', methods[0].full_name) + assert_in_delta(0.2, methods[0].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, methods[0].children_time, 0.03 * @delta_multiplier) + + assert_equal('Thread#join', methods[1].full_name) + assert_in_delta(0.2, methods[1].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].children_time, 0.03 * @delta_multiplier) + + assert_equal('#new', methods[2].full_name) + assert_in_delta(0.0, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) + + assert_equal('Thread#initialize', methods[3].full_name) + assert_in_delta(0.0, methods[3].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].children_time, 0.03 * @delta_multiplier) + + thread = result.threads.last + assert_in_delta(0.2, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(4, methods.length) + + methods = result.threads.last.methods.sort.reverse + assert_equal(5, methods.length) + + # Check times + assert_equal('MeasureWallTimeTest#test_instance_methods_threaded', methods[0].full_name) + assert_in_delta(0.2, methods[0].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, methods[0].children_time, 0.03 * @delta_multiplier) + + assert_equal('RubyProf::C1#sleep_wait', methods[1].full_name) + assert_in_delta(0.2, methods[1].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, methods[1].children_time, 0.03 * @delta_multiplier) + + assert_equal('Kernel#sleep', methods[2].full_name) + assert_in_delta(0.2, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.2, methods[2].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) + + assert_equal('Class#new', methods[3].full_name) + assert_in_delta(0.0, methods[3].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[3].children_time, 0.03 * @delta_multiplier) + + assert_equal('BasicObject#initialize', methods[4].full_name) + assert_in_delta(0.0, methods[4].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[4].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[4].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[4].children_time, 0.03 * @delta_multiplier) + end + + def test_module_methods + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + RubyProf::C2.sleep_wait + end + + thread = result.threads.first + assert_in_delta(0.3, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(3, methods.length) + + assert_equal('MeasureWallTimeTest#test_module_methods', methods[0].full_name) + assert_equal('RubyProf::M1#sleep_wait', 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.03 * @delta_multiplier) + assert_in_delta(0, methods[0].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0.3, methods[1].total_time, 0.1) + assert_in_delta(0, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[1].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0.3, methods[2].total_time, 0.1) + assert_in_delta(0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.3, methods[2].self_time, 0.1) + end + + def test_module_instance_methods + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + RubyProf::C2.new.sleep_wait + end + + thread = result.threads.first + assert_in_delta(0.3, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(5, methods.length) + names = methods.map(&:full_name) + assert_equal('MeasureWallTimeTest#test_module_instance_methods', names[0]) + assert_equal('RubyProf::M1#sleep_wait', names[1]) + assert_equal('Kernel#sleep', names[2]) + assert_equal('Class#new', names[3]) + + # order can differ + assert(names.include?("BasicObject#initialize")) + + # 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.03 * @delta_multiplier) + assert_in_delta(0, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[1].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0.3, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.3, methods[2].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0, methods[3].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[3].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[3].self_time, 0.03 * @delta_multiplier) + + assert_in_delta(0, methods[4].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[4].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0, methods[4].self_time, 0.03 * @delta_multiplier) + end + + def test_singleton_methods + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + RubyProf::C3.instance.sleep_wait + end + + thread = result.threads.first + assert_in_delta(0.3, thread.total_time, 0.03 * @delta_multiplier) + + methods = result.threads.first.methods.sort.reverse + assert_equal(7, methods.length) + + assert_equal('MeasureWallTimeTest#test_singleton_methods', methods[0].full_name) + assert_in_delta(0.3, methods[0].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[0].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.3, methods[0].children_time, 0.03 * @delta_multiplier) + + assert_equal('RubyProf::C3#sleep_wait', methods[1].full_name) + assert_in_delta(0.3, methods[1].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[1].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.3, methods[1].children_time, 0.03 * @delta_multiplier) + + assert_equal('Kernel#sleep', methods[2].full_name) + assert_in_delta(0.3, methods[2].total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.3, methods[2].self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, methods[2].children_time, 0.03 * @delta_multiplier) + + method = methods.detect {|a_method| a_method.full_name == 'Singleton::SingletonClassMethods#instance'} + assert_equal('Singleton::SingletonClassMethods#instance', method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods.detect {|a_method| a_method.full_name == 'Thread::Mutex#synchronize'} + assert_equal('Thread::Mutex#synchronize', method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods.detect {|a_method| a_method.full_name == 'Class#new'} + assert_equal('Class#new', method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + + method = methods.detect {|a_method| a_method.full_name == 'BasicObject#initialize'} + assert_equal('BasicObject#initialize', method.full_name) + assert_in_delta(0.0, method.total_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.wait_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.self_time, 0.03 * @delta_multiplier) + assert_in_delta(0.0, method.children_time, 0.03 * @delta_multiplier) + end end \ No newline at end of file diff --git a/test/method_info_test.rb b/test/method_info_test.rb index da6f9974..8202486e 100644 --- a/test/method_info_test.rb +++ b/test/method_info_test.rb @@ -1,95 +1,95 @@ -# frozen_string_literal: true - -require File.expand_path('../test_helper', __FILE__) -require 'base64' - -class MethodInfoTest < Minitest::Test - def test_initialize - method_info = RubyProf::MethodInfo.new(Base64, :encode64) - assert_equal("Base64", method_info.klass_name) - assert_equal(:encode64, method_info.method_name) - assert_equal("Base64#encode64", method_info.full_name) - assert_equal(0, method_info.klass_flags) - assert_match(/base64\.rb/, method_info.source_file) - assert_kind_of(Integer, method_info.line) - refute(method_info.recursive?) - - assert_kind_of(RubyProf::Measurement, method_info.measurement) - assert_kind_of(RubyProf::CallTrees, method_info.call_trees) - assert_empty(method_info.allocations) - end - - def test_initialize_nil_klass - error = assert_raises(NoMethodError) do - RubyProf::MethodInfo.new(nil, nil) - end - assert_match(/undefined method `instance_method' for nil:NilClass/, error.message) - end - - def test_initialize_nil_method_name - error = assert_raises(TypeError) do - RubyProf::MethodInfo.new(Base64, nil) - end - assert_equal("nil is not a symbol nor a string", error.to_s) - end - - def test_initialize_unknown_location - method_info = RubyProf::MethodInfo.new(Array, :size) - assert_equal('Array', method_info.klass_name) - assert_equal(:size, method_info.method_name) - assert_nil(method_info.source_file) - assert_equal(0, method_info.line) - end - - def test_measurement - method_info = RubyProf::MethodInfo.new(Base64, :encode64) - assert_equal(0, method_info.total_time) - assert_equal(0, method_info.self_time) - assert_equal(0, method_info.wait_time) - assert_equal(0, method_info.children_time) - assert_equal(0, method_info.called) - end - - def test_compare - method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) - assert_equal(0, method_info_1 <=> method_info_2) - - method_info_1 = RubyProf::MethodInfo.new(Base64, :decode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) - assert_equal(-1, method_info_1 <=> method_info_2) - - method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :decode64) - assert_equal(1, method_info_1 <=> method_info_2) - end - - def test_eql? - method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) - assert(method_info_1.eql?(method_info_2)) - end - - def test_equal? - method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) - refute(method_info_1.equal?(method_info_2)) - end - - def test_equality - method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) - assert(method_info_1 == method_info_2) - end - - def test_hash - method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) - method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) - assert_equal(method_info_1.hash, method_info_2.hash) - end - - def test_to_s - method_info = RubyProf::MethodInfo.new(Base64, :encode64) - assert_equal("Base64#encode64 (c: 0, tt: 0.0, st: 0.0, wt: 0.0, ct: 0.0)", method_info.to_s) - end -end +# frozen_string_literal: true + +require File.expand_path('../test_helper', __FILE__) +require 'base64' + +class MethodInfoTest < Minitest::Test + def test_initialize + method_info = RubyProf::MethodInfo.new(Base64, :encode64) + assert_equal("Base64", method_info.klass_name) + assert_equal(:encode64, method_info.method_name) + assert_equal("Base64#encode64", method_info.full_name) + assert_equal(0, method_info.klass_flags) + assert_match(/base64\.rb/, method_info.source_file) + assert_kind_of(Integer, method_info.line) + refute(method_info.recursive?) + + assert_kind_of(RubyProf::Measurement, method_info.measurement) + assert_kind_of(RubyProf::CallTrees, method_info.call_trees) + assert_empty(method_info.allocations) + end + + def test_initialize_nil_klass + error = assert_raises(NoMethodError) do + RubyProf::MethodInfo.new(nil, nil) + end + assert_match(/undefined method `instance_method' for nil/, error.message) + end + + def test_initialize_nil_method_name + error = assert_raises(TypeError) do + RubyProf::MethodInfo.new(Base64, nil) + end + assert_equal("nil is not a symbol nor a string", error.to_s) + end + + def test_initialize_unknown_location + method_info = RubyProf::MethodInfo.new(Array, :size) + assert_equal('Array', method_info.klass_name) + assert_equal(:size, method_info.method_name) + assert_nil(method_info.source_file) + assert_equal(0, method_info.line) + end + + def test_measurement + method_info = RubyProf::MethodInfo.new(Base64, :encode64) + assert_equal(0, method_info.total_time) + assert_equal(0, method_info.self_time) + assert_equal(0, method_info.wait_time) + assert_equal(0, method_info.children_time) + assert_equal(0, method_info.called) + end + + def test_compare + method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) + assert_equal(0, method_info_1 <=> method_info_2) + + method_info_1 = RubyProf::MethodInfo.new(Base64, :decode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) + assert_equal(-1, method_info_1 <=> method_info_2) + + method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :decode64) + assert_equal(1, method_info_1 <=> method_info_2) + end + + def test_eql? + method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) + assert(method_info_1.eql?(method_info_2)) + end + + def test_equal? + method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) + refute(method_info_1.equal?(method_info_2)) + end + + def test_equality + method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) + assert(method_info_1 == method_info_2) + end + + def test_hash + method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64) + method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64) + assert_equal(method_info_1.hash, method_info_2.hash) + end + + def test_to_s + method_info = RubyProf::MethodInfo.new(Base64, :encode64) + assert_equal("Base64#encode64 (c: 0, tt: 0.0, st: 0.0, wt: 0.0, ct: 0.0)", method_info.to_s) + end +end diff --git a/test/recursive_test.rb b/test/recursive_test.rb index 3aa0a1f9..e1461f91 100644 --- a/test/recursive_test.rb +++ b/test/recursive_test.rb @@ -1,425 +1,622 @@ -#!/usr/bin/env ruby -# encoding: UTF-8 - -require File.expand_path('../test_helper', __FILE__) - -module SimpleRecursion - # Simple recursive test - def simple(n) - sleep(1) - return if n == 0 - simple(n-1) - end - - # More complicated recursive test - def render_partial(i) - sleep(1) - case i - when 0 - render_partial(10) - when 1 - 2.times do |j| - render_partial(j + 10) - end - end - end - - def render - 2.times do |i| - render_partial(i) - end - end -end - -# -- Tests ---- -class RecursiveTest < TestCase - include SimpleRecursion - - def test_simple - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - simple(1) - end - - methods = result.threads.first.methods.sort.reverse - - if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1') - assert_equal(3, methods.length) - - # Method 0: RecursiveTest#test_simple - method = methods[0] - assert_equal('RecursiveTest#test_simple', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - assert_in_delta(2, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.01) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(2, method.children_time, 0.1) - - assert_equal(0, method.call_trees.callers.length) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('SimpleRecursion#simple', call_tree.target.full_name) - - # Method 1: SimpleRecursion#simple - method = methods[1] - assert_equal('SimpleRecursion#simple', method.full_name) - assert_equal(2, method.called) - assert(method.recursive?) - assert_in_delta(2, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.1) - assert_in_delta(2, method.children_time, 0.1) - - assert_equal(2, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name) - - call_tree = method.call_trees.callers[1] - assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Kernel#sleep', call_tree.target.full_name) - - call_tree = method.call_trees.callees[1] - assert_equal('SimpleRecursion#simple', call_tree.target.full_name) - - # Method 2: Kernel#sleep - method = methods[2] - assert_equal('Kernel#sleep', method.full_name) - assert_equal(2, method.called) - refute(method.recursive?) - - assert_in_delta(2, method.total_time, 0.1) - assert_in_delta(2, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.1) - assert_in_delta(0, method.children_time, 0.1) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) - assert_equal(0, method.call_trees.callees.length) - - assert_equal(0, method.call_trees.callees.length) - else - assert_equal(5, methods.length) - - # Method 0: RecursiveTest#test_simple - method = methods[0] - assert_equal('RecursiveTest#test_simple', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - assert_in_delta(2, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.01) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(2, method.children_time, 0.1) - - assert_equal(0, method.call_trees.callers.length) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('SimpleRecursion#simple', call_tree.target.full_name) - - # Method 1: SimpleRecursion#simple - method = methods[1] - assert_equal('SimpleRecursion#simple', method.full_name) - assert_equal(2, method.called) - assert(method.recursive?) - assert_in_delta(2, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.1) - assert_in_delta(2, method.children_time, 0.1) - - assert_equal(2, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name) - - call_tree = method.call_trees.callers[1] - assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) - - assert_equal(4, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Kernel#sleep', call_tree.target.full_name) - - call_tree = method.call_trees.callees[1] - assert_equal('Integer#==', call_tree.target.full_name) - - call_tree = method.call_trees.callees[2] - assert_equal('Integer#-', call_tree.target.full_name) - - call_tree = method.call_trees.callees[3] - assert_equal('SimpleRecursion#simple', call_tree.target.full_name) - - # Method 2: Kernel#sleep - method = methods[2] - assert_equal('Kernel#sleep', method.full_name) - assert_equal(2, method.called) - refute(method.recursive?) - - assert_in_delta(2, method.total_time, 0.1) - assert_in_delta(2, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.1) - assert_in_delta(0, method.children_time, 0.1) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) - assert_equal(0, method.call_trees.callees.length) - - assert_equal(0, method.call_trees.callees.length) - - # Method 3 - method = methods[3] - assert_equal('Integer#==', method.full_name) - assert_equal(2, method.called) - refute(method.recursive?) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) - - assert_equal(0, method.call_trees.callees.length) - - # Method 4 - method = methods[4] - assert_equal('Integer#-', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) - - assert_equal(0, method.call_trees.callees.length) - end - end - - def test_cycle - result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do - render - end - - methods = result.threads.first.methods.sort.reverse - - if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1') - assert_equal(5, methods.length) - - # Method 0 - method = methods[0] - assert_equal('RecursiveTest#test_cycle', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.01) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(0, method.call_trees.callers.length) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('SimpleRecursion#render', call_tree.target.full_name) - - # Method 1 - method = methods[1] - assert_equal('SimpleRecursion#render', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.01) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - - # Method 2 - method = methods[2] - assert_equal('Integer#times', method.full_name) - assert_equal(2, method.called) - assert(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.1) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(2, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name) - - call_tree = method.call_trees.callers[1] - assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) - - # Method 3 - method = methods[3] - assert_equal('SimpleRecursion#render_partial', method.full_name) - assert_equal(5, method.called) - assert(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(5, method.children_time, 0.05) - - assert_equal(2, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Integer#times', call_tree.parent.target.full_name) - - call_tree = method.call_trees.callers[1] - assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Kernel#sleep', call_tree.target.full_name) - - call_tree = method.call_trees.callees[1] - assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) - - call_tree = method.call_trees.callees[2] - assert_equal('Integer#times', call_tree.target.full_name) - - # Method 4 - method = methods[4] - assert_equal('Kernel#sleep', method.full_name) - assert_equal(5, method.called) - refute(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(5, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(0, method.children_time, 0.01) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) - - assert_equal(0, method.call_trees.callees.length) - else - assert_equal(6, methods.length) - - # Method 0 - method = methods[0] - assert_equal('RecursiveTest#test_cycle', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.01) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(0, method.call_trees.callers.length) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('SimpleRecursion#render', call_tree.target.full_name) - - # Method 1 - method = methods[1] - assert_equal('SimpleRecursion#render', method.full_name) - assert_equal(1, method.called) - refute(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.01) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name) - - assert_equal(1, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Integer#times', call_tree.target.full_name) - - # Method 2 - method = methods[2] - assert_equal('Integer#times', method.full_name) - assert_equal(2, method.called) - assert(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.1) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(2, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name) - - call_tree = method.call_trees.callers[1] - assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) - - assert_equal(2, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) - call_tree = method.call_trees.callees[1] - assert_equal('Integer#+', call_tree.target.full_name) - - # Method 3 - method = methods[3] - assert_equal('SimpleRecursion#render_partial', method.full_name) - assert_equal(5, method.called) - assert(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(5, method.children_time, 0.1) - - assert_equal(2, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Integer#times', call_tree.parent.target.full_name) - - call_tree = method.call_trees.callers[1] - assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) - - assert_equal(3, method.call_trees.callees.length) - call_tree = method.call_trees.callees[0] - assert_equal('Kernel#sleep', call_tree.target.full_name) - - call_tree = method.call_trees.callees[1] - assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) - - call_tree = method.call_trees.callees[2] - assert_equal('Integer#times', call_tree.target.full_name) - - # Method 4 - method = methods[4] - assert_equal('Kernel#sleep', method.full_name) - assert_equal(5, method.called) - refute(method.recursive?) - assert_in_delta(5, method.total_time, 0.1) - assert_in_delta(5, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(0, method.children_time, 0.01) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) - - assert_equal(0, method.call_trees.callees.length) - - # Method 5 - method = methods[5] - assert_equal('Integer#+', method.full_name) - assert_equal(2, method.called) - refute(method.recursive?) - assert_in_delta(0, method.total_time, 0.1) - assert_in_delta(0, method.self_time, 0.1) - assert_in_delta(0, method.wait_time, 0.01) - assert_in_delta(0, method.children_time, 0.01) - - assert_equal(1, method.call_trees.callers.length) - call_tree = method.call_trees.callers[0] - assert_equal('Integer#times', call_tree.parent.target.full_name) - - assert_equal(0, method.call_trees.callees.length) - end - end -end +#!/usr/bin/env ruby +# encoding: UTF-8 + +require File.expand_path('../test_helper', __FILE__) + +module SimpleRecursion + # Simple recursive test + def simple(n) + sleep(1) + return if n == 0 + simple(n-1) + end + + # More complicated recursive test + def render_partial(i) + sleep(1) + case i + when 0 + render_partial(10) + when 1 + 2.times do |j| + render_partial(j + 10) + end + end + end + + def render + 2.times do |i| + render_partial(i) + end + end +end + +# -- Tests ---- +class RecursiveTest < TestCase + include SimpleRecursion + + def test_simple + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + simple(1) + end + + methods = result.threads.first.methods.sort.reverse + + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1') + assert_equal(3, methods.length) + + # Method 0: RecursiveTest#test_simple + method = methods[0] + assert_equal('RecursiveTest#test_simple', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(2, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(2, method.children_time, 0.1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#simple', call_tree.target.full_name) + + # Method 1: SimpleRecursion#simple + method = methods[1] + assert_equal('SimpleRecursion#simple', method.full_name) + assert_equal(2, method.called) + assert(method.recursive?) + assert_in_delta(2, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(2, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#sleep', call_tree.target.full_name) + + call_tree = method.call_trees.callees[1] + assert_equal('SimpleRecursion#simple', call_tree.target.full_name) + + # Method 2: Kernel#sleep + method = methods[2] + assert_equal('Kernel#sleep', method.full_name) + assert_equal(2, method.called) + refute(method.recursive?) + + assert_in_delta(2, method.total_time, 0.1) + assert_in_delta(2, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(0, method.children_time, 0.1) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) + assert_equal(0, method.call_trees.callees.length) + + assert_equal(0, method.call_trees.callees.length) + else + assert_equal(5, methods.length) + + # Method 0: RecursiveTest#test_simple + method = methods[0] + assert_equal('RecursiveTest#test_simple', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(2, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(2, method.children_time, 0.1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#simple', call_tree.target.full_name) + + # Method 1: SimpleRecursion#simple + method = methods[1] + assert_equal('SimpleRecursion#simple', method.full_name) + assert_equal(2, method.called) + assert(method.recursive?) + assert_in_delta(2, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(2, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) + + assert_equal(4, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#sleep', call_tree.target.full_name) + + call_tree = method.call_trees.callees[1] + assert_equal('Integer#==', call_tree.target.full_name) + + call_tree = method.call_trees.callees[2] + assert_equal('Integer#-', call_tree.target.full_name) + + call_tree = method.call_trees.callees[3] + assert_equal('SimpleRecursion#simple', call_tree.target.full_name) + + # Method 2: Kernel#sleep + method = methods[2] + assert_equal('Kernel#sleep', method.full_name) + assert_equal(2, method.called) + refute(method.recursive?) + + assert_in_delta(2, method.total_time, 0.1) + assert_in_delta(2, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(0, method.children_time, 0.1) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) + assert_equal(0, method.call_trees.callees.length) + + assert_equal(0, method.call_trees.callees.length) + + # Method 3 + method = methods[3] + assert_equal('Integer#==', method.full_name) + assert_equal(2, method.called) + refute(method.recursive?) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + + # Method 4 + method = methods[4] + assert_equal('Integer#-', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + end + end + + def test_cycle + result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do + render + end + + methods = result.threads.first.methods.sort.reverse + + if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1') + assert_equal(5, methods.length) + + # Method 0 + method = methods[0] + assert_equal('RecursiveTest#test_cycle', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#render', call_tree.target.full_name) + + # Method 1 + method = methods[1] + assert_equal('SimpleRecursion#render', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + + # Method 2 + method = methods[2] + assert_equal('Integer#times', method.full_name) + assert_equal(2, method.called) + assert(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) + + # Method 3 + method = methods[3] + assert_equal('SimpleRecursion#render_partial', method.full_name) + assert_equal(5, method.called) + assert(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.05) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#sleep', call_tree.target.full_name) + + call_tree = method.call_trees.callees[1] + assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) + + call_tree = method.call_trees.callees[2] + assert_equal('Integer#times', call_tree.target.full_name) + + # Method 4 + method = methods[4] + assert_equal('Kernel#sleep', method.full_name) + assert_equal(5, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(5, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3') + assert_equal(6, methods.length) + + # Method 0 + method = methods[0] + assert_equal('RecursiveTest#test_cycle', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#render', call_tree.target.full_name) + + # Method 1 + method = methods[1] + assert_equal('SimpleRecursion#render', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + + # Method 2 + method = methods[2] + assert_equal('Integer#times', method.full_name) + assert_equal(2, method.called) + assert(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(2, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) + call_tree = method.call_trees.callees[1] + assert_equal('Integer#+', call_tree.target.full_name) + + # Method 3 + method = methods[3] + assert_equal('SimpleRecursion#render_partial', method.full_name) + assert_equal(5, method.called) + assert(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#sleep', call_tree.target.full_name) + + call_tree = method.call_trees.callees[1] + assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) + + call_tree = method.call_trees.callees[2] + assert_equal('Integer#times', call_tree.target.full_name) + + # Method 4 + method = methods[4] + assert_equal('Kernel#sleep', method.full_name) + assert_equal(5, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(5, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + + # Method 5 + method = methods[5] + assert_equal('Integer#+', method.full_name) + assert_equal(2, method.called) + refute(method.recursive?) + assert_in_delta(0, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + else + assert_equal(9, methods.length) + + # Method 0 + method = methods[0] + assert_equal('RecursiveTest#test_cycle', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(0, method.call_trees.callers.length) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('SimpleRecursion#render', call_tree.target.full_name) + + # Method 1 + method = methods[1] + assert_equal('SimpleRecursion#render', method.full_name) + assert_equal(1, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.01) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name) + + assert_equal(1, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Integer#times', call_tree.target.full_name) + + # Method 2 + method = methods[2] + assert_equal('Integer#times', method.full_name) + assert_equal(2, method.called) + assert(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.1) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(5, method.call_trees.callees.length) + + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#block_given?', call_tree.target.full_name) + assert_in_delta(0, call_tree.total_time) + assert_in_delta(0, call_tree.wait_time) + assert_in_delta(0, call_tree.self_time) + assert_in_delta(0, call_tree.children_time) + + call_tree = method.call_trees.callees[1] + assert_equal('Integer#<', call_tree.target.full_name) + assert_in_delta(0, call_tree.total_time) + assert_in_delta(0, call_tree.wait_time) + assert_in_delta(0, call_tree.self_time) + assert_in_delta(0, call_tree.children_time) + + call_tree = method.call_trees.callees[2] + assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) + assert_in_delta(7.0, call_tree.total_time, 0.1) + assert_in_delta(0, call_tree.wait_time) + assert_in_delta(0, call_tree.self_time) + assert_in_delta(7.0, call_tree.children_time, 0.1) + + call_tree = method.call_trees.callees[3] + assert_equal('Integer#succ', call_tree.target.full_name) + assert_in_delta(0, call_tree.total_time) + assert_in_delta(0, call_tree.wait_time) + assert_in_delta(0, call_tree.self_time) + assert_in_delta(0, call_tree.children_time) + + call_tree = method.call_trees.callees[4] + assert_equal('Integer#+', call_tree.target.full_name) + assert_in_delta(0, call_tree.total_time) + assert_in_delta(0, call_tree.wait_time) + assert_in_delta(0, call_tree.self_time) + assert_in_delta(0, call_tree.children_time) + + # Method 3 + method = methods[3] + assert_equal('SimpleRecursion#render_partial', method.full_name) + assert_equal(5, method.called) + assert(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(5, method.children_time, 0.1) + + assert_equal(2, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + call_tree = method.call_trees.callers[1] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(3, method.call_trees.callees.length) + call_tree = method.call_trees.callees[0] + assert_equal('Kernel#sleep', call_tree.target.full_name) + + call_tree = method.call_trees.callees[1] + assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name) + + call_tree = method.call_trees.callees[2] + assert_equal('Integer#times', call_tree.target.full_name) + + # Method 4 + method = methods[4] + assert_equal('Kernel#sleep', method.full_name) + assert_equal(5, method.called) + refute(method.recursive?) + assert_in_delta(5, method.total_time, 0.1) + assert_in_delta(5, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + + # Method 5 + method = methods[5] + assert_equal('Integer#succ', method.full_name) + assert_equal(4, method.called) + refute(method.recursive?) + assert_in_delta(0, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + + # Method 6 + method = methods[6] + assert_equal('Integer#<', method.full_name) + assert_equal(6, method.called) + refute(method.recursive?) + assert_in_delta(0, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + + # Method 7 + method = methods[7] + assert_equal('Integer#+', method.full_name) + assert_equal(2, method.called) + refute(method.recursive?) + assert_in_delta(0, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + + # Method 8 + method = methods[8] + assert_equal('Kernel#block_given?', method.full_name) + assert_equal(2, method.called) + refute(method.recursive?) + assert_in_delta(0, method.total_time, 0.1) + assert_in_delta(0, method.self_time, 0.1) + assert_in_delta(0, method.wait_time, 0.01) + assert_in_delta(0, method.children_time, 0.01) + + assert_equal(1, method.call_trees.callers.length) + call_tree = method.call_trees.callers[0] + assert_equal('Integer#times', call_tree.parent.target.full_name) + + assert_equal(0, method.call_trees.callees.length) + end + end +end