test/test_helper.rb in ruby-prof-0.18.0 vs test/test_helper.rb in ruby-prof-1.0.0
- old
+ new
@@ -1,9 +1,10 @@
# encoding: UTF-8
require "rubygems"
gem "minitest"
+require 'singleton'
# To make testing/debugging easier, test within this source tree versus an installed gem
dir = File.dirname(__FILE__)
root = File.expand_path(File.join(dir, '..'))
lib = File.expand_path(File.join(root, 'lib'))
@@ -12,256 +13,12 @@
$LOAD_PATH << lib
$LOAD_PATH << ext
require 'ruby-prof'
-# stub deprecation warnings
-module RubyProf
- module SuppressDeprecationWarnings
- def deprecation_warning(*args)
- super if ENV['SHOW_RUBY_PROF_DEPRECATION_WARNINGS'] == '1'
- end
- end
- extend SuppressDeprecationWarnings
-end
-
+# Disable minitest parallel tests. The problem is the thread switching will cahnge test results
+# (self vs wait time)
+ENV["N"] = "0"
require 'minitest/autorun'
class TestCase < Minitest::Test
- # I know this sucks, but ...
- def assert_nothing_raised(*)
- yield
- end
-
- def before_setup
- # make sure to exclude all threads except the one running the test
- # minitest allocates a thread pool and they would otherwise show
- # up in the profile data, breaking tests randomly
- RubyProf.exclude_threads = Thread.list.select{|t| t != Thread.current}
- end
-
- def after_teardown
- # reset exclude threads after testing
- RubyProf.exclude_threads = nil
- end
-end
-
-require File.expand_path('../prime', __FILE__)
-
-# Some classes used in measurement tests
-module RubyProf
- class C1
- def C1.hello
- sleep(0.1)
- end
-
- def hello
- sleep(0.2)
- end
- end
-
- module M1
- def hello
- sleep(0.3)
- end
- end
-
- class C2
- include M1
- extend M1
- end
-
- class C3
- def hello
- sleep(0.4)
- end
- end
-
- module M4
- def hello
- sleep(0.5)
- end
- end
-
- module M5
- include M4
- def goodbye
- hello
- end
- end
-
- class C6
- include M5
- def test
- goodbye
- end
- end
-
- class C7
- def self.busy_wait
- t = Time.now.to_f
- while Time.now.to_f - t < 0.1; end
- end
-
- def self.sleep_wait
- sleep 0.1
- end
-
- def busy_wait
- t = Time.now.to_f
- while Time.now.to_f - t < 0.2; end
- end
-
- def sleep_wait
- sleep 0.2
- end
- end
-
- module M7
- def busy_wait
- t = Time.now.to_f
- while Time.now.to_f - t < 0.3; end
- end
-
- def sleep_wait
- sleep 0.3
- end
- end
-
- class C8
- include M7
- extend M7
- end
-
- def self.ruby_major_version
- match = RUBY_VERSION.match(/(\d)\.(\d)/)
- return Integer(match[1])
- end
-
- def self.ruby_minor_version
- match = RUBY_VERSION.match(/(\d)\.(\d)/)
- return Integer(match[2])
- end
-
- def self.parent_object
- if ruby_major_version == 1 && ruby_minor_version == 8
- Object
- else
- BasicObject
- end
- end
-
- def self.ruby_2?
- ruby_major_version == 2
- end
-
- # store printer output in this directory
- def self.tmpdir
- path = File.expand_path('../../tmp', __FILE__)
- unless Dir.exist?(path)
- Dir.mkdir(path)
- end
- path
- end
-end
-
-module MemoryTestHelper
- def memory_test_helper
- result = RubyProf.profile {Array.new}
- total = result.threads.first.methods.inject(0) { |sum, m| sum + m.total_time }
- assert(total < 1_000_000, 'Total should not have subtract overflow error')
- total
- end
-end
-
-module PrinterTestHelper
- Metrics = Struct.new(:name, :total, :self_t, :wait, :child, :calls)
- class Metrics
- def pp
- "%s[total: %.2f, self: %.2f, wait: %.2f, child: %.2f, calls: %s]" %
- [name, total, self_t, wait, child, calls]
- end
- end
-
- Entry = Struct.new(:total_p, :self_p, :metrics, :parents, :children)
- class Entry
- def child(name)
- children.detect{|m| m.name == name}
- end
-
- def parent(name)
- parents.detect{|m| m.name == name}
- end
-
- def pp
- res = ""
- res << "NODE (total%%: %.2f, self%%: %.2f) %s\n" % [total_p, self_p, metrics.pp]
- res << " PARENTS:\n"
- parents.each {|m| res << " " + m.pp << "\n"}
- res << " CHILDREN:\n"
- children.each {|m| res << " " + m.pp << "\n"}
- res
- end
- end
-
- class MetricsArray < Array
- def metrics_for(name)
- detect {|e| e.metrics.name == name}
- end
-
- def pp(io = STDOUT)
- entries = map do |e|
- begin
- e.pp
- rescue
- puts $!.message + e.inspect
- ""
- end
- end
- io.puts entries.join("--------------------------------------------------\n")
- end
-
- def self.parse(str)
- res = new
- entry = nil
- relatives = []
- state = :preamble
-
- str.each_line do |l|
- line = l.chomp.strip
- if line =~ /-----/
- if state == :preamble
- state = :parsing_parents
- entry = Entry.new
- elsif state == :parsing_parents
- entry = Entry.new
- elsif state == :parsing_children
- entry.children = relatives
- res << entry
- entry = Entry.new
- relatives = []
- state = :parsing_parents
- end
- elsif line =~ /^\s*$/ || line =~ /indicates recursively called methods/
- next
- elsif state != :preamble
- elements = line.split(/\s+/)
- method = elements.pop
- numbers = elements[0..-2].map(&:to_f)
- metrics = Metrics.new(method, *numbers[-4..-1], elements[-1])
- if numbers.size == 6
- entry.metrics = metrics
- entry.total_p = numbers[0]
- entry.self_p = numbers[1]
- entry.parents = relatives
- entry.children = relatives = []
- state = :parsing_children
- res << entry
- else
- relatives << metrics
- end
- end
- end
- res
- end
- end
-end
+end
\ No newline at end of file