ruby-prof 1.7.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +112 -178
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/rp_allocation.c +0 -15
  35. data/ext/ruby_prof/rp_allocation.h +29 -33
  36. data/ext/ruby_prof/rp_call_tree.c +3 -0
  37. data/ext/ruby_prof/rp_call_tree.h +1 -4
  38. data/ext/ruby_prof/rp_call_trees.h +1 -4
  39. data/ext/ruby_prof/rp_measurement.c +0 -5
  40. data/ext/ruby_prof/rp_measurement.h +49 -53
  41. data/ext/ruby_prof/rp_method.c +3 -0
  42. data/ext/ruby_prof/rp_method.h +1 -4
  43. data/ext/ruby_prof/rp_profile.c +1 -1
  44. data/ext/ruby_prof/rp_profile.h +1 -5
  45. data/ext/ruby_prof/rp_stack.h +50 -53
  46. data/ext/ruby_prof/rp_thread.h +1 -4
  47. data/ext/ruby_prof/ruby_prof.h +1 -4
  48. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  49. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  50. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  51. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  52. data/lib/ruby-prof/call_tree.rb +57 -57
  53. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  54. data/lib/ruby-prof/measurement.rb +17 -17
  55. data/lib/ruby-prof/printers/abstract_printer.rb +19 -33
  56. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  57. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  58. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  59. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  60. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  61. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  62. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  63. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  64. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  65. data/lib/ruby-prof/profile.rb +13 -0
  66. data/lib/ruby-prof/rack.rb +114 -105
  67. data/lib/ruby-prof/task.rb +147 -147
  68. data/lib/ruby-prof/thread.rb +20 -20
  69. data/lib/ruby-prof/version.rb +1 -1
  70. data/lib/ruby-prof.rb +50 -52
  71. data/lib/unprof.rb +10 -10
  72. data/ruby-prof.gemspec +5 -5
  73. data/test/abstract_printer_test.rb +25 -27
  74. data/test/alias_test.rb +203 -117
  75. data/test/call_tree_builder.rb +126 -126
  76. data/test/call_tree_visitor_test.rb +27 -27
  77. data/test/call_trees_test.rb +66 -66
  78. data/test/duplicate_names_test.rb +32 -32
  79. data/test/dynamic_method_test.rb +50 -50
  80. data/test/exceptions_test.rb +24 -24
  81. data/test/exclude_threads_test.rb +48 -48
  82. data/test/fiber_test.rb +72 -72
  83. data/test/inverse_call_tree_test.rb +174 -174
  84. data/test/line_number_test.rb +138 -1
  85. data/test/marshal_test.rb +144 -145
  86. data/test/measure_allocations.rb +26 -26
  87. data/test/measure_allocations_test.rb +340 -1
  88. data/test/measure_process_time_test.rb +3098 -3142
  89. data/test/measure_times.rb +56 -56
  90. data/test/measure_wall_time_test.rb +511 -372
  91. data/test/measurement_test.rb +82 -82
  92. data/test/merge_test.rb +48 -48
  93. data/test/multi_printer_test.rb +52 -66
  94. data/test/no_method_class_test.rb +15 -15
  95. data/test/pause_resume_test.rb +171 -171
  96. data/test/prime.rb +54 -54
  97. data/test/prime_script.rb +5 -5
  98. data/test/printer_call_stack_test.rb +28 -27
  99. data/test/printer_call_tree_test.rb +30 -30
  100. data/test/printer_flame_graph_test.rb +82 -0
  101. data/test/printer_flat_test.rb +99 -99
  102. data/test/printer_graph_html_test.rb +62 -59
  103. data/test/printer_graph_test.rb +42 -40
  104. data/test/printers_test.rb +28 -44
  105. data/test/printing_recursive_graph_test.rb +81 -81
  106. data/test/profile_test.rb +101 -101
  107. data/test/rack_test.rb +103 -93
  108. data/test/recursive_test.rb +139 -139
  109. data/test/scheduler.rb +4 -0
  110. data/test/singleton_test.rb +39 -38
  111. data/test/stack_printer_test.rb +61 -61
  112. data/test/start_stop_test.rb +106 -106
  113. data/test/test_helper.rb +4 -0
  114. data/test/thread_test.rb +29 -29
  115. data/test/unique_call_path_test.rb +123 -123
  116. data/test/yarv_test.rb +56 -56
  117. metadata +53 -11
  118. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  119. data/lib/ruby-prof/compatibility.rb +0 -113
  120. data/test/compatibility_test.rb +0 -49
  121. data/test/measure_memory_test.rb +0 -1193
@@ -1,126 +1,126 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path('../test_helper', __FILE__)
4
- require 'base64'
5
-
6
- # Create a DummyClass with methods so we can create call trees in the test_merge method below
7
- class DummyClass
8
- %i[root a b aa ab ba bb].each do |method_name|
9
- define_method(method_name) do
10
- end
11
- end
12
- end
13
-
14
- def create_call_tree(method_name)
15
- method_info = RubyProf::MethodInfo.new(DummyClass, method_name)
16
- RubyProf::CallTree.new(method_info)
17
- end
18
-
19
- def build_call_tree(tree_hash)
20
- # tree_hash is a hash keyed on the parent method_name whose values are
21
- # child methods. Example:
22
- #
23
- # tree_hash = {:root => [:a, :b],
24
- # :a => [:aa, :ab],
25
- # :b => [:bb]}
26
- #
27
- # Note this is a simplified structure for testing. It assumes methods
28
- # are only called from one call_tree.
29
-
30
- call_trees = Hash.new
31
- tree_hash.each do |method_name, children|
32
- parent = call_trees[method_name] ||= create_call_tree(method_name)
33
- children.each do |child_method_name|
34
- child = call_trees[child_method_name] ||= create_call_tree(child_method_name)
35
- parent.add_child(child)
36
- end
37
- end
38
-
39
- call_trees
40
- end
41
-
42
- def create_call_tree_1
43
- #
44
- # root
45
- # / \
46
- # a b
47
- # / \ \
48
- # aa ab bb
49
- #
50
-
51
- # ------ Call Trees 1 -------------
52
- tree_hash = {:root => [:a, :b],
53
- :a => [:aa, :ab],
54
- :b => [:bb]}
55
-
56
- call_trees = build_call_tree(tree_hash)
57
-
58
- # Setup times
59
- call_trees[:aa].measurement.total_time = 1.5
60
- call_trees[:aa].measurement.self_time = 1.5
61
- call_trees[:ab].measurement.total_time = 2.2
62
- call_trees[:ab].measurement.self_time = 2.2
63
- call_trees[:a].measurement.total_time = 3.7
64
-
65
- call_trees[:aa].target.measurement.total_time = 1.5
66
- call_trees[:aa].target.measurement.self_time = 1.5
67
- call_trees[:ab].target.measurement.total_time = 2.2
68
- call_trees[:ab].target.measurement.self_time = 2.2
69
- call_trees[:a].target.measurement.total_time = 3.7
70
-
71
- call_trees[:bb].measurement.total_time = 4.3
72
- call_trees[:bb].measurement.self_time = 4.3
73
- call_trees[:b].measurement.total_time = 4.3
74
-
75
- call_trees[:bb].target.measurement.total_time = 4.3
76
- call_trees[:bb].target.measurement.self_time = 4.3
77
- call_trees[:b].target.measurement.total_time = 4.3
78
-
79
- call_trees[:root].measurement.total_time = 8.0
80
- call_trees[:root].target.measurement.total_time = 8.0
81
-
82
- call_trees[:root]
83
- end
84
-
85
- def create_call_tree_2
86
- #
87
- # root
88
- # / \
89
- # a b
90
- # \ / \
91
- # ab ba bb
92
-
93
- tree_hash = {:root => [:a, :b],
94
- :a => [:ab],
95
- :b => [:ba, :bb]}
96
-
97
- call_trees = build_call_tree(tree_hash)
98
-
99
- # Setup times
100
- call_trees[:ab].measurement.total_time = 0.4
101
- call_trees[:ab].measurement.self_time = 0.4
102
- call_trees[:a].measurement.total_time = 0.4
103
-
104
- call_trees[:ab].target.measurement.total_time = 0.4
105
- call_trees[:ab].target.measurement.self_time = 0.4
106
- call_trees[:a].target.measurement.total_time = 0.4
107
-
108
- call_trees[:ba].measurement.total_time = 0.9
109
- call_trees[:ba].measurement.self_time = 0.7
110
- call_trees[:ba].measurement.wait_time = 0.2
111
- call_trees[:bb].measurement.total_time = 2.3
112
- call_trees[:bb].measurement.self_time = 2.3
113
- call_trees[:b].measurement.total_time = 3.2
114
-
115
- call_trees[:ba].target.measurement.total_time = 0.9
116
- call_trees[:ba].target.measurement.self_time = 0.7
117
- call_trees[:ba].target.measurement.wait_time = 0.2
118
- call_trees[:bb].target.measurement.total_time = 2.3
119
- call_trees[:bb].target.measurement.self_time = 2.3
120
- call_trees[:b].target.measurement.total_time = 3.2
121
-
122
- call_trees[:root].measurement.total_time = 3.6
123
- call_trees[:root].target.measurement.total_time = 3.6
124
-
125
- call_trees[:root]
126
- end
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', __FILE__)
4
+ require 'base64'
5
+
6
+ # Create a DummyClass with methods so we can create call trees in the test_merge method below
7
+ class DummyClass
8
+ %i[root a b aa ab ba bb].each do |method_name|
9
+ define_method(method_name) do
10
+ end
11
+ end
12
+ end
13
+
14
+ def create_call_tree(method_name)
15
+ method_info = RubyProf::MethodInfo.new(DummyClass, method_name)
16
+ RubyProf::CallTree.new(method_info)
17
+ end
18
+
19
+ def build_call_tree(tree_hash)
20
+ # tree_hash is a hash keyed on the parent method_name whose values are
21
+ # child methods. Example:
22
+ #
23
+ # tree_hash = {root: [:a, :b],
24
+ # a: [:aa, :ab],
25
+ # b: [:bb]}
26
+ #
27
+ # Note this is a simplified structure for testing. It assumes methods
28
+ # are only called from one call_tree.
29
+
30
+ call_trees = Hash.new
31
+ tree_hash.each do |method_name, children|
32
+ parent = call_trees[method_name] ||= create_call_tree(method_name)
33
+ children.each do |child_method_name|
34
+ child = call_trees[child_method_name] ||= create_call_tree(child_method_name)
35
+ parent.add_child(child)
36
+ end
37
+ end
38
+
39
+ call_trees
40
+ end
41
+
42
+ def create_call_tree_1
43
+ #
44
+ # root
45
+ # / \
46
+ # a b
47
+ # / \ \
48
+ # aa ab bb
49
+ #
50
+
51
+ # ------ Call Trees 1 -------------
52
+ tree_hash = {root: [:a, :b],
53
+ a: [:aa, :ab],
54
+ b: [:bb]}
55
+
56
+ call_trees = build_call_tree(tree_hash)
57
+
58
+ # Setup times
59
+ call_trees[:aa].measurement.total_time = 1.5
60
+ call_trees[:aa].measurement.self_time = 1.5
61
+ call_trees[:ab].measurement.total_time = 2.2
62
+ call_trees[:ab].measurement.self_time = 2.2
63
+ call_trees[:a].measurement.total_time = 3.7
64
+
65
+ call_trees[:aa].target.measurement.total_time = 1.5
66
+ call_trees[:aa].target.measurement.self_time = 1.5
67
+ call_trees[:ab].target.measurement.total_time = 2.2
68
+ call_trees[:ab].target.measurement.self_time = 2.2
69
+ call_trees[:a].target.measurement.total_time = 3.7
70
+
71
+ call_trees[:bb].measurement.total_time = 4.3
72
+ call_trees[:bb].measurement.self_time = 4.3
73
+ call_trees[:b].measurement.total_time = 4.3
74
+
75
+ call_trees[:bb].target.measurement.total_time = 4.3
76
+ call_trees[:bb].target.measurement.self_time = 4.3
77
+ call_trees[:b].target.measurement.total_time = 4.3
78
+
79
+ call_trees[:root].measurement.total_time = 8.0
80
+ call_trees[:root].target.measurement.total_time = 8.0
81
+
82
+ call_trees[:root]
83
+ end
84
+
85
+ def create_call_tree_2
86
+ #
87
+ # root
88
+ # / \
89
+ # a b
90
+ # \ / \
91
+ # ab ba bb
92
+
93
+ tree_hash = {root: [:a, :b],
94
+ a: [:ab],
95
+ b: [:ba, :bb]}
96
+
97
+ call_trees = build_call_tree(tree_hash)
98
+
99
+ # Setup times
100
+ call_trees[:ab].measurement.total_time = 0.4
101
+ call_trees[:ab].measurement.self_time = 0.4
102
+ call_trees[:a].measurement.total_time = 0.4
103
+
104
+ call_trees[:ab].target.measurement.total_time = 0.4
105
+ call_trees[:ab].target.measurement.self_time = 0.4
106
+ call_trees[:a].target.measurement.total_time = 0.4
107
+
108
+ call_trees[:ba].measurement.total_time = 0.9
109
+ call_trees[:ba].measurement.self_time = 0.7
110
+ call_trees[:ba].measurement.wait_time = 0.2
111
+ call_trees[:bb].measurement.total_time = 2.3
112
+ call_trees[:bb].measurement.self_time = 2.3
113
+ call_trees[:b].measurement.total_time = 3.2
114
+
115
+ call_trees[:ba].target.measurement.total_time = 0.9
116
+ call_trees[:ba].target.measurement.self_time = 0.7
117
+ call_trees[:ba].target.measurement.wait_time = 0.2
118
+ call_trees[:bb].target.measurement.total_time = 2.3
119
+ call_trees[:bb].target.measurement.self_time = 2.3
120
+ call_trees[:b].target.measurement.total_time = 3.2
121
+
122
+ call_trees[:root].measurement.total_time = 3.6
123
+ call_trees[:root].target.measurement.total_time = 3.6
124
+
125
+ call_trees[:root]
126
+ end
@@ -1,27 +1,27 @@
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 CallTreeVisitorTest < TestCase
8
- def test_visit
9
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
10
- RubyProf::C1.sleep_wait
11
- end
12
-
13
- visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
14
-
15
- method_names = Array.new
16
-
17
- visitor.visit do |call_tree, event|
18
- method_names << call_tree.target.full_name if event == :enter
19
- end
20
-
21
- assert_equal(3, method_names.length)
22
- assert_equal("CallTreeVisitorTest#test_visit", method_names[0])
23
- assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
24
- assert_equal("Kernel#sleep", method_names[2])
25
- end
26
- end
27
-
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 CallTreeVisitorTest < TestCase
8
+ def test_visit
9
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
10
+ RubyProf::C1.sleep_wait
11
+ end
12
+
13
+ visitor = RubyProf::CallTreeVisitor.new(result.threads.first.call_tree)
14
+
15
+ method_names = Array.new
16
+
17
+ visitor.visit do |call_tree, event|
18
+ method_names << call_tree.target.full_name if event == :enter
19
+ end
20
+
21
+ assert_equal(3, method_names.length)
22
+ assert_equal("CallTreeVisitorTest#test_visit", method_names[0])
23
+ assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
24
+ assert_equal("Kernel#sleep", method_names[2])
25
+ end
26
+ end
27
+
@@ -1,66 +1,66 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- # -- Tests ----
7
- class CallTreesTest < TestCase
8
- def some_method_1
9
- some_method_2
10
- end
11
-
12
- def some_method_2
13
- end
14
-
15
- def test_call_infos
16
- result = RubyProf::Profile.profile do
17
- some_method_1
18
- end
19
-
20
- thread = result.threads.first
21
- assert_equal(3, thread.methods.length)
22
-
23
- method = thread.methods[0]
24
- assert_equal('CallTreesTest#test_call_infos', method.full_name)
25
-
26
- call_trees = method.call_trees
27
- assert_empty(call_trees.callers)
28
- assert_equal(1, call_trees.callees.length)
29
- assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
30
- assert_equal('CallTreesTest#some_method_1', call_trees.callees[0].target.full_name)
31
-
32
- method = thread.methods[1]
33
- assert_equal('CallTreesTest#some_method_1', method.full_name)
34
-
35
- call_trees = method.call_trees
36
- assert_equal(1, call_trees.callers.length)
37
- assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
38
- assert_equal('CallTreesTest#test_call_infos', call_trees.callers[0].parent.target.full_name)
39
- assert_equal(1, call_trees.callees.length)
40
- assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
41
- assert_equal('CallTreesTest#some_method_2', call_trees.callees[0].target.full_name)
42
-
43
- method = thread.methods[2]
44
- assert_equal('CallTreesTest#some_method_2', method.full_name)
45
-
46
- call_trees = method.call_trees
47
- assert_equal(1, call_trees.callers.length)
48
- assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
49
- assert_equal('CallTreesTest#some_method_1', call_trees.callers[0].parent.target.full_name)
50
- assert_empty(call_trees.callees)
51
- end
52
-
53
- def test_gc
54
- result = RubyProf::Profile.profile do
55
- some_method_1
56
- end
57
-
58
- method = result.threads.first.methods[1]
59
-
60
- 100.times do |i|
61
- method.call_trees.callers
62
- GC.start
63
- end
64
- assert(true)
65
- end
66
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # -- Tests ----
7
+ class CallTreesTest < TestCase
8
+ def some_method_1
9
+ some_method_2
10
+ end
11
+
12
+ def some_method_2
13
+ end
14
+
15
+ def test_call_infos
16
+ result = RubyProf::Profile.profile do
17
+ some_method_1
18
+ end
19
+
20
+ thread = result.threads.first
21
+ assert_equal(3, thread.methods.length)
22
+
23
+ method = thread.methods[0]
24
+ assert_equal('CallTreesTest#test_call_infos', method.full_name)
25
+
26
+ call_trees = method.call_trees
27
+ assert_empty(call_trees.callers)
28
+ assert_equal(1, call_trees.callees.length)
29
+ assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
30
+ assert_equal('CallTreesTest#some_method_1', call_trees.callees[0].target.full_name)
31
+
32
+ method = thread.methods[1]
33
+ assert_equal('CallTreesTest#some_method_1', method.full_name)
34
+
35
+ call_trees = method.call_trees
36
+ assert_equal(1, call_trees.callers.length)
37
+ assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
38
+ assert_equal('CallTreesTest#test_call_infos', call_trees.callers[0].parent.target.full_name)
39
+ assert_equal(1, call_trees.callees.length)
40
+ assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
41
+ assert_equal('CallTreesTest#some_method_2', call_trees.callees[0].target.full_name)
42
+
43
+ method = thread.methods[2]
44
+ assert_equal('CallTreesTest#some_method_2', method.full_name)
45
+
46
+ call_trees = method.call_trees
47
+ assert_equal(1, call_trees.callers.length)
48
+ assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
49
+ assert_equal('CallTreesTest#some_method_1', call_trees.callers[0].parent.target.full_name)
50
+ assert_empty(call_trees.callees)
51
+ end
52
+
53
+ def test_gc
54
+ result = RubyProf::Profile.profile do
55
+ some_method_1
56
+ end
57
+
58
+ method = result.threads.first.methods[1]
59
+
60
+ 100.times do |i|
61
+ method.call_trees.callers
62
+ GC.start
63
+ end
64
+ assert(true)
65
+ end
66
+ end
@@ -1,32 +1,32 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class DuplicateNamesTest < TestCase
7
- def test_names
8
- result = RubyProf::Profile.profile do
9
- str = %{module Foo; class Bar; def foo; end end end}
10
-
11
- eval str
12
- Foo::Bar.new.foo
13
- DuplicateNamesTest.class_eval {remove_const :Foo}
14
-
15
- eval str
16
- Foo::Bar.new.foo
17
- DuplicateNamesTest.class_eval {remove_const :Foo}
18
-
19
- eval str
20
- Foo::Bar.new.foo
21
- end
22
-
23
- # There should be 3 foo methods
24
- methods = result.threads.first.methods.sort.reverse
25
-
26
- methods = methods.select do |method|
27
- method.full_name == 'DuplicateNamesTest::Foo::Bar#foo'
28
- end
29
-
30
- assert_equal(3, methods.length)
31
- end
32
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class DuplicateNamesTest < TestCase
7
+ def test_names
8
+ result = RubyProf::Profile.profile do
9
+ str = %{module Foo; class Bar; def foo; end end end}
10
+
11
+ eval str
12
+ Foo::Bar.new.foo
13
+ DuplicateNamesTest.class_eval {remove_const :Foo}
14
+
15
+ eval str
16
+ Foo::Bar.new.foo
17
+ DuplicateNamesTest.class_eval {remove_const :Foo}
18
+
19
+ eval str
20
+ Foo::Bar.new.foo
21
+ end
22
+
23
+ # There should be 3 foo methods
24
+ methods = result.threads.first.methods.sort.reverse
25
+
26
+ methods = methods.select do |method|
27
+ method.full_name == 'DuplicateNamesTest::Foo::Bar#foo'
28
+ end
29
+
30
+ assert_equal(3, methods.length)
31
+ end
32
+ end
@@ -1,50 +1,50 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path("../test_helper", __FILE__)
5
-
6
- class DynamicMethodTest < TestCase
7
-
8
- class FruitMedley
9
- define_method(:apple) do
10
- sleep(0.1)
11
- "I'm a peach"
12
- end
13
-
14
- define_method(:orange) do
15
- sleep(0.2)
16
- "I'm an orange"
17
- end
18
-
19
- [:banana, :peach].each_with_index do |fruit,i|
20
- define_method(fruit) do
21
- sleep(i == 0 ? 0.3 : 0.4)
22
- "I'm a #{fruit}"
23
- end
24
- end
25
- end
26
-
27
- def test_dynamic_method
28
- medley = FruitMedley.new
29
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
30
- medley.apple
31
- medley.orange
32
- medley.banana
33
- medley.peach
34
- end
35
-
36
- methods = result.threads.first.methods.sort.reverse
37
-
38
- expected_method_names = %w(
39
- DynamicMethodTest#test_dynamic_method
40
- Kernel#sleep
41
- DynamicMethodTest::FruitMedley#peach
42
- DynamicMethodTest::FruitMedley#banana
43
- DynamicMethodTest::FruitMedley#orange
44
- DynamicMethodTest::FruitMedley#apple
45
- Integer#==
46
- )
47
-
48
- assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
49
- end
50
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path("../test_helper", __FILE__)
5
+
6
+ class DynamicMethodTest < TestCase
7
+
8
+ class FruitMedley
9
+ define_method(:apple) do
10
+ sleep(0.1)
11
+ "I'm a peach"
12
+ end
13
+
14
+ define_method(:orange) do
15
+ sleep(0.2)
16
+ "I'm an orange"
17
+ end
18
+
19
+ [:banana, :peach].each_with_index do |fruit,i|
20
+ define_method(fruit) do
21
+ sleep(i == 0 ? 0.3 : 0.4)
22
+ "I'm a #{fruit}"
23
+ end
24
+ end
25
+ end
26
+
27
+ def test_dynamic_method
28
+ medley = FruitMedley.new
29
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
30
+ medley.apple
31
+ medley.orange
32
+ medley.banana
33
+ medley.peach
34
+ end
35
+
36
+ methods = result.threads.first.methods.sort.reverse
37
+
38
+ expected_method_names = %w(
39
+ DynamicMethodTest#test_dynamic_method
40
+ Kernel#sleep
41
+ DynamicMethodTest::FruitMedley#peach
42
+ DynamicMethodTest::FruitMedley#banana
43
+ DynamicMethodTest::FruitMedley#orange
44
+ DynamicMethodTest::FruitMedley#apple
45
+ Integer#==
46
+ )
47
+
48
+ assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
49
+ end
50
+ end
@@ -1,24 +1,24 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class ExceptionsTest < TestCase
7
- def test_profile
8
- result = begin
9
- RubyProf::Profile.profile do
10
- raise(RuntimeError, 'Test error')
11
- end
12
- rescue
13
- end
14
- assert_kind_of(RubyProf::Profile, result)
15
- end
16
-
17
- def test_profile_allows_exceptions
18
- assert_raises(RuntimeError) do
19
- RubyProf::Profile.profile(:allow_exceptions => true) do
20
- raise(RuntimeError, 'Test error')
21
- end
22
- end
23
- end
24
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class ExceptionsTest < TestCase
7
+ def test_profile
8
+ result = begin
9
+ RubyProf::Profile.profile do
10
+ raise(RuntimeError, 'Test error')
11
+ end
12
+ rescue
13
+ end
14
+ assert_kind_of(RubyProf::Profile, result)
15
+ end
16
+
17
+ def test_profile_allows_exceptions
18
+ assert_raises(RuntimeError) do
19
+ RubyProf::Profile.profile(allow_exceptions: true) do
20
+ raise(RuntimeError, 'Test error')
21
+ end
22
+ end
23
+ end
24
+ end