ruby-prof 1.4.3 → 1.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +59 -9
  3. data/{README.rdoc → README.md} +2 -2
  4. data/Rakefile +4 -4
  5. data/bin/ruby-prof +100 -87
  6. data/ext/ruby_prof/rp_allocation.c +140 -85
  7. data/ext/ruby_prof/rp_allocation.h +8 -6
  8. data/ext/ruby_prof/rp_call_tree.c +502 -369
  9. data/ext/ruby_prof/rp_call_tree.h +47 -43
  10. data/ext/ruby_prof/rp_call_trees.c +16 -8
  11. data/ext/ruby_prof/rp_measure_allocations.c +10 -13
  12. data/ext/ruby_prof/rp_measure_memory.c +8 -4
  13. data/ext/ruby_prof/rp_measure_process_time.c +7 -6
  14. data/ext/ruby_prof/rp_measurement.c +147 -20
  15. data/ext/ruby_prof/rp_measurement.h +4 -1
  16. data/ext/ruby_prof/rp_method.c +142 -83
  17. data/ext/ruby_prof/rp_method.h +63 -62
  18. data/ext/ruby_prof/rp_profile.c +933 -900
  19. data/ext/ruby_prof/rp_profile.h +1 -0
  20. data/ext/ruby_prof/rp_thread.c +433 -362
  21. data/ext/ruby_prof/rp_thread.h +39 -39
  22. data/ext/ruby_prof/ruby_prof.c +0 -2
  23. data/ext/ruby_prof/ruby_prof.h +8 -0
  24. data/ext/ruby_prof/vc/ruby_prof.vcxproj +11 -8
  25. data/lib/ruby-prof/assets/call_stack_printer.html.erb +2 -1
  26. data/lib/ruby-prof/compatibility.rb +14 -0
  27. data/lib/ruby-prof/method_info.rb +8 -1
  28. data/lib/ruby-prof/printers/abstract_printer.rb +2 -1
  29. data/lib/ruby-prof/printers/call_tree_printer.rb +4 -10
  30. data/lib/ruby-prof/printers/graph_html_printer.rb +1 -1
  31. data/lib/ruby-prof/printers/multi_printer.rb +17 -17
  32. data/lib/ruby-prof/profile.rb +70 -37
  33. data/lib/ruby-prof/rack.rb +31 -21
  34. data/lib/ruby-prof/version.rb +1 -1
  35. data/lib/ruby-prof.rb +1 -1
  36. data/ruby-prof.gemspec +2 -3
  37. data/test/abstract_printer_test.rb +1 -0
  38. data/test/alias_test.rb +97 -106
  39. data/test/call_tree_builder.rb +126 -0
  40. data/test/call_tree_test.rb +94 -0
  41. data/test/call_tree_visitor_test.rb +1 -6
  42. data/test/call_trees_test.rb +6 -6
  43. data/test/{basic_test.rb → compatibility_test.rb} +8 -2
  44. data/test/duplicate_names_test.rb +5 -5
  45. data/test/dynamic_method_test.rb +24 -15
  46. data/test/enumerable_test.rb +1 -1
  47. data/test/exceptions_test.rb +2 -2
  48. data/test/exclude_methods_test.rb +3 -8
  49. data/test/exclude_threads_test.rb +4 -9
  50. data/test/fiber_test.rb +74 -8
  51. data/test/gc_test.rb +11 -9
  52. data/test/inverse_call_tree_test.rb +33 -34
  53. data/test/line_number_test.rb +37 -61
  54. data/test/marshal_test.rb +16 -3
  55. data/test/measure_allocations.rb +1 -5
  56. data/test/measure_allocations_test.rb +642 -357
  57. data/test/{measure_memory_trace_test.rb → measure_memory_test.rb} +180 -616
  58. data/test/measure_process_time_test.rb +1566 -741
  59. data/test/measure_wall_time_test.rb +179 -193
  60. data/test/measurement_test.rb +82 -0
  61. data/test/merge_test.rb +146 -0
  62. data/test/method_info_test.rb +95 -0
  63. data/test/multi_printer_test.rb +0 -5
  64. data/test/no_method_class_test.rb +1 -1
  65. data/test/pause_resume_test.rb +12 -16
  66. data/test/printer_call_stack_test.rb +2 -2
  67. data/test/printer_call_tree_test.rb +4 -4
  68. data/test/printer_flat_test.rb +1 -1
  69. data/test/printer_graph_html_test.rb +2 -2
  70. data/test/printer_graph_test.rb +2 -2
  71. data/test/printers_test.rb +14 -20
  72. data/test/printing_recursive_graph_test.rb +2 -2
  73. data/test/profile_test.rb +85 -0
  74. data/test/recursive_test.rb +374 -155
  75. data/test/scheduler.rb +363 -0
  76. data/test/singleton_test.rb +1 -1
  77. data/test/stack_printer_test.rb +5 -8
  78. data/test/start_stop_test.rb +11 -14
  79. data/test/test_helper.rb +11 -8
  80. data/test/thread_test.rb +106 -15
  81. data/test/unique_call_path_test.rb +28 -12
  82. data/test/yarv_test.rb +11 -7
  83. metadata +17 -29
  84. data/ext/ruby_prof/rp_aggregate_call_tree.c +0 -59
  85. data/ext/ruby_prof/rp_aggregate_call_tree.h +0 -13
  86. data/test/measure_allocations_trace_test.rb +0 -375
  87. data/test/temp.rb +0 -20
data/test/alias_test.rb CHANGED
@@ -15,112 +15,103 @@ class AliasTest < TestCase
15
15
  end
16
16
  end
17
17
 
18
- def setup
19
- # Need to use wall time for this test due to the sleep calls
20
- RubyProf::measure_mode = RubyProf::WALL_TIME
21
- end
22
-
23
- # This test only correct works on Ruby 2.5 and higher because - see:
24
- # https://bugs.ruby-lang.org/issues/12747
25
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0')
26
- def test_alias
27
- result = RubyProf.profile do
28
- TestMe.new.some_method
29
- end
30
-
31
- methods = result.threads.first.methods
32
- assert_equal(6, methods.count)
33
-
34
- # Method 0
35
- method = methods[0]
36
- assert_equal('AliasTest#test_alias', method.full_name)
37
- assert_equal(28, method.line)
38
- refute(method.recursive?)
39
-
40
- assert_equal(0, method.call_trees.callers.count)
41
-
42
- assert_equal(2, method.call_trees.callees.count)
43
- call_tree = method.call_trees.callees[0]
44
- assert_equal('Class#new', call_tree.target.full_name)
45
- assert_equal(28, call_tree.line)
46
-
47
- call_tree = method.call_trees.callees[1]
48
- assert_equal('AliasTest::TestMe#some_method', call_tree.target.full_name)
49
- assert_equal(28, call_tree.line)
50
-
51
- # Method 1
52
- method = methods[1]
53
- assert_equal('Class#new', method.full_name)
54
- assert_equal(0, method.line)
55
- refute(method.recursive?)
56
-
57
- assert_equal(1, method.call_trees.callers.count)
58
- call_tree = method.call_trees.callers[0]
59
- assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
60
- assert_equal(28, call_tree.line)
61
-
62
- assert_equal(1, method.call_trees.callees.count)
63
- call_tree = method.call_trees.callees[0]
64
- assert_equal('BasicObject#initialize', call_tree.target.full_name)
65
- assert_equal(0, call_tree.line)
66
-
67
- # Method 2
68
- method = methods[2]
69
- assert_equal('BasicObject#initialize', method.full_name)
70
- assert_equal(0, method.line)
71
- refute(method.recursive?)
72
-
73
- assert_equal(1, method.call_trees.callers.count)
74
- call_tree = method.call_trees.callers[0]
75
- assert_equal('Class#new', call_tree.parent.target.full_name)
76
- assert_equal(0, call_tree.line)
77
-
78
- assert_equal(0, method.call_trees.callees.count)
79
-
80
- # Method 3
81
- method = methods[3]
82
- assert_equal('AliasTest::TestMe#some_method', method.full_name)
83
- assert_equal(13, method.line)
84
- refute(method.recursive?)
85
-
86
- assert_equal(1, method.call_trees.callers.count)
87
- call_tree = method.call_trees.callers[0]
88
- assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
89
- assert_equal(28, call_tree.line)
90
-
91
- assert_equal(1, method.call_trees.callees.count)
92
- call_tree = method.call_trees.callees[0]
93
- assert_equal('AliasTest::TestMe#some_method_original', call_tree.target.full_name)
94
- assert_equal(14, call_tree.line)
95
-
96
- # Method 4
97
- method = methods[4]
98
- assert_equal('AliasTest::TestMe#some_method_original', method.full_name)
99
- assert_equal(8, method.line)
100
- refute(method.recursive?)
101
-
102
- assert_equal(1, method.call_trees.callers.count)
103
- call_tree = method.call_trees.callers[0]
104
- assert_equal('AliasTest::TestMe#some_method', call_tree.parent.target.full_name)
105
- assert_equal(14, call_tree.line)
106
-
107
- assert_equal(1, method.call_trees.callees.count)
108
- call_tree = method.call_trees.callees[0]
109
- assert_equal('Kernel#sleep', call_tree.target.full_name)
110
- assert_equal(9, call_tree.line)
111
-
112
- # Method 5
113
- method = methods[5]
114
- assert_equal('Kernel#sleep', method.full_name)
115
- assert_equal(0, method.line)
116
- refute(method.recursive?)
117
-
118
- assert_equal(1, method.call_trees.callers.count)
119
- call_tree = method.call_trees.callers[0]
120
- assert_equal('AliasTest::TestMe#some_method_original', call_tree.parent.target.full_name)
121
- assert_equal(9, call_tree.line)
122
-
123
- assert_equal(0, method.call_trees.callees.count)
18
+ def test_alias
19
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
20
+ TestMe.new.some_method
124
21
  end
22
+
23
+ methods = result.threads.first.methods
24
+ assert_equal(6, methods.count)
25
+
26
+ # Method 0
27
+ method = methods[0]
28
+ assert_equal('AliasTest#test_alias', method.full_name)
29
+ assert_equal(20, method.line)
30
+ refute(method.recursive?)
31
+
32
+ assert_equal(0, method.call_trees.callers.count)
33
+
34
+ assert_equal(2, method.call_trees.callees.count)
35
+ call_tree = method.call_trees.callees[0]
36
+ assert_equal('Class#new', call_tree.target.full_name)
37
+ assert_equal(20, call_tree.line)
38
+
39
+ call_tree = method.call_trees.callees[1]
40
+ assert_equal('AliasTest::TestMe#some_method', call_tree.target.full_name)
41
+ assert_equal(20, call_tree.line)
42
+
43
+ # Method 1
44
+ method = methods[1]
45
+ assert_equal('Class#new', method.full_name)
46
+ assert_equal(0, method.line)
47
+ refute(method.recursive?)
48
+
49
+ assert_equal(1, method.call_trees.callers.count)
50
+ call_tree = method.call_trees.callers[0]
51
+ assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
52
+ assert_equal(20, call_tree.line)
53
+
54
+ assert_equal(1, method.call_trees.callees.count)
55
+ call_tree = method.call_trees.callees[0]
56
+ assert_equal('BasicObject#initialize', call_tree.target.full_name)
57
+ assert_equal(0, call_tree.line)
58
+
59
+ # Method 2
60
+ method = methods[2]
61
+ assert_equal('BasicObject#initialize', method.full_name)
62
+ assert_equal(0, method.line)
63
+ refute(method.recursive?)
64
+
65
+ assert_equal(1, method.call_trees.callers.count)
66
+ call_tree = method.call_trees.callers[0]
67
+ assert_equal('Class#new', call_tree.parent.target.full_name)
68
+ assert_equal(0, call_tree.line)
69
+
70
+ assert_equal(0, method.call_trees.callees.count)
71
+
72
+ # Method 3
73
+ method = methods[3]
74
+ assert_equal('AliasTest::TestMe#some_method', method.full_name)
75
+ assert_equal(13, method.line)
76
+ refute(method.recursive?)
77
+
78
+ assert_equal(1, method.call_trees.callers.count)
79
+ call_tree = method.call_trees.callers[0]
80
+ assert_equal('AliasTest#test_alias', call_tree.parent.target.full_name)
81
+ assert_equal(20, call_tree.line)
82
+
83
+ assert_equal(1, method.call_trees.callees.count)
84
+ call_tree = method.call_trees.callees[0]
85
+ assert_equal('AliasTest::TestMe#some_method_original', call_tree.target.full_name)
86
+ assert_equal(14, call_tree.line)
87
+
88
+ # Method 4
89
+ method = methods[4]
90
+ assert_equal('AliasTest::TestMe#some_method_original', method.full_name)
91
+ assert_equal(8, method.line)
92
+ refute(method.recursive?)
93
+
94
+ assert_equal(1, method.call_trees.callers.count)
95
+ call_tree = method.call_trees.callers[0]
96
+ assert_equal('AliasTest::TestMe#some_method', call_tree.parent.target.full_name)
97
+ assert_equal(14, call_tree.line)
98
+
99
+ assert_equal(1, method.call_trees.callees.count)
100
+ call_tree = method.call_trees.callees[0]
101
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
102
+ assert_equal(9, call_tree.line)
103
+
104
+ # Method 5
105
+ method = methods[5]
106
+ assert_equal('Kernel#sleep', method.full_name)
107
+ assert_equal(0, method.line)
108
+ refute(method.recursive?)
109
+
110
+ assert_equal(1, method.call_trees.callers.count)
111
+ call_tree = method.call_trees.callers[0]
112
+ assert_equal('AliasTest::TestMe#some_method_original', call_tree.parent.target.full_name)
113
+ assert_equal(9, call_tree.line)
114
+
115
+ assert_equal(0, method.call_trees.callees.count)
125
116
  end
126
117
  end
@@ -0,0 +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
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', __FILE__)
4
+ require_relative './call_tree_builder'
5
+ require 'base64'
6
+
7
+ class CallTreeTest < Minitest::Test
8
+ def test_initialize
9
+ method_info = RubyProf::MethodInfo.new(Base64, :encode64)
10
+ call_tree = RubyProf::CallTree.new(method_info)
11
+ assert_equal(method_info, call_tree.target)
12
+ end
13
+
14
+ def test_measurement
15
+ method_info = RubyProf::MethodInfo.new(Base64, :encode64)
16
+ call_tree = RubyProf::CallTree.new(method_info)
17
+
18
+ assert_equal(0, call_tree.total_time)
19
+ assert_equal(0, call_tree.self_time)
20
+ assert_equal(0, call_tree.wait_time)
21
+ assert_equal(0, call_tree.children_time)
22
+ assert_equal(0, call_tree.called)
23
+ end
24
+
25
+ def test_compare
26
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :encode64)
27
+ call_tree_1 = RubyProf::CallTree.new(method_info_1)
28
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
29
+ call_tree_2 = RubyProf::CallTree.new(method_info_2)
30
+ assert_equal(0, call_tree_1 <=> call_tree_2)
31
+
32
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :decode64)
33
+ call_tree_1 = RubyProf::CallTree.new(method_info_1)
34
+ call_tree_1.measurement.total_time = 1
35
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
36
+ call_tree_2 = RubyProf::CallTree.new(method_info_2)
37
+ assert_equal(1, call_tree_1 <=> call_tree_2)
38
+
39
+ method_info_1 = RubyProf::MethodInfo.new(Base64, :decode64)
40
+ call_tree_1 = RubyProf::CallTree.new(method_info_1)
41
+ method_info_2 = RubyProf::MethodInfo.new(Base64, :encode64)
42
+ call_tree_2 = RubyProf::CallTree.new(method_info_2)
43
+ call_tree_2.measurement.total_time = 1
44
+ assert_equal(-1, call_tree_1 <=> call_tree_2)
45
+ end
46
+
47
+ def test_to_s
48
+ method_info = RubyProf::MethodInfo.new(Base64, :encode64)
49
+ call_tree = RubyProf::CallTree.new(method_info)
50
+ assert_equal("<RubyProf::CallTree - Base64#encode64>", call_tree.to_s)
51
+ end
52
+
53
+ def test_add_child
54
+ method_info_parent = RubyProf::MethodInfo.new(Base64, :encode64)
55
+ call_tree_parent = RubyProf::CallTree.new(method_info_parent)
56
+
57
+ method_info_child = RubyProf::MethodInfo.new(Array, :pack)
58
+ call_tree_child = RubyProf::CallTree.new(method_info_child)
59
+
60
+ assert_equal(0, call_tree_parent.children.size)
61
+ assert_nil(call_tree_child.parent)
62
+
63
+ result = call_tree_parent.add_child(call_tree_child)
64
+ assert_equal(1, call_tree_parent.children.size)
65
+ assert_equal(call_tree_child, call_tree_parent.children.first)
66
+ assert_equal(call_tree_child, result)
67
+ assert_equal(call_tree_parent, call_tree_child.parent)
68
+ end
69
+
70
+ def test_add_child_gc
71
+ GC.stress = true
72
+
73
+ begin
74
+ method_info_parent = RubyProf::MethodInfo.new(Base64, :encode64)
75
+ call_tree_parent = RubyProf::CallTree.new(method_info_parent)
76
+
77
+ method_info_child = RubyProf::MethodInfo.new(Array, :pack)
78
+ call_tree_child = RubyProf::CallTree.new(method_info_child)
79
+ call_tree_parent.add_child(call_tree_child)
80
+
81
+ # Free the child first
82
+ call_tree_child = nil
83
+ GC.start
84
+
85
+ # Now free the parent and make sure it doesn't free the child a second time
86
+ call_tree_parent = nil
87
+ GC.start
88
+
89
+ assert(true)
90
+ ensure
91
+ GC.stress = false
92
+ end
93
+ end
94
+ end
@@ -5,13 +5,8 @@ require File.expand_path('../test_helper', __FILE__)
5
5
  require_relative './measure_times'
6
6
 
7
7
  class CallTreeVisitorTest < 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
8
  def test_visit
14
- result = RubyProf.profile do
9
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
15
10
  RubyProf::C1.sleep_wait
16
11
  end
17
12
 
@@ -13,7 +13,7 @@ class CallTreesTest < TestCase
13
13
  end
14
14
 
15
15
  def test_call_infos
16
- result = RubyProf.profile do
16
+ result = RubyProf::Profile.profile do
17
17
  some_method_1
18
18
  end
19
19
 
@@ -26,7 +26,7 @@ class CallTreesTest < TestCase
26
26
  call_trees = method.call_trees
27
27
  assert_empty(call_trees.callers)
28
28
  assert_equal(1, call_trees.callees.length)
29
- assert_kind_of(RubyProf::AggregateCallTree, call_trees.callees[0])
29
+ assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
30
30
  assert_equal('CallTreesTest#some_method_1', call_trees.callees[0].target.full_name)
31
31
 
32
32
  method = thread.methods[1]
@@ -34,10 +34,10 @@ class CallTreesTest < TestCase
34
34
 
35
35
  call_trees = method.call_trees
36
36
  assert_equal(1, call_trees.callers.length)
37
- assert_kind_of(RubyProf::AggregateCallTree, call_trees.callers[0])
37
+ assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
38
38
  assert_equal('CallTreesTest#test_call_infos', call_trees.callers[0].parent.target.full_name)
39
39
  assert_equal(1, call_trees.callees.length)
40
- assert_kind_of(RubyProf::AggregateCallTree, call_trees.callees[0])
40
+ assert_kind_of(RubyProf::CallTree, call_trees.callees[0])
41
41
  assert_equal('CallTreesTest#some_method_2', call_trees.callees[0].target.full_name)
42
42
 
43
43
  method = thread.methods[2]
@@ -45,13 +45,13 @@ class CallTreesTest < TestCase
45
45
 
46
46
  call_trees = method.call_trees
47
47
  assert_equal(1, call_trees.callers.length)
48
- assert_kind_of(RubyProf::AggregateCallTree, call_trees.callers[0])
48
+ assert_kind_of(RubyProf::CallTree, call_trees.callers[0])
49
49
  assert_equal('CallTreesTest#some_method_1', call_trees.callers[0].parent.target.full_name)
50
50
  assert_empty(call_trees.callees)
51
51
  end
52
52
 
53
53
  def test_gc
54
- result = RubyProf.profile do
54
+ result = RubyProf::Profile.profile do
55
55
  some_method_1
56
56
  end
57
57
 
@@ -4,12 +4,18 @@
4
4
  require File.expand_path('../test_helper', __FILE__)
5
5
  require_relative './measure_times'
6
6
 
7
- class BasicTest < TestCase
7
+ class CompatibilityTest < TestCase
8
8
  def setup
9
- # Need to use wall time for this test due to the sleep calls
9
+ super
10
+ Gem::Deprecate.skip = true
10
11
  RubyProf::measure_mode = RubyProf::WALL_TIME
11
12
  end
12
13
 
14
+ def teardown
15
+ super
16
+ Gem::Deprecate.skip = false
17
+ end
18
+
13
19
  def test_running
14
20
  assert(!RubyProf.running?)
15
21
  RubyProf.start
@@ -3,18 +3,18 @@
3
3
 
4
4
  require File.expand_path('../test_helper', __FILE__)
5
5
 
6
- class DuplicateNames < TestCase
6
+ class DuplicateNamesTest < TestCase
7
7
  def test_names
8
- result = RubyProf::profile do
8
+ result = RubyProf::Profile.profile do
9
9
  str = %{module Foo; class Bar; def foo; end end end}
10
10
 
11
11
  eval str
12
12
  Foo::Bar.new.foo
13
- DuplicateNames.class_eval {remove_const :Foo}
13
+ DuplicateNamesTest.class_eval {remove_const :Foo}
14
14
 
15
15
  eval str
16
16
  Foo::Bar.new.foo
17
- DuplicateNames.class_eval {remove_const :Foo}
17
+ DuplicateNamesTest.class_eval {remove_const :Foo}
18
18
 
19
19
  eval str
20
20
  Foo::Bar.new.foo
@@ -24,7 +24,7 @@ class DuplicateNames < TestCase
24
24
  methods = result.threads.first.methods.sort.reverse
25
25
 
26
26
  methods = methods.select do |method|
27
- method.full_name == 'DuplicateNames::Foo::Bar#foo'
27
+ method.full_name == 'DuplicateNamesTest::Foo::Bar#foo'
28
28
  end
29
29
 
30
30
  assert_equal(3, methods.length)
@@ -24,14 +24,9 @@ class DynamicMethodTest < TestCase
24
24
  end
25
25
  end
26
26
 
27
- def setup
28
- # Need to use wall time for this test due to the sleep calls
29
- RubyProf::measure_mode = RubyProf::WALL_TIME
30
- end
31
-
32
27
  def test_dynamic_method
33
28
  medley = FruitMedley.new
34
- result = RubyProf.profile do
29
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
35
30
  medley.apple
36
31
  medley.orange
37
32
  medley.banana
@@ -39,15 +34,29 @@ class DynamicMethodTest < TestCase
39
34
  end
40
35
 
41
36
  methods = result.threads.first.methods.sort.reverse
42
- expected_method_names = %w(
43
- DynamicMethodTest#test_dynamic_method
44
- Kernel#sleep
45
- DynamicMethodTest::FruitMedley#peach
46
- DynamicMethodTest::FruitMedley#banana
47
- DynamicMethodTest::FruitMedley#orange
48
- DynamicMethodTest::FruitMedley#apple
49
- Symbol#to_s
50
- )
37
+
38
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1')
39
+ expected_method_names = %w(
40
+ DynamicMethodTest#test_dynamic_method
41
+ Kernel#sleep
42
+ DynamicMethodTest::FruitMedley#peach
43
+ DynamicMethodTest::FruitMedley#banana
44
+ DynamicMethodTest::FruitMedley#orange
45
+ DynamicMethodTest::FruitMedley#apple
46
+ Symbol#to_s
47
+ )
48
+ else
49
+ expected_method_names = %w(
50
+ DynamicMethodTest#test_dynamic_method
51
+ Kernel#sleep
52
+ DynamicMethodTest::FruitMedley#peach
53
+ DynamicMethodTest::FruitMedley#banana
54
+ DynamicMethodTest::FruitMedley#orange
55
+ DynamicMethodTest::FruitMedley#apple
56
+ Integer#==
57
+ )
58
+ end
59
+
51
60
  assert_equal expected_method_names.join("\n"), methods.map(&:full_name).join("\n")
52
61
  end
53
62
  end
@@ -8,7 +8,7 @@ require File.expand_path('../test_helper', __FILE__)
8
8
 
9
9
  class EnumerableTest < TestCase
10
10
  def test_enumerable
11
- result = RubyProf.profile do
11
+ result = RubyProf::Profile.profile do
12
12
  3.times { [1,2,3].any? {|n| n} }
13
13
  end
14
14
  methods = if RUBY_VERSION >= "2.2.0"
@@ -6,7 +6,7 @@ require File.expand_path('../test_helper', __FILE__)
6
6
  class ExceptionsTest < TestCase
7
7
  def test_profile
8
8
  result = begin
9
- RubyProf.profile do
9
+ RubyProf::Profile.profile do
10
10
  raise(RuntimeError, 'Test error')
11
11
  end
12
12
  rescue
@@ -16,7 +16,7 @@ class ExceptionsTest < TestCase
16
16
 
17
17
  def test_profile_allows_exceptions
18
18
  assert_raises(RuntimeError) do
19
- RubyProf.profile(:allow_exceptions => true) do
19
+ RubyProf::Profile.profile(:allow_exceptions => true) do
20
20
  raise(RuntimeError, 'Test error')
21
21
  end
22
22
  end
@@ -34,14 +34,9 @@ class ExcludeMethodsClass
34
34
  end
35
35
 
36
36
  class ExcludeMethodsTest < TestCase
37
- def setup
38
- # Need to use wall time for this test due to the sleep calls
39
- RubyProf::measure_mode = RubyProf::WALL_TIME
40
- end
41
-
42
37
  def test_methods_can_be_profiled
43
38
  obj = ExcludeMethodsClass.new
44
- prf = RubyProf::Profile.new
39
+ prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME)
45
40
 
46
41
  result = prf.profile {obj.a}
47
42
  methods = result.threads.first.methods.sort.reverse
@@ -102,7 +97,7 @@ class ExcludeMethodsTest < TestCase
102
97
 
103
98
  def test_exclude_common_methods1
104
99
  obj = ExcludeMethodsClass.new
105
- prf = RubyProf::Profile.new
100
+ prf = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME)
106
101
 
107
102
  prf.exclude_common_methods!
108
103
 
@@ -124,7 +119,7 @@ class ExcludeMethodsTest < TestCase
124
119
  def test_exclude_common_methods2
125
120
  obj = ExcludeMethodsClass.new
126
121
 
127
- result = RubyProf.profile(exclude_common: true) { 5.times {obj.a} }
122
+ result = RubyProf::Profile.profile(exclude_common: true) { 5.times {obj.a} }
128
123
  methods = result.threads.first.methods.sort.reverse
129
124
 
130
125
  assert_equal(9, methods.count)
@@ -26,15 +26,10 @@ class ExcludeThreadsTest < TestCase
26
26
  thread2_proc
27
27
  end
28
28
 
29
- # exclude_threads already includes the minitest thread pool
30
- RubyProf.exclude_threads += [ thread2 ]
31
-
32
- RubyProf.start
33
-
34
- thread1.join
35
- thread2.join
36
-
37
- result = RubyProf.stop
29
+ result = RubyProf::Profile.profile(exclude_threads: [thread2]) do
30
+ thread1.join
31
+ thread2.join
32
+ end
38
33
 
39
34
  assert_equal(2, result.threads.length)
40
35