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

Sign up to get free protection for your applications and to get access to all the features.
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