ruby-prof 1.7.2 → 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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +112 -178
  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/rp_allocation.c +0 -15
  35. data/ext/ruby_prof/rp_allocation.h +29 -33
  36. data/ext/ruby_prof/rp_call_tree.c +3 -0
  37. data/ext/ruby_prof/rp_call_tree.h +1 -4
  38. data/ext/ruby_prof/rp_call_trees.h +1 -4
  39. data/ext/ruby_prof/rp_measurement.c +0 -5
  40. data/ext/ruby_prof/rp_measurement.h +49 -53
  41. data/ext/ruby_prof/rp_method.c +3 -0
  42. data/ext/ruby_prof/rp_method.h +1 -4
  43. data/ext/ruby_prof/rp_profile.c +1 -1
  44. data/ext/ruby_prof/rp_profile.h +1 -5
  45. data/ext/ruby_prof/rp_stack.h +50 -53
  46. data/ext/ruby_prof/rp_thread.h +1 -4
  47. data/ext/ruby_prof/ruby_prof.h +1 -4
  48. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  49. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  50. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  51. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  52. data/lib/ruby-prof/call_tree.rb +57 -57
  53. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  54. data/lib/ruby-prof/measurement.rb +17 -17
  55. data/lib/ruby-prof/printers/abstract_printer.rb +19 -33
  56. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  57. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  58. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  59. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  60. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  61. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  62. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  63. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  64. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  65. data/lib/ruby-prof/profile.rb +13 -0
  66. data/lib/ruby-prof/rack.rb +114 -105
  67. data/lib/ruby-prof/task.rb +147 -147
  68. data/lib/ruby-prof/thread.rb +20 -20
  69. data/lib/ruby-prof/version.rb +1 -1
  70. data/lib/ruby-prof.rb +50 -52
  71. data/lib/unprof.rb +10 -10
  72. data/ruby-prof.gemspec +5 -5
  73. data/test/abstract_printer_test.rb +25 -27
  74. data/test/alias_test.rb +203 -117
  75. data/test/call_tree_builder.rb +126 -126
  76. data/test/call_tree_visitor_test.rb +27 -27
  77. data/test/call_trees_test.rb +66 -66
  78. data/test/duplicate_names_test.rb +32 -32
  79. data/test/dynamic_method_test.rb +50 -50
  80. data/test/exceptions_test.rb +24 -24
  81. data/test/exclude_threads_test.rb +48 -48
  82. data/test/fiber_test.rb +72 -72
  83. data/test/inverse_call_tree_test.rb +174 -174
  84. data/test/line_number_test.rb +138 -1
  85. data/test/marshal_test.rb +144 -145
  86. data/test/measure_allocations.rb +26 -26
  87. data/test/measure_allocations_test.rb +340 -1
  88. data/test/measure_process_time_test.rb +3098 -3142
  89. data/test/measure_times.rb +56 -56
  90. data/test/measure_wall_time_test.rb +511 -372
  91. data/test/measurement_test.rb +82 -82
  92. data/test/merge_test.rb +48 -48
  93. data/test/multi_printer_test.rb +52 -66
  94. data/test/no_method_class_test.rb +15 -15
  95. data/test/pause_resume_test.rb +171 -171
  96. data/test/prime.rb +54 -54
  97. data/test/prime_script.rb +5 -5
  98. data/test/printer_call_stack_test.rb +28 -27
  99. data/test/printer_call_tree_test.rb +30 -30
  100. data/test/printer_flame_graph_test.rb +82 -0
  101. data/test/printer_flat_test.rb +99 -99
  102. data/test/printer_graph_html_test.rb +62 -59
  103. data/test/printer_graph_test.rb +42 -40
  104. data/test/printers_test.rb +28 -44
  105. data/test/printing_recursive_graph_test.rb +81 -81
  106. data/test/profile_test.rb +101 -101
  107. data/test/rack_test.rb +103 -93
  108. data/test/recursive_test.rb +139 -139
  109. data/test/scheduler.rb +4 -0
  110. data/test/singleton_test.rb +39 -38
  111. data/test/stack_printer_test.rb +61 -61
  112. data/test/start_stop_test.rb +106 -106
  113. data/test/test_helper.rb +4 -0
  114. data/test/thread_test.rb +29 -29
  115. data/test/unique_call_path_test.rb +123 -123
  116. data/test/yarv_test.rb +56 -56
  117. metadata +53 -11
  118. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  119. data/lib/ruby-prof/compatibility.rb +0 -113
  120. data/test/compatibility_test.rb +0 -49
  121. data/test/measure_memory_test.rb +0 -1193
@@ -1,81 +1,81 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require 'fileutils'
6
- require 'stringio'
7
-
8
- # --- code to be tested ---
9
- module PRGT
10
- extend self
11
-
12
- def f(n)
13
- n.times { sleep 0.1 }
14
- end
15
-
16
- def g(n)
17
- n.times { sleep 0.2 }
18
- end
19
-
20
- def run
21
- 2.times { f(2); g(4) }
22
- end
23
- end
24
-
25
- # --- expected test output ---
26
- =begin
27
- Measure Mode: wall_time
28
- Thread ID: 1307675084040
29
- Fiber ID: 1307708787440
30
- Total Time: 2.0939999999973224
31
- Sort by:
32
-
33
- %total %self total self wait child calls name
34
- --------------------------------------------------------------------------------
35
- 1.657 0.000 0.000 1.657 2/2 Integer#times
36
- 79.13% 0.00% 1.657 0.000 0.000 1.657 2 PRGT#g
37
- 1.657 0.000 0.000 1.657 2/5 Integer#times
38
- --------------------------------------------------------------------------------
39
- 2.094 2.094 0.000 0.000 12/12 Integer#times
40
- 100.00% 100.00% 2.094 2.094 0.000 0.000 12 Kernel#sleep
41
- --------------------------------------------------------------------------------
42
- 0.437 0.000 0.000 0.437 2/2 Integer#times
43
- 20.87% 0.00% 0.437 0.000 0.000 0.437 2 PRGT#f
44
- 0.437 0.000 0.000 0.437 2/5 Integer#times
45
- --------------------------------------------------------------------------------
46
- 0.437 0.000 0.000 0.437 2/5 PRGT#f
47
- 1.657 0.000 0.000 1.657 2/5 PRGT#g
48
- 2.094 0.000 0.000 2.094 1/5 PRGT#run
49
- 100.00% 0.00% 2.094 0.000 0.000 2.094 5 *Integer#times
50
- 2.094 2.094 0.000 0.000 12/12 Kernel#sleep
51
- 1.657 0.000 0.000 1.657 2/2 PRGT#g
52
- 0.437 0.000 0.000 0.437 2/2 PRGT#f
53
- --------------------------------------------------------------------------------
54
- 2.094 0.000 0.000 2.094 1/1 PrintingRecursiveGraphTest#setup
55
- 100.00% 0.00% 2.094 0.000 0.000 2.094 1 PRGT#run
56
- 2.094 0.000 0.000 2.094 1/5 Integer#times
57
- --------------------------------------------------------------------------------
58
- 100.00% 0.00% 2.094 0.000 0.000 2.094 1 PrintingRecursiveGraphTest#setup
59
- 2.094 0.000 0.000 2.094 1/1 PRGT#run
60
-
61
- * indicates recursively called methods
62
- =end
63
-
64
- class PrintingRecursiveGraphTest < TestCase
65
- def setup
66
- super
67
- # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
68
- @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
69
- PRGT.run
70
- end
71
- end
72
-
73
- def test_printing_rescursive_graph
74
- printer = RubyProf::GraphPrinter.new(@result)
75
- buffer = ''
76
- printer.print(StringIO.new(buffer))
77
- puts buffer if ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1"
78
-
79
- refute_nil(buffer)
80
- end
81
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require 'fileutils'
6
+ require 'stringio'
7
+
8
+ # --- code to be tested ---
9
+ module PRGT
10
+ extend self
11
+
12
+ def f(n)
13
+ n.times { sleep 0.1 }
14
+ end
15
+
16
+ def g(n)
17
+ n.times { sleep 0.2 }
18
+ end
19
+
20
+ def run
21
+ 2.times { f(2); g(4) }
22
+ end
23
+ end
24
+
25
+ # --- expected test output ---
26
+ =begin
27
+ Measure Mode: wall_time
28
+ Thread ID: 1307675084040
29
+ Fiber ID: 1307708787440
30
+ Total Time: 2.0939999999973224
31
+ Sort by:
32
+
33
+ %total %self total self wait child calls name
34
+ --------------------------------------------------------------------------------
35
+ 1.657 0.000 0.000 1.657 2/2 Integer#times
36
+ 79.13% 0.00% 1.657 0.000 0.000 1.657 2 PRGT#g
37
+ 1.657 0.000 0.000 1.657 2/5 Integer#times
38
+ --------------------------------------------------------------------------------
39
+ 2.094 2.094 0.000 0.000 12/12 Integer#times
40
+ 100.00% 100.00% 2.094 2.094 0.000 0.000 12 Kernel#sleep
41
+ --------------------------------------------------------------------------------
42
+ 0.437 0.000 0.000 0.437 2/2 Integer#times
43
+ 20.87% 0.00% 0.437 0.000 0.000 0.437 2 PRGT#f
44
+ 0.437 0.000 0.000 0.437 2/5 Integer#times
45
+ --------------------------------------------------------------------------------
46
+ 0.437 0.000 0.000 0.437 2/5 PRGT#f
47
+ 1.657 0.000 0.000 1.657 2/5 PRGT#g
48
+ 2.094 0.000 0.000 2.094 1/5 PRGT#run
49
+ 100.00% 0.00% 2.094 0.000 0.000 2.094 5 *Integer#times
50
+ 2.094 2.094 0.000 0.000 12/12 Kernel#sleep
51
+ 1.657 0.000 0.000 1.657 2/2 PRGT#g
52
+ 0.437 0.000 0.000 0.437 2/2 PRGT#f
53
+ --------------------------------------------------------------------------------
54
+ 2.094 0.000 0.000 2.094 1/1 PrintingRecursiveGraphTest#setup
55
+ 100.00% 0.00% 2.094 0.000 0.000 2.094 1 PRGT#run
56
+ 2.094 0.000 0.000 2.094 1/5 Integer#times
57
+ --------------------------------------------------------------------------------
58
+ 100.00% 0.00% 2.094 0.000 0.000 2.094 1 PrintingRecursiveGraphTest#setup
59
+ 2.094 0.000 0.000 2.094 1/1 PRGT#run
60
+
61
+ * indicates recursively called methods
62
+ =end
63
+
64
+ class PrintingRecursiveGraphTest < TestCase
65
+ def setup
66
+ super
67
+ # WALL_TIME so we can use sleep in our test and get same measurements on linux and windows
68
+ @result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
69
+ PRGT.run
70
+ end
71
+ end
72
+
73
+ def test_printing_rescursive_graph
74
+ printer = RubyProf::GraphPrinter.new(@result)
75
+ buffer = StringIO.new
76
+ printer.print(buffer)
77
+ puts buffer.string if ENV['SHOW_RUBY_PROF_PRINTER_OUTPUT'] == "1"
78
+
79
+ refute_nil(buffer.string)
80
+ end
81
+ end
data/test/profile_test.rb CHANGED
@@ -1,101 +1,101 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
- require_relative './call_tree_builder'
6
-
7
- class ProfileTest < TestCase
8
- def test_measure_mode
9
- profile = RubyProf::Profile.new(:measure_mode => RubyProf::PROCESS_TIME)
10
- assert_equal(RubyProf::PROCESS_TIME, profile.measure_mode)
11
- end
12
-
13
- def test_measure_mode_string
14
- profile = RubyProf::Profile.new(:measure_mode => RubyProf::PROCESS_TIME)
15
- assert_equal("process_time", profile.measure_mode_string)
16
- end
17
-
18
- def test_add_thread
19
- profile = RubyProf::Profile.new
20
- assert_empty(profile.threads)
21
-
22
- method_info = RubyProf::MethodInfo.new(Array, :size)
23
- call_tree = RubyProf::CallTree.new(method_info)
24
- thread = RubyProf::Thread.new(call_tree, Thread.current, Fiber.current)
25
-
26
- profile.add_thread(thread)
27
- assert_equal(1, profile.threads.size)
28
- assert(thread.equal?(profile.threads.first))
29
- end
30
-
31
- def test_add_threads
32
- call_tree_1 = create_call_tree_1
33
- ruby_thread_1 = Thread.new { }
34
- thread_1 = RubyProf::Thread.new(call_tree_1, ruby_thread_1, Fiber.current)
35
-
36
- call_tree_2 = create_call_tree_2
37
- ruby_thread_2 = Thread.new { }
38
- thread_2 = RubyProf::Thread.new(call_tree_2, ruby_thread_2, Fiber.current)
39
-
40
- profile = RubyProf::Profile.new
41
- profile.add_thread(thread_1)
42
- profile.add_thread(thread_2)
43
- assert_equal(1, profile.threads.count)
44
- end
45
-
46
- def test_add_fibers
47
- call_tree_1 = create_call_tree_1
48
- fiber_1 = Fiber.new { }
49
- thread_1 = RubyProf::Thread.new(call_tree_1, Thread.current, fiber_1)
50
-
51
- call_tree_2 = create_call_tree_2
52
- fiber_2 = Fiber.new { }
53
- thread_2 = RubyProf::Thread.new(call_tree_2, Thread.current, fiber_2)
54
-
55
- profile = RubyProf::Profile.new
56
- profile.add_thread(thread_1)
57
- profile.add_thread(thread_2)
58
- assert_equal(2, profile.threads.count)
59
- end
60
-
61
- def test_remove_thread
62
- profile = RubyProf::Profile.new
63
- assert_empty(profile.threads)
64
-
65
- method_info = RubyProf::MethodInfo.new(Array, :size)
66
- call_tree = RubyProf::CallTree.new(method_info)
67
- thread = RubyProf::Thread.new(call_tree, Thread.current, Fiber.current)
68
-
69
- profile.add_thread(thread)
70
- assert_equal(1, profile.threads.size)
71
- assert(thread.equal?(profile.threads.first))
72
-
73
- removed = profile.remove_thread(thread)
74
- assert_equal(0, profile.threads.size)
75
- assert(removed.equal?(thread))
76
- end
77
-
78
- def test_merge
79
- call_tree_1 = create_call_tree_1
80
- fiber_1 = Thread.new { }
81
- thread_1 = RubyProf::Thread.new(call_tree_1, Thread.current, fiber_1)
82
-
83
- call_tree_2 = create_call_tree_2
84
- fiber_2 = Thread.new { }
85
- thread_2 = RubyProf::Thread.new(call_tree_2, Thread.current, fiber_2)
86
-
87
- profile = RubyProf::Profile.new
88
- profile.add_thread(thread_1)
89
- profile.add_thread(thread_2)
90
-
91
- profile.merge!
92
- assert_equal(1, profile.threads.count)
93
-
94
- assert_equal(thread_1, profile.threads.first)
95
-
96
- assert_in_delta(11.6, thread_1.call_tree.total_time, 0.00001)
97
- assert_in_delta(0, thread_1.call_tree.self_time, 0.00001)
98
- assert_in_delta(0.0, thread_1.call_tree.wait_time, 0.00001)
99
- assert_in_delta(11.6, thread_1.call_tree.children_time, 0.00001)
100
- end
101
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+ require_relative './call_tree_builder'
6
+
7
+ class ProfileTest < TestCase
8
+ def test_measure_mode
9
+ profile = RubyProf::Profile.new(measure_mode: RubyProf::PROCESS_TIME)
10
+ assert_equal(RubyProf::PROCESS_TIME, profile.measure_mode)
11
+ end
12
+
13
+ def test_measure_mode_string
14
+ profile = RubyProf::Profile.new(measure_mode: RubyProf::PROCESS_TIME)
15
+ assert_equal("process_time", profile.measure_mode_string)
16
+ end
17
+
18
+ def test_add_thread
19
+ profile = RubyProf::Profile.new
20
+ assert_empty(profile.threads)
21
+
22
+ method_info = RubyProf::MethodInfo.new(Array, :size)
23
+ call_tree = RubyProf::CallTree.new(method_info)
24
+ thread = RubyProf::Thread.new(call_tree, Thread.current, Fiber.current)
25
+
26
+ profile.add_thread(thread)
27
+ assert_equal(1, profile.threads.size)
28
+ assert(thread.equal?(profile.threads.first))
29
+ end
30
+
31
+ def test_add_threads
32
+ call_tree_1 = create_call_tree_1
33
+ ruby_thread_1 = Thread.new { }
34
+ thread_1 = RubyProf::Thread.new(call_tree_1, ruby_thread_1, Fiber.current)
35
+
36
+ call_tree_2 = create_call_tree_2
37
+ ruby_thread_2 = Thread.new { }
38
+ thread_2 = RubyProf::Thread.new(call_tree_2, ruby_thread_2, Fiber.current)
39
+
40
+ profile = RubyProf::Profile.new
41
+ profile.add_thread(thread_1)
42
+ profile.add_thread(thread_2)
43
+ assert_equal(1, profile.threads.count)
44
+ end
45
+
46
+ def test_add_fibers
47
+ call_tree_1 = create_call_tree_1
48
+ fiber_1 = Fiber.new { }
49
+ thread_1 = RubyProf::Thread.new(call_tree_1, Thread.current, fiber_1)
50
+
51
+ call_tree_2 = create_call_tree_2
52
+ fiber_2 = Fiber.new { }
53
+ thread_2 = RubyProf::Thread.new(call_tree_2, Thread.current, fiber_2)
54
+
55
+ profile = RubyProf::Profile.new
56
+ profile.add_thread(thread_1)
57
+ profile.add_thread(thread_2)
58
+ assert_equal(2, profile.threads.count)
59
+ end
60
+
61
+ def test_remove_thread
62
+ profile = RubyProf::Profile.new
63
+ assert_empty(profile.threads)
64
+
65
+ method_info = RubyProf::MethodInfo.new(Array, :size)
66
+ call_tree = RubyProf::CallTree.new(method_info)
67
+ thread = RubyProf::Thread.new(call_tree, Thread.current, Fiber.current)
68
+
69
+ profile.add_thread(thread)
70
+ assert_equal(1, profile.threads.size)
71
+ assert(thread.equal?(profile.threads.first))
72
+
73
+ removed = profile.remove_thread(thread)
74
+ assert_equal(0, profile.threads.size)
75
+ assert(removed.equal?(thread))
76
+ end
77
+
78
+ def test_merge
79
+ call_tree_1 = create_call_tree_1
80
+ fiber_1 = Thread.new { }
81
+ thread_1 = RubyProf::Thread.new(call_tree_1, Thread.current, fiber_1)
82
+
83
+ call_tree_2 = create_call_tree_2
84
+ fiber_2 = Thread.new { }
85
+ thread_2 = RubyProf::Thread.new(call_tree_2, Thread.current, fiber_2)
86
+
87
+ profile = RubyProf::Profile.new
88
+ profile.add_thread(thread_1)
89
+ profile.add_thread(thread_2)
90
+
91
+ profile.merge!
92
+ assert_equal(1, profile.threads.count)
93
+
94
+ assert_equal(thread_1, profile.threads.first)
95
+
96
+ assert_in_delta(11.6, thread_1.call_tree.total_time, 0.00001)
97
+ assert_in_delta(0, thread_1.call_tree.self_time, 0.00001)
98
+ assert_in_delta(0.0, thread_1.call_tree.wait_time, 0.00001)
99
+ assert_in_delta(11.6, thread_1.call_tree.children_time, 0.00001)
100
+ end
101
+ end
data/test/rack_test.rb CHANGED
@@ -1,93 +1,103 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- class FakeRackApp
7
- def call(env)
8
- end
9
- end
10
-
11
- module Rack
12
- class Request
13
- def initialize(env)
14
- if env == :fake_env
15
- @env = {}
16
- else
17
- @env = env
18
- end
19
- end
20
-
21
- def path
22
- @env[:path] || '/path/to/resource.json'
23
- end
24
- end
25
- end
26
-
27
- class RackTest < TestCase
28
- def test_create_print_path
29
- path = Dir.mktmpdir
30
- Dir.delete(path)
31
-
32
- Rack::RubyProf.new(FakeRackApp.new, :path => path)
33
-
34
- assert(Dir.exist?(path))
35
- end
36
-
37
- def test_create_profile_reports
38
- path = Dir.mktmpdir
39
-
40
- adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path)
41
-
42
- adapter.call(:fake_env)
43
-
44
- %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
45
- file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
46
- assert(File.exist?(file_path))
47
- end
48
- end
49
-
50
- def test_skip_paths
51
- path = Dir.mktmpdir
52
-
53
- adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :skip_paths => [%r{\.json$}])
54
-
55
- adapter.call(:fake_env)
56
-
57
- %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
58
- file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
59
- assert(!File.exist?(file_path))
60
- end
61
- end
62
-
63
- def test_only_paths
64
- path = Dir.mktmpdir
65
-
66
- adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :only_paths => [%r{\.json$}])
67
-
68
- adapter.call({path: '/path/to/resource.json'})
69
-
70
- %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
71
- file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
72
- assert(File.exist?(file_path))
73
- end
74
-
75
- adapter.call({path: '/path/to/resource.html'})
76
- %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
77
- file_path = ::File.join(path, "path-to-resource.html-#{base_name}")
78
- assert(!File.exist?(file_path))
79
- end
80
- end
81
-
82
- def test_allows_lazy_filename_setting
83
- path = Dir.mktmpdir
84
-
85
- printer = {::RubyProf::FlatPrinter => lambda { 'dynamic.txt' }}
86
- adapter = Rack::RubyProf.new(FakeRackApp.new, :path => path, :printers => printer)
87
-
88
- adapter.call(:fake_env)
89
-
90
- file_path = ::File.join(path, 'path-to-resource.json-dynamic.txt')
91
- assert(File.exist?(file_path))
92
- end
93
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class FakeRackApp
7
+ def call(env)
8
+ end
9
+ end
10
+
11
+ module Rack
12
+ class Request
13
+ def initialize(env)
14
+ if env == :fake_env
15
+ @env = {}
16
+ else
17
+ @env = env
18
+ end
19
+ end
20
+
21
+ def path
22
+ @env[:path] || '/path/to/resource.json'
23
+ end
24
+ end
25
+ end
26
+
27
+ class RackTest < TestCase
28
+ def test_pathname_path
29
+ path = Pathname.new(Dir.mktmpdir)
30
+ adapter = Rack::RubyProf.new(FakeRackApp.new, path: path)
31
+
32
+ adapter.call(:fake_env)
33
+
34
+ file_path = ::File.join(path.to_s, 'path-to-resource.json-flat.txt')
35
+ assert(File.exist?(file_path))
36
+ end
37
+
38
+ def test_create_print_path
39
+ path = Dir.mktmpdir
40
+ Dir.delete(path)
41
+
42
+ Rack::RubyProf.new(FakeRackApp.new, path: path)
43
+
44
+ assert(Dir.exist?(path))
45
+ end
46
+
47
+ def test_create_profile_reports
48
+ path = Dir.mktmpdir
49
+
50
+ adapter = Rack::RubyProf.new(FakeRackApp.new, path: path)
51
+
52
+ adapter.call(:fake_env)
53
+
54
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
55
+ file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
56
+ assert(File.exist?(file_path))
57
+ end
58
+ end
59
+
60
+ def test_skip_paths
61
+ path = Dir.mktmpdir
62
+
63
+ adapter = Rack::RubyProf.new(FakeRackApp.new, path: path, skip_paths: [%r{\.json$}])
64
+
65
+ adapter.call(:fake_env)
66
+
67
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
68
+ file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
69
+ assert(!File.exist?(file_path))
70
+ end
71
+ end
72
+
73
+ def test_only_paths
74
+ path = Dir.mktmpdir
75
+
76
+ adapter = Rack::RubyProf.new(FakeRackApp.new, path: path, only_paths: [%r{\.json$}])
77
+
78
+ adapter.call({path: '/path/to/resource.json'})
79
+
80
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
81
+ file_path = ::File.join(path, "path-to-resource.json-#{base_name}")
82
+ assert(File.exist?(file_path))
83
+ end
84
+
85
+ adapter.call({path: '/path/to/resource.html'})
86
+ %w(flat.txt graph.txt graph.html call_stack.html).each do |base_name|
87
+ file_path = ::File.join(path, "path-to-resource.html-#{base_name}")
88
+ assert(!File.exist?(file_path))
89
+ end
90
+ end
91
+
92
+ def test_allows_lazy_filename_setting
93
+ path = Dir.mktmpdir
94
+
95
+ printer = {::RubyProf::FlatPrinter => lambda { 'dynamic.txt' }}
96
+ adapter = Rack::RubyProf.new(FakeRackApp.new, path: path, printers: printer)
97
+
98
+ adapter.call(:fake_env)
99
+
100
+ file_path = ::File.join(path, 'path-to-resource.json-dynamic.txt')
101
+ assert(File.exist?(file_path))
102
+ end
103
+ end