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,82 +1,71 @@
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 MSTPT
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 MultiPrinterTest < 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_all_profiles_can_be_created
36
- start_time = Time.now
37
- RubyProf.start
38
- 5.times{MSTPT.new.a}
39
- result = RubyProf.stop
40
- end_time = Time.now
41
- expected_time = end_time - start_time
42
- stack = graph = nil
43
- assert_nothing_raised { stack, graph = print(result) }
44
- re = Regexp.new('
45
- \s*<table>
46
- \s*<tr>
47
- \s*<th>Thread ID</th>
48
- \s*(<th>Fiber ID</th>)?
49
- \s*<th>Total Time</th>
50
- \s*</tr>
51
- \s*
52
- \s*<tr>
53
- \s*(<td>([\.0-9]+)</td>)?
54
- \s*<td><a href="#-?\d+">-?\d+</a></td>
55
- \s*<td>([\.0-9e]+)</td>
56
- \s*</tr>
57
- \s*
58
- \s*</table>')
59
- assert_match(re, graph)
60
- graph =~ re
61
- display_time = $4.to_f
62
- assert_in_delta expected_time, display_time, 0.001
63
- end
64
-
65
- private
66
- def print(result)
67
- test = caller.first =~ /in `(.*)'/ ? $1 : "test"
68
- path = RubyProf.tmpdir
69
- profile = "ruby_prof_#{test}"
70
- printer = RubyProf::MultiPrinter.new(result)
71
- printer.print(:path => path, :profile => profile,
72
- :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")
73
- if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
74
- system("open '#{printer.stack_profile}'")
75
- end
76
- if GC.respond_to?(:dump_file_and_line_info)
77
- GC.start
78
- GC.dump_file_and_line_info("heap.dump")
79
- end
80
- [File.read(printer.stack_profile), File.read(printer.graph_profile)]
81
- end
82
- 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 MSTPT
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 MultiPrinterTest < 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_refuses_io_objects
36
+ # we don't need a real profile for this test
37
+ p = RubyProf::MultiPrinter.new nil
38
+ begin
39
+ p.print(STDOUT)
40
+ flunk "should have raised an ArgumentError"
41
+ rescue ArgumentError => e
42
+ assert_match(/IO/, e.to_s)
43
+ end
44
+ end
45
+
46
+ def test_refuses_non_hashes
47
+ # we don't need a real profile for this test
48
+ p = RubyProf::MultiPrinter.new nil
49
+ begin
50
+ p.print([])
51
+ flunk "should have raised an ArgumentError"
52
+ rescue ArgumentError => e
53
+ assert_match(/hash/, e.to_s)
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def print(result)
60
+ test = caller.first =~ /in `(.*)'/ ? $1 : "test"
61
+ path = Dir.tmpdir
62
+ profile = "ruby_prof_#{test}"
63
+ printer = RubyProf::MultiPrinter.new(result)
64
+ printer.print(:path => path, :profile => profile,
65
+ :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")
66
+ if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
67
+ system("open '#{printer.stack_profile}'")
68
+ end
69
+ [File.read(printer.stack_profile), File.read(printer.graph_profile)]
70
+ end
71
+ end
@@ -1,15 +1,15 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- # Make sure this works with no class or method
7
- result = RubyProf.profile do
8
- sleep 1
9
- end
10
-
11
- methods = result.threads.first.methods
12
- global_method = methods.sort_by {|method| method.full_name}.first
13
- if global_method.full_name != 'Global#[No method]'
14
- raise(RuntimeError, "Wrong method name. Expected: Global#[No method]. Actual: #{global_method.full_name}")
15
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # Make sure this works with no class or method
7
+ result = RubyProf.profile do
8
+ sleep 1
9
+ end
10
+
11
+ methods = result.threads.first.methods
12
+ global_method = methods.sort_by {|method| method.full_name}.first
13
+ if global_method.full_name != 'Kernel#sleep'
14
+ raise(RuntimeError, "Wrong method name. Expected: Global#[No method]. Actual: #{global_method.full_name}")
15
+ end
@@ -1,166 +1,175 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class PauseResumeTest < 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 test_pause_resume
13
- # Measured
14
- RubyProf.start
15
- RubyProf::C1.hello
16
-
17
- # Not measured
18
- RubyProf.pause
19
- sleep 1
20
- RubyProf::C1.hello
21
-
22
- # Measured
23
- RubyProf.resume
24
- RubyProf::C1.hello
25
-
26
- result = RubyProf.stop
27
-
28
- # Length should be 3:
29
- # PauseResumeTest#test_pause_resume
30
- # <Class::RubyProf::C1>#hello
31
- # Kernel#sleep
32
-
33
- methods = result.threads.first.methods.sort_by {|method_info| method_info.full_name}
34
- # remove methods called by pause/resume
35
- called_methods = ['Array#include?', 'Fixnum#==', 'Kernel#respond_to?', 'Kernel#respond_to_missing?']
36
- methods.reject!{|m| called_methods.include?(m.full_name) }
37
- # TODO: fix pause/resume to not include those methods in the first place
38
- assert_equal(3, methods.length)
39
-
40
- # Check the names
41
- assert_equal('<Class::RubyProf::C1>#hello', methods[0].full_name)
42
- assert_equal('Kernel#sleep', methods[1].full_name)
43
- assert_equal('PauseResumeTest#test_pause_resume', methods[2].full_name)
44
-
45
- # Check times
46
- assert_in_delta(0.2, methods[0].total_time, 0.01)
47
- assert_in_delta(0, methods[0].wait_time, 0.01)
48
- assert_in_delta(0, methods[0].self_time, 0.01)
49
-
50
- assert_in_delta(0.2, methods[1].total_time, 0.01)
51
- assert_in_delta(0, methods[1].wait_time, 0.01)
52
- assert_in_delta(0.2, methods[1].self_time, 0.01)
53
-
54
- assert_in_delta(0.2, methods[2].total_time, 0.01)
55
- assert_in_delta(0, methods[2].wait_time, 0.01)
56
- assert_in_delta(0, methods[2].self_time, 0.01)
57
- end
58
-
59
- # pause/resume in the same frame
60
- def test_pause_resume_1
61
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
62
-
63
- profile.start
64
- method_1a
65
-
66
- profile.pause
67
- method_1b
68
-
69
- profile.resume
70
- method_1c
71
-
72
- result = profile.stop
73
- assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_1$/}[0].total_time, 0.05)
74
- end
75
- def method_1a; sleep 0.2 end
76
- def method_1b; sleep 1 end
77
- def method_1c; sleep 0.4 end
78
-
79
- # pause in parent frame, resume in child
80
- def test_pause_resume_2
81
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
82
-
83
- profile.start
84
- method_2a
85
-
86
- profile.pause
87
- sleep 0.5
88
- method_2b(profile)
89
-
90
- result = profile.stop
91
- assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_2$/}[0].total_time, 0.05)
92
- end
93
- def method_2a; sleep 0.2 end
94
- def method_2b(profile); sleep 0.5; profile.resume; sleep 0.4 end
95
-
96
- # pause in child frame, resume in parent
97
- def test_pause_resume_3
98
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
99
-
100
- profile.start
101
- method_3a(profile)
102
-
103
- sleep 0.5
104
- profile.resume
105
- method_3b
106
-
107
- result = profile.stop
108
- assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_3$/}[0].total_time, 0.05)
109
- end
110
- def method_3a(profile); sleep 0.2; profile.pause; sleep 0.5 end
111
- def method_3b; sleep 0.4 end
112
-
113
- def test_pause_seq
114
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
115
- profile.start ; assert !profile.paused?
116
- profile.pause ; assert profile.paused?
117
- profile.resume; assert !profile.paused?
118
- profile.pause ; assert profile.paused?
119
- profile.pause ; assert profile.paused?
120
- profile.resume; assert !profile.paused?
121
- profile.resume; assert !profile.paused?
122
- profile.stop ; assert !profile.paused?
123
- end
124
-
125
- def test_pause_block
126
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
127
- profile.start
128
- profile.pause
129
- assert profile.paused?
130
-
131
- times_block_invoked = 0
132
- retval= profile.resume{
133
- times_block_invoked += 1
134
- 120 + times_block_invoked
135
- }
136
- assert_equal 1, times_block_invoked
137
- assert profile.paused?
138
-
139
- assert_equal 121, retval, "resume() should return the result of the given block."
140
-
141
- profile.stop
142
- end
143
-
144
- def test_pause_block_with_error
145
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
146
- profile.start
147
- profile.pause
148
- assert profile.paused?
149
-
150
- begin
151
- profile.resume{ raise }
152
- flunk 'Exception expected.'
153
- rescue
154
- assert profile.paused?
155
- end
156
-
157
- profile.stop
158
- end
159
-
160
- def test_resume_when_not_paused
161
- profile = RubyProf::Profile.new(RubyProf::WALL_TIME,[])
162
- profile.start ; assert !profile.paused?
163
- profile.resume; assert !profile.paused?
164
- profile.stop ; assert !profile.paused?
165
- end
166
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require_relative 'measure_times'
6
+
7
+ class PauseResumeTest < TestCase
8
+ def setup
9
+ # Need to use wall time for this test due to the sleep calls
10
+ RubyProf::measure_mode = RubyProf::WALL_TIME
11
+ end
12
+
13
+ def test_pause_resume
14
+ # Measured
15
+ RubyProf.start
16
+ RubyProf::C1.sleep_wait
17
+
18
+ # Not measured
19
+ RubyProf.pause
20
+ sleep 1
21
+ RubyProf::C1.sleep_wait
22
+
23
+ # Measured
24
+ RubyProf.resume
25
+ RubyProf::C1.sleep_wait
26
+
27
+ result = RubyProf.stop
28
+
29
+ # Length should be 3:
30
+ # PauseResumeTest#test_pause_resume
31
+ # <Class::RubyProf::C1>#sleep_wait
32
+ # Kernel#sleep
33
+
34
+ methods = result.threads.first.methods.sort_by {|method_info| method_info.full_name}
35
+ # remove methods called by pause/resume
36
+ called_methods = ['Array#include?', 'Fixnum#==', 'Kernel#respond_to?', 'Kernel#respond_to_missing?']
37
+ methods.reject!{|m| called_methods.include?(m.full_name) }
38
+ # TODO: fix pause/resume to not include those methods in the first place
39
+ assert_equal(3, methods.length)
40
+
41
+ # Check the names
42
+ assert_equal('<Class::RubyProf::C1>#sleep_wait', methods[0].full_name)
43
+ assert_equal('Kernel#sleep', methods[1].full_name)
44
+ assert_equal('PauseResumeTest#test_pause_resume', methods[2].full_name)
45
+
46
+ # Check times
47
+ assert_in_delta(0.22, methods[0].total_time, 0.02)
48
+ assert_in_delta(0, methods[0].wait_time, 0.02)
49
+ assert_in_delta(0, methods[0].self_time, 0.02)
50
+
51
+ assert_in_delta(0.22, methods[1].total_time, 0.02)
52
+ assert_in_delta(0, methods[1].wait_time, 0.02)
53
+ assert_in_delta(0.22, methods[1].self_time, 0.02)
54
+
55
+ assert_in_delta(0.22, methods[2].total_time, 0.02)
56
+ assert_in_delta(0, methods[2].wait_time, 0.02)
57
+ assert_in_delta(0, methods[2].self_time, 0.02)
58
+ end
59
+
60
+ # pause/resume in the same frame
61
+ def test_pause_resume_1
62
+ profile = RubyProf::Profile.new
63
+
64
+ profile.start
65
+ method_1a
66
+
67
+ profile.pause
68
+ method_1b
69
+
70
+ profile.resume
71
+ method_1c
72
+
73
+ result = profile.stop
74
+ assert_in_delta(0.65, result.threads[0].methods.select {|m| m.full_name =~ /test_pause_resume_1$/}[0].total_time, 0.05)
75
+ end
76
+ def method_1a; sleep 0.22 end
77
+ def method_1b; sleep 1 end
78
+ def method_1c; sleep 0.4 end
79
+
80
+ # pause in parent frame, resume in child
81
+ def test_pause_resume_2
82
+ profile = RubyProf::Profile.new
83
+
84
+ profile.start
85
+ method_2a
86
+
87
+ profile.pause
88
+ sleep 0.5
89
+ method_2b(profile)
90
+
91
+ result = profile.stop
92
+ assert_in_delta(0.6, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_2$/}[0].total_time, 0.05)
93
+ end
94
+ def method_2a; sleep 0.22 end
95
+ def method_2b(profile); sleep 0.5; profile.resume; sleep 0.4 end
96
+
97
+ # pause in child frame, resume in parent
98
+ def test_pause_resume_3
99
+ profile = RubyProf::Profile.new
100
+
101
+ profile.start
102
+ method_3a(profile)
103
+
104
+ sleep 0.5
105
+ profile.resume
106
+ method_3b
107
+
108
+ result = profile.stop
109
+ assert_in_delta(0.65, result.threads[0].methods.select{|m| m.full_name =~ /test_pause_resume_3$/}[0].total_time, 0.05)
110
+ end
111
+
112
+ def method_3a(profile)
113
+ sleep 0.22
114
+ profile.pause
115
+ sleep 0.5
116
+ end
117
+
118
+ def method_3b
119
+ sleep 0.4
120
+ end
121
+
122
+ def test_pause_seq
123
+ profile = RubyProf::Profile.new
124
+ profile.start ; assert !profile.paused?
125
+ profile.pause ; assert profile.paused?
126
+ profile.resume; assert !profile.paused?
127
+ profile.pause ; assert profile.paused?
128
+ profile.pause ; assert profile.paused?
129
+ profile.resume; assert !profile.paused?
130
+ profile.resume; assert !profile.paused?
131
+ profile.stop ; assert !profile.paused?
132
+ end
133
+
134
+ def test_pause_block
135
+ profile = RubyProf::Profile.new
136
+ profile.start
137
+ profile.pause
138
+ assert profile.paused?
139
+
140
+ times_block_invoked = 0
141
+ retval= profile.resume{
142
+ times_block_invoked += 1
143
+ 120 + times_block_invoked
144
+ }
145
+ assert_equal 1, times_block_invoked
146
+ assert profile.paused?
147
+
148
+ assert_equal 121, retval, "resume() should return the result of the given block."
149
+
150
+ profile.stop
151
+ end
152
+
153
+ def test_pause_block_with_error
154
+ profile = RubyProf::Profile.new
155
+ profile.start
156
+ profile.pause
157
+ assert profile.paused?
158
+
159
+ begin
160
+ profile.resume{ raise }
161
+ flunk 'Exception expected.'
162
+ rescue
163
+ assert profile.paused?
164
+ end
165
+
166
+ profile.stop
167
+ end
168
+
169
+ def test_resume_when_not_paused
170
+ profile = RubyProf::Profile.new
171
+ profile.start ; assert !profile.paused?
172
+ profile.resume; assert !profile.paused?
173
+ profile.stop ; assert !profile.paused?
174
+ end
175
+ end