ruby-prof 0.18.0-x64-mingw32 → 1.1.0-x64-mingw32

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +32 -0
  3. data/LICENSE +2 -2
  4. data/README.rdoc +1 -483
  5. data/Rakefile +3 -6
  6. data/bin/ruby-prof +65 -30
  7. data/ext/ruby_prof/extconf.rb +6 -38
  8. data/ext/ruby_prof/rp_allocation.c +279 -0
  9. data/ext/ruby_prof/rp_allocation.h +31 -0
  10. data/ext/ruby_prof/rp_call_info.c +129 -283
  11. data/ext/ruby_prof/rp_call_info.h +16 -34
  12. data/ext/ruby_prof/rp_measure_allocations.c +25 -49
  13. data/ext/ruby_prof/rp_measure_memory.c +21 -56
  14. data/ext/ruby_prof/rp_measure_process_time.c +35 -39
  15. data/ext/ruby_prof/rp_measure_wall_time.c +36 -19
  16. data/ext/ruby_prof/rp_measurement.c +230 -0
  17. data/ext/ruby_prof/rp_measurement.h +50 -0
  18. data/ext/ruby_prof/rp_method.c +389 -389
  19. data/ext/ruby_prof/rp_method.h +34 -39
  20. data/ext/ruby_prof/rp_profile.c +895 -0
  21. data/ext/ruby_prof/rp_profile.h +37 -0
  22. data/ext/ruby_prof/rp_stack.c +103 -80
  23. data/ext/ruby_prof/rp_stack.h +5 -12
  24. data/ext/ruby_prof/rp_thread.c +143 -83
  25. data/ext/ruby_prof/rp_thread.h +15 -6
  26. data/ext/ruby_prof/ruby_prof.c +11 -757
  27. data/ext/ruby_prof/ruby_prof.h +4 -47
  28. data/ext/ruby_prof/vc/ruby_prof.vcxproj +10 -8
  29. data/lib/{2.6.3 → 2.6.5}/ruby_prof.so +0 -0
  30. data/lib/ruby-prof.rb +2 -18
  31. data/lib/ruby-prof/assets/call_stack_printer.html.erb +713 -0
  32. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  33. data/lib/ruby-prof/assets/graph_printer.html.erb +356 -0
  34. data/lib/ruby-prof/call_info.rb +35 -93
  35. data/lib/ruby-prof/call_info_visitor.rb +19 -21
  36. data/lib/ruby-prof/compatibility.rb +37 -107
  37. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  38. data/lib/ruby-prof/measurement.rb +14 -0
  39. data/lib/ruby-prof/method_info.rb +52 -83
  40. data/lib/ruby-prof/printers/abstract_printer.rb +73 -50
  41. data/lib/ruby-prof/printers/call_info_printer.rb +13 -3
  42. data/lib/ruby-prof/printers/call_stack_printer.rb +62 -145
  43. data/lib/ruby-prof/printers/call_tree_printer.rb +20 -12
  44. data/lib/ruby-prof/printers/dot_printer.rb +5 -5
  45. data/lib/ruby-prof/printers/flat_printer.rb +6 -24
  46. data/lib/ruby-prof/printers/graph_html_printer.rb +6 -192
  47. data/lib/ruby-prof/printers/graph_printer.rb +13 -15
  48. data/lib/ruby-prof/printers/multi_printer.rb +66 -23
  49. data/lib/ruby-prof/profile.rb +10 -3
  50. data/lib/ruby-prof/rack.rb +0 -3
  51. data/lib/ruby-prof/thread.rb +12 -12
  52. data/lib/ruby-prof/version.rb +1 -1
  53. data/ruby-prof.gemspec +2 -2
  54. data/test/abstract_printer_test.rb +0 -27
  55. data/test/alias_test.rb +129 -0
  56. data/test/basic_test.rb +41 -40
  57. data/test/call_info_visitor_test.rb +3 -3
  58. data/test/dynamic_method_test.rb +0 -2
  59. data/test/fiber_test.rb +11 -17
  60. data/test/gc_test.rb +96 -0
  61. data/test/line_number_test.rb +120 -39
  62. data/test/marshal_test.rb +119 -0
  63. data/test/measure_allocations.rb +30 -0
  64. data/test/measure_allocations_test.rb +371 -12
  65. data/test/measure_allocations_trace_test.rb +385 -0
  66. data/test/measure_memory_trace_test.rb +756 -0
  67. data/test/measure_process_time_test.rb +821 -33
  68. data/test/measure_times.rb +54 -0
  69. data/test/measure_wall_time_test.rb +349 -145
  70. data/test/multi_printer_test.rb +1 -34
  71. data/test/parser_timings.rb +24 -0
  72. data/test/pause_resume_test.rb +5 -5
  73. data/test/prime.rb +2 -0
  74. data/test/printer_call_stack_test.rb +28 -0
  75. data/test/printer_call_tree_test.rb +31 -0
  76. data/test/printer_flat_test.rb +68 -0
  77. data/test/printer_graph_html_test.rb +60 -0
  78. data/test/printer_graph_test.rb +41 -0
  79. data/test/printers_test.rb +32 -166
  80. data/test/printing_recursive_graph_test.rb +26 -72
  81. data/test/recursive_test.rb +72 -77
  82. data/test/stack_printer_test.rb +2 -15
  83. data/test/start_stop_test.rb +22 -25
  84. data/test/test_helper.rb +5 -248
  85. data/test/thread_test.rb +11 -54
  86. data/test/unique_call_path_test.rb +16 -28
  87. data/test/yarv_test.rb +1 -0
  88. metadata +28 -36
  89. data/examples/flat.txt +0 -50
  90. data/examples/graph.dot +0 -84
  91. data/examples/graph.html +0 -823
  92. data/examples/graph.txt +0 -139
  93. data/examples/multi.flat.txt +0 -23
  94. data/examples/multi.graph.html +0 -760
  95. data/examples/multi.grind.dat +0 -114
  96. data/examples/multi.stack.html +0 -547
  97. data/examples/stack.html +0 -547
  98. data/ext/ruby_prof/rp_measure.c +0 -40
  99. data/ext/ruby_prof/rp_measure.h +0 -45
  100. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
  101. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
  102. data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
  103. data/lib/ruby-prof/aggregate_call_info.rb +0 -76
  104. data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
  105. data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
  106. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -83
  107. data/lib/ruby-prof/profile/exclude_common_methods.rb +0 -207
  108. data/lib/ruby-prof/profile/legacy_method_elimination.rb +0 -50
  109. data/test/aggregate_test.rb +0 -136
  110. data/test/block_test.rb +0 -74
  111. data/test/call_info_test.rb +0 -78
  112. data/test/issue137_test.rb +0 -63
  113. data/test/measure_cpu_time_test.rb +0 -212
  114. data/test/measure_gc_runs_test.rb +0 -32
  115. data/test/measure_gc_time_test.rb +0 -36
  116. data/test/measure_memory_test.rb +0 -33
  117. data/test/method_elimination_test.rb +0 -84
  118. data/test/module_test.rb +0 -45
  119. data/test/stack_test.rb +0 -138
@@ -11,10 +11,10 @@ class CallInfoVisitorTest < TestCase
11
11
 
12
12
  def test_visit
13
13
  result = RubyProf.profile do
14
- RubyProf::C1.hello
14
+ RubyProf::C1.sleep_wait
15
15
  end
16
16
 
17
- visitor = RubyProf::CallInfoVisitor.new(result.threads.first.top_call_infos)
17
+ visitor = RubyProf::CallInfoVisitor.new(result.threads.first.root_methods)
18
18
 
19
19
  method_names = Array.new
20
20
 
@@ -24,7 +24,7 @@ class CallInfoVisitorTest < TestCase
24
24
 
25
25
  assert_equal(3, method_names.length)
26
26
  assert_equal("CallInfoVisitorTest#test_visit", method_names[0])
27
- assert_equal("<Class::RubyProf::C1>#hello", method_names[1])
27
+ assert_equal("<Class::RubyProf::C1>#sleep_wait", method_names[1])
28
28
  assert_equal("Kernel#sleep", method_names[2])
29
29
  end
30
30
  end
@@ -38,8 +38,6 @@ class DynamicMethodTest < TestCase
38
38
  medley.peach
39
39
  end
40
40
 
41
- # RubyProf::FlatPrinter.new(result).print(STDOUT)
42
-
43
41
  methods = result.threads.first.methods.sort.reverse
44
42
  expected_method_names = %w(
45
43
  DynamicMethodTest#test_dynamic_method
data/test/fiber_test.rb CHANGED
@@ -2,25 +2,21 @@
2
2
  # encoding: UTF-8
3
3
 
4
4
  require File.expand_path('../test_helper', __FILE__)
5
+ require 'fiber'
5
6
  require 'timeout'
6
7
  require 'set'
7
- begin
8
- require 'fiber'
9
- rescue LoadError
10
- end
11
8
 
12
9
  # -- Tests ----
13
10
  class FiberTest < TestCase
14
-
15
11
  def fiber_test
16
12
  @fiber_ids << Fiber.current.object_id
17
13
  enum = Enumerator.new do |yielder|
18
- [1,2].each do |x|
19
- @fiber_ids << Fiber.current.object_id
20
- sleep 0.1
21
- yielder.yield x
22
- end
14
+ [1,2].each do |x|
15
+ @fiber_ids << Fiber.current.object_id
16
+ sleep 0.1
17
+ yielder.yield x
23
18
  end
19
+ end
24
20
  while true
25
21
  begin
26
22
  enum.next
@@ -64,16 +60,14 @@ class FiberTest < TestCase
64
60
  result = RubyProf.profile(merge_fibers: true) { fiber_test }
65
61
  assert_equal(1, result.threads.length)
66
62
 
67
- profile = result.threads.first
68
- assert_equal 0, profile.fiber_id
63
+ thread = result.threads.first
64
+ assert_equal(thread.id, thread.fiber_id)
65
+ assert_in_delta(0.3, thread.total_time, 0.05)
69
66
 
70
- assert_in_delta(0.3, profile.total_time, 0.05)
71
-
72
- assert(method_next = profile.methods.detect{|m| m.full_name == "Enumerator#next"})
73
- assert(method_each = profile.methods.detect{|m| m.full_name == "Enumerator#each"})
67
+ assert(method_next = thread.methods.detect{|m| m.full_name == "Enumerator#next"})
68
+ assert(method_each = thread.methods.detect{|m| m.full_name == "Enumerator#each"})
74
69
 
75
70
  assert_in_delta(0.2, method_next.total_time, 0.05)
76
71
  assert_in_delta(0.2, method_each.total_time, 0.05)
77
72
  end
78
-
79
73
  end
data/test/gc_test.rb ADDED
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class GcTest < TestCase
7
+ def some_method
8
+ Array.new(3 * 4)
9
+ end
10
+
11
+ def run_profile
12
+ RubyProf.profile do
13
+ self.some_method
14
+ end
15
+ end
16
+
17
+ def test_hold_onto_thread
18
+ threads = 1000.times.reduce(Array.new) do |array, i|
19
+ array.concat(run_profile.threads)
20
+ GC.start
21
+ array
22
+ end
23
+
24
+ threads.each do |thread|
25
+ error = assert_raises(RuntimeError) do
26
+ thread.id
27
+ end
28
+ assert_match(/has already been freed/, error.message)
29
+ end
30
+ assert(true)
31
+ end
32
+
33
+ def test_hold_onto_method
34
+ methods = 1000.times.reduce(Array.new) do |array, i|
35
+ array.concat(run_profile.threads.map(&:methods).flatten)
36
+ GC.start
37
+ array
38
+ end
39
+
40
+ methods.each do |method|
41
+ error = assert_raises(RuntimeError) do
42
+ method.method_name
43
+ end
44
+ assert_match(/has already been freed/, error.message)
45
+ end
46
+ assert(true)
47
+ end
48
+
49
+ def test_hold_onto_parent_callers
50
+ call_infos = 1000.times.reduce(Array.new) do |array, i|
51
+ array.concat(run_profile.threads.map(&:methods).flatten.map(&:callers).flatten)
52
+ GC.start
53
+ array
54
+ end
55
+
56
+ call_infos.each do |call_info|
57
+ error = assert_raises(RuntimeError) do
58
+ call_info.source_file
59
+ end
60
+ assert_match(/has already been freed/, error.message)
61
+ end
62
+ assert(true)
63
+ end
64
+
65
+ def test_hold_onto_parent_callees
66
+ call_infos = 1000.times.reduce(Array.new) do |array, i|
67
+ array.concat(run_profile.threads.map(&:methods).flatten.map(&:callees).flatten)
68
+ GC.start
69
+ array
70
+ end
71
+
72
+ call_infos.each do |call_info|
73
+ error = assert_raises(RuntimeError) do
74
+ call_info.source_file
75
+ end
76
+ assert_match(/has already been freed/, error.message)
77
+ end
78
+ assert(true)
79
+ end
80
+
81
+ def test_hold_onto_measurements
82
+ measurements = 1000.times.reduce(Array.new) do |array, i|
83
+ array.concat(run_profile.threads.map(&:methods).flatten.map(&:callers).flatten.map(&:measurement))
84
+ GC.start
85
+ array
86
+ end
87
+
88
+ measurements.each do |measurement|
89
+ error = assert_raises(RuntimeError) do
90
+ measurement.total_time
91
+ end
92
+ assert_match(/has already been freed/, error.message)
93
+ end
94
+ assert(true)
95
+ end
96
+ end
@@ -4,14 +4,26 @@
4
4
  require File.expand_path('../test_helper', __FILE__)
5
5
 
6
6
  class LineNumbers
7
- def method1
7
+ def method_1
8
+ method_2
9
+ filler = 1
10
+ method_3
8
11
  end
9
12
 
10
- def method2
11
- method1
13
+ def method_2
14
+ filler = 1
15
+ 2.times do |i|
16
+ filler = 2
17
+ method_3
18
+ end
19
+ end
20
+
21
+ def method_3
22
+ sleep(0.4)
23
+ method_4
12
24
  end
13
25
 
14
- def method3
26
+ def method_4
15
27
  sleep(1)
16
28
  end
17
29
  end
@@ -22,59 +34,128 @@ class LineNumbersTest < TestCase
22
34
  numbers = LineNumbers.new
23
35
 
24
36
  result = RubyProf.profile do
25
- numbers.method2
37
+ numbers.method_1
26
38
  end
27
39
 
28
40
  methods = result.threads.first.methods.sort.reverse
29
- assert_equal(3, methods.length)
41
+ assert_equal(7, methods.length)
30
42
 
43
+ # Method 0
31
44
  method = methods[0]
32
45
  assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
33
- assert_equal(25, method.line)
46
+ assert_equal(37, method.line)
34
47
 
48
+ assert_equal(1, method.callers.count)
49
+ call_info = method.callers[0]
50
+ assert_nil(call_info.parent)
51
+ assert_equal(37, call_info.line)
52
+
53
+ assert_equal(1, method.callees.count)
54
+ call_info = method.callees[0]
55
+ assert_equal('LineNumbers#method_1', call_info.target.full_name)
56
+ assert_equal(37, call_info.line)
57
+
58
+ # Method 1
35
59
  method = methods[1]
36
- assert_equal('LineNumbers#method2', method.full_name)
37
- if RUBY_VERSION < "2.5"
38
- assert_equal(10, method.line)
39
- else
40
- assert_equal(11, method.line)
41
- end
60
+ assert_equal('LineNumbers#method_1', method.full_name)
61
+ assert_equal(7, method.line)
62
+
63
+ assert_equal(1, method.callers.count)
64
+ call_info = method.callers[0]
65
+ assert_equal('LineNumbersTest#test_function_line_no', call_info.parent.full_name)
66
+ assert_equal(37, call_info.line)
67
+
68
+ assert_equal(2, method.callees.count)
69
+ call_info = method.callees[0]
70
+ assert_equal('LineNumbers#method_2', call_info.target.full_name)
71
+ assert_equal(8, call_info.line)
42
72
 
73
+ call_info = method.callees[1]
74
+ assert_equal('LineNumbers#method_3', call_info.target.full_name)
75
+ assert_equal(10, call_info.line)
76
+
77
+ # Method 2
43
78
  method = methods[2]
44
- assert_equal('LineNumbers#method1', method.full_name)
45
- assert_equal(7, method.line)
46
- end
79
+ assert_equal('LineNumbers#method_3', method.full_name)
80
+ assert_equal(21, method.line)
47
81
 
48
- def test_c_function
49
- numbers = LineNumbers.new
82
+ assert_equal(2, method.callers.count)
83
+ call_info = method.callers[0]
84
+ assert_equal('Integer#times', call_info.parent.full_name)
85
+ assert_equal(17, call_info.line)
50
86
 
51
- result = RubyProf.profile do
52
- numbers.method3
53
- end
87
+ call_info = method.callers[1]
88
+ assert_equal('LineNumbers#method_1', call_info.parent.full_name)
89
+ assert_equal(10, call_info.line)
54
90
 
55
- methods = result.threads.first.methods.sort_by {|method| method.full_name}
56
- assert_equal(3, methods.length)
91
+ assert_equal(2, method.callees.count)
92
+ call_info = method.callees[0]
93
+ assert_equal('Kernel#sleep', call_info.target.full_name)
94
+ assert_equal(22, call_info.line)
57
95
 
58
- # Methods:
59
- # LineNumbers#method3
60
- # LineNumbersTest#test_c_function
61
- # Kernel#sleep
96
+ call_info = method.callees[1]
97
+ assert_equal('LineNumbers#method_4', call_info.target.full_name)
98
+ assert_equal(23, call_info.line)
62
99
 
63
- method = methods[0]
100
+ # Method 3
101
+ method = methods[3]
64
102
  assert_equal('Kernel#sleep', method.full_name)
65
103
  assert_equal(0, method.line)
66
104
 
67
- method = methods[1]
68
- assert_equal('LineNumbers#method3', method.full_name)
69
- if RUBY_VERSION < "2.5"
70
- assert_equal(14, method.line)
71
- else
72
- assert_equal(15, method.line)
73
- end
105
+ assert_equal(2, method.callers.count)
106
+ call_info = method.callers[0]
107
+ assert_equal('LineNumbers#method_3', call_info.parent.full_name)
108
+ assert_equal(22, call_info.line)
109
+
110
+ call_info = method.callers[1]
111
+ assert_equal('LineNumbers#method_4', call_info.parent.full_name)
112
+ assert_equal(27, call_info.line)
113
+
114
+ assert_equal(0, method.callees.count)
115
+
116
+ # Method 4
117
+ method = methods[4]
118
+ assert_equal('LineNumbers#method_4', method.full_name)
119
+ assert_equal(26, method.line)
120
+
121
+ assert_equal(1, method.callers.count)
122
+ call_info = method.callers[0]
123
+ assert_equal('LineNumbers#method_3', call_info.parent.full_name)
124
+ assert_equal(23, call_info.line)
125
+
126
+ assert_equal(1, method.callees.count)
127
+ call_info = method.callees[0]
128
+ assert_equal('Kernel#sleep', call_info.target.full_name)
129
+ assert_equal(27, call_info.line)
130
+
131
+ # Method 5
132
+ method = methods[5]
133
+ assert_equal('LineNumbers#method_2', method.full_name)
134
+ assert_equal(13, method.line)
135
+
136
+ assert_equal(1, method.callers.count)
137
+ call_info = method.callers[0]
138
+ assert_equal('LineNumbers#method_1', call_info.parent.full_name)
139
+ assert_equal(8, call_info.line)
140
+
141
+ assert_equal(1, method.callees.count)
142
+ call_info = method.callees[0]
143
+ assert_equal('Integer#times', call_info.target.full_name)
144
+ assert_equal(15, call_info.line)
145
+
146
+ # Method 6
147
+ method = methods[6]
148
+ assert_equal('Integer#times', method.full_name)
149
+ assert_equal(0, method.line)
74
150
 
75
- method = methods[2]
76
- assert_equal('LineNumbersTest#test_c_function', method.full_name)
77
- assert_equal(52, method.line)
78
- end
151
+ assert_equal(1, method.callers.count)
152
+ call_info = method.callers[0]
153
+ assert_equal('LineNumbers#method_2', call_info.parent.full_name)
154
+ assert_equal(15, call_info.line)
79
155
 
156
+ assert_equal(1, method.callees.count)
157
+ call_info = method.callees[0]
158
+ assert_equal('LineNumbers#method_3', call_info.target.full_name)
159
+ assert_equal(17, call_info.line)
160
+ end
80
161
  end
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path("../test_helper", __FILE__)
5
+ require 'stringio'
6
+
7
+ class MarshalTest < TestCase
8
+ def verify_profile(profile_1, profile_2)
9
+ verify_threads(profile_1.threads, profile_2.threads)
10
+ end
11
+
12
+ def verify_threads(threads_1, threads_2)
13
+ assert_equal(threads_1.count, threads_2.count)
14
+ threads_1.count.times do |i|
15
+ thread_1 = threads_1[i]
16
+ thread_2 = threads_2[i]
17
+ assert_nil(thread_2.id)
18
+ assert_equal(thread_1.fiber_id, thread_2.fiber_id)
19
+
20
+ verify_methods(thread_1.methods, thread_2.methods)
21
+ end
22
+ end
23
+
24
+ def verify_methods(methods_1, methods_2)
25
+ assert_equal(methods_1.count, methods_2.count)
26
+
27
+ methods_1.count.times do |i|
28
+ method_1 = methods_1[i]
29
+ method_2 = methods_2[i]
30
+
31
+ assert_equal(method_1.klass_name, method_2.klass_name)
32
+ assert_equal(method_1.klass_flags, method_2.klass_flags)
33
+
34
+ assert_equal(method_1.method_name, method_2.method_name)
35
+ assert_equal(method_1.full_name, method_2.full_name)
36
+
37
+ assert_equal(method_1.recursive?, method_2.recursive?)
38
+ assert_equal(method_1.root?, method_2.root?)
39
+ assert_equal(method_1.excluded?, method_2.excluded?)
40
+
41
+ assert_equal(method_1.source_file, method_2.source_file)
42
+ assert_equal(method_1.line, method_2.line)
43
+
44
+ verify_measurement(method_1.measurement, method_2.measurement)
45
+
46
+ verify_call_infos(method_1.callers, method_2.callers)
47
+ verify_call_infos(method_1.callees, method_2.callees)
48
+
49
+ verify_allocations(method_1.allocations, method_2.allocations)
50
+ end
51
+ end
52
+
53
+ def verify_allocations(allocations_1, allocations_2)
54
+ assert_equal(allocations_1.count, allocations_2.count)
55
+
56
+ allocations_1.count.times do |i|
57
+ allocation_1 = allocations_1[i]
58
+ allocation_2 = allocations_2[i]
59
+
60
+ assert_equal(allocation_1.klass_name, allocation_2.klass_name)
61
+ assert_equal(allocation_1.klass_flags, allocation_2.klass_flags)
62
+
63
+ assert_equal(allocation_1.count, allocation_2.count)
64
+ assert_equal(allocation_1.memory, allocation_2.memory)
65
+
66
+ assert_equal(allocation_1.source_file, allocation_2.source_file)
67
+ assert_equal(allocation_1.line, allocation_2.line)
68
+ end
69
+ end
70
+
71
+ def verify_call_infos(call_infos_1, call_infos_2)
72
+ assert_equal(call_infos_1.count, call_infos_2.count)
73
+ call_infos_1.count.times do |i|
74
+ call_info_1 = call_infos_1[i]
75
+ call_info_2 = call_infos_2[i]
76
+ verify_call_info(call_info_1, call_info_2)
77
+ end
78
+ end
79
+
80
+ def verify_call_info(call_info_1, call_info_2)
81
+ assert_equal(call_info_1.parent, call_info_2.parent)
82
+ assert_equal(call_info_1.target, call_info_2.target)
83
+
84
+ assert_equal(call_info_1.depth, call_info_2.depth)
85
+ assert_equal(call_info_1.source_file, call_info_2.source_file)
86
+ assert_equal(call_info_1.line, call_info_2.line)
87
+
88
+ verify_measurement(call_info_1.measurement, call_info_2.measurement)
89
+ end
90
+
91
+ def verify_measurement(measurement_1, measurement_2)
92
+ assert_equal(measurement_1.total_time, measurement_2.total_time)
93
+ assert_equal(measurement_1.self_time, measurement_2.self_time)
94
+ assert_equal(measurement_1.wait_time, measurement_2.wait_time)
95
+ assert_equal(measurement_1.called, measurement_2.called)
96
+ end
97
+
98
+ def test_marshal
99
+ profile_1 = RubyProf.profile do
100
+ 1.times { RubyProf::C1.new.sleep_wait }
101
+ end
102
+
103
+ data = Marshal.dump(profile_1)
104
+ profile_2 = Marshal.load(data)
105
+
106
+ verify_profile(profile_1, profile_2)
107
+ end
108
+
109
+ def test_singleton
110
+ profile_1 = RubyProf.profile do
111
+ SingletonTest.instance.busy_wait
112
+ end
113
+
114
+ data = Marshal.dump(profile_1)
115
+ profile_2 = Marshal.load(data)
116
+
117
+ verify_profile(profile_1, profile_2)
118
+ end
119
+ end