ruby-prof 0.8.1-x86-mingw32 → 0.11.0.rc1-x86-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. data/CHANGES +89 -13
  2. data/LICENSE +4 -3
  3. data/{README → README.rdoc} +155 -162
  4. data/Rakefile +50 -123
  5. data/bin/ruby-prof +86 -47
  6. data/examples/empty.png +0 -0
  7. data/examples/graph.dot +106 -0
  8. data/examples/graph.png +0 -0
  9. data/examples/minus.png +0 -0
  10. data/examples/multi.flat.txt +23 -0
  11. data/examples/multi.graph.html +906 -0
  12. data/examples/multi.grind.dat +194 -0
  13. data/examples/multi.stack.html +573 -0
  14. data/examples/plus.png +0 -0
  15. data/examples/stack.html +573 -0
  16. data/ext/ruby_prof/extconf.rb +53 -0
  17. data/ext/ruby_prof/rp_call_info.c +369 -0
  18. data/ext/ruby_prof/rp_call_info.h +46 -0
  19. data/ext/ruby_prof/rp_measure.c +48 -0
  20. data/ext/ruby_prof/rp_measure.h +45 -0
  21. data/ext/ruby_prof/rp_measure_allocations.c +86 -0
  22. data/ext/ruby_prof/rp_measure_cpu_time.c +112 -0
  23. data/ext/ruby_prof/rp_measure_gc_runs.c +87 -0
  24. data/ext/ruby_prof/rp_measure_gc_time.c +73 -0
  25. data/ext/ruby_prof/rp_measure_memory.c +81 -0
  26. data/ext/ruby_prof/rp_measure_process_time.c +71 -0
  27. data/ext/ruby_prof/rp_measure_wall_time.c +42 -0
  28. data/ext/ruby_prof/rp_method.c +363 -0
  29. data/ext/ruby_prof/rp_method.h +55 -0
  30. data/ext/ruby_prof/rp_stack.c +61 -0
  31. data/ext/ruby_prof/rp_stack.h +40 -0
  32. data/ext/ruby_prof/rp_thread.c +113 -0
  33. data/ext/ruby_prof/rp_thread.h +20 -0
  34. data/ext/ruby_prof/ruby_prof.c +332 -1377
  35. data/ext/ruby_prof/ruby_prof.h +54 -188
  36. data/ext/ruby_prof/version.h +6 -3
  37. data/lib/1.8/ruby_prof.so +0 -0
  38. data/lib/1.9/ruby_prof.exp +0 -0
  39. data/lib/1.9/ruby_prof.ilk +0 -0
  40. data/lib/1.9/ruby_prof.lib +0 -0
  41. data/lib/1.9/ruby_prof.pdb +0 -0
  42. data/lib/1.9/ruby_prof.so +0 -0
  43. data/lib/ruby-prof.rb +32 -18
  44. data/lib/ruby-prof/abstract_printer.rb +15 -5
  45. data/lib/ruby-prof/aggregate_call_info.rb +11 -3
  46. data/lib/ruby-prof/call_info.rb +68 -1
  47. data/lib/ruby-prof/call_stack_printer.rb +775 -0
  48. data/lib/ruby-prof/call_tree_printer.rb +17 -9
  49. data/lib/ruby-prof/compatibility.rb +134 -0
  50. data/lib/ruby-prof/dot_printer.rb +152 -0
  51. data/lib/ruby-prof/empty.png +0 -0
  52. data/lib/ruby-prof/flat_printer.rb +23 -24
  53. data/lib/ruby-prof/flat_printer_with_line_numbers.rb +17 -21
  54. data/lib/ruby-prof/graph_html_printer.rb +69 -39
  55. data/lib/ruby-prof/graph_printer.rb +35 -35
  56. data/lib/ruby-prof/method_info.rb +26 -4
  57. data/lib/ruby-prof/minus.png +0 -0
  58. data/lib/ruby-prof/multi_printer.rb +56 -0
  59. data/lib/ruby-prof/plus.png +0 -0
  60. data/lib/ruby-prof/profile.rb +72 -0
  61. data/lib/ruby-prof/rack.rb +31 -0
  62. data/lib/ruby-prof/symbol_to_proc.rb +3 -1
  63. data/lib/ruby-prof/task.rb +20 -19
  64. data/lib/ruby-prof/test.rb +5 -3
  65. data/lib/ruby_prof.exp +0 -0
  66. data/lib/ruby_prof.ilk +0 -0
  67. data/lib/ruby_prof.lib +0 -0
  68. data/lib/ruby_prof.pdb +0 -0
  69. data/lib/ruby_prof.so +0 -0
  70. data/lib/unprof.rb +2 -0
  71. data/test/aggregate_test.rb +29 -14
  72. data/test/basic_test.rb +3 -251
  73. data/test/bug_test.rb +6 -0
  74. data/test/duplicate_names_test.rb +4 -4
  75. data/test/dynamic_method_test.rb +61 -0
  76. data/test/enumerable_test.rb +4 -4
  77. data/test/exceptions_test.rb +6 -5
  78. data/test/exclude_threads_test.rb +47 -47
  79. data/test/exec_test.rb +5 -5
  80. data/test/line_number_test.rb +16 -16
  81. data/test/measure_allocations_test.rb +25 -0
  82. data/test/measure_cpu_time_test.rb +212 -0
  83. data/test/measure_gc_runs_test.rb +29 -0
  84. data/test/measure_gc_time_test.rb +29 -0
  85. data/test/measure_memory_test.rb +36 -0
  86. data/test/measure_process_time_test.rb +205 -0
  87. data/test/measure_wall_time_test.rb +209 -0
  88. data/test/method_elimination_test.rb +74 -0
  89. data/test/module_test.rb +12 -21
  90. data/test/multi_printer_test.rb +81 -0
  91. data/test/no_method_class_test.rb +5 -3
  92. data/test/prime.rb +7 -10
  93. data/test/prime_test.rb +3 -3
  94. data/test/printers_test.rb +180 -54
  95. data/test/recursive_test.rb +34 -72
  96. data/test/singleton_test.rb +5 -4
  97. data/test/stack_printer_test.rb +73 -0
  98. data/test/stack_test.rb +7 -7
  99. data/test/start_stop_test.rb +23 -6
  100. data/test/test_helper.rb +81 -0
  101. data/test/test_suite.rb +35 -21
  102. data/test/thread_test.rb +40 -39
  103. data/test/unique_call_path_test.rb +6 -6
  104. metadata +106 -51
  105. data/ext/ruby_prof/measure_allocations.h +0 -58
  106. data/ext/ruby_prof/measure_cpu_time.h +0 -152
  107. data/ext/ruby_prof/measure_gc_runs.h +0 -76
  108. data/ext/ruby_prof/measure_gc_time.h +0 -57
  109. data/ext/ruby_prof/measure_memory.h +0 -101
  110. data/ext/ruby_prof/measure_process_time.h +0 -52
  111. data/ext/ruby_prof/measure_wall_time.h +0 -53
  112. data/ext/ruby_prof/mingw/Rakefile +0 -23
  113. data/ext/ruby_prof/mingw/build.rake +0 -38
  114. data/rails/environment/profile.rb +0 -24
  115. data/rails/example/example_test.rb +0 -9
  116. data/rails/profile_test_helper.rb +0 -21
  117. data/test/current_failures_windows +0 -8
  118. data/test/measurement_test.rb +0 -121
  119. data/test/ruby-prof-bin +0 -20
data/test/exec_test.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: UTF-8
2
3
 
3
- require 'test/unit'
4
- require 'os'
4
+ require File.expand_path('../test_helper', __FILE__)
5
5
 
6
6
  # -- Test for bug when it loads with no frames
7
7
 
8
- class EnumerableTest < Test::Unit::TestCase
8
+ class ExecTest < Test::Unit::TestCase
9
9
  def test_being_able_to_run_its_binary
10
10
  Dir.chdir(File.dirname(__FILE__)) do
11
11
  assert system(OS.ruby_bin + " ruby-prof-bin do_nothing.rb")
12
- end
12
+ end
13
13
  end
14
- end
14
+ end
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
- require 'test/unit'
3
- require 'ruby-prof'
4
- require 'prime'
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
5
 
6
6
  class LineNumbers
7
7
  def method1
8
- a = 3
8
+ 3
9
9
  end
10
-
10
+
11
11
  def method2
12
- a = 3
12
+ 3
13
13
  method1
14
14
  end
15
-
15
+
16
16
  def method3
17
17
  sleep(1)
18
18
  end
@@ -22,30 +22,30 @@ end
22
22
  class LineNumbersTest < Test::Unit::TestCase
23
23
  def test_function_line_no
24
24
  numbers = LineNumbers.new
25
-
25
+
26
26
  result = RubyProf.profile do
27
27
  numbers.method2
28
28
  end
29
29
 
30
30
  methods = result.threads.values.first.sort.reverse
31
31
  assert_equal(3, methods.length)
32
-
32
+
33
33
  method = methods[0]
34
34
  assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
35
35
  assert_equal(27, method.line)
36
-
36
+
37
37
  method = methods[1]
38
38
  assert_equal('LineNumbers#method2', method.full_name)
39
39
  assert_equal(11, method.line)
40
-
40
+
41
41
  method = methods[2]
42
42
  assert_equal('LineNumbers#method1', method.full_name)
43
43
  assert_equal(7, method.line)
44
44
  end
45
-
45
+
46
46
  def test_c_function
47
47
  numbers = LineNumbers.new
48
-
48
+
49
49
  result = RubyProf.profile do
50
50
  numbers.method3
51
51
  end
@@ -61,13 +61,13 @@ class LineNumbersTest < Test::Unit::TestCase
61
61
  method = methods[0]
62
62
  assert_equal('Kernel#sleep', method.full_name)
63
63
  assert_equal(0, method.line)
64
-
64
+
65
65
  method = methods[1]
66
66
  assert_equal('LineNumbers#method3', method.full_name)
67
67
  assert_equal(16, method.line)
68
-
68
+
69
69
  method = methods[2]
70
70
  assert_equal('LineNumbersTest#test_c_function', method.full_name)
71
71
  assert_equal(50, method.line)
72
72
  end
73
- end
73
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureAllocationsTest < Test::Unit::TestCase
7
+ def test_allocations_mode
8
+ RubyProf::measure_mode = RubyProf::ALLOCATIONS
9
+ assert_equal(RubyProf::ALLOCATIONS, RubyProf::measure_mode)
10
+ end
11
+
12
+ def test_allocations_enabled_defined
13
+ assert(defined?(RubyProf::ALLOCATIONS_ENABLED))
14
+ end
15
+
16
+ if RubyProf::ALLOCATIONS_ENABLED
17
+ def test_allocations
18
+ t = RubyProf.measure_allocations
19
+ assert_kind_of Integer, t
20
+
21
+ u = RubyProf.measure_allocations
22
+ assert u > t, [t, u].inspect
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureCpuTimeTest < Test::Unit::TestCase
7
+ def setup
8
+ # Need to use wall time for this test due to the sleep calls
9
+ RubyProf::measure_mode = RubyProf::CPU_TIME
10
+ end
11
+
12
+ def test_mode
13
+ RubyProf::measure_mode = RubyProf::CPU_TIME
14
+ assert_equal(RubyProf::CPU_TIME, RubyProf::measure_mode)
15
+ end
16
+
17
+ def test_cpu_time_enabled_defined
18
+ assert(defined?(RubyProf::CPU_TIME_ENABLED))
19
+ end
20
+
21
+ def test_class_methods
22
+ result = RubyProf.profile do
23
+ RubyProf::C1.hello
24
+ end
25
+
26
+ printer = RubyProf::FlatPrinter.new(result)
27
+ printer.print
28
+
29
+ # Length should be 3:
30
+ # MeasureCpuTimeTest#test_class_methods
31
+ # <Class::RubyProf::C1>#hello
32
+ # Kernel#sleep
33
+
34
+ methods = result.threads.values.first.sort.reverse
35
+ assert_equal(3, methods.length)
36
+
37
+ # Check the names
38
+ assert_equal('MeasureCpuTimeTest#test_class_methods', methods[0].full_name)
39
+ assert_equal('<Class::RubyProf::C1>#hello', methods[1].full_name)
40
+ assert_equal('Kernel#sleep', methods[2].full_name)
41
+
42
+ # Check times
43
+ assert_in_delta(0.1, methods[0].total_time, 0.01)
44
+ assert_in_delta(0, methods[0].wait_time, 0.01)
45
+ assert_in_delta(0, methods[0].self_time, 0.01)
46
+
47
+ assert_in_delta(0.1, methods[1].total_time, 0.01)
48
+ assert_in_delta(0, methods[1].wait_time, 0.01)
49
+ assert_in_delta(0, methods[1].self_time, 0.01)
50
+
51
+ assert_in_delta(0.1, methods[2].total_time, 0.01)
52
+ assert_in_delta(0, methods[2].wait_time, 0.01)
53
+ assert_in_delta(0.1, methods[2].self_time, 0.01)
54
+ end
55
+
56
+ def test_instance_methods
57
+ result = RubyProf.profile do
58
+ RubyProf::C1.new.hello
59
+ end
60
+
61
+ # Methods called
62
+ # MeasureCpuTimeTest#test_instance_methods
63
+ # Class.new
64
+ # Class:Object#allocate
65
+ # for Object#initialize
66
+ # C1#hello
67
+ # Kernel#sleep
68
+
69
+ methods = result.threads.values.first.sort.reverse
70
+ assert_equal(6, methods.length)
71
+ names = methods.map(&:full_name)
72
+ assert_equal('MeasureCpuTimeTest#test_instance_methods', names[0])
73
+ assert_equal('RubyProf::C1#hello', names[1])
74
+ assert_equal('Kernel#sleep', names[2])
75
+ assert_equal('Class#new', names[3])
76
+ # order can differ
77
+ assert(names.include?("<Class::#{RubyProf::PARENT}>#allocate"))
78
+ assert(names.include?("#{RubyProf::PARENT}#initialize"))
79
+
80
+ # Check times
81
+ assert_in_delta(0.2, methods[0].total_time, 0.02)
82
+ assert_in_delta(0, methods[0].wait_time, 0.02)
83
+ assert_in_delta(0, methods[0].self_time, 0.02)
84
+
85
+ assert_in_delta(0.2, methods[1].total_time, 0.02)
86
+ assert_in_delta(0, methods[1].wait_time, 0.02)
87
+ assert_in_delta(0, methods[1].self_time, 0.02)
88
+
89
+ assert_in_delta(0.2, methods[2].total_time, 0.02)
90
+ assert_in_delta(0, methods[2].wait_time, 0.02)
91
+ assert_in_delta(0.2, methods[2].self_time, 0.02)
92
+
93
+ assert_in_delta(0, methods[3].total_time, 0.01)
94
+ assert_in_delta(0, methods[3].wait_time, 0.01)
95
+ assert_in_delta(0, methods[3].self_time, 0.01)
96
+
97
+ assert_in_delta(0, methods[4].total_time, 0.01)
98
+ assert_in_delta(0, methods[4].wait_time, 0.01)
99
+ assert_in_delta(0, methods[4].self_time, 0.01)
100
+
101
+ assert_in_delta(0, methods[5].total_time, 0.01)
102
+ assert_in_delta(0, methods[5].wait_time, 0.01)
103
+ assert_in_delta(0, methods[5].self_time, 0.01)
104
+ end
105
+
106
+ def test_module_methods
107
+ result = RubyProf.profile do
108
+ RubyProf::C2.hello
109
+ end
110
+
111
+ # Methods:
112
+ # MeasureCpuTimeTest#test_module_methods
113
+ # M1#hello
114
+ # Kernel#sleep
115
+
116
+ methods = result.threads.values.first.sort.reverse
117
+ assert_equal(3, methods.length)
118
+
119
+ assert_equal('MeasureCpuTimeTest#test_module_methods', methods[0].full_name)
120
+ assert_equal('RubyProf::M1#hello', methods[1].full_name)
121
+ assert_equal('Kernel#sleep', methods[2].full_name)
122
+
123
+ # Check times
124
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
125
+ assert_in_delta(0, methods[0].wait_time, 0.02)
126
+ assert_in_delta(0, methods[0].self_time, 0.02)
127
+
128
+ assert_in_delta(0.3, methods[1].total_time, 0.1)
129
+ assert_in_delta(0, methods[1].wait_time, 0.02)
130
+ assert_in_delta(0, methods[1].self_time, 0.02)
131
+
132
+ assert_in_delta(0.3, methods[2].total_time, 0.1)
133
+ assert_in_delta(0, methods[2].wait_time, 0.02)
134
+ assert_in_delta(0.3, methods[2].self_time, 0.1)
135
+ end
136
+
137
+ def test_module_instance_methods
138
+ result = RubyProf.profile do
139
+ RubyProf::C2.new.hello
140
+ end
141
+
142
+ # Methods:
143
+ # MeasureCpuTimeTest#test_module_instance_methods
144
+ # Class#new
145
+ # <Class::Object>#allocate
146
+ # Object#initialize
147
+ # M1#hello
148
+ # Kernel#sleep
149
+
150
+ methods = result.threads.values.first.sort.reverse
151
+ assert_equal(6, methods.length)
152
+ names = methods.map(&:full_name)
153
+ assert_equal('MeasureCpuTimeTest#test_module_instance_methods', names[0])
154
+ assert_equal('RubyProf::M1#hello', names[1])
155
+ assert_equal('Kernel#sleep', names[2])
156
+ assert_equal('Class#new', names[3])
157
+ assert(names.include?("<Class::#{RubyProf::PARENT}>#allocate"))
158
+ assert(names.include?("#{RubyProf::PARENT}#initialize"))
159
+
160
+ # Check times
161
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
162
+ assert_in_delta(0, methods[0].wait_time, 0.1)
163
+ assert_in_delta(0, methods[0].self_time, 0.1)
164
+
165
+ assert_in_delta(0.3, methods[1].total_time, 0.02)
166
+ assert_in_delta(0, methods[1].wait_time, 0.01)
167
+ assert_in_delta(0, methods[1].self_time, 0.01)
168
+
169
+ assert_in_delta(0.3, methods[2].total_time, 0.02)
170
+ assert_in_delta(0, methods[2].wait_time, 0.01)
171
+ assert_in_delta(0.3, methods[2].self_time, 0.02)
172
+
173
+ assert_in_delta(0, methods[3].total_time, 0.01)
174
+ assert_in_delta(0, methods[3].wait_time, 0.01)
175
+ assert_in_delta(0, methods[3].self_time, 0.01)
176
+
177
+ assert_in_delta(0, methods[4].total_time, 0.01)
178
+ assert_in_delta(0, methods[4].wait_time, 0.01)
179
+ assert_in_delta(0, methods[4].self_time, 0.01)
180
+
181
+ assert_in_delta(0, methods[5].total_time, 0.01)
182
+ assert_in_delta(0, methods[5].wait_time, 0.01)
183
+ assert_in_delta(0, methods[5].self_time, 0.01)
184
+ end
185
+
186
+ def test_singleton
187
+ c3 = RubyProf::C3.new
188
+
189
+ class << c3
190
+ def hello
191
+ end
192
+ end
193
+
194
+ result = RubyProf.profile do
195
+ c3.hello
196
+ end
197
+
198
+ methods = result.threads.values.first.sort.reverse
199
+ assert_equal(2, methods.length)
200
+
201
+ assert_equal('MeasureCpuTimeTest#test_singleton', methods[0].full_name)
202
+ assert_equal('<Object::RubyProf::C3>#hello', methods[1].full_name)
203
+
204
+ assert_in_delta(0, methods[0].total_time, 0.01)
205
+ assert_in_delta(0, methods[0].wait_time, 0.01)
206
+ assert_in_delta(0, methods[0].self_time, 0.01)
207
+
208
+ assert_in_delta(0, methods[1].total_time, 0.01)
209
+ assert_in_delta(0, methods[1].wait_time, 0.01)
210
+ assert_in_delta(0, methods[1].self_time, 0.01)
211
+ end
212
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasuremeGCRunsTest < Test::Unit::TestCase
7
+ def test_gc_runs_mode
8
+ RubyProf::measure_mode = RubyProf::GC_RUNS
9
+ assert_equal(RubyProf::GC_RUNS, RubyProf::measure_mode)
10
+ end
11
+
12
+ def test_gc_runs_enabled_defined
13
+ assert(defined?(RubyProf::GC_RUNS_ENABLED))
14
+ end
15
+
16
+ if RubyProf::GC_RUNS_ENABLED
17
+ def test_gc_runs
18
+ t = RubyProf.measure_gc_runs
19
+ assert_kind_of Integer, t
20
+
21
+ GC.start
22
+
23
+ u = RubyProf.measure_gc_runs
24
+ assert u > t, [t, u].inspect
25
+ RubyProf::measure_mode = RubyProf::GC_RUNS
26
+ memory_test_helper
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureGCTimeTest < Test::Unit::TestCase
7
+ def test_gc_time_mode
8
+ RubyProf::measure_mode = RubyProf::GC_TIME
9
+ assert_equal(RubyProf::GC_TIME, RubyProf::measure_mode)
10
+ end
11
+
12
+ def test_gc_time_enabled_defined
13
+ assert(defined?(RubyProf::GC_TIME_ENABLED))
14
+ end
15
+
16
+ if RubyProf::GC_TIME_ENABLED
17
+ def test_gc_time
18
+ t = RubyProf.measure_gc_time
19
+ assert_kind_of Integer, t
20
+
21
+ GC.start
22
+
23
+ u = RubyProf.measure_gc_time
24
+ assert u > t, [t, u].inspect
25
+ RubyProf::measure_mode = RubyProf::GC_TIME
26
+ memory_test_helper
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureMemoryTest < Test::Unit::TestCase
7
+ def memory_test_helper
8
+ result = RubyProf.profile {Array.new}
9
+ total = result.threads.values.first.inject(0) { |sum, m| sum + m.total_time }
10
+ assert(total < 1_000_000, 'Total should not have subtract overflow error')
11
+ total
12
+ end
13
+
14
+ def test_memory_mode
15
+ RubyProf::measure_mode = RubyProf::MEMORY
16
+ assert_equal(RubyProf::MEMORY, RubyProf::measure_mode)
17
+ end
18
+
19
+ def test_memory_enabled_defined
20
+ assert(defined?(RubyProf::MEMORY_ENABLED))
21
+ end
22
+
23
+ if RubyProf::MEMORY_ENABLED
24
+ def test_memory
25
+ t = RubyProf.measure_memory
26
+ assert_kind_of Integer, t
27
+
28
+ u = RubyProf.measure_memory
29
+ assert(u >= t, [t, u].inspect)
30
+ RubyProf::measure_mode = RubyProf::MEMORY
31
+ total = memory_test_helper
32
+ assert(total > 0, 'Should measure more than zero kilobytes of memory usage')
33
+ assert_not_equal(0, total % 1, 'Should not truncate fractional kilobyte measurements')
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class MeasureProcessTimeTest < Test::Unit::TestCase
7
+ def setup
8
+ # Need to use wall time for this test due to the sleep calls
9
+ RubyProf::measure_mode = RubyProf::PROCESS_TIME
10
+ end
11
+
12
+ def test_mode
13
+ RubyProf::measure_mode = RubyProf::PROCESS_TIME
14
+ assert_equal(RubyProf::PROCESS_TIME, RubyProf::measure_mode)
15
+ end
16
+
17
+ def test_process_time_enabled_defined
18
+ assert(defined?(RubyProf::PROCESS_TIME_ENABLED))
19
+ end
20
+
21
+ def test_class_methods
22
+ result = RubyProf.profile do
23
+ RubyProf::C1.hello
24
+ end
25
+
26
+ # Length should be 3:
27
+ # MeasureProcessTimeTest#test_class_methods
28
+ # <Class::RubyProf::C1>#hello
29
+ # Kernel#sleep
30
+
31
+ methods = result.threads.values.first.sort.reverse
32
+ puts methods[0].total_time
33
+
34
+ assert_equal(3, methods.length)
35
+
36
+ # Check times
37
+ assert_equal("MeasureProcessTimeTest#test_class_methods", methods[0].full_name)
38
+ assert_in_delta(0.1, methods[0].total_time, 0.01)
39
+ assert_in_delta(0.0, methods[0].wait_time, 0.01)
40
+ assert_in_delta(0.0, methods[0].self_time, 0.01)
41
+
42
+ assert_equal("<Class::RubyProf::C1>#hello", methods[1].full_name)
43
+ assert_in_delta(0.1, methods[1].total_time, 0.01)
44
+ assert_in_delta(0.0, methods[1].wait_time, 0.01)
45
+ assert_in_delta(0.0, methods[1].self_time, 0.01)
46
+
47
+ assert_equal("Kernel#sleep", methods[2].full_name)
48
+ assert_in_delta(0.1, methods[2].total_time, 0.01)
49
+ assert_in_delta(0.0, methods[2].wait_time, 0.01)
50
+ assert_in_delta(0.1, methods[2].self_time, 0.01)
51
+ end
52
+
53
+ def test_instance_methods
54
+ result = RubyProf.profile do
55
+ RubyProf::C1.new.hello
56
+ end
57
+
58
+ # Methods called
59
+ # MeasureProcessTimeTest#test_instance_methods
60
+ # Class.new
61
+ # Class:Object#allocate
62
+ # for Object#initialize
63
+ # C1#hello
64
+ # Kernel#sleep
65
+
66
+ methods = result.threads.values.first.sort.reverse
67
+ assert_equal(6, methods.length)
68
+
69
+ # Check times
70
+ assert_equal("MeasureProcessTimeTest#test_instance_methods", methods[0].full_name)
71
+ assert_in_delta(0.2, methods[0].total_time, 0.02)
72
+ assert_in_delta(0.0, methods[0].wait_time, 0.02)
73
+ assert_in_delta(0.0, methods[0].self_time, 0.02)
74
+
75
+ assert_equal("RubyProf::C1#hello", methods[1].full_name)
76
+ assert_in_delta(0.2, methods[1].total_time, 0.02)
77
+ assert_in_delta(0.0, methods[1].wait_time, 0.02)
78
+ assert_in_delta(0.0, methods[1].self_time, 0.02)
79
+
80
+ assert_equal("Kernel#sleep", methods[2].full_name)
81
+ assert_in_delta(0.2, methods[2].total_time, 0.02)
82
+ assert_in_delta(0.0, methods[2].wait_time, 0.02)
83
+ assert_in_delta(0.2, methods[2].self_time, 0.02)
84
+
85
+ assert_equal("Class#new", methods[3].full_name)
86
+ assert_in_delta(0.0, methods[3].total_time, 0.01)
87
+ assert_in_delta(0.0, methods[3].wait_time, 0.01)
88
+ assert_in_delta(0.0, methods[3].self_time, 0.01)
89
+
90
+ assert_equal("<Class::#{RubyProf::PARENT}>#allocate", methods[4].full_name)
91
+ assert_in_delta(0.0, methods[4].total_time, 0.01)
92
+ assert_in_delta(0.0, methods[4].wait_time, 0.01)
93
+ assert_in_delta(0.0, methods[4].self_time, 0.01)
94
+
95
+ assert_equal("#{RubyProf::PARENT}#initialize", methods[5].full_name)
96
+ assert_in_delta(0.0, methods[5].total_time, 0.01)
97
+ assert_in_delta(0.0, methods[5].wait_time, 0.01)
98
+ assert_in_delta(0.0, methods[5].self_time, 0.01)
99
+ end
100
+
101
+ def test_module_methods
102
+ result = RubyProf.profile do
103
+ RubyProf::C2.hello
104
+ end
105
+
106
+ # Methods:
107
+ # MeasureProcessTimeTest#test_module_methods
108
+ # M1#hello
109
+ # Kernel#sleep
110
+
111
+ methods = result.threads.values.first.sort.reverse
112
+ assert_equal(3, methods.length)
113
+
114
+ # Check times
115
+ assert_equal("MeasureProcessTimeTest#test_module_methods", methods[0].full_name)
116
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
117
+ assert_in_delta(0.0, methods[0].wait_time, 0.02)
118
+ assert_in_delta(0.0, methods[0].self_time, 0.02)
119
+
120
+ assert_equal("RubyProf::M1#hello", methods[1].full_name)
121
+ assert_in_delta(0.3, methods[1].total_time, 0.1)
122
+ assert_in_delta(0.0, methods[1].wait_time, 0.02)
123
+ assert_in_delta(0.0, methods[1].self_time, 0.02)
124
+
125
+ assert_equal("Kernel#sleep", methods[2].full_name)
126
+ assert_in_delta(0.3, methods[2].total_time, 0.1)
127
+ assert_in_delta(0.0, methods[2].wait_time, 0.02)
128
+ assert_in_delta(0.3, methods[2].self_time, 0.1)
129
+ end
130
+
131
+ def test_module_instance_methods
132
+ result = RubyProf.profile do
133
+ RubyProf::C2.new.hello
134
+ end
135
+
136
+ # Methods:
137
+ # MeasureProcessTimeTest#test_module_instance_methods
138
+ # Class#new
139
+ # <Class::Object>#allocate
140
+ # Object#initialize
141
+ # M1#hello
142
+ # Kernel#sleep
143
+
144
+ methods = result.threads.values.first.sort.reverse
145
+ assert_equal(6, methods.length)
146
+
147
+ # Check times
148
+ assert_equal("MeasureProcessTimeTest#test_module_instance_methods", methods[0].full_name)
149
+ assert_in_delta(0.3, methods[0].total_time, 0.1)
150
+ assert_in_delta(0.0, methods[0].wait_time, 0.1)
151
+ assert_in_delta(0.0, methods[0].self_time, 0.1)
152
+
153
+ assert_equal("RubyProf::M1#hello", methods[1].full_name)
154
+ assert_in_delta(0.3, methods[1].total_time, 0.02)
155
+ assert_in_delta(0.0, methods[1].wait_time, 0.01)
156
+ assert_in_delta(0.0, methods[1].self_time, 0.01)
157
+
158
+ assert_equal("Kernel#sleep", methods[2].full_name)
159
+ assert_in_delta(0.3, methods[2].total_time, 0.02)
160
+ assert_in_delta(0.0, methods[2].wait_time, 0.01)
161
+ assert_in_delta(0.3, methods[2].self_time, 0.02)
162
+
163
+ assert_equal("Class#new", methods[3].full_name)
164
+ assert_in_delta(0.0, methods[3].total_time, 0.01)
165
+ assert_in_delta(0.0, methods[3].wait_time, 0.01)
166
+ assert_in_delta(0.0, methods[3].self_time, 0.01)
167
+
168
+ assert_equal("<Class::#{RubyProf::PARENT}>#allocate", methods[4].full_name)
169
+ assert_in_delta(0.0, methods[4].total_time, 0.01)
170
+ assert_in_delta(0.0, methods[4].wait_time, 0.01)
171
+ assert_in_delta(0.0, methods[4].self_time, 0.01)
172
+
173
+ assert_equal("#{RubyProf::PARENT}#initialize", methods[5].full_name)
174
+ assert_in_delta(0.0, methods[5].total_time, 0.01)
175
+ assert_in_delta(0.0, methods[5].wait_time, 0.01)
176
+ assert_in_delta(0.0, methods[5].self_time, 0.01)
177
+ end
178
+
179
+ def test_singleton
180
+ c3 = RubyProf::C3.new
181
+
182
+ class << c3
183
+ def hello
184
+ end
185
+ end
186
+
187
+ result = RubyProf.profile do
188
+ c3.hello
189
+ end
190
+
191
+ methods = result.threads.values.first.sort.reverse
192
+ assert_equal(2, methods.length)
193
+
194
+ assert_equal("MeasureProcessTimeTest#test_singleton", methods[0].full_name)
195
+ assert_equal("<Object::RubyProf::C3>#hello", methods[1].full_name)
196
+
197
+ assert_in_delta(0.0, methods[0].total_time, 0.01)
198
+ assert_in_delta(0.0, methods[0].wait_time, 0.01)
199
+ assert_in_delta(0.0, methods[0].self_time, 0.01)
200
+
201
+ assert_in_delta(0.0, methods[1].total_time, 0.01)
202
+ assert_in_delta(0.0, methods[1].wait_time, 0.01)
203
+ assert_in_delta(0.0, methods[1].self_time, 0.01)
204
+ end
205
+ end