ruby-prof 1.4.3 → 1.6.3

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 (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/fiber_test.rb CHANGED
@@ -8,7 +8,6 @@ require 'set'
8
8
 
9
9
  # -- Tests ----
10
10
  class FiberTest < TestCase
11
-
12
11
  def enumerator_with_fibers
13
12
  enum = Enumerator.new do |yielder|
14
13
  [1,2].each do |x|
@@ -30,13 +29,8 @@ class FiberTest < TestCase
30
29
  fiber.resume
31
30
  end
32
31
 
33
- def setup
34
- # Need to use wall time for this test due to the sleep calls
35
- RubyProf::measure_mode = RubyProf::WALL_TIME
36
- end
37
-
38
32
  def test_fibers
39
- result = RubyProf.profile { enumerator_with_fibers }
33
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { enumerator_with_fibers }
40
34
 
41
35
  assert_equal(2, result.threads.size)
42
36
 
@@ -47,46 +41,86 @@ class FiberTest < TestCase
47
41
  method = methods[0]
48
42
  assert_equal('FiberTest#test_fibers', method.full_name)
49
43
  assert_equal(1, method.called)
44
+ assert_in_delta(0, method.total_time)
45
+ assert_in_delta(0, method.self_time)
46
+ assert_in_delta(0, method.wait_time)
47
+ assert_in_delta(0, method.children_time)
50
48
 
51
49
  method = methods[1]
52
50
  assert_equal('FiberTest#enumerator_with_fibers', method.full_name)
53
51
  assert_equal(1, method.called)
52
+ assert_in_delta(0, method.total_time)
53
+ assert_in_delta(0, method.self_time)
54
+ assert_in_delta(0, method.wait_time)
55
+ assert_in_delta(0, method.children_time)
54
56
 
55
57
  method = methods[2]
56
58
  assert_equal('Enumerator#next', method.full_name)
57
59
  assert_equal(2, method.called)
60
+ assert_in_delta(0, method.total_time)
61
+ assert_in_delta(0, method.self_time)
62
+ assert_in_delta(0, method.wait_time)
63
+ assert_in_delta(0, method.children_time)
58
64
 
59
65
  method = methods[3]
60
66
  assert_equal('Class#new', method.full_name)
61
67
  assert_equal(1, method.called)
68
+ assert_in_delta(0, method.total_time)
69
+ assert_in_delta(0, method.self_time)
70
+ assert_in_delta(0, method.wait_time)
71
+ assert_in_delta(0, method.children_time)
62
72
 
63
73
  method = methods[4]
64
74
  assert_equal('Enumerator#initialize', method.full_name)
65
75
  assert_equal(1, method.called)
76
+ assert_in_delta(0, method.total_time)
77
+ assert_in_delta(0, method.self_time)
78
+ assert_in_delta(0, method.wait_time)
79
+ assert_in_delta(0, method.children_time)
66
80
 
67
81
  thread2 = result.threads[1]
68
82
  methods = thread2.methods.sort.reverse
69
83
  assert_equal(4, methods.count)
84
+ assert_in_delta(0, method.total_time)
85
+ assert_in_delta(0, method.self_time)
86
+ assert_in_delta(0, method.wait_time)
87
+ assert_in_delta(0, method.children_time)
70
88
 
71
89
  method = methods[0]
72
90
  assert_equal('Enumerator#each', method.full_name)
73
91
  assert_equal(1, method.called)
92
+ assert_in_delta(0, method.total_time)
93
+ assert_in_delta(0, method.self_time)
94
+ assert_in_delta(0, method.wait_time)
95
+ assert_in_delta(0, method.children_time)
74
96
 
75
97
  method = methods[1]
76
98
  assert_equal('Enumerator::Generator#each', method.full_name)
77
99
  assert_equal(1, method.called)
100
+ assert_in_delta(0, method.total_time)
101
+ assert_in_delta(0, method.self_time)
102
+ assert_in_delta(0, method.wait_time)
103
+ assert_in_delta(0, method.children_time)
78
104
 
79
105
  method = methods[2]
80
106
  assert_equal('Array#each', method.full_name)
81
107
  assert_equal(1, method.called)
108
+ assert_in_delta(0, method.total_time)
109
+ assert_in_delta(0, method.self_time)
110
+ assert_in_delta(0, method.wait_time)
111
+ assert_in_delta(0, method.children_time)
82
112
 
83
113
  method = methods[3]
84
114
  assert_equal('Enumerator::Yielder#yield', method.full_name)
85
115
  assert_equal(2, method.called)
116
+ assert_in_delta(0, method.total_time)
117
+ assert_in_delta(0, method.self_time)
118
+ assert_in_delta(0, method.wait_time)
119
+ assert_in_delta(0, method.children_time)
86
120
  end
87
121
 
88
122
  def test_fiber_resume
89
- result = RubyProf.profile { fiber_yield_resume }
123
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) { fiber_yield_resume }
90
124
 
91
125
  assert_equal(2, result.threads.size)
92
126
 
@@ -97,33 +131,65 @@ class FiberTest < TestCase
97
131
  method = methods[0]
98
132
  assert_equal('FiberTest#test_fiber_resume', method.full_name)
99
133
  assert_equal(1, method.called)
134
+ assert_in_delta(0, method.total_time)
135
+ assert_in_delta(0, method.self_time)
136
+ assert_in_delta(0, method.wait_time)
137
+ assert_in_delta(0, method.children_time)
100
138
 
101
139
  method = methods[1]
102
140
  assert_equal('FiberTest#fiber_yield_resume', method.full_name)
103
141
  assert_equal(1, method.called)
142
+ assert_in_delta(0, method.total_time)
143
+ assert_in_delta(0, method.self_time)
144
+ assert_in_delta(0, method.wait_time)
145
+ assert_in_delta(0, method.children_time)
104
146
 
105
147
  method = methods[2]
106
148
  assert_equal('Fiber#resume', method.full_name)
107
149
  assert_equal(2, method.called)
150
+ assert_in_delta(0, method.total_time)
151
+ assert_in_delta(0, method.self_time)
152
+ assert_in_delta(0, method.wait_time)
153
+ assert_in_delta(0, method.children_time)
108
154
 
109
155
  method = methods[3]
110
156
  assert_equal('Class#new', method.full_name)
111
157
  assert_equal(1, method.called)
158
+ assert_in_delta(0, method.total_time)
159
+ assert_in_delta(0, method.self_time)
160
+ assert_in_delta(0, method.wait_time)
161
+ assert_in_delta(0, method.children_time)
112
162
 
113
163
  method = methods[4]
114
164
  assert_equal('Fiber#initialize', method.full_name)
115
165
  assert_equal(1, method.called)
166
+ assert_in_delta(0, method.total_time)
167
+ assert_in_delta(0, method.self_time)
168
+ assert_in_delta(0, method.wait_time)
169
+ assert_in_delta(0, method.children_time)
116
170
 
117
171
  thread1 = result.threads[1]
118
172
  methods = thread1.methods.sort.reverse
119
173
  assert_equal(2, methods.count)
174
+ assert_in_delta(0, method.total_time)
175
+ assert_in_delta(0, method.self_time)
176
+ assert_in_delta(0, method.wait_time)
177
+ assert_in_delta(0, method.children_time)
120
178
 
121
179
  method = methods[0]
122
180
  assert_equal('FiberTest#fiber_yield_resume', method.full_name)
123
181
  assert_equal(1, method.called)
182
+ assert_in_delta(0, method.total_time)
183
+ assert_in_delta(0, method.self_time)
184
+ assert_in_delta(0, method.wait_time)
185
+ assert_in_delta(0, method.children_time)
124
186
 
125
187
  method = methods[1]
126
188
  assert_equal('<Class::Fiber>#yield', method.full_name)
127
189
  assert_equal(2, method.called)
190
+ assert_in_delta(0, method.total_time)
191
+ assert_in_delta(0, method.self_time)
192
+ assert_in_delta(0, method.wait_time)
193
+ assert_in_delta(0, method.children_time)
128
194
  end
129
195
  end
data/test/gc_test.rb CHANGED
@@ -6,6 +6,7 @@ Minitest::Test.i_suck_and_my_tests_are_order_dependent!
6
6
 
7
7
  class GcTest < TestCase
8
8
  def setup
9
+ super
9
10
  GC.stress = true
10
11
  end
11
12
 
@@ -18,7 +19,7 @@ class GcTest < TestCase
18
19
  end
19
20
 
20
21
  def run_profile
21
- RubyProf.profile do
22
+ RubyProf::Profile.profile do
22
23
  self.some_method
23
24
  end
24
25
  end
@@ -36,7 +37,6 @@ class GcTest < TestCase
36
37
  end
37
38
  end
38
39
 
39
-
40
40
  def test_hold_onto_method
41
41
  methods = 5.times.reduce(Array.new) do |array, i|
42
42
  profile = run_profile
@@ -67,16 +67,18 @@ class GcTest < TestCase
67
67
  end
68
68
 
69
69
  def test_hold_onto_measurements
70
- measurements = 5.times.reduce(Array.new) do |array, i|
71
- profile = run_profile
72
- measurements_2 = profile.threads.map(&:methods).flatten.map(&:measurement)
73
- array.concat(measurements_2)
74
- array
75
- end
70
+ # Run a profile
71
+ profile = run_profile
72
+
73
+ # Get measurement objects
74
+ measurements = profile.threads.map(&:methods).flatten.map(&:measurement)
75
+
76
+ # Free the profiles which frees the measurements
77
+ profile = nil
76
78
 
77
79
  GC.start
78
80
 
79
- measurements.each do |measurement|
81
+ measurements.each_with_index do |measurement|
80
82
  error = assert_raises(RuntimeError) do
81
83
  measurement.total_time
82
84
  end
@@ -4,18 +4,17 @@
4
4
  require File.expand_path('../test_helper', __FILE__)
5
5
 
6
6
  class InverseCallTreeTest < TestCase
7
- INVERSE_DEPTH = 5
8
-
9
7
  def setup
10
- # Need to use wall time for this test due to the sleep calls
11
- RubyProf::measure_mode = RubyProf::WALL_TIME
8
+ super
9
+ @profile = RubyProf::Profile.new
12
10
  end
11
+ INVERSE_DEPTH = 5
13
12
 
14
13
  INVERSE_DEPTH.times do |i|
15
14
  if i == 0
16
15
  define_method("method_#{i}") do
17
16
  sleep_amount = (i + 1) * 0.05
18
- RubyProf.start
17
+ @profile.start
19
18
  sleep(sleep_amount)
20
19
  end
21
20
  else
@@ -31,11 +30,11 @@ class InverseCallTreeTest < TestCase
31
30
  def test_inverse
32
31
  method_name = "method_#{INVERSE_DEPTH - 1}"
33
32
  self.send(method_name.to_sym)
34
- profile = RubyProf.stop
33
+ result = @profile.stop
35
34
 
36
- assert_equal(1, profile.threads.count)
35
+ assert_equal(1, result.threads.count)
37
36
 
38
- thread = profile.threads.first
37
+ thread = result.threads.first
39
38
  assert_in_delta(0.79, thread.total_time, 0.05)
40
39
 
41
40
  assert_equal(7, thread.methods.length)
@@ -44,29 +43,29 @@ class InverseCallTreeTest < TestCase
44
43
  # InverseCallTreeTest#test_inverse
45
44
  method = methods[0]
46
45
  assert_equal('InverseCallTreeTest#test_inverse', method.full_name)
47
- assert_equal(34, method.line)
46
+ assert_equal(33, method.line)
48
47
 
49
48
  assert_equal(0, method.call_trees.callers.count)
50
49
 
51
50
  assert_equal(1, method.call_trees.callees.count)
52
51
  call_tree = method.call_trees.callees[0]
53
52
  assert_equal('InverseCallTreeTest#method_4', call_tree.target.full_name)
54
- assert_equal(26, call_tree.line)
53
+ assert_equal(25, call_tree.line)
55
54
 
56
55
  # InverseCallTreeTest#method_4
57
56
  method = methods[1]
58
57
  assert_equal('InverseCallTreeTest#method_4', method.full_name)
59
- assert_equal(26, method.line)
58
+ assert_equal(25, method.line)
60
59
 
61
60
  assert_equal(1, method.call_trees.callers.count)
62
61
  call_tree = method.call_trees.callers[0]
63
62
  assert_equal('InverseCallTreeTest#test_inverse', call_tree.parent.target.full_name)
64
- assert_equal(26, call_tree.line)
63
+ assert_equal(25, call_tree.line)
65
64
 
66
65
  assert_equal(2, method.call_trees.callees.count)
67
66
  call_tree = method.call_trees.callees[0]
68
67
  assert_equal('InverseCallTreeTest#method_3', call_tree.target.full_name)
69
- assert_equal(26, call_tree.line)
68
+ assert_equal(25, call_tree.line)
70
69
 
71
70
  # Kernel#sleep
72
71
  method = methods[2]
@@ -76,100 +75,100 @@ class InverseCallTreeTest < TestCase
76
75
  assert_equal(5, method.call_trees.callers.count)
77
76
  call_tree = method.call_trees.callers[0]
78
77
  assert_equal('InverseCallTreeTest#method_0', call_tree.parent.target.full_name)
79
- assert_equal(19, call_tree.line)
78
+ assert_equal(18, call_tree.line)
80
79
 
81
80
  call_tree = method.call_trees.callers[1]
82
81
  assert_equal('InverseCallTreeTest#method_1', call_tree.parent.target.full_name)
83
- assert_equal(26, call_tree.line)
82
+ assert_equal(25, call_tree.line)
84
83
 
85
84
  call_tree = method.call_trees.callers[2]
86
85
  assert_equal('InverseCallTreeTest#method_2', call_tree.parent.target.full_name)
87
- assert_equal(26, call_tree.line)
86
+ assert_equal(25, call_tree.line)
88
87
  call_tree = method.call_trees.callers[3]
89
88
 
90
89
  assert_equal('InverseCallTreeTest#method_3', call_tree.parent.target.full_name)
91
- assert_equal(26, call_tree.line)
90
+ assert_equal(25, call_tree.line)
92
91
 
93
92
  call_tree = method.call_trees.callers[4]
94
93
  assert_equal('InverseCallTreeTest#method_4', call_tree.parent.target.full_name)
95
- assert_equal(26, call_tree.line)
94
+ assert_equal(25, call_tree.line)
96
95
 
97
96
  assert_equal(0, method.call_trees.callees.count)
98
97
 
99
98
  # InverseCallTreeTest#method_3
100
99
  method = methods[3]
101
100
  assert_equal('InverseCallTreeTest#method_3', method.full_name)
102
- assert_equal(26, method.line)
101
+ assert_equal(25, method.line)
103
102
 
104
103
  assert_equal(1, method.call_trees.callers.count)
105
104
  call_tree = method.call_trees.callers[0]
106
105
  assert_equal('InverseCallTreeTest#method_4', call_tree.parent.target.full_name)
107
- assert_equal(26, call_tree.line)
106
+ assert_equal(25, call_tree.line)
108
107
 
109
108
  assert_equal(2, method.call_trees.callees.count)
110
109
  call_tree = method.call_trees.callees[0]
111
110
  assert_equal('InverseCallTreeTest#method_2', call_tree.target.full_name)
112
- assert_equal(26, call_tree.line)
111
+ assert_equal(25, call_tree.line)
113
112
 
114
113
  call_tree = method.call_trees.callees[1]
115
114
  assert_equal('Kernel#sleep', call_tree.target.full_name)
116
- assert_equal(26, call_tree.line)
115
+ assert_equal(25, call_tree.line)
117
116
 
118
117
  # InverseCallTreeTest#method_2
119
118
  method = methods[4]
120
119
  assert_equal('InverseCallTreeTest#method_2', method.full_name)
121
- assert_equal(26, method.line)
120
+ assert_equal(25, method.line)
122
121
 
123
122
  assert_equal(1, method.call_trees.callers.count)
124
123
  call_tree = method.call_trees.callers[0]
125
124
  assert_equal('InverseCallTreeTest#method_3', call_tree.parent.target.full_name)
126
- assert_equal(26, call_tree.line)
125
+ assert_equal(25, call_tree.line)
127
126
 
128
127
  assert_equal(2, method.call_trees.callees.count)
129
128
  call_tree = method.call_trees.callees[0]
130
129
  assert_equal('InverseCallTreeTest#method_1', call_tree.target.full_name)
131
- assert_equal(26, call_tree.line)
130
+ assert_equal(25, call_tree.line)
132
131
 
133
132
  call_tree = method.call_trees.callees[1]
134
133
  assert_equal('Kernel#sleep', call_tree.target.full_name)
135
- assert_equal(26, call_tree.line)
134
+ assert_equal(25, call_tree.line)
136
135
 
137
136
  call_tree = method.call_trees.callees[1]
138
137
  assert_equal('Kernel#sleep', call_tree.target.full_name)
139
- assert_equal(26, call_tree.line)
138
+ assert_equal(25, call_tree.line)
140
139
 
141
140
  # InverseCallTreeTest#method_1
142
141
  method = methods[5]
143
142
  assert_equal('InverseCallTreeTest#method_1', method.full_name)
144
- assert_equal(26, method.line)
143
+ assert_equal(25, method.line)
145
144
 
146
145
  assert_equal(1, method.call_trees.callers.count)
147
146
  call_tree = method.call_trees.callers[0]
148
147
  assert_equal('InverseCallTreeTest#method_2', call_tree.parent.target.full_name)
149
- assert_equal(26, call_tree.line)
148
+ assert_equal(25, call_tree.line)
150
149
 
151
150
  assert_equal(2, method.call_trees.callees.count)
152
151
  call_tree = method.call_trees.callees[0]
153
152
  assert_equal('InverseCallTreeTest#method_0', call_tree.target.full_name)
154
- assert_equal(19, call_tree.line)
153
+ assert_equal(18, call_tree.line)
155
154
 
156
155
  call_tree = method.call_trees.callees[1]
157
156
  assert_equal('Kernel#sleep', call_tree.target.full_name)
158
- assert_equal(26, call_tree.line)
157
+ assert_equal(25, call_tree.line)
159
158
 
160
159
  # InverseCallTreeTest#method_0
161
160
  method = methods[6]
162
161
  assert_equal('InverseCallTreeTest#method_0', method.full_name)
163
- assert_equal(19, method.line)
162
+ assert_equal(18, method.line)
164
163
 
165
164
  assert_equal(1, method.call_trees.callers.count)
166
165
  call_tree = method.call_trees.callers[0]
167
166
  assert_equal('InverseCallTreeTest#method_1', call_tree.parent.target.full_name)
168
- assert_equal(19, call_tree.line)
167
+ assert_equal(18, call_tree.line)
169
168
 
170
169
  assert_equal(1, method.call_trees.callees.count)
171
170
  call_tree = method.call_trees.callees[0]
172
171
  assert_equal('Kernel#sleep', call_tree.target.full_name)
173
- assert_equal(19, call_tree.line)
172
+ assert_equal(18, call_tree.line)
174
173
  end
175
174
  end
@@ -19,12 +19,10 @@ class LineNumbers
19
19
  end
20
20
 
21
21
  def method_3
22
- sleep(0.3)
23
22
  method_4
24
23
  end
25
24
 
26
25
  def method_4
27
- sleep(1.2)
28
26
  end
29
27
  end
30
28
 
@@ -33,24 +31,28 @@ class LineNumbersTest < TestCase
33
31
  def test_function_line_no
34
32
  numbers = LineNumbers.new
35
33
 
36
- result = RubyProf.profile do
34
+ result = RubyProf::Profile.profile do
37
35
  numbers.method_1
38
36
  end
39
37
 
40
- methods = result.threads.first.methods.sort.reverse
41
- assert_equal(7, methods.length)
38
+ # Sort methods by name to have stable results
39
+ methods = result.threads.first.methods.sort_by(&:full_name)
40
+ assert_equal(6, methods.length)
42
41
 
43
42
  # Method 0
44
43
  method = methods[0]
45
- assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
46
- assert_equal(37, method.line)
44
+ assert_equal('Integer#times', method.full_name)
45
+ assert_equal(0, method.line)
47
46
 
48
- assert_equal(0, method.call_trees.callers.count)
47
+ assert_equal(1, method.call_trees.callers.count)
48
+ call_tree = method.call_trees.callers[0]
49
+ assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name)
50
+ assert_equal(15, call_tree.line)
49
51
 
50
52
  assert_equal(1, method.call_trees.callees.count)
51
53
  call_tree = method.call_trees.callees[0]
52
- assert_equal('LineNumbers#method_1', call_tree.target.full_name)
53
- assert_equal(37, call_tree.line)
54
+ assert_equal('LineNumbers#method_3', call_tree.target.full_name)
55
+ assert_equal(17, call_tree.line)
54
56
 
55
57
  # Method 1
56
58
  method = methods[1]
@@ -60,7 +62,7 @@ class LineNumbersTest < TestCase
60
62
  assert_equal(1, method.call_trees.callers.count)
61
63
  call_tree = method.call_trees.callers[0]
62
64
  assert_equal('LineNumbersTest#test_function_line_no', call_tree.parent.target.full_name)
63
- assert_equal(37, call_tree.line)
65
+ assert_equal(35, call_tree.line)
64
66
 
65
67
  assert_equal(2, method.call_trees.callees.count)
66
68
  call_tree = method.call_trees.callees[0]
@@ -73,6 +75,21 @@ class LineNumbersTest < TestCase
73
75
 
74
76
  # Method 2
75
77
  method = methods[2]
78
+ assert_equal('LineNumbers#method_2', method.full_name)
79
+ assert_equal(13, method.line)
80
+
81
+ assert_equal(1, method.call_trees.callers.count)
82
+ call_tree = method.call_trees.callers[0]
83
+ assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
84
+ assert_equal(8, call_tree.line)
85
+
86
+ assert_equal(1, method.call_trees.callees.count)
87
+ call_tree = method.call_trees.callees[0]
88
+ assert_equal('Integer#times', call_tree.target.full_name)
89
+ assert_equal(15, call_tree.line)
90
+
91
+ # Method 3
92
+ method = methods[3]
76
93
  assert_equal('LineNumbers#method_3', method.full_name)
77
94
  assert_equal(21, method.line)
78
95
 
@@ -85,74 +102,33 @@ class LineNumbersTest < TestCase
85
102
  assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
86
103
  assert_equal(10, call_tree.line)
87
104
 
88
- assert_equal(2, method.call_trees.callees.count)
105
+ assert_equal(1, method.call_trees.callees.count)
89
106
  call_tree = method.call_trees.callees[0]
90
- assert_equal('Kernel#sleep', call_tree.target.full_name)
91
- assert_equal(22, call_tree.line)
92
-
93
- call_tree = method.call_trees.callees[1]
94
107
  assert_equal('LineNumbers#method_4', call_tree.target.full_name)
95
- assert_equal(23, call_tree.line)
96
-
97
- # Method 3
98
- method = methods[3]
99
- assert_equal('Kernel#sleep', method.full_name)
100
- assert_equal(0, method.line)
101
-
102
- assert_equal(2, method.call_trees.callers.count)
103
- call_tree = method.call_trees.callers[0]
104
- assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name)
105
108
  assert_equal(22, call_tree.line)
106
109
 
107
- call_tree = method.call_trees.callers[1]
108
- assert_equal('LineNumbers#method_4', call_tree.parent.target.full_name)
109
- assert_equal(27, call_tree.line)
110
-
111
- assert_equal(0, method.call_trees.callees.count)
112
-
113
110
  # Method 4
114
111
  method = methods[4]
115
112
  assert_equal('LineNumbers#method_4', method.full_name)
116
- assert_equal(26, method.line)
113
+ assert_equal(25, method.line)
117
114
 
118
115
  assert_equal(1, method.call_trees.callers.count)
119
116
  call_tree = method.call_trees.callers[0]
120
117
  assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name)
121
- assert_equal(23, call_tree.line)
118
+ assert_equal(22, call_tree.line)
122
119
 
123
- assert_equal(1, method.call_trees.callees.count)
124
- call_tree = method.call_trees.callees[0]
125
- assert_equal('Kernel#sleep', call_tree.target.full_name)
126
- assert_equal(27, call_tree.line)
120
+ assert_equal(0, method.call_trees.callees.count)
127
121
 
128
122
  # Method 5
129
123
  method = methods[5]
130
- assert_equal('LineNumbers#method_2', method.full_name)
131
- assert_equal(13, method.line)
132
-
133
- assert_equal(1, method.call_trees.callers.count)
134
- call_tree = method.call_trees.callers[0]
135
- assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
136
- assert_equal(8, call_tree.line)
137
-
138
- assert_equal(1, method.call_trees.callees.count)
139
- call_tree = method.call_trees.callees[0]
140
- assert_equal('Integer#times', call_tree.target.full_name)
141
- assert_equal(15, call_tree.line)
142
-
143
- # Method 6
144
- method = methods[6]
145
- assert_equal('Integer#times', method.full_name)
146
- assert_equal(0, method.line)
124
+ assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
125
+ assert_equal(35, method.line)
147
126
 
148
- assert_equal(1, method.call_trees.callers.count)
149
- call_tree = method.call_trees.callers[0]
150
- assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name)
151
- assert_equal(15, call_tree.line)
127
+ assert_equal(0, method.call_trees.callers.count)
152
128
 
153
129
  assert_equal(1, method.call_trees.callees.count)
154
130
  call_tree = method.call_trees.callees[0]
155
- assert_equal('LineNumbers#method_3', call_tree.target.full_name)
156
- assert_equal(17, call_tree.line)
131
+ assert_equal('LineNumbers#method_1', call_tree.target.full_name)
132
+ assert_equal(35, call_tree.line)
157
133
  end
158
134
  end
data/test/marshal_test.rb CHANGED
@@ -5,6 +5,8 @@ require File.expand_path("../test_helper", __FILE__)
5
5
  class MarshalTest < TestCase
6
6
  def verify_profile(profile_1, profile_2)
7
7
  verify_threads(profile_1.threads, profile_2.threads)
8
+ assert_equal(profile_1.measure_mode, profile_2.measure_mode)
9
+ assert_equal(profile_1.track_allocations?, profile_2.track_allocations?)
8
10
  end
9
11
 
10
12
  def verify_threads(threads_1, threads_2)
@@ -108,8 +110,19 @@ class MarshalTest < TestCase
108
110
  assert_equal(measurement_1.called, measurement_2.called)
109
111
  end
110
112
 
111
- def test_marshal
112
- profile_1 = RubyProf.profile do
113
+ def test_marshal_1
114
+ profile_1 = RubyProf::Profile.profile(:measure_mode => RubyProf::WALL_TIME) do
115
+ 1.times { RubyProf::C1.new.sleep_wait }
116
+ end
117
+
118
+ data = Marshal.dump(profile_1)
119
+ profile_2 = Marshal.load(data)
120
+
121
+ verify_profile(profile_1, profile_2)
122
+ end
123
+
124
+ def test_marshal_2
125
+ profile_1 = RubyProf::Profile.profile(:measure_mode => RubyProf::PROCESS_TIME, :track_allocations => true) do
113
126
  1.times { RubyProf::C1.new.sleep_wait }
114
127
  end
115
128
 
@@ -120,7 +133,7 @@ class MarshalTest < TestCase
120
133
  end
121
134
 
122
135
  def test_singleton
123
- profile_1 = RubyProf.profile do
136
+ profile_1 = RubyProf::Profile.profile do
124
137
  SingletonTest.instance.busy_wait
125
138
  end
126
139
 
@@ -18,13 +18,9 @@ class Allocator
18
18
  String.new(b_string)
19
19
  end
20
20
 
21
- def internal_run
21
+ def run
22
22
  make_arrays
23
23
  make_hashes
24
24
  make_strings
25
25
  end
26
-
27
- def run
28
- internal_run
29
- end
30
26
  end