ruby-prof 1.7.1 → 2.0.0

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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +118 -176
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/extconf.rb +23 -22
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.c +296 -296
  40. data/ext/ruby_prof/rp_call_trees.h +25 -28
  41. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  42. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  43. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  44. data/ext/ruby_prof/rp_measurement.c +0 -5
  45. data/ext/ruby_prof/rp_measurement.h +49 -53
  46. data/ext/ruby_prof/rp_method.c +554 -551
  47. data/ext/ruby_prof/rp_method.h +1 -4
  48. data/ext/ruby_prof/rp_profile.c +1 -1
  49. data/ext/ruby_prof/rp_profile.h +1 -5
  50. data/ext/ruby_prof/rp_stack.c +212 -212
  51. data/ext/ruby_prof/rp_stack.h +50 -53
  52. data/ext/ruby_prof/rp_thread.h +1 -4
  53. data/ext/ruby_prof/ruby_prof.c +50 -50
  54. data/ext/ruby_prof/ruby_prof.h +4 -6
  55. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  56. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  57. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  58. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  59. data/lib/ruby-prof/call_tree.rb +57 -57
  60. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  61. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  62. data/lib/ruby-prof/measurement.rb +17 -17
  63. data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
  64. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  65. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  66. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  67. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  68. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  69. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  70. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  71. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  72. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  73. data/lib/ruby-prof/profile.rb +13 -0
  74. data/lib/ruby-prof/rack.rb +114 -105
  75. data/lib/ruby-prof/task.rb +147 -147
  76. data/lib/ruby-prof/thread.rb +20 -20
  77. data/lib/ruby-prof/version.rb +3 -3
  78. data/lib/ruby-prof.rb +50 -52
  79. data/lib/unprof.rb +10 -10
  80. data/ruby-prof.gemspec +66 -65
  81. data/test/abstract_printer_test.rb +25 -27
  82. data/test/alias_test.rb +203 -117
  83. data/test/call_tree_builder.rb +126 -126
  84. data/test/call_tree_visitor_test.rb +27 -27
  85. data/test/call_trees_test.rb +66 -66
  86. data/test/duplicate_names_test.rb +32 -32
  87. data/test/dynamic_method_test.rb +50 -62
  88. data/test/enumerable_test.rb +23 -21
  89. data/test/exceptions_test.rb +24 -24
  90. data/test/exclude_methods_test.rb +363 -257
  91. data/test/exclude_threads_test.rb +48 -48
  92. data/test/fiber_test.rb +195 -195
  93. data/test/gc_test.rb +104 -102
  94. data/test/inverse_call_tree_test.rb +174 -174
  95. data/test/line_number_test.rb +563 -289
  96. data/test/marshal_test.rb +144 -145
  97. data/test/measure_allocations.rb +26 -26
  98. data/test/measure_allocations_test.rb +1511 -1081
  99. data/test/measure_process_time_test.rb +3286 -2477
  100. data/test/measure_times.rb +56 -56
  101. data/test/measure_wall_time_test.rb +773 -568
  102. data/test/measurement_test.rb +82 -82
  103. data/test/merge_test.rb +146 -146
  104. data/test/method_info_test.rb +100 -95
  105. data/test/multi_printer_test.rb +52 -66
  106. data/test/no_method_class_test.rb +15 -15
  107. data/test/pause_resume_test.rb +171 -171
  108. data/test/prime.rb +54 -54
  109. data/test/prime_script.rb +5 -5
  110. data/test/printer_call_stack_test.rb +28 -27
  111. data/test/printer_call_tree_test.rb +30 -30
  112. data/test/printer_flame_graph_test.rb +82 -0
  113. data/test/printer_flat_test.rb +99 -99
  114. data/test/printer_graph_html_test.rb +62 -59
  115. data/test/printer_graph_test.rb +42 -40
  116. data/test/printers_test.rb +162 -135
  117. data/test/printing_recursive_graph_test.rb +81 -81
  118. data/test/profile_test.rb +101 -101
  119. data/test/rack_test.rb +103 -93
  120. data/test/recursive_test.rb +796 -622
  121. data/test/scheduler.rb +4 -0
  122. data/test/singleton_test.rb +39 -38
  123. data/test/stack_printer_test.rb +61 -61
  124. data/test/start_stop_test.rb +106 -106
  125. data/test/test_helper.rb +24 -20
  126. data/test/thread_test.rb +229 -231
  127. data/test/unique_call_path_test.rb +123 -136
  128. data/test/yarv_test.rb +56 -60
  129. metadata +68 -16
  130. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  131. data/lib/ruby-prof/compatibility.rb +0 -113
  132. data/test/compatibility_test.rb +0 -49
  133. data/test/crash2.rb +0 -144
  134. data/test/measure_memory_test.rb +0 -1456
data/test/scheduler.rb CHANGED
@@ -262,6 +262,10 @@ class Scheduler
262
262
  return fiber
263
263
  end
264
264
 
265
+ def fiber_interrupt(fiber, exception)
266
+ fiber.raise(exception)
267
+ end
268
+
265
269
  def address_resolve(hostname)
266
270
  Thread.new do
267
271
  Addrinfo.getaddrinfo(hostname, nil).map(&:ip_address).uniq
@@ -1,38 +1,39 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'timeout'
6
-
7
- # -- Test for bug [#5657]
8
- # http://rubyforge.org/tracker/index.php?func=detail&aid=5657&group_id=1814&atid=7060
9
-
10
-
11
- class A
12
- attr_accessor :as
13
- def initialize
14
- @as = []
15
- class << @as
16
- def <<(an_a)
17
- super
18
- end
19
- end
20
- end
21
-
22
- def <<(an_a)
23
- @as << an_a
24
- end
25
- end
26
-
27
- class SingletonTest < TestCase
28
- def test_singleton
29
- result = RubyProf::Profile.profile do
30
- a = A.new
31
- a << :first_thing
32
- assert_equal(1, a.as.size)
33
- end
34
- printer = RubyProf::FlatPrinter.new(result)
35
- output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : ''
36
- printer.print(output)
37
- end
38
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'stringio'
6
+ require 'timeout'
7
+
8
+ # -- Test for bug [#5657]
9
+ # http://rubyforge.org/tracker/index.php?func=detail&aid=5657&group_id=1814&atid=7060
10
+
11
+
12
+ class A
13
+ attr_accessor :as
14
+ def initialize
15
+ @as = []
16
+ class << @as
17
+ def <<(an_a)
18
+ super
19
+ end
20
+ end
21
+ end
22
+
23
+ def <<(an_a)
24
+ @as << an_a
25
+ end
26
+ end
27
+
28
+ class SingletonTest < TestCase
29
+ def test_singleton
30
+ result = RubyProf::Profile.profile do
31
+ a = A.new
32
+ a << :first_thing
33
+ assert_equal(1, a.as.size)
34
+ end
35
+ printer = RubyProf::FlatPrinter.new(result)
36
+ output = ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1" ? STDOUT : StringIO.new
37
+ printer.print(output)
38
+ end
39
+ end
@@ -1,61 +1,61 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- # Test data
7
- # A
8
- # / \
9
- # B C
10
- # \
11
- # B
12
-
13
- class STPT
14
- def a
15
- 100.times{b}
16
- 300.times{c}
17
- c;c;c
18
- end
19
-
20
- def b
21
- sleep 0
22
- end
23
-
24
- def c
25
- 5.times{b}
26
- end
27
- end
28
-
29
- class StackPrinterTest < TestCase
30
- def test_stack_can_be_printed
31
- start_time = Time.now
32
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
33
- 5.times{STPT.new.a}
34
- end
35
-
36
- end_time = Time.now
37
- expected_time = end_time - start_time
38
-
39
- file_contents = nil
40
- file_contents = print(result)
41
- re = /Thread: (\d+)(, Fiber: (\d+))? \([\.0-9]+.[\.0-9]+% ~ ([\.0-9]+)\)/
42
- assert_match(re, file_contents)
43
- file_contents =~ re
44
- actual_time = $4.to_f
45
- assert_in_delta(expected_time, actual_time, 0.1)
46
- end
47
-
48
- private
49
-
50
- def print(result)
51
- test = caller.first =~ /in `(.*)'/ ? $1 : "test"
52
- testfile_name = "#{Dir.tmpdir}/ruby_prof_#{test}.html"
53
- # puts "printing to #{testfile_name}"
54
- printer = RubyProf::CallStackPrinter.new(result)
55
- File.open(testfile_name, "w") {|f| printer.print(f, :threshold => 0, :min_percent => 0, :title => "ruby_prof #{test}")}
56
- system("open '#{testfile_name}'") if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
57
- assert File.exist?(testfile_name), "#{testfile_name} does not exist"
58
- assert File.readable?(testfile_name), "#{testfile_name} is no readable"
59
- File.read(testfile_name)
60
- end
61
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ # Test data
7
+ # A
8
+ # / \
9
+ # B C
10
+ # \
11
+ # B
12
+
13
+ class STPT
14
+ def a
15
+ 100.times{b}
16
+ 300.times{c}
17
+ c;c;c
18
+ end
19
+
20
+ def b
21
+ sleep 0
22
+ end
23
+
24
+ def c
25
+ 5.times{b}
26
+ end
27
+ end
28
+
29
+ class StackPrinterTest < TestCase
30
+ def test_stack_can_be_printed
31
+ start_time = Time.now
32
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
33
+ 5.times{STPT.new.a}
34
+ end
35
+
36
+ end_time = Time.now
37
+ expected_time = end_time - start_time
38
+
39
+ file_contents = nil
40
+ file_contents = print(result)
41
+ re = /Thread: (\d+)(, Fiber: (\d+))? \([\.0-9]+.[\.0-9]+% ~ ([\.0-9]+)\)/
42
+ assert_match(re, file_contents)
43
+ file_contents =~ re
44
+ actual_time = $4.to_f
45
+ assert_in_delta(expected_time, actual_time, 0.1)
46
+ end
47
+
48
+ private
49
+
50
+ def print(result)
51
+ test = caller.first =~ /in `(.*)'/ ? $1 : "test"
52
+ testfile_name = "#{Dir.tmpdir}/ruby_prof_#{test}.html"
53
+ # puts "printing to #{testfile_name}"
54
+ printer = RubyProf::CallStackPrinter.new(result)
55
+ File.open(testfile_name, "w") {|f| printer.print(f, threshold: 0, min_percent: 0, title: "ruby_prof #{test}")}
56
+ system("open '#{testfile_name}'") if RUBY_PLATFORM =~ /darwin/ && ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT']=="1"
57
+ assert File.exist?(testfile_name), "#{testfile_name} does not exist"
58
+ assert File.readable?(testfile_name), "#{testfile_name} is no readable"
59
+ File.read(testfile_name)
60
+ end
61
+ end
@@ -1,106 +1,106 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class StartStopTest < TestCase
7
- def setup
8
- super
9
- # Need to use wall time for this test due to the sleep calls
10
- @profile = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME)
11
- end
12
-
13
- def method1
14
- @profile.start
15
- method2
16
- end
17
-
18
- def method2
19
- method3
20
- end
21
-
22
- def method3
23
- sleep(2)
24
- @result = @profile.stop
25
- end
26
-
27
- def test_extra_stop_should_raise
28
- @profile.start
29
- assert_raises(RuntimeError) do
30
- @profile.start
31
- end
32
-
33
- @profile.stop # ok
34
- assert_raises(RuntimeError) do
35
- @profile.stop
36
- end
37
- end
38
-
39
- def test_different_methods
40
- method1
41
-
42
- # Ruby prof should be stopped
43
- assert_equal(false, @profile.running?)
44
-
45
- methods = @result.threads.first.methods.sort.reverse
46
- assert_equal(4, methods.length)
47
-
48
- method = methods[0]
49
- assert_equal('StartStopTest#method1', method.full_name)
50
- assert_equal(1, method.called)
51
- assert_in_delta(2, method.total_time, 0.05)
52
- assert_in_delta(0, method.wait_time, 0.02)
53
- assert_in_delta(0, method.self_time, 0.02)
54
- assert_in_delta(2, method.children_time, 0.05)
55
-
56
- assert_equal(1, method.call_trees.callees.length)
57
- call_tree = method.call_trees.callees[0]
58
- assert_equal('StartStopTest#method2', call_tree.target.full_name)
59
-
60
- method = methods[1]
61
- assert_equal('StartStopTest#method2', method.full_name)
62
- assert_equal(1, method.called)
63
- assert_in_delta(2, method.total_time, 0.05)
64
- assert_in_delta(0, method.wait_time, 0.02)
65
- assert_in_delta(0, method.self_time, 0.02)
66
- assert_in_delta(2, method.children_time, 0.05)
67
-
68
- assert_equal(1, method.call_trees.callers.length)
69
- call_tree = method.call_trees.callers[0]
70
- assert_equal('StartStopTest#method1', call_tree.parent.target.full_name)
71
-
72
- assert_equal(1, method.call_trees.callees.length)
73
- call_tree = method.call_trees.callees[0]
74
- assert_equal('StartStopTest#method3', call_tree.target.full_name)
75
-
76
- method = methods[2]
77
- assert_equal('StartStopTest#method3', method.full_name)
78
- assert_equal(1, method.called)
79
- assert_in_delta(2, method.total_time, 0.02)
80
- assert_in_delta(0, method.wait_time, 0.02)
81
- assert_in_delta(0, method.self_time, 0.02)
82
- assert_in_delta(2, method.children_time, 0.02)
83
-
84
- assert_equal(1, method.call_trees.callers.length)
85
- call_tree = method.call_trees.callers[0]
86
- assert_equal('StartStopTest#method2', call_tree.parent.target.full_name)
87
-
88
- assert_equal(1, method.call_trees.callees.length)
89
- call_tree = method.call_trees.callees[0]
90
- assert_equal('Kernel#sleep', call_tree.target.full_name)
91
-
92
- method = methods[3]
93
- assert_equal('Kernel#sleep', method.full_name)
94
- assert_equal(1, method.called)
95
- assert_in_delta(2, method.total_time, 0.02)
96
- assert_in_delta(0, method.wait_time, 0.02)
97
- assert_in_delta(2, method.self_time, 0.02)
98
- assert_in_delta(0, method.children_time, 0.02)
99
-
100
- assert_equal(1, method.call_trees.callers.length)
101
- call_tree = method.call_trees.callers[0]
102
- assert_equal('StartStopTest#method3', call_tree.parent.target.full_name)
103
-
104
- assert_equal(0, method.call_trees.callees.length)
105
- end
106
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class StartStopTest < TestCase
7
+ def setup
8
+ super
9
+ # Need to use wall time for this test due to the sleep calls
10
+ @profile = RubyProf::Profile.new(measure_mode: RubyProf::WALL_TIME)
11
+ end
12
+
13
+ def method1
14
+ @profile.start
15
+ method2
16
+ end
17
+
18
+ def method2
19
+ method3
20
+ end
21
+
22
+ def method3
23
+ sleep(2)
24
+ @result = @profile.stop
25
+ end
26
+
27
+ def test_extra_stop_should_raise
28
+ @profile.start
29
+ assert_raises(RuntimeError) do
30
+ @profile.start
31
+ end
32
+
33
+ @profile.stop # ok
34
+ assert_raises(RuntimeError) do
35
+ @profile.stop
36
+ end
37
+ end
38
+
39
+ def test_different_methods
40
+ method1
41
+
42
+ # Ruby prof should be stopped
43
+ assert_equal(false, @profile.running?)
44
+
45
+ methods = @result.threads.first.methods.sort.reverse
46
+ assert_equal(4, methods.length)
47
+
48
+ method = methods[0]
49
+ assert_equal('StartStopTest#method1', method.full_name)
50
+ assert_equal(1, method.called)
51
+ assert_in_delta(2, method.total_time, 0.05 * delta_multiplier)
52
+ assert_in_delta(0, method.wait_time, 0.02 * delta_multiplier)
53
+ assert_in_delta(0, method.self_time, 0.02 * delta_multiplier)
54
+ assert_in_delta(2, method.children_time, 0.05 * delta_multiplier)
55
+
56
+ assert_equal(1, method.call_trees.callees.length)
57
+ call_tree = method.call_trees.callees[0]
58
+ assert_equal('StartStopTest#method2', call_tree.target.full_name)
59
+
60
+ method = methods[1]
61
+ assert_equal('StartStopTest#method2', method.full_name)
62
+ assert_equal(1, method.called)
63
+ assert_in_delta(2, method.total_time, 0.05 * delta_multiplier)
64
+ assert_in_delta(0, method.wait_time, 0.02 * delta_multiplier)
65
+ assert_in_delta(0, method.self_time, 0.02 * delta_multiplier)
66
+ assert_in_delta(2, method.children_time, 0.05 * delta_multiplier)
67
+
68
+ assert_equal(1, method.call_trees.callers.length)
69
+ call_tree = method.call_trees.callers[0]
70
+ assert_equal('StartStopTest#method1', call_tree.parent.target.full_name)
71
+
72
+ assert_equal(1, method.call_trees.callees.length)
73
+ call_tree = method.call_trees.callees[0]
74
+ assert_equal('StartStopTest#method3', call_tree.target.full_name)
75
+
76
+ method = methods[2]
77
+ assert_equal('StartStopTest#method3', method.full_name)
78
+ assert_equal(1, method.called)
79
+ assert_in_delta(2, method.total_time, 0.05 * delta_multiplier)
80
+ assert_in_delta(0, method.wait_time, 0.02 * delta_multiplier)
81
+ assert_in_delta(0, method.self_time, 0.02 * delta_multiplier)
82
+ assert_in_delta(2, method.children_time, 0.05 * delta_multiplier)
83
+
84
+ assert_equal(1, method.call_trees.callers.length)
85
+ call_tree = method.call_trees.callers[0]
86
+ assert_equal('StartStopTest#method2', call_tree.parent.target.full_name)
87
+
88
+ assert_equal(1, method.call_trees.callees.length)
89
+ call_tree = method.call_trees.callees[0]
90
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
91
+
92
+ method = methods[3]
93
+ assert_equal('Kernel#sleep', method.full_name)
94
+ assert_equal(1, method.called)
95
+ assert_in_delta(2, method.total_time, 0.05 * delta_multiplier)
96
+ assert_in_delta(0, method.wait_time, 0.02 * delta_multiplier)
97
+ assert_in_delta(2, method.self_time, 0.05 * delta_multiplier)
98
+ assert_in_delta(0, method.children_time, 0.02 * delta_multiplier)
99
+
100
+ assert_equal(1, method.call_trees.callers.length)
101
+ call_tree = method.call_trees.callers[0]
102
+ assert_equal('StartStopTest#method3', call_tree.parent.target.full_name)
103
+
104
+ assert_equal(0, method.call_trees.callees.length)
105
+ end
106
+ end
data/test/test_helper.rb CHANGED
@@ -1,20 +1,24 @@
1
- # encoding: UTF-8
2
-
3
- # To make testing/debugging easier test within this source tree versus an installed gem
4
- require 'bundler/setup'
5
-
6
- # Add ext directory to load path to make it easier to test locally built extensions
7
- ext_path = File.expand_path(File.join(__dir__, '..', 'ext', 'ruby_prof'))
8
- $LOAD_PATH.unshift(File.expand_path(ext_path))
9
-
10
- # Now load code
11
- require 'ruby-prof'
12
-
13
- # Disable minitest parallel tests. The problem is the thread switching will change test results
14
- # (self vs wait time)
15
- ENV["MT_CPU"] = "0" # New versions of minitest
16
- ENV["N"] = "0" # Older versions of minitest
17
-
18
- require 'minitest/autorun'
19
- class TestCase < Minitest::Test
20
- end
1
+ # encoding: UTF-8
2
+
3
+ # To make testing/debugging easier test within this source tree versus an installed gem
4
+ require 'bundler/setup'
5
+
6
+ # Add ext directory to load path to make it easier to test locally built extensions
7
+ ext_path = File.expand_path(File.join(__dir__, '..', 'ext', 'ruby_prof'))
8
+ $LOAD_PATH.unshift(ext_path)
9
+
10
+ # Now load code
11
+ require 'ruby-prof'
12
+
13
+ # Disable minitest parallel tests. The problem is the thread switching will change test results
14
+ # (self vs wait time)
15
+ ENV["MT_CPU"] = "0" # New versions of minitest
16
+ ENV["N"] = "0" # Older versions of minitest
17
+
18
+ require 'minitest/autorun'
19
+ Minitest.load_plugins
20
+ class TestCase < Minitest::Test
21
+ def delta_multiplier
22
+ osx? && ENV["GITHUB_ACTIONS"] ? 6 : 1
23
+ end
24
+ end