ruby-prof 1.7.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +118 -176
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/extconf.rb +23 -22
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.c +296 -296
  40. data/ext/ruby_prof/rp_call_trees.h +25 -28
  41. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  42. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  43. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  44. data/ext/ruby_prof/rp_measurement.c +0 -5
  45. data/ext/ruby_prof/rp_measurement.h +49 -53
  46. data/ext/ruby_prof/rp_method.c +554 -551
  47. data/ext/ruby_prof/rp_method.h +1 -4
  48. data/ext/ruby_prof/rp_profile.c +1 -1
  49. data/ext/ruby_prof/rp_profile.h +1 -5
  50. data/ext/ruby_prof/rp_stack.c +212 -212
  51. data/ext/ruby_prof/rp_stack.h +50 -53
  52. data/ext/ruby_prof/rp_thread.h +1 -4
  53. data/ext/ruby_prof/ruby_prof.c +50 -50
  54. data/ext/ruby_prof/ruby_prof.h +4 -6
  55. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  56. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  57. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  58. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  59. data/lib/ruby-prof/call_tree.rb +57 -57
  60. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  61. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  62. data/lib/ruby-prof/measurement.rb +17 -17
  63. data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
  64. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  65. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  66. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  67. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  68. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  69. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  70. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  71. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  72. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  73. data/lib/ruby-prof/profile.rb +13 -0
  74. data/lib/ruby-prof/rack.rb +114 -105
  75. data/lib/ruby-prof/task.rb +147 -147
  76. data/lib/ruby-prof/thread.rb +20 -20
  77. data/lib/ruby-prof/version.rb +3 -3
  78. data/lib/ruby-prof.rb +50 -52
  79. data/lib/unprof.rb +10 -10
  80. data/ruby-prof.gemspec +66 -65
  81. data/test/abstract_printer_test.rb +25 -27
  82. data/test/alias_test.rb +203 -117
  83. data/test/call_tree_builder.rb +126 -126
  84. data/test/call_tree_visitor_test.rb +27 -27
  85. data/test/call_trees_test.rb +66 -66
  86. data/test/duplicate_names_test.rb +32 -32
  87. data/test/dynamic_method_test.rb +50 -62
  88. data/test/enumerable_test.rb +23 -21
  89. data/test/exceptions_test.rb +24 -24
  90. data/test/exclude_methods_test.rb +363 -257
  91. data/test/exclude_threads_test.rb +48 -48
  92. data/test/fiber_test.rb +195 -195
  93. data/test/gc_test.rb +104 -102
  94. data/test/inverse_call_tree_test.rb +174 -174
  95. data/test/line_number_test.rb +563 -289
  96. data/test/marshal_test.rb +144 -145
  97. data/test/measure_allocations.rb +26 -26
  98. data/test/measure_allocations_test.rb +1511 -1081
  99. data/test/measure_process_time_test.rb +3286 -2477
  100. data/test/measure_times.rb +56 -56
  101. data/test/measure_wall_time_test.rb +773 -568
  102. data/test/measurement_test.rb +82 -82
  103. data/test/merge_test.rb +146 -146
  104. data/test/method_info_test.rb +100 -95
  105. data/test/multi_printer_test.rb +52 -66
  106. data/test/no_method_class_test.rb +15 -15
  107. data/test/pause_resume_test.rb +171 -171
  108. data/test/prime.rb +54 -54
  109. data/test/prime_script.rb +5 -5
  110. data/test/printer_call_stack_test.rb +28 -27
  111. data/test/printer_call_tree_test.rb +30 -30
  112. data/test/printer_flame_graph_test.rb +82 -0
  113. data/test/printer_flat_test.rb +99 -99
  114. data/test/printer_graph_html_test.rb +62 -59
  115. data/test/printer_graph_test.rb +42 -40
  116. data/test/printers_test.rb +162 -135
  117. data/test/printing_recursive_graph_test.rb +81 -81
  118. data/test/profile_test.rb +101 -101
  119. data/test/rack_test.rb +103 -93
  120. data/test/recursive_test.rb +796 -622
  121. data/test/scheduler.rb +4 -0
  122. data/test/singleton_test.rb +39 -38
  123. data/test/stack_printer_test.rb +61 -61
  124. data/test/start_stop_test.rb +106 -106
  125. data/test/test_helper.rb +24 -20
  126. data/test/thread_test.rb +229 -231
  127. data/test/unique_call_path_test.rb +123 -136
  128. data/test/yarv_test.rb +56 -60
  129. metadata +68 -16
  130. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  131. data/lib/ruby-prof/compatibility.rb +0 -113
  132. data/test/compatibility_test.rb +0 -49
  133. data/test/crash2.rb +0 -144
  134. data/test/measure_memory_test.rb +0 -1456
@@ -1,30 +1,30 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'fileutils'
6
- require 'tmpdir'
7
- require_relative 'prime'
8
-
9
- # -- Tests ----
10
- class PrinterCallTreeTest < TestCase
11
- def setup
12
- super
13
- # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
14
- @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
15
- run_primes(1000, 5000)
16
- end
17
- end
18
-
19
- def test_call_tree_string
20
- printer = RubyProf::CallTreePrinter.new(@result)
21
-
22
- printer.print(:path => Dir.tmpdir)
23
- main_output_file_name = File.join(Dir.tmpdir, "callgrind.out.#{$$}")
24
- assert(File.exist?(main_output_file_name))
25
- output = File.read(main_output_file_name)
26
- assert_match(/fn=Object::find_primes/i, output)
27
- assert_match(/events: wall_time/i, output)
28
- refute_match(/d\d\d\d\d\d/, output) # old bug looked [in error] like Object::run_primes(d5833116)
29
- end
30
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'fileutils'
6
+ require 'tmpdir'
7
+ require_relative 'prime'
8
+
9
+ # -- Tests ----
10
+ class PrinterCallTreeTest < TestCase
11
+ def setup
12
+ super
13
+ # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
14
+ @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
15
+ run_primes(1000, 5000)
16
+ end
17
+ end
18
+
19
+ def test_call_tree_string
20
+ printer = RubyProf::CallTreePrinter.new(@result)
21
+
22
+ printer.print(path: Dir.tmpdir)
23
+ main_output_file_name = File.join(Dir.tmpdir, "callgrind.out.#{$$}")
24
+ assert(File.exist?(main_output_file_name))
25
+ output = File.read(main_output_file_name)
26
+ assert_match(/fn=Object::find_primes/i, output)
27
+ assert_match(/events: wall_time/i, output)
28
+ refute_match(/d\d\d\d\d\d/, output) # old bug looked [in error] like Object::run_primes(d5833116)
29
+ end
30
+ end
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'fileutils'
6
+ require 'stringio'
7
+ require 'tmpdir'
8
+ require_relative 'prime'
9
+
10
+ # -- Tests ----
11
+ class PrinterFlameGraphTest < TestCase
12
+ def setup
13
+ super
14
+ # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
15
+ @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
16
+ run_primes(1000, 5000)
17
+ end
18
+ end
19
+
20
+ def test_flame_graph_string
21
+ output = StringIO.new
22
+ printer = RubyProf::FlameGraphPrinter.new(@result)
23
+ printer.print(output)
24
+
25
+ assert_match(/<!DOCTYPE html>/i, output.string)
26
+ assert_match(/flame-svg/, output.string)
27
+ assert_match(/Object#run_primes/i, output.string)
28
+ end
29
+
30
+ def test_flame_graph_stringio
31
+ output = StringIO.new
32
+ printer = RubyProf::FlameGraphPrinter.new(@result)
33
+ printer.print(output)
34
+
35
+ result = output.string
36
+ assert_match(/<!DOCTYPE html>/i, result)
37
+ assert_match(/flame-svg/, result)
38
+ assert_match(/Object#run_primes/i, result)
39
+ end
40
+
41
+ def test_flame_graph_contains_svg_elements
42
+ output = StringIO.new
43
+ printer = RubyProf::FlameGraphPrinter.new(@result)
44
+ printer.print(output)
45
+
46
+ assert_match(/<svg/, output.string)
47
+ assert_match(/renderNode/, output.string)
48
+ end
49
+
50
+ def test_flame_graph_contains_json_data
51
+ output = StringIO.new
52
+ printer = RubyProf::FlameGraphPrinter.new(@result)
53
+ printer.print(output)
54
+
55
+ # The template embeds thread data as JSON
56
+ assert_match(/"name"/, output.string)
57
+ assert_match(/"value"/, output.string)
58
+ assert_match(/"children"/, output.string)
59
+ end
60
+
61
+ def test_flame_graph_custom_title
62
+ output = StringIO.new
63
+ printer = RubyProf::FlameGraphPrinter.new(@result)
64
+ printer.print(output, title: "Custom Flame Graph")
65
+
66
+ assert_match(/Custom Flame Graph/, output.string)
67
+ end
68
+
69
+ def test_flame_graph_file_output
70
+ Dir.mktmpdir do |dir|
71
+ path = File.join(dir, "flame_graph.html")
72
+ File.open(path, "wb") do |file|
73
+ printer = RubyProf::FlameGraphPrinter.new(@result)
74
+ printer.print(file)
75
+ end
76
+
77
+ content = File.read(path)
78
+ assert_match(/<!DOCTYPE html>/i, content)
79
+ assert_match(/Object#run_primes/i, content)
80
+ end
81
+ end
82
+ end
@@ -1,99 +1,99 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'fileutils'
6
- require 'stringio'
7
- require 'tmpdir'
8
- require_relative 'prime'
9
-
10
- # -- Tests ----
11
- class PrinterFlatTest < TestCase
12
- def run_profile
13
- RubyProf::Profile.profile(:measure_mode => RubyProf::WALL_TIME) do
14
- run_primes(1000, 5000)
15
- end
16
- end
17
-
18
- def flat_output_nth_column_values(output, n)
19
- only_method_calls = output.split("\n").select { |line| line =~ /^\s+\d+/ }
20
- only_method_calls.collect { |line| line.split(/\s+/)[n] }
21
- end
22
-
23
- def helper_test_flat_string(klass)
24
- output = StringIO.new
25
-
26
- printer = klass.new(self.run_profile)
27
- printer.print(output)
28
-
29
- assert_match(/Thread ID: -?\d+/i, output.string)
30
- assert_match(/Fiber ID: -?\d+/i, output.string)
31
- assert_match(/Total: \d+\.\d+/i, output.string)
32
- assert_match(/Object#run_primes/i, output.string)
33
- output.string
34
- end
35
-
36
- def assert_sorted(array)
37
- array = array.map(&:to_f) # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
38
- assert_equal(array, array.sort.reverse)
39
- end
40
-
41
- def test_flat_string
42
- output = helper_test_flat_string(RubyProf::FlatPrinter)
43
- assert_match(/prime.rb/, output)
44
- end
45
-
46
- def test_flat_result_sorting_by_self_time_is_default
47
- printer = RubyProf::FlatPrinter.new(self.run_profile)
48
-
49
- output = StringIO.new
50
- printer.print(output)
51
- self_times = flat_output_nth_column_values(output.string, 3)
52
-
53
- assert_sorted self_times
54
- end
55
-
56
- def test_flat_result_sorting
57
- printer = RubyProf::FlatPrinter.new(self.run_profile)
58
-
59
- sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
60
-
61
- sort_method_with_column_number.each_pair do |sort_method, n|
62
- output = StringIO.new
63
- printer.print(output, :sort_method => sort_method)
64
-
65
- times = flat_output_nth_column_values(output.string, n)
66
- assert_sorted(times)
67
- end
68
- end
69
-
70
- def test_flat_result_max_percent
71
- printer = RubyProf::FlatPrinter.new(self.run_profile)
72
-
73
- output = StringIO.new
74
- printer.print(output, max_percent: 1)
75
- self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
76
-
77
- assert self_percents.max < 1
78
- end
79
-
80
- def test_flat_result_filter_by_total_time
81
- printer = RubyProf::FlatPrinter.new(self.run_profile)
82
-
83
- output = StringIO.new
84
- printer.print(output, filter_by: :total_time, min_percent: 50)
85
- total_times = flat_output_nth_column_values(output.string, 2).map(&:to_f)
86
-
87
- assert (total_times.min / total_times.max) >= 0.5
88
- end
89
-
90
- def test_flat_result_filter_by_self_time
91
- printer = RubyProf::FlatPrinter.new(self.run_profile)
92
-
93
- output = StringIO.new
94
- printer.print(output, filter_by: :self_time, min_percent: 0.1)
95
- self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
96
-
97
- assert self_percents.min >= 0.1
98
- end
99
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'fileutils'
6
+ require 'stringio'
7
+ require 'tmpdir'
8
+ require_relative 'prime'
9
+
10
+ # -- Tests ----
11
+ class PrinterFlatTest < TestCase
12
+ def run_profile
13
+ RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
14
+ run_primes(1000, 5000)
15
+ end
16
+ end
17
+
18
+ def flat_output_nth_column_values(output, n)
19
+ only_method_calls = output.split("\n").select { |line| line =~ /^\s+\d+/ }
20
+ only_method_calls.collect { |line| line.split(/\s+/)[n] }
21
+ end
22
+
23
+ def helper_test_flat_string(klass)
24
+ output = StringIO.new
25
+
26
+ printer = klass.new(self.run_profile)
27
+ printer.print(output)
28
+
29
+ assert_match(/Thread ID: -?\d+/i, output.string)
30
+ assert_match(/Fiber ID: -?\d+/i, output.string)
31
+ assert_match(/Total: \d+\.\d+/i, output.string)
32
+ assert_match(/Object#run_primes/i, output.string)
33
+ output.string
34
+ end
35
+
36
+ def assert_sorted(array)
37
+ array = array.map(&:to_f) # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
38
+ assert_equal(array, array.sort.reverse)
39
+ end
40
+
41
+ def test_flat_string
42
+ output = helper_test_flat_string(RubyProf::FlatPrinter)
43
+ assert_match(/prime.rb/, output)
44
+ end
45
+
46
+ def test_flat_result_sorting_by_self_time_is_default
47
+ printer = RubyProf::FlatPrinter.new(self.run_profile)
48
+
49
+ output = StringIO.new
50
+ printer.print(output)
51
+ self_times = flat_output_nth_column_values(output.string, 3)
52
+
53
+ assert_sorted self_times
54
+ end
55
+
56
+ def test_flat_result_sorting
57
+ printer = RubyProf::FlatPrinter.new(self.run_profile)
58
+
59
+ sort_method_with_column_number = {total_time: 2, self_time: 3, wait_time: 4, children_time: 5}
60
+
61
+ sort_method_with_column_number.each_pair do |sort_method, n|
62
+ output = StringIO.new
63
+ printer.print(output, sort_method: sort_method)
64
+
65
+ times = flat_output_nth_column_values(output.string, n)
66
+ assert_sorted(times)
67
+ end
68
+ end
69
+
70
+ def test_flat_result_max_percent
71
+ printer = RubyProf::FlatPrinter.new(self.run_profile)
72
+
73
+ output = StringIO.new
74
+ printer.print(output, max_percent: 1)
75
+ self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
76
+
77
+ assert self_percents.max < 1
78
+ end
79
+
80
+ def test_flat_result_filter_by_total_time
81
+ printer = RubyProf::FlatPrinter.new(self.run_profile)
82
+
83
+ output = StringIO.new
84
+ printer.print(output, filter_by: :total_time, min_percent: 50)
85
+ total_times = flat_output_nth_column_values(output.string, 2).map(&:to_f)
86
+
87
+ assert (total_times.min / total_times.max) >= 0.5
88
+ end
89
+
90
+ def test_flat_result_filter_by_self_time
91
+ printer = RubyProf::FlatPrinter.new(self.run_profile)
92
+
93
+ output = StringIO.new
94
+ printer.print(output, filter_by: :self_time, min_percent: 0.1)
95
+ self_percents = flat_output_nth_column_values(output.string, 1).map(&:to_f)
96
+
97
+ assert self_percents.min >= 0.1
98
+ end
99
+ end
@@ -1,59 +1,62 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'fileutils'
6
- require 'tmpdir'
7
- require_relative 'prime'
8
-
9
- # -- Tests ----
10
- class PrinterGraphHtmlTest < TestCase
11
- def setup
12
- super
13
- # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
14
- @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
15
- run_primes(1000, 5000)
16
- end
17
- end
18
-
19
- def graph_html_output_nth_column_values(output, n)
20
- only_root_calls = output.split('<tr class="method">')
21
- only_root_calls.delete_at(0)
22
- only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
23
- end
24
-
25
- def assert_sorted array
26
- array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
27
- assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
28
- end
29
-
30
- def test_graph_html_string
31
- output = ''
32
- printer = RubyProf::GraphHtmlPrinter.new(@result)
33
- printer.print(output)
34
-
35
- assert_match(/<!DOCTYPE html>/i, output)
36
- assert_match( %r{<th>Total</th>}i, output)
37
- assert_match(/Object#run_primes/i, output)
38
- end
39
-
40
- def test_graph_html_result_sorting_by_total_time_is_default
41
- printer = RubyProf::GraphHtmlPrinter.new(@result)
42
- printer.print(output = '')
43
- total_times = graph_html_output_nth_column_values(output, 3)
44
-
45
- assert_sorted total_times
46
- end
47
-
48
- def test_graph_html_result_sorting
49
- printer = RubyProf::GraphHtmlPrinter.new(@result)
50
-
51
- sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
52
-
53
- sort_method_with_column_number.each_pair do |sort_method, n|
54
- printer.print(output = '', :sort_method => sort_method)
55
- times = graph_html_output_nth_column_values(output, n)
56
- assert_sorted times
57
- end
58
- end
59
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'fileutils'
6
+ require 'stringio'
7
+ require 'tmpdir'
8
+ require_relative 'prime'
9
+
10
+ # -- Tests ----
11
+ class PrinterGraphHtmlTest < TestCase
12
+ def setup
13
+ super
14
+ # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
15
+ @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
16
+ run_primes(1000, 5000)
17
+ end
18
+ end
19
+
20
+ def graph_html_output_nth_column_values(output, n)
21
+ only_root_calls = output.split('<tr class="method">')
22
+ only_root_calls.delete_at(0)
23
+ only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
24
+ end
25
+
26
+ def assert_sorted array
27
+ array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
28
+ assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
29
+ end
30
+
31
+ def test_graph_html_string
32
+ output = StringIO.new
33
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
34
+ printer.print(output)
35
+
36
+ assert_match(/<!DOCTYPE html>/i, output.string)
37
+ assert_match( %r{<th>Total</th>}i, output.string)
38
+ assert_match(/Object#run_primes/i, output.string)
39
+ end
40
+
41
+ def test_graph_html_result_sorting_by_total_time_is_default
42
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
43
+ output = StringIO.new
44
+ printer.print(output)
45
+ total_times = graph_html_output_nth_column_values(output.string, 3)
46
+
47
+ assert_sorted total_times
48
+ end
49
+
50
+ def test_graph_html_result_sorting
51
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
52
+
53
+ sort_method_with_column_number = {total_time: 3, self_time: 4, wait_time: 5, children_time: 6}
54
+
55
+ sort_method_with_column_number.each_pair do |sort_method, n|
56
+ output = StringIO.new
57
+ printer.print(output, sort_method: sort_method)
58
+ times = graph_html_output_nth_column_values(output.string, n)
59
+ assert_sorted times
60
+ end
61
+ end
62
+ end
@@ -1,40 +1,42 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'fileutils'
6
- require 'tmpdir'
7
- require_relative 'prime'
8
-
9
- # -- Tests ----
10
- class PrinterGraphTest < TestCase
11
- def setup
12
- super
13
- # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
14
- @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
15
- run_primes(1000, 5000)
16
- end
17
- end
18
-
19
- def graph_output_nth_column_values(output, n)
20
- only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
21
- only_root_calls.collect { |line| line.split(/ +/)[n] }
22
- end
23
-
24
- def assert_sorted(array)
25
- array = array.map {|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
26
- assert_equal(array, array.sort.reverse, "Array #{array.inspect} is not sorted")
27
- end
28
-
29
- def test_graph_results_sorting
30
- printer = RubyProf::GraphPrinter.new(@result)
31
-
32
- sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
33
-
34
- sort_method_with_column_number.each_pair do |sort_method, n|
35
- printer.print(output = '', :sort_method => sort_method)
36
- times = graph_output_nth_column_values(output, n)
37
- assert_sorted times
38
- end
39
- end
40
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'fileutils'
6
+ require 'stringio'
7
+ require 'tmpdir'
8
+ require_relative 'prime'
9
+
10
+ # -- Tests ----
11
+ class PrinterGraphTest < TestCase
12
+ def setup
13
+ super
14
+ # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
15
+ @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
16
+ run_primes(1000, 5000)
17
+ end
18
+ end
19
+
20
+ def graph_output_nth_column_values(output, n)
21
+ only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
22
+ only_root_calls.collect { |line| line.split(/ +/)[n] }
23
+ end
24
+
25
+ def assert_sorted(array)
26
+ array = array.map {|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
27
+ assert_equal(array, array.sort.reverse, "Array #{array.inspect} is not sorted")
28
+ end
29
+
30
+ def test_graph_results_sorting
31
+ printer = RubyProf::GraphPrinter.new(@result)
32
+
33
+ sort_method_with_column_number = {total_time: 3, self_time: 4, wait_time: 5, children_time: 6}
34
+
35
+ sort_method_with_column_number.each_pair do |sort_method, n|
36
+ output = StringIO.new
37
+ printer.print(output, sort_method: sort_method)
38
+ times = graph_output_nth_column_values(output.string, n)
39
+ assert_sorted times
40
+ end
41
+ end
42
+ end