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.
- checksums.yaml +5 -5
- data/CHANGES +500 -482
- data/LICENSE +24 -24
- data/README.rdoc +487 -485
- data/Rakefile +113 -113
- data/bin/ruby-prof +345 -345
- data/bin/ruby-prof-check-trace +45 -45
- data/examples/flat.txt +50 -50
- data/examples/graph.dot +84 -84
- data/examples/graph.html +823 -823
- data/examples/graph.txt +139 -139
- data/examples/multi.flat.txt +23 -23
- data/examples/multi.graph.html +760 -760
- data/examples/multi.grind.dat +114 -114
- data/examples/multi.stack.html +547 -547
- data/examples/stack.html +547 -547
- data/ext/ruby_prof/extconf.rb +68 -68
- data/ext/ruby_prof/rp_call_info.c +425 -425
- data/ext/ruby_prof/rp_call_info.h +53 -53
- data/ext/ruby_prof/rp_measure.c +40 -40
- data/ext/ruby_prof/rp_measure.h +45 -45
- data/ext/ruby_prof/rp_measure_allocations.c +76 -76
- data/ext/ruby_prof/rp_measure_cpu_time.c +136 -136
- data/ext/ruby_prof/rp_measure_gc_runs.c +73 -73
- data/ext/ruby_prof/rp_measure_gc_time.c +60 -60
- data/ext/ruby_prof/rp_measure_memory.c +77 -77
- data/ext/ruby_prof/rp_measure_process_time.c +71 -71
- data/ext/ruby_prof/rp_measure_wall_time.c +45 -45
- data/ext/ruby_prof/rp_method.c +630 -636
- data/ext/ruby_prof/rp_method.h +75 -75
- data/ext/ruby_prof/rp_stack.c +173 -173
- data/ext/ruby_prof/rp_stack.h +63 -63
- data/ext/ruby_prof/rp_thread.c +277 -276
- data/ext/ruby_prof/rp_thread.h +27 -27
- data/ext/ruby_prof/ruby_prof.c +794 -774
- data/ext/ruby_prof/ruby_prof.h +60 -59
- data/ext/ruby_prof/vc/ruby_prof.sln +20 -21
- data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +31 -0
- data/lib/ruby-prof.rb +68 -68
- data/lib/ruby-prof/aggregate_call_info.rb +76 -76
- data/lib/ruby-prof/assets/call_stack_printer.css.html +116 -116
- data/lib/ruby-prof/assets/call_stack_printer.js.html +384 -384
- data/lib/ruby-prof/call_info.rb +115 -115
- data/lib/ruby-prof/call_info_visitor.rb +40 -40
- data/lib/ruby-prof/compatibility.rb +179 -178
- data/lib/ruby-prof/method_info.rb +121 -121
- data/lib/ruby-prof/printers/abstract_printer.rb +104 -103
- data/lib/ruby-prof/printers/call_info_printer.rb +41 -41
- data/lib/ruby-prof/printers/call_stack_printer.rb +265 -265
- data/lib/ruby-prof/printers/call_tree_printer.rb +143 -143
- data/lib/ruby-prof/printers/dot_printer.rb +132 -132
- data/lib/ruby-prof/printers/flat_printer.rb +70 -70
- data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +83 -83
- data/lib/ruby-prof/printers/graph_html_printer.rb +249 -249
- data/lib/ruby-prof/printers/graph_printer.rb +116 -116
- data/lib/ruby-prof/printers/multi_printer.rb +84 -84
- data/lib/ruby-prof/profile.rb +26 -26
- data/lib/ruby-prof/profile/exclude_common_methods.rb +207 -201
- data/lib/ruby-prof/profile/legacy_method_elimination.rb +50 -49
- data/lib/ruby-prof/rack.rb +174 -174
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +35 -35
- data/lib/ruby-prof/version.rb +3 -3
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +58 -58
- data/test/abstract_printer_test.rb +53 -0
- data/test/aggregate_test.rb +136 -136
- data/test/basic_test.rb +128 -128
- data/test/block_test.rb +74 -74
- data/test/call_info_test.rb +78 -78
- data/test/call_info_visitor_test.rb +31 -31
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +55 -55
- data/test/enumerable_test.rb +21 -21
- data/test/exceptions_test.rb +24 -16
- data/test/exclude_methods_test.rb +146 -146
- data/test/exclude_threads_test.rb +53 -53
- data/test/fiber_test.rb +79 -79
- data/test/issue137_test.rb +63 -63
- data/test/line_number_test.rb +80 -80
- data/test/measure_allocations_test.rb +26 -26
- data/test/measure_cpu_time_test.rb +212 -213
- data/test/measure_gc_runs_test.rb +32 -32
- data/test/measure_gc_time_test.rb +36 -36
- data/test/measure_memory_test.rb +33 -33
- data/test/measure_process_time_test.rb +61 -63
- data/test/measure_wall_time_test.rb +255 -255
- data/test/method_elimination_test.rb +84 -84
- data/test/module_test.rb +45 -45
- data/test/multi_printer_test.rb +104 -104
- data/test/no_method_class_test.rb +15 -15
- data/test/pause_resume_test.rb +166 -166
- data/test/prime.rb +54 -54
- data/test/printers_test.rb +275 -275
- data/test/printing_recursive_graph_test.rb +127 -127
- data/test/rack_test.rb +157 -157
- data/test/recursive_test.rb +215 -215
- data/test/singleton_test.rb +38 -38
- data/test/stack_printer_test.rb +77 -78
- data/test/stack_test.rb +138 -138
- data/test/start_stop_test.rb +112 -112
- data/test/test_helper.rb +267 -275
- data/test/thread_test.rb +187 -187
- data/test/unique_call_path_test.rb +202 -202
- data/test/yarv_test.rb +55 -55
- metadata +17 -96
- data/doc/LICENSE.html +0 -115
- data/doc/README_rdoc.html +0 -637
- data/doc/Rack.html +0 -96
- data/doc/Rack/RubyProf.html +0 -233
- data/doc/Rack/RubyProf/RackProfiler.html +0 -343
- data/doc/RubyProf.html +0 -974
- data/doc/RubyProf/AbstractPrinter.html +0 -625
- data/doc/RubyProf/AggregateCallInfo.html +0 -552
- data/doc/RubyProf/CallInfo.html +0 -579
- data/doc/RubyProf/CallInfoPrinter.html +0 -121
- data/doc/RubyProf/CallInfoVisitor.html +0 -199
- data/doc/RubyProf/CallStackPrinter.html +0 -1127
- data/doc/RubyProf/CallTreePrinter.html +0 -725
- data/doc/RubyProf/Cmd.html +0 -637
- data/doc/RubyProf/DeprecationWarnings.html +0 -148
- data/doc/RubyProf/DotPrinter.html +0 -258
- data/doc/RubyProf/FlatPrinter.html +0 -164
- data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -210
- data/doc/RubyProf/GraphHtmlPrinter.html +0 -558
- data/doc/RubyProf/GraphPrinter.html +0 -140
- data/doc/RubyProf/MethodInfo.html +0 -676
- data/doc/RubyProf/MultiPrinter.html +0 -574
- data/doc/RubyProf/Profile.html +0 -908
- data/doc/RubyProf/Profile/ExcludeCommonMethods.html +0 -411
- data/doc/RubyProf/Profile/LegacyMethodElimination.html +0 -158
- data/doc/RubyProf/ProfileTask.html +0 -491
- data/doc/RubyProf/Thread.html +0 -275
- data/doc/created.rid +0 -33
- data/doc/css/fonts.css +0 -167
- data/doc/css/rdoc.css +0 -590
- data/doc/examples/flat_txt.html +0 -139
- data/doc/examples/graph_html.html +0 -910
- data/doc/examples/graph_txt.html +0 -248
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -666
- data/doc/js/darkfish.js +0 -161
- data/doc/js/jquery.js +0 -4
- data/doc/js/navigation.js +0 -142
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +0 -109
- data/doc/js/search_index.js +0 -1
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +0 -229
- data/doc/js/searcher.js.gz +0 -0
- data/doc/table_of_contents.html +0 -1052
- data/examples/cachegrind.out.1 +0 -114
- data/examples/cachegrind.out.1.32313213 +0 -114
- data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
- data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
@@ -1,127 +1,127 @@
|
|
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
|
-
# --- code to be tested ---
|
9
|
-
module PRGT
|
10
|
-
extend self
|
11
|
-
|
12
|
-
def f(n)
|
13
|
-
n.times { sleep 0.1 }
|
14
|
-
end
|
15
|
-
|
16
|
-
def g(n)
|
17
|
-
n.times { sleep 0.2 }
|
18
|
-
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
2.times { f(2); g(4) }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# --- expected test output ---
|
26
|
-
=begin
|
27
|
-
Measure Mode: wall_time
|
28
|
-
Thread ID: 70238775664960
|
29
|
-
Fiber ID: 70238784046840
|
30
|
-
Total Time: 2.040249824523926
|
31
|
-
Sort by: total_time
|
32
|
-
|
33
|
-
%total %self total self wait child calls Name
|
34
|
-
--------------------------------------------------------------------------------
|
35
|
-
100.00% 0.00% 2.040 0.000 0.000 2.040 1 PrintingRecursiveGraphTest#setup
|
36
|
-
2.040 0.000 0.000 2.040 1/1 PRGT#run
|
37
|
-
--------------------------------------------------------------------------------
|
38
|
-
2.040 0.000 0.000 2.040 1/1 PrintingRecursiveGraphTest#setup
|
39
|
-
100.00% 0.00% 2.040 0.000 0.000 2.040 1 PRGT#run
|
40
|
-
2.040 0.000 0.000 2.040 1/5 Integer#times
|
41
|
-
--------------------------------------------------------------------------------
|
42
|
-
0.409 0.000 0.000 0.409 2/5 Prgt#f
|
43
|
-
1.631 0.000 0.000 1.631 2/5 PRGT#g
|
44
|
-
2.040 0.000 0.000 2.040 1/5 PRGT#run
|
45
|
-
100.00% 0.00% 2.040 0.000 0.000 2.040 5 *Integer#times
|
46
|
-
2.040 2.040 0.000 0.000 12/12 Kernel#sleep
|
47
|
-
1.631 0.000 0.000 1.631 2/2 PRGT#g
|
48
|
-
0.409 0.000 0.000 0.409 2/2 PRGT#f
|
49
|
-
--------------------------------------------------------------------------------
|
50
|
-
2.040 2.040 0.000 0.000 12/12 Integer#times
|
51
|
-
99.99% 99.99% 2.040 2.040 0.000 0.000 12 Kernel#sleep
|
52
|
-
--------------------------------------------------------------------------------
|
53
|
-
1.631 0.000 0.000 1.631 2/2 Integer#times
|
54
|
-
79.94% 0.00% 1.631 0.000 0.000 1.631 2 PRGT#g
|
55
|
-
1.631 0.000 0.000 1.631 2/5 Integer#times
|
56
|
-
--------------------------------------------------------------------------------
|
57
|
-
0.409 0.000 0.000 0.409 2/2 Integer#times
|
58
|
-
20.05% 0.00% 0.409 0.000 0.000 0.409 2 PRGT#f
|
59
|
-
0.409 0.000 0.000 0.409 2/5 Integer#times
|
60
|
-
|
61
|
-
* indicates recursively called methods
|
62
|
-
=end
|
63
|
-
|
64
|
-
class PrintingRecursiveGraphTest < TestCase
|
65
|
-
include PrinterTestHelper
|
66
|
-
|
67
|
-
def setup
|
68
|
-
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
69
|
-
RubyProf::measure_mode = RubyProf::WALL_TIME
|
70
|
-
@result = RubyProf.profile do
|
71
|
-
PRGT.run
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_printing_rescursive_graph
|
76
|
-
printer = RubyProf::GraphPrinter.new(@result)
|
77
|
-
|
78
|
-
buffer = ''
|
79
|
-
printer.print(StringIO.new(buffer))
|
80
|
-
|
81
|
-
puts buffer if ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1"
|
82
|
-
|
83
|
-
parsed_output = MetricsArray.parse(buffer)
|
84
|
-
|
85
|
-
assert( integer_times = parsed_output.metrics_for("*Integer#times") )
|
86
|
-
|
87
|
-
actual_parents = integer_times.parents.map(&:name)
|
88
|
-
expected_parents = %w(PRGT#f PRGT#g PRGT#run)
|
89
|
-
assert_equal expected_parents, actual_parents
|
90
|
-
|
91
|
-
actual_children = integer_times.children.map(&:name)
|
92
|
-
expected_children = %w(Kernel#sleep PRGT#g PRGT#f)
|
93
|
-
assert_equal expected_children, actual_children
|
94
|
-
|
95
|
-
assert( fp = integer_times.parent("PRGT#f") )
|
96
|
-
assert_in_delta(fp.total, fp.child, 0.01)
|
97
|
-
assert_equal("2/5", fp.calls)
|
98
|
-
|
99
|
-
assert( gp = integer_times.parent("PRGT#g") )
|
100
|
-
assert_in_delta(gp.total, gp.child, 0.01)
|
101
|
-
assert_equal("2/5", gp.calls)
|
102
|
-
|
103
|
-
assert( rp = integer_times.parent("PRGT#run") )
|
104
|
-
assert_in_delta(rp.total, rp.child, 0.01)
|
105
|
-
assert_equal("1/5", rp.calls)
|
106
|
-
|
107
|
-
assert_in_delta(4*fp.total, gp.total, 0.05)
|
108
|
-
assert_in_delta(fp.total + gp.total, rp.total, 0.05)
|
109
|
-
assert_in_delta(integer_times.metrics.total, rp.total, 0.05)
|
110
|
-
|
111
|
-
assert( fc = integer_times.child("PRGT#f") )
|
112
|
-
assert_in_delta(fc.total, fc.child, 0.01)
|
113
|
-
assert_equal("2/2", fc.calls)
|
114
|
-
|
115
|
-
assert( gc = integer_times.child("PRGT#g") )
|
116
|
-
assert_in_delta(gc.total, gc.child, 0.01)
|
117
|
-
assert_equal("2/2", gc.calls)
|
118
|
-
|
119
|
-
assert( ks = integer_times.child("Kernel#sleep") )
|
120
|
-
assert_in_delta(ks.total, ks.self_t, 0.01)
|
121
|
-
assert_equal("12/12", ks.calls)
|
122
|
-
|
123
|
-
assert_in_delta(4*fc.total, gc.total, 0.05)
|
124
|
-
assert_in_delta(fp.total + gc.total, ks.total, 0.05)
|
125
|
-
assert_in_delta(integer_times.metrics.total, ks.total, 0.05)
|
126
|
-
end
|
127
|
-
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
|
+
# --- code to be tested ---
|
9
|
+
module PRGT
|
10
|
+
extend self
|
11
|
+
|
12
|
+
def f(n)
|
13
|
+
n.times { sleep 0.1 }
|
14
|
+
end
|
15
|
+
|
16
|
+
def g(n)
|
17
|
+
n.times { sleep 0.2 }
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
2.times { f(2); g(4) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# --- expected test output ---
|
26
|
+
=begin
|
27
|
+
Measure Mode: wall_time
|
28
|
+
Thread ID: 70238775664960
|
29
|
+
Fiber ID: 70238784046840
|
30
|
+
Total Time: 2.040249824523926
|
31
|
+
Sort by: total_time
|
32
|
+
|
33
|
+
%total %self total self wait child calls Name
|
34
|
+
--------------------------------------------------------------------------------
|
35
|
+
100.00% 0.00% 2.040 0.000 0.000 2.040 1 PrintingRecursiveGraphTest#setup
|
36
|
+
2.040 0.000 0.000 2.040 1/1 PRGT#run
|
37
|
+
--------------------------------------------------------------------------------
|
38
|
+
2.040 0.000 0.000 2.040 1/1 PrintingRecursiveGraphTest#setup
|
39
|
+
100.00% 0.00% 2.040 0.000 0.000 2.040 1 PRGT#run
|
40
|
+
2.040 0.000 0.000 2.040 1/5 Integer#times
|
41
|
+
--------------------------------------------------------------------------------
|
42
|
+
0.409 0.000 0.000 0.409 2/5 Prgt#f
|
43
|
+
1.631 0.000 0.000 1.631 2/5 PRGT#g
|
44
|
+
2.040 0.000 0.000 2.040 1/5 PRGT#run
|
45
|
+
100.00% 0.00% 2.040 0.000 0.000 2.040 5 *Integer#times
|
46
|
+
2.040 2.040 0.000 0.000 12/12 Kernel#sleep
|
47
|
+
1.631 0.000 0.000 1.631 2/2 PRGT#g
|
48
|
+
0.409 0.000 0.000 0.409 2/2 PRGT#f
|
49
|
+
--------------------------------------------------------------------------------
|
50
|
+
2.040 2.040 0.000 0.000 12/12 Integer#times
|
51
|
+
99.99% 99.99% 2.040 2.040 0.000 0.000 12 Kernel#sleep
|
52
|
+
--------------------------------------------------------------------------------
|
53
|
+
1.631 0.000 0.000 1.631 2/2 Integer#times
|
54
|
+
79.94% 0.00% 1.631 0.000 0.000 1.631 2 PRGT#g
|
55
|
+
1.631 0.000 0.000 1.631 2/5 Integer#times
|
56
|
+
--------------------------------------------------------------------------------
|
57
|
+
0.409 0.000 0.000 0.409 2/2 Integer#times
|
58
|
+
20.05% 0.00% 0.409 0.000 0.000 0.409 2 PRGT#f
|
59
|
+
0.409 0.000 0.000 0.409 2/5 Integer#times
|
60
|
+
|
61
|
+
* indicates recursively called methods
|
62
|
+
=end
|
63
|
+
|
64
|
+
class PrintingRecursiveGraphTest < TestCase
|
65
|
+
include PrinterTestHelper
|
66
|
+
|
67
|
+
def setup
|
68
|
+
# WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
|
69
|
+
RubyProf::measure_mode = RubyProf::WALL_TIME
|
70
|
+
@result = RubyProf.profile do
|
71
|
+
PRGT.run
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_printing_rescursive_graph
|
76
|
+
printer = RubyProf::GraphPrinter.new(@result)
|
77
|
+
|
78
|
+
buffer = ''
|
79
|
+
printer.print(StringIO.new(buffer))
|
80
|
+
|
81
|
+
puts buffer if ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1"
|
82
|
+
|
83
|
+
parsed_output = MetricsArray.parse(buffer)
|
84
|
+
|
85
|
+
assert( integer_times = parsed_output.metrics_for("*Integer#times") )
|
86
|
+
|
87
|
+
actual_parents = integer_times.parents.map(&:name)
|
88
|
+
expected_parents = %w(PRGT#f PRGT#g PRGT#run)
|
89
|
+
assert_equal expected_parents, actual_parents
|
90
|
+
|
91
|
+
actual_children = integer_times.children.map(&:name)
|
92
|
+
expected_children = %w(Kernel#sleep PRGT#g PRGT#f)
|
93
|
+
assert_equal expected_children, actual_children
|
94
|
+
|
95
|
+
assert( fp = integer_times.parent("PRGT#f") )
|
96
|
+
assert_in_delta(fp.total, fp.child, 0.01)
|
97
|
+
assert_equal("2/5", fp.calls)
|
98
|
+
|
99
|
+
assert( gp = integer_times.parent("PRGT#g") )
|
100
|
+
assert_in_delta(gp.total, gp.child, 0.01)
|
101
|
+
assert_equal("2/5", gp.calls)
|
102
|
+
|
103
|
+
assert( rp = integer_times.parent("PRGT#run") )
|
104
|
+
assert_in_delta(rp.total, rp.child, 0.01)
|
105
|
+
assert_equal("1/5", rp.calls)
|
106
|
+
|
107
|
+
assert_in_delta(4*fp.total, gp.total, 0.05)
|
108
|
+
assert_in_delta(fp.total + gp.total, rp.total, 0.05)
|
109
|
+
assert_in_delta(integer_times.metrics.total, rp.total, 0.05)
|
110
|
+
|
111
|
+
assert( fc = integer_times.child("PRGT#f") )
|
112
|
+
assert_in_delta(fc.total, fc.child, 0.01)
|
113
|
+
assert_equal("2/2", fc.calls)
|
114
|
+
|
115
|
+
assert( gc = integer_times.child("PRGT#g") )
|
116
|
+
assert_in_delta(gc.total, gc.child, 0.01)
|
117
|
+
assert_equal("2/2", gc.calls)
|
118
|
+
|
119
|
+
assert( ks = integer_times.child("Kernel#sleep") )
|
120
|
+
assert_in_delta(ks.total, ks.self_t, 0.01)
|
121
|
+
assert_equal("12/12", ks.calls)
|
122
|
+
|
123
|
+
assert_in_delta(4*fc.total, gc.total, 0.05)
|
124
|
+
assert_in_delta(fp.total + gc.total, ks.total, 0.05)
|
125
|
+
assert_in_delta(integer_times.metrics.total, ks.total, 0.05)
|
126
|
+
end
|
127
|
+
end
|
data/test/rack_test.rb
CHANGED
@@ -1,157 +1,157 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
require File.expand_path('../test_helper', __FILE__)
|
5
|
-
|
6
|
-
class FakeRackApp
|
7
|
-
def call(env)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
module Rack
|
12
|
-
class Request
|
13
|
-
def initialize(env)
|
14
|
-
if env == :fake_env
|
15
|
-
@env = {}
|
16
|
-
else
|
17
|
-
@env = env
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def path
|
22
|
-
@env[:path] || '/path/to/resource.json'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
module Rack
|
28
|
-
class RubyProf
|
29
|
-
attr_reader :_profiler
|
30
|
-
|
31
|
-
def public_delete_profiler!
|
32
|
-
delete_profiler!
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class RackTest < TestCase
|
38
|
-
def test_create_print_path
|
39
|
-
path = Dir.mktmpdir
|
40
|
-
Dir.delete(path)
|
41
|
-
|
42
|
-
Rack::RubyProf.new(FakeRackApp.new, :path => path)
|
43
|
-
|
44
|
-
assert(Dir.exist?(path))
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_create_profile_reports
|
48
|
-
path = Dir.mktmpdir
|
49
|
-
|
50
|
-
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path)
|
51
|
-
|
52
|
-
adapter.call(:fake_env)
|
53
|
-
|
54
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
55
|
-
file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
|
56
|
-
assert(File.exist?(file_path))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_skip_paths
|
61
|
-
path = Dir.mktmpdir
|
62
|
-
|
63
|
-
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :skip_paths => [%r{\.json$}])
|
64
|
-
|
65
|
-
adapter.call(:fake_env)
|
66
|
-
|
67
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
68
|
-
file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
|
69
|
-
assert(!File.exist?(file_path))
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_only_paths
|
74
|
-
path = Dir.mktmpdir
|
75
|
-
|
76
|
-
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :only_paths => [%r{\.json$}])
|
77
|
-
|
78
|
-
adapter.call({path: '/path/to/resource.json'})
|
79
|
-
|
80
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
81
|
-
file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
|
82
|
-
assert(File.exist?(file_path))
|
83
|
-
end
|
84
|
-
|
85
|
-
adapter.call({path: '/path/to/resource.html'})
|
86
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
87
|
-
file_path = ::File.join(path, "path-to-resource.html-#{base_name}")
|
88
|
-
assert(!File.exist?(file_path))
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_allows_lazy_filename_setting
|
93
|
-
path = Dir.mktmpdir
|
94
|
-
|
95
|
-
printer = {::RubyProf::FlatPrinter => lambda { 'dynamic.txt' }}
|
96
|
-
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :printers => printer)
|
97
|
-
|
98
|
-
adapter.call(:fake_env)
|
99
|
-
|
100
|
-
file_path = ::File.join(path, 'path-to-resource.json-dynamic.txt')
|
101
|
-
assert(File.exist?(file_path))
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_works_for_multiple_requests
|
105
|
-
path = Dir.mktmpdir
|
106
|
-
|
107
|
-
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :max_requests => 2)
|
108
|
-
|
109
|
-
# make a 1st request, and check that this didn't create any files
|
110
|
-
adapter.call(:fake_env)
|
111
|
-
assert(Dir["#{path}/*"].empty?)
|
112
|
-
|
113
|
-
# now a second request should create all the expected files
|
114
|
-
adapter.call(:fake_env)
|
115
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
116
|
-
file_path = ::File.join(path, "multi-requests-2-#{base_name}")
|
117
|
-
assert(File.exist?(file_path))
|
118
|
-
end
|
119
|
-
|
120
|
-
# let's clean up
|
121
|
-
FileUtils.rm_rf(Dir["#{path}/*"])
|
122
|
-
|
123
|
-
# and do the same again for the next 2 requests
|
124
|
-
adapter.call(:fake_env)
|
125
|
-
assert(Dir["#{path}/*"].empty?)
|
126
|
-
|
127
|
-
adapter.call(:fake_env)
|
128
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
129
|
-
file_path = ::File.join(path, "multi-requests-2-#{base_name}")
|
130
|
-
assert(File.exist?(file_path))
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_tries_to_print_results_if_shut_down_before_max_requests_reached
|
135
|
-
path = Dir.mktmpdir
|
136
|
-
|
137
|
-
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :max_requests => 100)
|
138
|
-
|
139
|
-
# make a 1st request, and check that this didn't create any files
|
140
|
-
adapter.call(:fake_env)
|
141
|
-
assert(Dir["#{path}/*"].empty?)
|
142
|
-
|
143
|
-
adapter.public_delete_profiler!
|
144
|
-
|
145
|
-
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
146
|
-
file_path = ::File.join(path, "multi-requests-1-#{base_name}")
|
147
|
-
assert(File.exist?(file_path))
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_it_uses_separate_profilers_if_not_aggregating_multiple_requests
|
152
|
-
adapter1 = Rack::RubyProf.new(FakeRackApp.new)
|
153
|
-
adapter2 = Rack::RubyProf.new(FakeRackApp.new)
|
154
|
-
|
155
|
-
assert(adapter1.object_id != adapter2.object_id)
|
156
|
-
end
|
157
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
require File.expand_path('../test_helper', __FILE__)
|
5
|
+
|
6
|
+
class FakeRackApp
|
7
|
+
def call(env)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Rack
|
12
|
+
class Request
|
13
|
+
def initialize(env)
|
14
|
+
if env == :fake_env
|
15
|
+
@env = {}
|
16
|
+
else
|
17
|
+
@env = env
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def path
|
22
|
+
@env[:path] || '/path/to/resource.json'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module Rack
|
28
|
+
class RubyProf
|
29
|
+
attr_reader :_profiler
|
30
|
+
|
31
|
+
def public_delete_profiler!
|
32
|
+
delete_profiler!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class RackTest < TestCase
|
38
|
+
def test_create_print_path
|
39
|
+
path = Dir.mktmpdir
|
40
|
+
Dir.delete(path)
|
41
|
+
|
42
|
+
Rack::RubyProf.new(FakeRackApp.new, :path => path)
|
43
|
+
|
44
|
+
assert(Dir.exist?(path))
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_create_profile_reports
|
48
|
+
path = Dir.mktmpdir
|
49
|
+
|
50
|
+
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path)
|
51
|
+
|
52
|
+
adapter.call(:fake_env)
|
53
|
+
|
54
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
55
|
+
file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
|
56
|
+
assert(File.exist?(file_path))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_skip_paths
|
61
|
+
path = Dir.mktmpdir
|
62
|
+
|
63
|
+
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :skip_paths => [%r{\.json$}])
|
64
|
+
|
65
|
+
adapter.call(:fake_env)
|
66
|
+
|
67
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
68
|
+
file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
|
69
|
+
assert(!File.exist?(file_path))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_only_paths
|
74
|
+
path = Dir.mktmpdir
|
75
|
+
|
76
|
+
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :only_paths => [%r{\.json$}])
|
77
|
+
|
78
|
+
adapter.call({path: '/path/to/resource.json'})
|
79
|
+
|
80
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
81
|
+
file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
|
82
|
+
assert(File.exist?(file_path))
|
83
|
+
end
|
84
|
+
|
85
|
+
adapter.call({path: '/path/to/resource.html'})
|
86
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
87
|
+
file_path = ::File.join(path, "path-to-resource.html-#{base_name}")
|
88
|
+
assert(!File.exist?(file_path))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_allows_lazy_filename_setting
|
93
|
+
path = Dir.mktmpdir
|
94
|
+
|
95
|
+
printer = {::RubyProf::FlatPrinter => lambda { 'dynamic.txt' }}
|
96
|
+
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :printers => printer)
|
97
|
+
|
98
|
+
adapter.call(:fake_env)
|
99
|
+
|
100
|
+
file_path = ::File.join(path, 'path-to-resource.json-dynamic.txt')
|
101
|
+
assert(File.exist?(file_path))
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_works_for_multiple_requests
|
105
|
+
path = Dir.mktmpdir
|
106
|
+
|
107
|
+
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :max_requests => 2)
|
108
|
+
|
109
|
+
# make a 1st request, and check that this didn't create any files
|
110
|
+
adapter.call(:fake_env)
|
111
|
+
assert(Dir["#{path}/*"].empty?)
|
112
|
+
|
113
|
+
# now a second request should create all the expected files
|
114
|
+
adapter.call(:fake_env)
|
115
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
116
|
+
file_path = ::File.join(path, "multi-requests-2-#{base_name}")
|
117
|
+
assert(File.exist?(file_path))
|
118
|
+
end
|
119
|
+
|
120
|
+
# let's clean up
|
121
|
+
FileUtils.rm_rf(Dir["#{path}/*"])
|
122
|
+
|
123
|
+
# and do the same again for the next 2 requests
|
124
|
+
adapter.call(:fake_env)
|
125
|
+
assert(Dir["#{path}/*"].empty?)
|
126
|
+
|
127
|
+
adapter.call(:fake_env)
|
128
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
129
|
+
file_path = ::File.join(path, "multi-requests-2-#{base_name}")
|
130
|
+
assert(File.exist?(file_path))
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_tries_to_print_results_if_shut_down_before_max_requests_reached
|
135
|
+
path = Dir.mktmpdir
|
136
|
+
|
137
|
+
adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :max_requests => 100)
|
138
|
+
|
139
|
+
# make a 1st request, and check that this didn't create any files
|
140
|
+
adapter.call(:fake_env)
|
141
|
+
assert(Dir["#{path}/*"].empty?)
|
142
|
+
|
143
|
+
adapter.public_delete_profiler!
|
144
|
+
|
145
|
+
%w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
|
146
|
+
file_path = ::File.join(path, "multi-requests-1-#{base_name}")
|
147
|
+
assert(File.exist?(file_path))
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_it_uses_separate_profilers_if_not_aggregating_multiple_requests
|
152
|
+
adapter1 = Rack::RubyProf.new(FakeRackApp.new)
|
153
|
+
adapter2 = Rack::RubyProf.new(FakeRackApp.new)
|
154
|
+
|
155
|
+
assert(adapter1.object_id != adapter2.object_id)
|
156
|
+
end
|
157
|
+
end
|