ruby-prof 0.17.0 → 0.18.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 (185) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +500 -482
  3. data/LICENSE +24 -24
  4. data/README.rdoc +487 -485
  5. data/Rakefile +113 -113
  6. data/bin/ruby-prof +345 -345
  7. data/bin/ruby-prof-check-trace +45 -45
  8. data/examples/flat.txt +50 -50
  9. data/examples/graph.dot +84 -84
  10. data/examples/graph.html +823 -823
  11. data/examples/graph.txt +139 -139
  12. data/examples/multi.flat.txt +23 -23
  13. data/examples/multi.graph.html +760 -760
  14. data/examples/multi.grind.dat +114 -114
  15. data/examples/multi.stack.html +547 -547
  16. data/examples/stack.html +547 -547
  17. data/ext/ruby_prof/extconf.rb +68 -68
  18. data/ext/ruby_prof/rp_call_info.c +425 -425
  19. data/ext/ruby_prof/rp_call_info.h +53 -53
  20. data/ext/ruby_prof/rp_measure.c +40 -40
  21. data/ext/ruby_prof/rp_measure.h +45 -45
  22. data/ext/ruby_prof/rp_measure_allocations.c +76 -76
  23. data/ext/ruby_prof/rp_measure_cpu_time.c +136 -136
  24. data/ext/ruby_prof/rp_measure_gc_runs.c +73 -73
  25. data/ext/ruby_prof/rp_measure_gc_time.c +60 -60
  26. data/ext/ruby_prof/rp_measure_memory.c +77 -77
  27. data/ext/ruby_prof/rp_measure_process_time.c +71 -71
  28. data/ext/ruby_prof/rp_measure_wall_time.c +45 -45
  29. data/ext/ruby_prof/rp_method.c +630 -636
  30. data/ext/ruby_prof/rp_method.h +75 -75
  31. data/ext/ruby_prof/rp_stack.c +173 -173
  32. data/ext/ruby_prof/rp_stack.h +63 -63
  33. data/ext/ruby_prof/rp_thread.c +277 -276
  34. data/ext/ruby_prof/rp_thread.h +27 -27
  35. data/ext/ruby_prof/ruby_prof.c +794 -774
  36. data/ext/ruby_prof/ruby_prof.h +60 -59
  37. data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
  38. data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +31 -0
  39. data/lib/ruby-prof.rb +68 -68
  40. data/lib/ruby-prof/aggregate_call_info.rb +76 -76
  41. data/lib/ruby-prof/assets/call_stack_printer.css.html +116 -116
  42. data/lib/ruby-prof/assets/call_stack_printer.js.html +384 -384
  43. data/lib/ruby-prof/call_info.rb +115 -115
  44. data/lib/ruby-prof/call_info_visitor.rb +40 -40
  45. data/lib/ruby-prof/compatibility.rb +179 -178
  46. data/lib/ruby-prof/method_info.rb +121 -121
  47. data/lib/ruby-prof/printers/abstract_printer.rb +104 -103
  48. data/lib/ruby-prof/printers/call_info_printer.rb +41 -41
  49. data/lib/ruby-prof/printers/call_stack_printer.rb +265 -265
  50. data/lib/ruby-prof/printers/call_tree_printer.rb +143 -143
  51. data/lib/ruby-prof/printers/dot_printer.rb +132 -132
  52. data/lib/ruby-prof/printers/flat_printer.rb +70 -70
  53. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -83
  54. data/lib/ruby-prof/printers/graph_html_printer.rb +249 -249
  55. data/lib/ruby-prof/printers/graph_printer.rb +116 -116
  56. data/lib/ruby-prof/printers/multi_printer.rb +84 -84
  57. data/lib/ruby-prof/profile.rb +26 -26
  58. data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -201
  59. data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -49
  60. data/lib/ruby-prof/rack.rb +174 -174
  61. data/lib/ruby-prof/task.rb +147 -147
  62. data/lib/ruby-prof/thread.rb +35 -35
  63. data/lib/ruby-prof/version.rb +3 -3
  64. data/lib/unprof.rb +10 -10
  65. data/ruby-prof.gemspec +58 -58
  66. data/test/abstract_printer_test.rb +53 -0
  67. data/test/aggregate_test.rb +136 -136
  68. data/test/basic_test.rb +128 -128
  69. data/test/block_test.rb +74 -74
  70. data/test/call_info_test.rb +78 -78
  71. data/test/call_info_visitor_test.rb +31 -31
  72. data/test/duplicate_names_test.rb +32 -32
  73. data/test/dynamic_method_test.rb +55 -55
  74. data/test/enumerable_test.rb +21 -21
  75. data/test/exceptions_test.rb +24 -16
  76. data/test/exclude_methods_test.rb +146 -146
  77. data/test/exclude_threads_test.rb +53 -53
  78. data/test/fiber_test.rb +79 -79
  79. data/test/issue137_test.rb +63 -63
  80. data/test/line_number_test.rb +80 -80
  81. data/test/measure_allocations_test.rb +26 -26
  82. data/test/measure_cpu_time_test.rb +212 -213
  83. data/test/measure_gc_runs_test.rb +32 -32
  84. data/test/measure_gc_time_test.rb +36 -36
  85. data/test/measure_memory_test.rb +33 -33
  86. data/test/measure_process_time_test.rb +61 -63
  87. data/test/measure_wall_time_test.rb +255 -255
  88. data/test/method_elimination_test.rb +84 -84
  89. data/test/module_test.rb +45 -45
  90. data/test/multi_printer_test.rb +104 -104
  91. data/test/no_method_class_test.rb +15 -15
  92. data/test/pause_resume_test.rb +166 -166
  93. data/test/prime.rb +54 -54
  94. data/test/printers_test.rb +275 -275
  95. data/test/printing_recursive_graph_test.rb +127 -127
  96. data/test/rack_test.rb +157 -157
  97. data/test/recursive_test.rb +215 -215
  98. data/test/singleton_test.rb +38 -38
  99. data/test/stack_printer_test.rb +77 -78
  100. data/test/stack_test.rb +138 -138
  101. data/test/start_stop_test.rb +112 -112
  102. data/test/test_helper.rb +267 -275
  103. data/test/thread_test.rb +187 -187
  104. data/test/unique_call_path_test.rb +202 -202
  105. data/test/yarv_test.rb +55 -55
  106. metadata +17 -96
  107. data/doc/LICENSE.html +0 -115
  108. data/doc/README_rdoc.html +0 -637
  109. data/doc/Rack.html +0 -96
  110. data/doc/Rack/RubyProf.html +0 -233
  111. data/doc/Rack/RubyProf/RackProfiler.html +0 -343
  112. data/doc/RubyProf.html +0 -974
  113. data/doc/RubyProf/AbstractPrinter.html +0 -625
  114. data/doc/RubyProf/AggregateCallInfo.html +0 -552
  115. data/doc/RubyProf/CallInfo.html +0 -579
  116. data/doc/RubyProf/CallInfoPrinter.html +0 -121
  117. data/doc/RubyProf/CallInfoVisitor.html +0 -199
  118. data/doc/RubyProf/CallStackPrinter.html +0 -1127
  119. data/doc/RubyProf/CallTreePrinter.html +0 -725
  120. data/doc/RubyProf/Cmd.html +0 -637
  121. data/doc/RubyProf/DeprecationWarnings.html +0 -148
  122. data/doc/RubyProf/DotPrinter.html +0 -258
  123. data/doc/RubyProf/FlatPrinter.html +0 -164
  124. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -210
  125. data/doc/RubyProf/GraphHtmlPrinter.html +0 -558
  126. data/doc/RubyProf/GraphPrinter.html +0 -140
  127. data/doc/RubyProf/MethodInfo.html +0 -676
  128. data/doc/RubyProf/MultiPrinter.html +0 -574
  129. data/doc/RubyProf/Profile.html +0 -908
  130. data/doc/RubyProf/Profile/ExcludeCommonMethods.html +0 -411
  131. data/doc/RubyProf/Profile/LegacyMethodElimination.html +0 -158
  132. data/doc/RubyProf/ProfileTask.html +0 -491
  133. data/doc/RubyProf/Thread.html +0 -275
  134. data/doc/created.rid +0 -33
  135. data/doc/css/fonts.css +0 -167
  136. data/doc/css/rdoc.css +0 -590
  137. data/doc/examples/flat_txt.html +0 -139
  138. data/doc/examples/graph_html.html +0 -910
  139. data/doc/examples/graph_txt.html +0 -248
  140. data/doc/fonts/Lato-Light.ttf +0 -0
  141. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  142. data/doc/fonts/Lato-Regular.ttf +0 -0
  143. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  144. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  145. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  146. data/doc/images/add.png +0 -0
  147. data/doc/images/arrow_up.png +0 -0
  148. data/doc/images/brick.png +0 -0
  149. data/doc/images/brick_link.png +0 -0
  150. data/doc/images/bug.png +0 -0
  151. data/doc/images/bullet_black.png +0 -0
  152. data/doc/images/bullet_toggle_minus.png +0 -0
  153. data/doc/images/bullet_toggle_plus.png +0 -0
  154. data/doc/images/date.png +0 -0
  155. data/doc/images/delete.png +0 -0
  156. data/doc/images/find.png +0 -0
  157. data/doc/images/loadingAnimation.gif +0 -0
  158. data/doc/images/macFFBgHack.png +0 -0
  159. data/doc/images/package.png +0 -0
  160. data/doc/images/page_green.png +0 -0
  161. data/doc/images/page_white_text.png +0 -0
  162. data/doc/images/page_white_width.png +0 -0
  163. data/doc/images/plugin.png +0 -0
  164. data/doc/images/ruby.png +0 -0
  165. data/doc/images/tag_blue.png +0 -0
  166. data/doc/images/tag_green.png +0 -0
  167. data/doc/images/transparent.png +0 -0
  168. data/doc/images/wrench.png +0 -0
  169. data/doc/images/wrench_orange.png +0 -0
  170. data/doc/images/zoom.png +0 -0
  171. data/doc/index.html +0 -666
  172. data/doc/js/darkfish.js +0 -161
  173. data/doc/js/jquery.js +0 -4
  174. data/doc/js/navigation.js +0 -142
  175. data/doc/js/navigation.js.gz +0 -0
  176. data/doc/js/search.js +0 -109
  177. data/doc/js/search_index.js +0 -1
  178. data/doc/js/search_index.js.gz +0 -0
  179. data/doc/js/searcher.js +0 -229
  180. data/doc/js/searcher.js.gz +0 -0
  181. data/doc/table_of_contents.html +0 -1052
  182. data/examples/cachegrind.out.1 +0 -114
  183. data/examples/cachegrind.out.1.32313213 +0 -114
  184. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
  185. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
@@ -1,275 +1,275 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'stringio'
6
- require 'fileutils'
7
-
8
- # -- Tests ----
9
- class PrintersTest < TestCase
10
- def setup
11
- # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
12
- RubyProf::measure_mode = RubyProf::WALL_TIME
13
- @result = RubyProf.profile do
14
- run_primes(1000, 5000)
15
- end
16
- end
17
-
18
- def test_printers
19
- assert_nothing_raised do
20
- output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new('')
21
-
22
- printer = RubyProf::CallInfoPrinter.new(@result)
23
- printer.print(output)
24
-
25
- printer = RubyProf::CallTreePrinter.new(@result)
26
- printer.print()
27
-
28
- printer = RubyProf::FlatPrinter.new(@result)
29
- printer.print(output)
30
-
31
- printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
32
- printer.print(output)
33
-
34
- printer = RubyProf::GraphHtmlPrinter.new(@result)
35
- printer.print(output)
36
-
37
- printer = RubyProf::GraphPrinter.new(@result)
38
- printer.print(output)
39
- end
40
- end
41
-
42
- def test_print_to_files
43
- assert_nothing_raised do
44
- output_dir = 'examples2'
45
-
46
- if ENV['SAVE_NEW_PRINTER_EXAMPLES']
47
- output_dir = 'examples'
48
- end
49
- FileUtils.mkdir_p output_dir
50
-
51
- printer = RubyProf::DotPrinter.new(@result)
52
- File.open("#{output_dir}/graph.dot", "w") {|f| printer.print(f)}
53
-
54
- printer = RubyProf::CallStackPrinter.new(@result)
55
- File.open("#{output_dir}/stack.html", "w") {|f| printer.print(f, :application => "primes")}
56
-
57
- printer = RubyProf::MultiPrinter.new(@result)
58
- printer.print(:path => "#{output_dir}", :profile => "multi", :application => "primes")
59
- for file in ['graph.dot', 'multi.flat.txt', 'multi.graph.html', "multi.callgrind.out.#{$$}", 'multi.stack.html', 'stack.html']
60
- existant_file = output_dir + '/' + file
61
- assert File.size(existant_file) > 0
62
- end
63
- end
64
- end
65
-
66
- def test_refuses_io_objects
67
- p = RubyProf::MultiPrinter.new(@result)
68
- begin
69
- p.print(STDOUT)
70
- flunk "should have raised an ArgumentError"
71
- rescue ArgumentError => e
72
- assert_match(/IO/, e.to_s)
73
- end
74
- end
75
-
76
- def test_refuses_non_hashes
77
- p = RubyProf::MultiPrinter.new (@result)
78
- begin
79
- p.print([])
80
- flunk "should have raised an ArgumentError"
81
- rescue ArgumentError => e
82
- assert_match(/hash/, e.to_s)
83
- end
84
- end
85
-
86
- def test_flat_string
87
- output = helper_test_flat_string(RubyProf::FlatPrinter)
88
- refute_match(/prime.rb/, output)
89
- end
90
-
91
- def helper_test_flat_string(klass)
92
- output = ''
93
-
94
- printer = klass.new(@result)
95
- printer.print(output)
96
-
97
- assert_match(/Thread ID: -?\d+/i, output)
98
- assert_match(/Fiber ID: -?\d+/i, output)
99
- assert_match(/Total: \d+\.\d+/i, output)
100
- assert_match(/Object#run_primes/i, output)
101
- output
102
- end
103
-
104
- def test_flat_string_with_numbers
105
- output = helper_test_flat_string RubyProf::FlatPrinterWithLineNumbers
106
- assert_match(/prime.rb/, output)
107
- refute_match(/ruby_runtime:0/, output)
108
- assert_match(/called from/, output)
109
-
110
- # should combine common parents
111
- # 1.9 inlines it's Fixnum#- so we don't see as many
112
- assert_equal(2, output.scan(/Object#is_prime/).length)
113
- refute_match(/\.\/test\/prime.rb/, output) # don't use relative paths
114
- end
115
-
116
- def test_graph_html_string
117
- output = ''
118
- printer = RubyProf::GraphHtmlPrinter.new(@result)
119
- printer.print(output)
120
-
121
- assert_match(/DTD HTML 4\.01/i, output)
122
- assert_match( %r{<th>Total Time</th>}i, output)
123
- assert_match(/Object#run_primes/i, output)
124
- end
125
-
126
- def test_graph_string
127
- output = ''
128
- printer = RubyProf::GraphPrinter.new(@result)
129
- printer.print(output)
130
-
131
- assert_match(/Thread ID: -?\d+/i, output)
132
- assert_match(/Fiber ID: -?\d+/i, output)
133
- assert_match(/Total Time: \d+\.\d+/i, output)
134
- assert_match(/Object#run_primes/i, output)
135
- end
136
-
137
- def test_call_tree_string
138
- printer = RubyProf::CallTreePrinter.new(@result)
139
- printer.print(:profile => "lolcat", :path => RubyProf.tmpdir)
140
- main_output_file_name = File.join(RubyProf.tmpdir, "lolcat.callgrind.out.#{$$}")
141
- assert(File.exist?(main_output_file_name))
142
- output = File.read(main_output_file_name)
143
- assert_match(/fn=Object::find_primes/i, output)
144
- assert_match(/events: wall_time/i, output)
145
- refute_match(/d\d\d\d\d\d/, output) # old bug looked [in error] like Object::run_primes(d5833116)
146
- end
147
-
148
- def do_nothing
149
- start = Time.now
150
- while(Time.now == start)
151
- end
152
- end
153
-
154
- def test_all_with_small_percentiles
155
- result = RubyProf.profile do
156
- sleep 2
157
- do_nothing
158
- end
159
-
160
- # RubyProf::CallTreePrinter doesn't "do" a min_percent
161
- # RubyProf::FlatPrinter only outputs if self time > percent...
162
- # RubyProf::FlatPrinterWithLineNumbers same
163
- for klass in [ RubyProf::GraphPrinter, RubyProf::GraphHtmlPrinter]
164
- printer = klass.new(result)
165
- out = ''
166
- printer.print(out, :min_percent => 0.00000001)
167
- assert_match(/do_nothing/, out)
168
- end
169
-
170
- end
171
-
172
- def test_flat_result_sorting_by_self_time_is_default
173
- printer = RubyProf::FlatPrinter.new(@result)
174
-
175
- printer.print(output = '')
176
- self_times = flat_output_nth_column_values(output, 3)
177
-
178
- assert_sorted self_times
179
- end
180
-
181
- def test_flat_result_sorting
182
- printer = RubyProf::FlatPrinter.new(@result)
183
-
184
- sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
185
-
186
- sort_method_with_column_number.each_pair do |sort_method, n|
187
- printer.print(output = '', :sort_method => sort_method)
188
- times = flat_output_nth_column_values(output, n)
189
- assert_sorted times
190
- end
191
- end
192
-
193
- def test_flat_result_with_line_numbers_sorting_by_self_time_is_default
194
- printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
195
-
196
- printer.print(output = '')
197
- self_times = flat_output_nth_column_values(output, 3)
198
-
199
- assert_sorted self_times
200
- end
201
-
202
- def test_flat_with_line_numbers_result_sorting
203
- printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
204
-
205
- sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
206
-
207
- sort_method_with_column_number.each_pair do |sort_method, n|
208
- printer.print(output = '', :sort_method => sort_method)
209
- times = flat_output_nth_column_values(output, n)
210
- assert_sorted times
211
- end
212
- end
213
-
214
- def test_graph_result_sorting_by_total_time_is_default
215
- printer = RubyProf::GraphPrinter.new(@result)
216
- printer.print(output = '')
217
- total_times = graph_output_nth_column_values(output, 3)
218
-
219
- assert_sorted total_times
220
- end
221
-
222
- def test_graph_results_sorting
223
- printer = RubyProf::GraphPrinter.new(@result)
224
-
225
- sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
226
-
227
- sort_method_with_column_number.each_pair do |sort_method, n|
228
- printer.print(output = '', :sort_method => sort_method)
229
- times = graph_output_nth_column_values(output, n)
230
- assert_sorted times
231
- end
232
- end
233
-
234
- def test_graph_html_result_sorting_by_total_time_is_default
235
- printer = RubyProf::GraphHtmlPrinter.new(@result)
236
- printer.print(output = '')
237
- total_times = graph_html_output_nth_column_values(output, 3)
238
-
239
- assert_sorted total_times
240
- end
241
-
242
- def test_graph_html_result_sorting
243
- printer = RubyProf::GraphHtmlPrinter.new(@result)
244
-
245
- sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
246
-
247
- sort_method_with_column_number.each_pair do |sort_method, n|
248
- printer.print(output = '', :sort_method => sort_method)
249
- times = graph_html_output_nth_column_values(output, n)
250
- assert_sorted times
251
- end
252
- end
253
-
254
- private
255
- def flat_output_nth_column_values(output, n)
256
- only_method_calls = output.split("\n").select { |line| line =~ /^ +\d+/ }
257
- only_method_calls.collect { |line| line.split(/ +/)[n] }
258
- end
259
-
260
- def graph_output_nth_column_values(output, n)
261
- only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
262
- only_root_calls.collect { |line| line.split(/ +/)[n] }
263
- end
264
-
265
- def graph_html_output_nth_column_values(output, n)
266
- only_root_calls = output.split('<tr class="method">')
267
- only_root_calls.delete_at(0)
268
- only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
269
- end
270
-
271
- def assert_sorted array
272
- array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
273
- assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
274
- end
275
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'stringio'
6
+ require 'fileutils'
7
+
8
+ # -- Tests ----
9
+ class PrintersTest < TestCase
10
+ def setup
11
+ # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
12
+ RubyProf::measure_mode = RubyProf::WALL_TIME
13
+ @result = RubyProf.profile do
14
+ run_primes(1000, 5000)
15
+ end
16
+ end
17
+
18
+ def test_printers
19
+ assert_nothing_raised do
20
+ output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new('')
21
+
22
+ printer = RubyProf::CallInfoPrinter.new(@result)
23
+ printer.print(output)
24
+
25
+ printer = RubyProf::CallTreePrinter.new(@result)
26
+ printer.print()
27
+
28
+ printer = RubyProf::FlatPrinter.new(@result)
29
+ printer.print(output)
30
+
31
+ printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
32
+ printer.print(output)
33
+
34
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
35
+ printer.print(output)
36
+
37
+ printer = RubyProf::GraphPrinter.new(@result)
38
+ printer.print(output)
39
+ end
40
+ end
41
+
42
+ def test_print_to_files
43
+ assert_nothing_raised do
44
+ output_dir = 'examples2'
45
+
46
+ if ENV['SAVE_NEW_PRINTER_EXAMPLES']
47
+ output_dir = 'examples'
48
+ end
49
+ FileUtils.mkdir_p output_dir
50
+
51
+ printer = RubyProf::DotPrinter.new(@result)
52
+ File.open("#{output_dir}/graph.dot", "w") {|f| printer.print(f)}
53
+
54
+ printer = RubyProf::CallStackPrinter.new(@result)
55
+ File.open("#{output_dir}/stack.html", "w") {|f| printer.print(f, :application => "primes")}
56
+
57
+ printer = RubyProf::MultiPrinter.new(@result)
58
+ printer.print(:path => "#{output_dir}", :profile => "multi", :application => "primes")
59
+ for file in ['graph.dot', 'multi.flat.txt', 'multi.graph.html', "multi.callgrind.out.#{$$}", 'multi.stack.html', 'stack.html']
60
+ existant_file = output_dir + '/' + file
61
+ assert File.size(existant_file) > 0
62
+ end
63
+ end
64
+ end
65
+
66
+ def test_refuses_io_objects
67
+ p = RubyProf::MultiPrinter.new(@result)
68
+ begin
69
+ p.print(STDOUT)
70
+ flunk "should have raised an ArgumentError"
71
+ rescue ArgumentError => e
72
+ assert_match(/IO/, e.to_s)
73
+ end
74
+ end
75
+
76
+ def test_refuses_non_hashes
77
+ p = RubyProf::MultiPrinter.new (@result)
78
+ begin
79
+ p.print([])
80
+ flunk "should have raised an ArgumentError"
81
+ rescue ArgumentError => e
82
+ assert_match(/hash/, e.to_s)
83
+ end
84
+ end
85
+
86
+ def test_flat_string
87
+ output = helper_test_flat_string(RubyProf::FlatPrinter)
88
+ refute_match(/prime.rb/, output)
89
+ end
90
+
91
+ def helper_test_flat_string(klass)
92
+ output = ''
93
+
94
+ printer = klass.new(@result)
95
+ printer.print(output)
96
+
97
+ assert_match(/Thread ID: -?\d+/i, output)
98
+ assert_match(/Fiber ID: -?\d+/i, output)
99
+ assert_match(/Total: \d+\.\d+/i, output)
100
+ assert_match(/Object#run_primes/i, output)
101
+ output
102
+ end
103
+
104
+ def test_flat_string_with_numbers
105
+ output = helper_test_flat_string RubyProf::FlatPrinterWithLineNumbers
106
+ assert_match(/prime.rb/, output)
107
+ refute_match(/ruby_runtime:0/, output)
108
+ assert_match(/called from/, output)
109
+
110
+ # should combine common parents
111
+ # 1.9 inlines it's Fixnum#- so we don't see as many
112
+ assert_equal(2, output.scan(/Object#is_prime/).length)
113
+ refute_match(/\.\/test\/prime.rb/, output) # don't use relative paths
114
+ end
115
+
116
+ def test_graph_html_string
117
+ output = ''
118
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
119
+ printer.print(output)
120
+
121
+ assert_match(/DTD HTML 4\.01/i, output)
122
+ assert_match( %r{<th>Total Time</th>}i, output)
123
+ assert_match(/Object#run_primes/i, output)
124
+ end
125
+
126
+ def test_graph_string
127
+ output = ''
128
+ printer = RubyProf::GraphPrinter.new(@result)
129
+ printer.print(output)
130
+
131
+ assert_match(/Thread ID: -?\d+/i, output)
132
+ assert_match(/Fiber ID: -?\d+/i, output)
133
+ assert_match(/Total Time: \d+\.\d+/i, output)
134
+ assert_match(/Object#run_primes/i, output)
135
+ end
136
+
137
+ def test_call_tree_string
138
+ printer = RubyProf::CallTreePrinter.new(@result)
139
+ printer.print(:profile => "lolcat", :path => RubyProf.tmpdir)
140
+ main_output_file_name = File.join(RubyProf.tmpdir, "lolcat.callgrind.out.#{$$}")
141
+ assert(File.exist?(main_output_file_name))
142
+ output = File.read(main_output_file_name)
143
+ assert_match(/fn=Object::find_primes/i, output)
144
+ assert_match(/events: wall_time/i, output)
145
+ refute_match(/d\d\d\d\d\d/, output) # old bug looked [in error] like Object::run_primes(d5833116)
146
+ end
147
+
148
+ def do_nothing
149
+ start = Time.now
150
+ while(Time.now == start)
151
+ end
152
+ end
153
+
154
+ def test_all_with_small_percentiles
155
+ result = RubyProf.profile do
156
+ sleep 2
157
+ do_nothing
158
+ end
159
+
160
+ # RubyProf::CallTreePrinter doesn't "do" a min_percent
161
+ # RubyProf::FlatPrinter only outputs if self time > percent...
162
+ # RubyProf::FlatPrinterWithLineNumbers same
163
+ for klass in [ RubyProf::GraphPrinter, RubyProf::GraphHtmlPrinter]
164
+ printer = klass.new(result)
165
+ out = ''
166
+ printer.print(out, :min_percent => 0.00000001)
167
+ assert_match(/do_nothing/, out)
168
+ end
169
+
170
+ end
171
+
172
+ def test_flat_result_sorting_by_self_time_is_default
173
+ printer = RubyProf::FlatPrinter.new(@result)
174
+
175
+ printer.print(output = '')
176
+ self_times = flat_output_nth_column_values(output, 3)
177
+
178
+ assert_sorted self_times
179
+ end
180
+
181
+ def test_flat_result_sorting
182
+ printer = RubyProf::FlatPrinter.new(@result)
183
+
184
+ sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
185
+
186
+ sort_method_with_column_number.each_pair do |sort_method, n|
187
+ printer.print(output = '', :sort_method => sort_method)
188
+ times = flat_output_nth_column_values(output, n)
189
+ assert_sorted times
190
+ end
191
+ end
192
+
193
+ def test_flat_result_with_line_numbers_sorting_by_self_time_is_default
194
+ printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
195
+
196
+ printer.print(output = '')
197
+ self_times = flat_output_nth_column_values(output, 3)
198
+
199
+ assert_sorted self_times
200
+ end
201
+
202
+ def test_flat_with_line_numbers_result_sorting
203
+ printer = RubyProf::FlatPrinterWithLineNumbers.new(@result)
204
+
205
+ sort_method_with_column_number = {:total_time => 2, :self_time => 3, :wait_time => 4, :children_time => 5}
206
+
207
+ sort_method_with_column_number.each_pair do |sort_method, n|
208
+ printer.print(output = '', :sort_method => sort_method)
209
+ times = flat_output_nth_column_values(output, n)
210
+ assert_sorted times
211
+ end
212
+ end
213
+
214
+ def test_graph_result_sorting_by_total_time_is_default
215
+ printer = RubyProf::GraphPrinter.new(@result)
216
+ printer.print(output = '')
217
+ total_times = graph_output_nth_column_values(output, 3)
218
+
219
+ assert_sorted total_times
220
+ end
221
+
222
+ def test_graph_results_sorting
223
+ printer = RubyProf::GraphPrinter.new(@result)
224
+
225
+ sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
226
+
227
+ sort_method_with_column_number.each_pair do |sort_method, n|
228
+ printer.print(output = '', :sort_method => sort_method)
229
+ times = graph_output_nth_column_values(output, n)
230
+ assert_sorted times
231
+ end
232
+ end
233
+
234
+ def test_graph_html_result_sorting_by_total_time_is_default
235
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
236
+ printer.print(output = '')
237
+ total_times = graph_html_output_nth_column_values(output, 3)
238
+
239
+ assert_sorted total_times
240
+ end
241
+
242
+ def test_graph_html_result_sorting
243
+ printer = RubyProf::GraphHtmlPrinter.new(@result)
244
+
245
+ sort_method_with_column_number = {:total_time => 3, :self_time => 4, :wait_time => 5, :children_time => 6}
246
+
247
+ sort_method_with_column_number.each_pair do |sort_method, n|
248
+ printer.print(output = '', :sort_method => sort_method)
249
+ times = graph_html_output_nth_column_values(output, n)
250
+ assert_sorted times
251
+ end
252
+ end
253
+
254
+ private
255
+ def flat_output_nth_column_values(output, n)
256
+ only_method_calls = output.split("\n").select { |line| line =~ /^ +\d+/ }
257
+ only_method_calls.collect { |line| line.split(/ +/)[n] }
258
+ end
259
+
260
+ def graph_output_nth_column_values(output, n)
261
+ only_root_calls = output.split("\n").select { |line| line =~ /^ +[\d\.]+%/ }
262
+ only_root_calls.collect { |line| line.split(/ +/)[n] }
263
+ end
264
+
265
+ def graph_html_output_nth_column_values(output, n)
266
+ only_root_calls = output.split('<tr class="method">')
267
+ only_root_calls.delete_at(0)
268
+ only_root_calls.collect {|line| line.scan(/[\d\.]+/)[n - 1] }
269
+ end
270
+
271
+ def assert_sorted array
272
+ array = array.map{|n| n.to_f} # allow for > 10s times to sort right, since lexographically 4.0 > 10.0
273
+ assert_equal array, array.sort.reverse, "Array #{array.inspect} is not sorted"
274
+ end
275
+ end