1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#!/usr/bin/env ruby
# encoding: UTF-8
require File.expand_path('../test_helper', __FILE__)
require 'stringio'
require 'fileutils'
require 'tmpdir'
require_relative 'prime'
# -- Tests ----
class PrintersTest < TestCase
def setup
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
RubyProf::measure_mode = RubyProf::WALL_TIME
@result = RubyProf.profile do
run_primes(1000, 5000)
end
end
def test_printers
output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new('')
printer = RubyProf::CallStackPrinter.new(@result)
printer.print(output)
printer = RubyProf::CallTreePrinter.new(@result)
printer.print()
printer = RubyProf::FlatPrinter.new(@result)
printer.print(output)
printer = RubyProf::GraphHtmlPrinter.new(@result)
printer.print(output)
printer = RubyProf::GraphPrinter.new(@result)
printer.print(output)
end
def test_print_to_files
output_dir = 'examples2'
if ENV['SAVE_NEW_PRINTER_EXAMPLES']
output_dir = 'examples'
end
FileUtils.mkdir_p output_dir
printer = RubyProf::DotPrinter.new(@result)
File.open("#{output_dir}/graph.dot", "w") {|f| printer.print(f)}
printer = RubyProf::CallStackPrinter.new(@result)
File.open("#{output_dir}/stack.html", "w") {|f| printer.print(f, :application => "primes")}
# printer = RubyProf::MultiPrinter.new(@result)
# printer.print(:path => "#{output_dir}", :profile => "multi", :application => "primes")
# for file in ['graph.dot', 'multi.flat.txt', 'multi.graph.html', "multi.callgrind.out.#{$$}", 'multi.stack.html', 'stack.html']
# existant_file = output_dir + '/' + file
# assert File.size(existant_file) > 0
# end
end
def test_refuses_io_objects
p = RubyProf::MultiPrinter.new(@result)
begin
p.print(STDOUT)
flunk "should have raised an ArgumentError"
rescue ArgumentError => e
assert_match(/IO/, e.to_s)
end
end
def test_refuses_non_hashes
p = RubyProf::MultiPrinter.new (@result)
begin
p.print([])
flunk "should have raised an ArgumentError"
rescue ArgumentError => e
assert_match(/hash/, e.to_s)
end
end
def test_flat_string
output = helper_test_flat_string(RubyProf::FlatPrinter)
assert_match(/prime.rb/, output)
end
def helper_test_flat_string(klass)
output = ''
printer = klass.new(@result)
printer.print(output)
assert_match(/Thread ID: -?\d+/i, output)
assert_match(/Fiber ID: -?\d+/i, output)
assert_match(/Total: \d+\.\d+/i, output)
assert_match(/Object#run_primes/i, output)
output
end
def test_graph_html_string
output = ''
printer = RubyProf::GraphHtmlPrinter.new(@result)
printer.print(output)
assert_match(/<!DOCTYPE html>/i, output)
assert_match( %r{<th>Total</th>}i, output)
assert_match(/Object#run_primes/i, output)
end
def test_graph_string
output = ''
printer = RubyProf::GraphPrinter.new(@result)
printer.print(output)
assert_match(/Thread ID: -?\d+/i, output)
assert_match(/Fiber ID: -?\d+/i, output)
assert_match(/Total Time: \d+\.\d+/i, output)
assert_match(/Object#run_primes/i, output)
end
def do_nothing
start = Time.now
while(Time.now == start)
end
end
def test_all_with_small_percentiles
result = RubyProf.profile do
sleep 2
do_nothing
end
# RubyProf::CallTreePrinter doesn't "do" a min_percent
# RubyProf::FlatPrinter only outputs if self time > percent...
for klass in [RubyProf::GraphPrinter, RubyProf::GraphHtmlPrinter]
printer = klass.new(result)
out = ''
printer.print(out, :min_percent => 0.00000001)
assert_match(/do_nothing/, out)
end
end
end
|