ruby-prof 0.13.1 → 1.4.2

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 (209) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +579 -371
  3. data/LICENSE +24 -23
  4. data/README.rdoc +5 -433
  5. data/Rakefile +98 -110
  6. data/bin/ruby-prof +328 -329
  7. data/bin/ruby-prof-check-trace +45 -0
  8. data/ext/ruby_prof/extconf.rb +16 -59
  9. data/ext/ruby_prof/rp_aggregate_call_tree.c +59 -0
  10. data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
  11. data/ext/ruby_prof/rp_allocation.c +287 -0
  12. data/ext/ruby_prof/rp_allocation.h +31 -0
  13. data/ext/ruby_prof/rp_call_tree.c +369 -0
  14. data/ext/ruby_prof/rp_call_tree.h +43 -0
  15. data/ext/ruby_prof/rp_call_trees.c +288 -0
  16. data/ext/ruby_prof/rp_call_trees.h +28 -0
  17. data/ext/ruby_prof/rp_measure_allocations.c +50 -65
  18. data/ext/ruby_prof/rp_measure_memory.c +42 -73
  19. data/ext/ruby_prof/rp_measure_process_time.c +65 -71
  20. data/ext/ruby_prof/rp_measure_wall_time.c +64 -42
  21. data/ext/ruby_prof/rp_measurement.c +237 -0
  22. data/ext/ruby_prof/rp_measurement.h +50 -0
  23. data/ext/ruby_prof/rp_method.c +491 -420
  24. data/ext/ruby_prof/rp_method.h +62 -57
  25. data/ext/ruby_prof/rp_profile.c +908 -0
  26. data/ext/ruby_prof/rp_profile.h +35 -0
  27. data/ext/ruby_prof/rp_stack.c +212 -128
  28. data/ext/ruby_prof/rp_stack.h +53 -51
  29. data/ext/ruby_prof/rp_thread.c +362 -268
  30. data/ext/ruby_prof/rp_thread.h +39 -27
  31. data/ext/ruby_prof/ruby_prof.c +52 -695
  32. data/ext/ruby_prof/ruby_prof.h +26 -55
  33. data/ext/ruby_prof/vc/ruby_prof.sln +28 -21
  34. data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +56 -8
  35. data/lib/ruby-prof.rb +52 -67
  36. data/lib/ruby-prof/assets/call_stack_printer.html.erb +710 -0
  37. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  38. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -0
  39. data/lib/ruby-prof/call_tree.rb +57 -0
  40. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  41. data/lib/ruby-prof/compatibility.rb +99 -169
  42. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  43. data/lib/ruby-prof/measurement.rb +17 -0
  44. data/lib/ruby-prof/method_info.rb +78 -131
  45. data/lib/ruby-prof/printers/abstract_printer.rb +137 -85
  46. data/lib/ruby-prof/printers/call_info_printer.rb +53 -41
  47. data/lib/ruby-prof/printers/call_stack_printer.rb +180 -773
  48. data/lib/ruby-prof/printers/call_tree_printer.rb +151 -92
  49. data/lib/ruby-prof/printers/dot_printer.rb +132 -132
  50. data/lib/ruby-prof/printers/flat_printer.rb +53 -69
  51. data/lib/ruby-prof/printers/graph_html_printer.rb +63 -255
  52. data/lib/ruby-prof/printers/graph_printer.rb +113 -116
  53. data/lib/ruby-prof/printers/multi_printer.rb +127 -56
  54. data/lib/ruby-prof/profile.rb +37 -77
  55. data/lib/ruby-prof/rack.rb +62 -15
  56. data/lib/ruby-prof/task.rb +147 -147
  57. data/lib/ruby-prof/thread.rb +10 -12
  58. data/lib/ruby-prof/version.rb +3 -0
  59. data/lib/unprof.rb +10 -10
  60. data/ruby-prof.gemspec +65 -61
  61. data/test/abstract_printer_test.rb +26 -0
  62. data/test/alias_test.rb +126 -0
  63. data/test/basic_test.rb +43 -128
  64. data/test/call_tree_visitor_test.rb +32 -0
  65. data/test/call_trees_test.rb +66 -0
  66. data/test/duplicate_names_test.rb +32 -32
  67. data/test/dynamic_method_test.rb +53 -74
  68. data/test/enumerable_test.rb +21 -16
  69. data/test/exceptions_test.rb +24 -16
  70. data/test/exclude_methods_test.rb +151 -0
  71. data/test/exclude_threads_test.rb +53 -54
  72. data/test/fiber_test.rb +129 -65
  73. data/test/gc_test.rb +90 -0
  74. data/test/inverse_call_tree_test.rb +175 -0
  75. data/test/line_number_test.rb +158 -71
  76. data/test/marshal_test.rb +113 -0
  77. data/test/measure_allocations.rb +30 -0
  78. data/test/measure_allocations_test.rb +375 -25
  79. data/test/measure_allocations_trace_test.rb +375 -0
  80. data/test/measure_memory_trace_test.rb +1101 -0
  81. data/test/measure_process_time_test.rb +785 -62
  82. data/test/measure_times.rb +56 -0
  83. data/test/measure_wall_time_test.rb +434 -254
  84. data/test/multi_printer_test.rb +71 -82
  85. data/test/no_method_class_test.rb +15 -15
  86. data/test/pause_resume_test.rb +175 -166
  87. data/test/prime.rb +54 -54
  88. data/test/prime_script.rb +6 -0
  89. data/test/printer_call_stack_test.rb +27 -0
  90. data/test/printer_call_tree_test.rb +30 -0
  91. data/test/printer_flat_test.rb +99 -0
  92. data/test/printer_graph_html_test.rb +59 -0
  93. data/test/printer_graph_test.rb +40 -0
  94. data/test/printers_test.rb +141 -257
  95. data/test/printing_recursive_graph_test.rb +81 -0
  96. data/test/profile_test.rb +16 -0
  97. data/test/rack_test.rb +93 -0
  98. data/test/recursive_test.rb +206 -215
  99. data/test/singleton_test.rb +38 -38
  100. data/test/stack_printer_test.rb +64 -78
  101. data/test/start_stop_test.rb +109 -112
  102. data/test/test_helper.rb +13 -115
  103. data/test/thread_test.rb +144 -178
  104. data/test/unique_call_path_test.rb +120 -224
  105. data/test/yarv_test.rb +56 -0
  106. metadata +77 -133
  107. data/doc/LICENSE.html +0 -155
  108. data/doc/README_rdoc.html +0 -648
  109. data/doc/Rack.html +0 -167
  110. data/doc/Rack/RubyProf.html +0 -319
  111. data/doc/RubyProf.html +0 -1000
  112. data/doc/RubyProf/AbstractPrinter.html +0 -580
  113. data/doc/RubyProf/AggregateCallInfo.html +0 -570
  114. data/doc/RubyProf/CallInfo.html +0 -512
  115. data/doc/RubyProf/CallInfoPrinter.html +0 -190
  116. data/doc/RubyProf/CallInfoVisitor.html +0 -332
  117. data/doc/RubyProf/CallStackPrinter.html +0 -1600
  118. data/doc/RubyProf/CallTreePrinter.html +0 -413
  119. data/doc/RubyProf/Cmd.html +0 -669
  120. data/doc/RubyProf/DotPrinter.html +0 -312
  121. data/doc/RubyProf/FlatPrinter.html +0 -229
  122. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -267
  123. data/doc/RubyProf/GraphHtmlPrinter.html +0 -630
  124. data/doc/RubyProf/GraphPrinter.html +0 -209
  125. data/doc/RubyProf/MethodInfo.html +0 -713
  126. data/doc/RubyProf/MultiPrinter.html +0 -407
  127. data/doc/RubyProf/Profile.html +0 -821
  128. data/doc/RubyProf/ProfileTask.html +0 -532
  129. data/doc/RubyProf/Test.html +0 -578
  130. data/doc/RubyProf/Thread.html +0 -262
  131. data/doc/created.rid +0 -32
  132. data/doc/examples/flat_txt.html +0 -191
  133. data/doc/examples/graph_txt.html +0 -305
  134. data/doc/images/add.png +0 -0
  135. data/doc/images/brick.png +0 -0
  136. data/doc/images/brick_link.png +0 -0
  137. data/doc/images/bug.png +0 -0
  138. data/doc/images/bullet_black.png +0 -0
  139. data/doc/images/bullet_toggle_minus.png +0 -0
  140. data/doc/images/bullet_toggle_plus.png +0 -0
  141. data/doc/images/date.png +0 -0
  142. data/doc/images/delete.png +0 -0
  143. data/doc/images/find.png +0 -0
  144. data/doc/images/loadingAnimation.gif +0 -0
  145. data/doc/images/macFFBgHack.png +0 -0
  146. data/doc/images/package.png +0 -0
  147. data/doc/images/page_green.png +0 -0
  148. data/doc/images/page_white_text.png +0 -0
  149. data/doc/images/page_white_width.png +0 -0
  150. data/doc/images/plugin.png +0 -0
  151. data/doc/images/ruby.png +0 -0
  152. data/doc/images/tag_blue.png +0 -0
  153. data/doc/images/tag_green.png +0 -0
  154. data/doc/images/transparent.png +0 -0
  155. data/doc/images/wrench.png +0 -0
  156. data/doc/images/wrench_orange.png +0 -0
  157. data/doc/images/zoom.png +0 -0
  158. data/doc/index.html +0 -647
  159. data/doc/js/darkfish.js +0 -155
  160. data/doc/js/jquery.js +0 -18
  161. data/doc/js/navigation.js +0 -142
  162. data/doc/js/search.js +0 -94
  163. data/doc/js/search_index.js +0 -1
  164. data/doc/js/searcher.js +0 -228
  165. data/doc/rdoc.css +0 -543
  166. data/doc/table_of_contents.html +0 -462
  167. data/examples/empty.png +0 -0
  168. data/examples/flat.txt +0 -55
  169. data/examples/graph.dot +0 -106
  170. data/examples/graph.html +0 -823
  171. data/examples/graph.png +0 -0
  172. data/examples/graph.txt +0 -170
  173. data/examples/minus.png +0 -0
  174. data/examples/multi.flat.txt +0 -23
  175. data/examples/multi.graph.html +0 -906
  176. data/examples/multi.grind.dat +0 -194
  177. data/examples/multi.stack.html +0 -573
  178. data/examples/plus.png +0 -0
  179. data/examples/stack.html +0 -573
  180. data/ext/ruby_prof/rp_call_info.c +0 -407
  181. data/ext/ruby_prof/rp_call_info.h +0 -48
  182. data/ext/ruby_prof/rp_measure.c +0 -48
  183. data/ext/ruby_prof/rp_measure.h +0 -45
  184. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -112
  185. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -65
  186. data/ext/ruby_prof/rp_measure_gc_time.c +0 -57
  187. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
  188. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
  189. data/ext/ruby_prof/version.h +0 -7
  190. data/lib/ruby-prof/aggregate_call_info.rb +0 -72
  191. data/lib/ruby-prof/call_info.rb +0 -89
  192. data/lib/ruby-prof/call_info_visitor.rb +0 -44
  193. data/lib/ruby-prof/images/empty.png +0 -0
  194. data/lib/ruby-prof/images/minus.png +0 -0
  195. data/lib/ruby-prof/images/plus.png +0 -0
  196. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -57
  197. data/lib/ruby-prof/test.rb +0 -150
  198. data/test/aggregate_test.rb +0 -136
  199. data/test/call_info_test.rb +0 -78
  200. data/test/call_info_visitor_test.rb +0 -31
  201. data/test/exec_test.rb +0 -14
  202. data/test/measure_cpu_time_test.rb +0 -220
  203. data/test/measure_gc_runs_test.rb +0 -32
  204. data/test/measure_gc_time_test.rb +0 -36
  205. data/test/measure_memory_test.rb +0 -31
  206. data/test/method_elimination_test.rb +0 -84
  207. data/test/module_test.rb +0 -45
  208. data/test/stack_test.rb +0 -138
  209. data/test/test_suite.rb +0 -37
@@ -1,38 +1,38 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'timeout'
6
-
7
- # -- Test for bug [#5657]
8
- # http://rubyforge.org/tracker/index.php?func=detail&aid=5657&group_id=1814&atid=7060
9
-
10
-
11
- class A
12
- attr_accessor :as
13
- def initialize
14
- @as = []
15
- class << @as
16
- def <<(an_a)
17
- super
18
- end
19
- end
20
- end
21
-
22
- def <<(an_a)
23
- @as << an_a
24
- end
25
- end
26
-
27
- class SingletonTest < Test::Unit::TestCase
28
- def test_singleton
29
- result = RubyProf.profile do
30
- a = A.new
31
- a << :first_thing
32
- assert_equal(1, a.as.size)
33
- end
34
- printer = RubyProf::FlatPrinter.new(result)
35
- output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : ''
36
- printer.print(output)
37
- end
38
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'timeout'
6
+
7
+ # -- Test for bug [#5657]
8
+ # http://rubyforge.org/tracker/index.php?func=detail&aid=5657&group_id=1814&atid=7060
9
+
10
+
11
+ class A
12
+ attr_accessor :as
13
+ def initialize
14
+ @as = []
15
+ class << @as
16
+ def <<(an_a)
17
+ super
18
+ end
19
+ end
20
+ end
21
+
22
+ def <<(an_a)
23
+ @as << an_a
24
+ end
25
+ end
26
+
27
+ class SingletonTest < TestCase
28
+ def test_singleton
29
+ result = RubyProf.profile do
30
+ a = A.new
31
+ a << :first_thing
32
+ assert_equal(1, a.as.size)
33
+ end
34
+ printer = RubyProf::FlatPrinter.new(result)
35
+ output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : ''
36
+ printer.print(output)
37
+ end
38
+ end
@@ -1,78 +1,64 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- # Test data
7
- # A
8
- # / \
9
- # B C
10
- # \
11
- # B
12
-
13
- class STPT
14
- def a
15
- 100.times{b}
16
- 300.times{c}
17
- c;c;c
18
- end
19
-
20
- def b
21
- sleep 0
22
- end
23
-
24
- def c
25
- 5.times{b}
26
- end
27
- end
28
-
29
- class StackPrinterTest < Test::Unit::TestCase
30
- def setup
31
- # Need to use wall time for this test due to the sleep calls
32
- RubyProf::measure_mode = RubyProf::WALL_TIME
33
- end
34
-
35
- def test_stack_can_be_printed
36
- start_time = Time.now
37
- RubyProf.start
38
- 5.times{STPT.new.a}
39
- result = RubyProf.stop
40
- end_time = Time.now
41
- expected_time = end_time - start_time
42
-
43
- file_contents = nil
44
- assert_nothing_raised { file_contents = print(result) }
45
- # TODO: why are thread ids negative on travis-ci.org (32 bit build maybe?)
46
- re = /Thread: (-?\d+)(, Fiber: (-?\d+))? \(100\.00% ~ ([\.0-9]+)\)/
47
- assert_match(re, file_contents)
48
- file_contents =~ re
49
- actual_time = $4.to_f
50
- assert_in_delta(expected_time, actual_time, 0.1)
51
- end
52
-
53
- def test_method_elimination
54
- RubyProf.start
55
- 5.times{STPT.new.a}
56
- result = RubyProf.stop
57
- assert_nothing_raised {
58
- # result.dump
59
- result.eliminate_methods!([/Integer#times/])
60
- # $stderr.puts "================================"
61
- # result.dump
62
- print(result)
63
- }
64
- end
65
-
66
- private
67
- def print(result)
68
- test = caller.first =~ /in `(.*)'/ ? $1 : "test"
69
- testfile_name = "#{RubyProf.tmpdir}/ruby_prof_#{test}.html"
70
- # puts "printing to #{testfile_name}"
71
- printer = RubyProf::CallStackPrinter.new(result)
72
- File.open(testfile_name, "w") {|f| printer.print(f, :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")}
73
- system("open '#{testfile_name}'") if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
74
- assert File.exist?(testfile_name), "#{testfile_name} does not exist"
75
- assert File.readable?(testfile_name), "#{testfile_name} is no readable"
76
- File.read(testfile_name)
77
- end
78
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # Test data
7
+ # A
8
+ # / \
9
+ # B C
10
+ # \
11
+ # B
12
+
13
+ class STPT
14
+ def a
15
+ 100.times{b}
16
+ 300.times{c}
17
+ c;c;c
18
+ end
19
+
20
+ def b
21
+ sleep 0
22
+ end
23
+
24
+ def c
25
+ 5.times{b}
26
+ end
27
+ end
28
+
29
+ class StackPrinterTest < TestCase
30
+ def setup
31
+ # Need to use wall time for this test due to the sleep calls
32
+ RubyProf::measure_mode = RubyProf::WALL_TIME
33
+ end
34
+
35
+ def test_stack_can_be_printed
36
+ start_time = Time.now
37
+ RubyProf.start
38
+ 5.times{STPT.new.a}
39
+ result = RubyProf.stop
40
+ end_time = Time.now
41
+ expected_time = end_time - start_time
42
+
43
+ file_contents = nil
44
+ file_contents = print(result)
45
+ re = /Thread: (\d+)(, Fiber: (\d+))? \([\.0-9]+.[\.0-9]+% ~ ([\.0-9]+)\)/
46
+ assert_match(re, file_contents)
47
+ file_contents =~ re
48
+ actual_time = $4.to_f
49
+ assert_in_delta(expected_time, actual_time, 0.1)
50
+ end
51
+
52
+ private
53
+ def print(result)
54
+ test = caller.first =~ /in `(.*)'/ ? $1 : "test"
55
+ testfile_name = "#{Dir.tmpdir}/ruby_prof_#{test}.html"
56
+ # puts "printing to #{testfile_name}"
57
+ printer = RubyProf::CallStackPrinter.new(result)
58
+ File.open(testfile_name, "w") {|f| printer.print(f, :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")}
59
+ system("open '#{testfile_name}'") if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
60
+ assert File.exist?(testfile_name), "#{testfile_name} does not exist"
61
+ assert File.readable?(testfile_name), "#{testfile_name} is no readable"
62
+ File.read(testfile_name)
63
+ end
64
+ end
@@ -1,112 +1,109 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class StartStopTest < Test::Unit::TestCase
7
- def setup
8
- # Need to use wall time for this test due to the sleep calls
9
- RubyProf::measure_mode = RubyProf::WALL_TIME
10
- end
11
-
12
- def method1
13
- RubyProf.start
14
- method2
15
- end
16
-
17
- def method2
18
- method3
19
- end
20
-
21
- def method3
22
- sleep(2)
23
- @result = RubyProf.stop
24
- end
25
-
26
- def test_extra_stop_should_raise
27
- RubyProf.start
28
- assert_raise(RuntimeError) do
29
- RubyProf.start
30
- end
31
-
32
- assert_raise(RuntimeError) do
33
- RubyProf.profile {}
34
- end
35
-
36
- RubyProf.stop # ok
37
- assert_raise(RuntimeError) do
38
- RubyProf.stop
39
- end
40
- end
41
-
42
-
43
- def test_different_methods
44
- method1
45
-
46
- # Ruby prof should be stopped
47
- assert_equal(false, RubyProf.running?)
48
-
49
-
50
- # Length should be 4:
51
- # StartStopTest#method1
52
- # StartStopTest#method2
53
- # StartStopTest#method3
54
- # Kernel#sleep
55
-
56
- methods = @result.threads.first.methods.sort.reverse
57
- assert_equal(4, methods.length)
58
-
59
- # Check StackTest#test_call_sequence
60
- method = methods[0]
61
- assert_equal('StartStopTest#method1', method.full_name)
62
- assert_equal(1, method.called)
63
- assert_in_delta(2, method.total_time, 0.05)
64
- assert_in_delta(0, method.wait_time, 0.02)
65
- assert_in_delta(0, method.self_time, 0.02)
66
- assert_in_delta(2, method.children_time, 0.05)
67
- assert_equal(1, method.call_infos.length)
68
-
69
- call_info = method.call_infos[0]
70
- assert_equal('StartStopTest#method1', call_info.call_sequence)
71
- assert_equal(1, call_info.children.length)
72
-
73
- method = methods[1]
74
- assert_equal('StartStopTest#method2', method.full_name)
75
- assert_equal(1, method.called)
76
- assert_in_delta(2, method.total_time, 0.05)
77
- assert_in_delta(0, method.wait_time, 0.02)
78
- assert_in_delta(0, method.self_time, 0.02)
79
- assert_in_delta(2, method.children_time, 0.05)
80
- assert_equal(1, method.call_infos.length)
81
-
82
- call_info = method.call_infos[0]
83
- assert_equal('StartStopTest#method1->StartStopTest#method2', call_info.call_sequence)
84
- assert_equal(1, call_info.children.length)
85
-
86
- method = methods[2]
87
- assert_equal('StartStopTest#method3', method.full_name)
88
- assert_equal(1, method.called)
89
- assert_in_delta(2, method.total_time, 0.02)
90
- assert_in_delta(0, method.wait_time, 0.02)
91
- assert_in_delta(0, method.self_time, 0.02)
92
- assert_in_delta(2, method.children_time, 0.02)
93
- assert_equal(1, method.call_infos.length)
94
-
95
- call_info = method.call_infos[0]
96
- assert_equal('StartStopTest#method1->StartStopTest#method2->StartStopTest#method3', call_info.call_sequence)
97
- assert_equal(1, call_info.children.length)
98
-
99
- method = methods[3]
100
- assert_equal('Kernel#sleep', method.full_name)
101
- assert_equal(1, method.called)
102
- assert_in_delta(2, method.total_time, 0.02)
103
- assert_in_delta(0, method.wait_time, 0.02)
104
- assert_in_delta(2, method.self_time, 0.02)
105
- assert_in_delta(0, method.children_time, 0.02)
106
- assert_equal(1, method.call_infos.length)
107
-
108
- call_info = method.call_infos[0]
109
- assert_equal('StartStopTest#method1->StartStopTest#method2->StartStopTest#method3->Kernel#sleep', call_info.call_sequence)
110
- assert_equal(0, call_info.children.length)
111
- end
112
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class StartStopTest < TestCase
7
+ def setup
8
+ # Need to use wall time for this test due to the sleep calls
9
+ RubyProf::measure_mode = RubyProf::WALL_TIME
10
+ end
11
+
12
+ def method1
13
+ RubyProf.start
14
+ method2
15
+ end
16
+
17
+ def method2
18
+ method3
19
+ end
20
+
21
+ def method3
22
+ sleep(2)
23
+ @result = RubyProf.stop
24
+ end
25
+
26
+ def test_extra_stop_should_raise
27
+ RubyProf.start
28
+ assert_raises(RuntimeError) do
29
+ RubyProf.start
30
+ end
31
+
32
+ assert_raises(RuntimeError) do
33
+ RubyProf.profile {}
34
+ end
35
+
36
+ RubyProf.stop # ok
37
+ assert_raises(RuntimeError) do
38
+ RubyProf.stop
39
+ end
40
+ end
41
+
42
+ def test_different_methods
43
+ method1
44
+
45
+ # Ruby prof should be stopped
46
+ assert_equal(false, RubyProf.running?)
47
+
48
+ methods = @result.threads.first.methods.sort.reverse
49
+ assert_equal(4, methods.length)
50
+
51
+ method = methods[0]
52
+ assert_equal('StartStopTest#method1', method.full_name)
53
+ assert_equal(1, method.called)
54
+ assert_in_delta(2, method.total_time, 0.05)
55
+ assert_in_delta(0, method.wait_time, 0.02)
56
+ assert_in_delta(0, method.self_time, 0.02)
57
+ assert_in_delta(2, method.children_time, 0.05)
58
+
59
+ assert_equal(1, method.call_trees.callees.length)
60
+ call_tree = method.call_trees.callees[0]
61
+ assert_equal('StartStopTest#method2', call_tree.target.full_name)
62
+
63
+ method = methods[1]
64
+ assert_equal('StartStopTest#method2', method.full_name)
65
+ assert_equal(1, method.called)
66
+ assert_in_delta(2, method.total_time, 0.05)
67
+ assert_in_delta(0, method.wait_time, 0.02)
68
+ assert_in_delta(0, method.self_time, 0.02)
69
+ assert_in_delta(2, method.children_time, 0.05)
70
+
71
+ assert_equal(1, method.call_trees.callers.length)
72
+ call_tree = method.call_trees.callers[0]
73
+ assert_equal('StartStopTest#method1', call_tree.parent.target.full_name)
74
+
75
+ assert_equal(1, method.call_trees.callees.length)
76
+ call_tree = method.call_trees.callees[0]
77
+ assert_equal('StartStopTest#method3', call_tree.target.full_name)
78
+
79
+ method = methods[2]
80
+ assert_equal('StartStopTest#method3', method.full_name)
81
+ assert_equal(1, method.called)
82
+ assert_in_delta(2, method.total_time, 0.02)
83
+ assert_in_delta(0, method.wait_time, 0.02)
84
+ assert_in_delta(0, method.self_time, 0.02)
85
+ assert_in_delta(2, method.children_time, 0.02)
86
+
87
+ assert_equal(1, method.call_trees.callers.length)
88
+ call_tree = method.call_trees.callers[0]
89
+ assert_equal('StartStopTest#method2', call_tree.parent.target.full_name)
90
+
91
+ assert_equal(1, method.call_trees.callees.length)
92
+ call_tree = method.call_trees.callees[0]
93
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
94
+
95
+ method = methods[3]
96
+ assert_equal('Kernel#sleep', method.full_name)
97
+ assert_equal(1, method.called)
98
+ assert_in_delta(2, method.total_time, 0.02)
99
+ assert_in_delta(0, method.wait_time, 0.02)
100
+ assert_in_delta(2, method.self_time, 0.02)
101
+ assert_in_delta(0, method.children_time, 0.02)
102
+
103
+ assert_equal(1, method.call_trees.callers.length)
104
+ call_tree = method.call_trees.callers[0]
105
+ assert_equal('StartStopTest#method3', call_tree.parent.target.full_name)
106
+
107
+ assert_equal(0, method.call_trees.callees.length)
108
+ end
109
+ end
@@ -1,115 +1,13 @@
1
- # encoding: UTF-8
2
-
3
- # Make RubyMine happy
4
- require "rubygems"
5
- gem "minitest"
6
-
7
- if ENV["RM_INFO"] || ENV["TEAMCITY_VERSION"]
8
- if RUBY_PLATFORM =~ /(win32|mingw)/
9
- gem "win32console"
10
- end
11
- gem "minitest-reporters"
12
- require 'minitest/reporters'
13
- MiniTest::Reporters.use!
14
- end
15
-
16
- require "minitest/pride"
17
-
18
- # To make testing/debugging easier, test within this source tree versus an installed gem
19
- dir = File.dirname(__FILE__)
20
- root = File.expand_path(File.join(dir, '..'))
21
- lib = File.expand_path(File.join(root, 'lib'))
22
- ext = File.expand_path(File.join(root, 'ext', 'ruby_prof'))
23
-
24
- $LOAD_PATH << lib
25
- $LOAD_PATH << ext
26
-
27
- require 'ruby-prof'
28
- require 'test/unit'
29
- require File.expand_path('../prime', __FILE__)
30
-
31
- # Some classes used in measurement tests
32
- module RubyProf
33
- class C1
34
- def C1.hello
35
- sleep(0.1)
36
- end
37
-
38
- def hello
39
- sleep(0.2)
40
- end
41
- end
42
-
43
- module M1
44
- def hello
45
- sleep(0.3)
46
- end
47
- end
48
-
49
- class C2
50
- include M1
51
- extend M1
52
- end
53
-
54
- class C3
55
- def hello
56
- sleep(0.4)
57
- end
58
- end
59
-
60
- module M4
61
- def hello
62
- sleep(0.5)
63
- end
64
- end
65
-
66
- module M5
67
- include M4
68
- def goodbye
69
- hello
70
- end
71
- end
72
-
73
- class C6
74
- include M5
75
- def test
76
- goodbye
77
- end
78
- end
79
-
80
- def self.ruby_major_version
81
- match = RUBY_VERSION.match(/(\d)\.(\d)/)
82
- return Integer(match[1])
83
- end
84
-
85
- def self.ruby_minor_version
86
- match = RUBY_VERSION.match(/(\d)\.(\d)/)
87
- return Integer(match[2])
88
- end
89
-
90
- def self.parent_object
91
- if ruby_major_version == 1 && ruby_minor_version == 8
92
- Object
93
- else
94
- BasicObject
95
- end
96
- end
97
-
98
- def self.ruby_2?
99
- ruby_major_version == 2
100
- end
101
-
102
- # store printer output in this directory
103
- def self.tmpdir
104
- File.expand_path('../../tmp', __FILE__)
105
- end
106
- end
107
-
108
- module MemoryTestHelper
109
- def memory_test_helper
110
- result = RubyProf.profile {Array.new}
111
- total = result.threads.first.methods.inject(0) { |sum, m| sum + m.total_time }
112
- assert(total < 1_000_000, 'Total should not have subtract overflow error')
113
- total
114
- end
115
- end
1
+ # encoding: UTF-8
2
+
3
+ # Disable minitest parallel tests. The problem is the thread switching will change test results
4
+ # (self vs wait time)
5
+ ENV["N"] = "0" # Older versions of minitest
6
+ ENV["MT_CPU"] = "0" # Newer versions minitest
7
+
8
+ require 'bundler/setup'
9
+ require 'minitest/autorun'
10
+ require 'ruby-prof'
11
+
12
+ class TestCase < Minitest::Test
13
+ end