dolores_rpm 3.2.0.2

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 (257) hide show
  1. data/CHANGELOG +559 -0
  2. data/LICENSE +64 -0
  3. data/README.rdoc +179 -0
  4. data/bin/mongrel_rpm +33 -0
  5. data/bin/newrelic +13 -0
  6. data/bin/newrelic_cmd +5 -0
  7. data/cert/cacert.pem +118 -0
  8. data/cert/oldsite.pem +28 -0
  9. data/cert/site.pem +27 -0
  10. data/dolores_rpm-3.3.4.fork.gem +0 -0
  11. data/install.rb +9 -0
  12. data/lib/conditional_vendored_dependency_detection.rb +3 -0
  13. data/lib/conditional_vendored_metric_parser.rb +5 -0
  14. data/lib/new_relic/agent/agent.rb +1311 -0
  15. data/lib/new_relic/agent/beacon_configuration.rb +110 -0
  16. data/lib/new_relic/agent/browser_monitoring.rb +102 -0
  17. data/lib/new_relic/agent/busy_calculator.rb +99 -0
  18. data/lib/new_relic/agent/chained_call.rb +13 -0
  19. data/lib/new_relic/agent/database.rb +203 -0
  20. data/lib/new_relic/agent/error_collector.rb +251 -0
  21. data/lib/new_relic/agent/instrumentation/active_merchant.rb +27 -0
  22. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +68 -0
  23. data/lib/new_relic/agent/instrumentation/authlogic.rb +19 -0
  24. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +424 -0
  25. data/lib/new_relic/agent/instrumentation/data_mapper.rb +57 -0
  26. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +52 -0
  27. data/lib/new_relic/agent/instrumentation/memcache.rb +80 -0
  28. data/lib/new_relic/agent/instrumentation/merb/controller.rb +41 -0
  29. data/lib/new_relic/agent/instrumentation/merb/errors.rb +29 -0
  30. data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +80 -0
  31. data/lib/new_relic/agent/instrumentation/metric_frame.rb +332 -0
  32. data/lib/new_relic/agent/instrumentation/net.rb +29 -0
  33. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +36 -0
  34. data/lib/new_relic/agent/instrumentation/queue_time.rb +210 -0
  35. data/lib/new_relic/agent/instrumentation/rack.rb +98 -0
  36. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +114 -0
  37. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +42 -0
  38. data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +115 -0
  39. data/lib/new_relic/agent/instrumentation/rails/errors.rb +42 -0
  40. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +118 -0
  41. data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +122 -0
  42. data/lib/new_relic/agent/instrumentation/rails3/errors.rb +37 -0
  43. data/lib/new_relic/agent/instrumentation/sinatra.rb +58 -0
  44. data/lib/new_relic/agent/instrumentation/sunspot.rb +29 -0
  45. data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +21 -0
  46. data/lib/new_relic/agent/instrumentation.rb +9 -0
  47. data/lib/new_relic/agent/method_tracer.rb +528 -0
  48. data/lib/new_relic/agent/sampler.rb +50 -0
  49. data/lib/new_relic/agent/samplers/cpu_sampler.rb +58 -0
  50. data/lib/new_relic/agent/samplers/delayed_job_lock_sampler.rb +40 -0
  51. data/lib/new_relic/agent/samplers/memory_sampler.rb +144 -0
  52. data/lib/new_relic/agent/samplers/object_sampler.rb +26 -0
  53. data/lib/new_relic/agent/shim_agent.rb +29 -0
  54. data/lib/new_relic/agent/sql_sampler.rb +267 -0
  55. data/lib/new_relic/agent/stats_engine/metric_stats.rb +187 -0
  56. data/lib/new_relic/agent/stats_engine/samplers.rb +95 -0
  57. data/lib/new_relic/agent/stats_engine/transactions.rb +208 -0
  58. data/lib/new_relic/agent/stats_engine.rb +25 -0
  59. data/lib/new_relic/agent/transaction_sample_builder.rb +101 -0
  60. data/lib/new_relic/agent/transaction_sampler.rb +397 -0
  61. data/lib/new_relic/agent/worker_loop.rb +89 -0
  62. data/lib/new_relic/agent.rb +454 -0
  63. data/lib/new_relic/collection_helper.rb +75 -0
  64. data/lib/new_relic/command.rb +85 -0
  65. data/lib/new_relic/commands/deployments.rb +105 -0
  66. data/lib/new_relic/commands/install.rb +80 -0
  67. data/lib/new_relic/control/class_methods.rb +53 -0
  68. data/lib/new_relic/control/configuration.rb +202 -0
  69. data/lib/new_relic/control/frameworks/external.rb +16 -0
  70. data/lib/new_relic/control/frameworks/merb.rb +31 -0
  71. data/lib/new_relic/control/frameworks/rails.rb +164 -0
  72. data/lib/new_relic/control/frameworks/rails3.rb +75 -0
  73. data/lib/new_relic/control/frameworks/ruby.rb +42 -0
  74. data/lib/new_relic/control/frameworks/sinatra.rb +20 -0
  75. data/lib/new_relic/control/frameworks.rb +10 -0
  76. data/lib/new_relic/control/instance_methods.rb +179 -0
  77. data/lib/new_relic/control/instrumentation.rb +100 -0
  78. data/lib/new_relic/control/logging_methods.rb +143 -0
  79. data/lib/new_relic/control/profiling.rb +25 -0
  80. data/lib/new_relic/control/server_methods.rb +114 -0
  81. data/lib/new_relic/control.rb +46 -0
  82. data/lib/new_relic/data_serialization.rb +157 -0
  83. data/lib/new_relic/delayed_job_injection.rb +46 -0
  84. data/lib/new_relic/language_support.rb +69 -0
  85. data/lib/new_relic/local_environment.rb +414 -0
  86. data/lib/new_relic/merbtasks.rb +6 -0
  87. data/lib/new_relic/metric_data.rb +51 -0
  88. data/lib/new_relic/metric_spec.rb +75 -0
  89. data/lib/new_relic/metrics.rb +9 -0
  90. data/lib/new_relic/noticed_error.rb +24 -0
  91. data/lib/new_relic/rack/browser_monitoring.rb +68 -0
  92. data/lib/new_relic/rack/developer_mode.rb +268 -0
  93. data/lib/new_relic/recipes.rb +73 -0
  94. data/lib/new_relic/stats.rb +388 -0
  95. data/lib/new_relic/timer_lib.rb +27 -0
  96. data/lib/new_relic/transaction_analysis/segment_summary.rb +49 -0
  97. data/lib/new_relic/transaction_analysis.rb +77 -0
  98. data/lib/new_relic/transaction_sample/composite_segment.rb +27 -0
  99. data/lib/new_relic/transaction_sample/fake_segment.rb +9 -0
  100. data/lib/new_relic/transaction_sample/segment.rb +201 -0
  101. data/lib/new_relic/transaction_sample/summary_segment.rb +21 -0
  102. data/lib/new_relic/transaction_sample.rb +245 -0
  103. data/lib/new_relic/url_rule.rb +14 -0
  104. data/lib/new_relic/version.rb +55 -0
  105. data/lib/newrelic_rpm.rb +49 -0
  106. data/lib/tasks/all.rb +4 -0
  107. data/lib/tasks/install.rake +7 -0
  108. data/lib/tasks/tests.rake +19 -0
  109. data/newrelic.yml +265 -0
  110. data/recipes/newrelic.rb +6 -0
  111. data/test/active_record_fixtures.rb +77 -0
  112. data/test/config/newrelic.yml +48 -0
  113. data/test/config/test_control.rb +48 -0
  114. data/test/new_relic/agent/agent/connect_test.rb +410 -0
  115. data/test/new_relic/agent/agent/start_test.rb +255 -0
  116. data/test/new_relic/agent/agent/start_worker_thread_test.rb +153 -0
  117. data/test/new_relic/agent/agent_test.rb +139 -0
  118. data/test/new_relic/agent/agent_test_controller.rb +77 -0
  119. data/test/new_relic/agent/agent_test_controller_test.rb +363 -0
  120. data/test/new_relic/agent/apdex_from_server_test.rb +9 -0
  121. data/test/new_relic/agent/beacon_configuration_test.rb +108 -0
  122. data/test/new_relic/agent/browser_monitoring_test.rb +278 -0
  123. data/test/new_relic/agent/busy_calculator_test.rb +81 -0
  124. data/test/new_relic/agent/database_test.rb +162 -0
  125. data/test/new_relic/agent/error_collector/notice_error_test.rb +257 -0
  126. data/test/new_relic/agent/error_collector_test.rb +175 -0
  127. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +538 -0
  128. data/test/new_relic/agent/instrumentation/controller_instrumentation_test.rb +36 -0
  129. data/test/new_relic/agent/instrumentation/instrumentation_test.rb +11 -0
  130. data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +172 -0
  131. data/test/new_relic/agent/instrumentation/metric_frame_test.rb +50 -0
  132. data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +84 -0
  133. data/test/new_relic/agent/instrumentation/queue_time_test.rb +387 -0
  134. data/test/new_relic/agent/instrumentation/rack_test.rb +35 -0
  135. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +184 -0
  136. data/test/new_relic/agent/memcache_instrumentation_test.rb +143 -0
  137. data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +164 -0
  138. data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +234 -0
  139. data/test/new_relic/agent/method_tracer_test.rb +386 -0
  140. data/test/new_relic/agent/mock_scope_listener.rb +23 -0
  141. data/test/new_relic/agent/rpm_agent_test.rb +149 -0
  142. data/test/new_relic/agent/sampler_test.rb +19 -0
  143. data/test/new_relic/agent/shim_agent_test.rb +20 -0
  144. data/test/new_relic/agent/sql_sampler_test.rb +160 -0
  145. data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +150 -0
  146. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +82 -0
  147. data/test/new_relic/agent/stats_engine/samplers_test.rb +99 -0
  148. data/test/new_relic/agent/stats_engine_test.rb +185 -0
  149. data/test/new_relic/agent/transaction_sample_builder_test.rb +195 -0
  150. data/test/new_relic/agent/transaction_sampler_test.rb +955 -0
  151. data/test/new_relic/agent/worker_loop_test.rb +66 -0
  152. data/test/new_relic/agent_test.rb +175 -0
  153. data/test/new_relic/collection_helper_test.rb +149 -0
  154. data/test/new_relic/command/deployments_test.rb +68 -0
  155. data/test/new_relic/control/class_methods_test.rb +62 -0
  156. data/test/new_relic/control/configuration_test.rb +72 -0
  157. data/test/new_relic/control/logging_methods_test.rb +185 -0
  158. data/test/new_relic/control_test.rb +254 -0
  159. data/test/new_relic/data_serialization_test.rb +208 -0
  160. data/test/new_relic/delayed_job_injection_test.rb +16 -0
  161. data/test/new_relic/local_environment_test.rb +72 -0
  162. data/test/new_relic/metric_data_test.rb +125 -0
  163. data/test/new_relic/metric_spec_test.rb +95 -0
  164. data/test/new_relic/rack/all_test.rb +11 -0
  165. data/test/new_relic/rack/browser_monitoring_test.rb +84 -0
  166. data/test/new_relic/rack/developer_mode_helper_test.rb +141 -0
  167. data/test/new_relic/rack/developer_mode_test.rb +43 -0
  168. data/test/new_relic/stats_test.rb +426 -0
  169. data/test/new_relic/transaction_analysis/segment_summary_test.rb +91 -0
  170. data/test/new_relic/transaction_analysis_test.rb +121 -0
  171. data/test/new_relic/transaction_sample/composite_segment_test.rb +35 -0
  172. data/test/new_relic/transaction_sample/fake_segment_test.rb +17 -0
  173. data/test/new_relic/transaction_sample/segment_test.rb +389 -0
  174. data/test/new_relic/transaction_sample/summary_segment_test.rb +31 -0
  175. data/test/new_relic/transaction_sample_subtest_test.rb +56 -0
  176. data/test/new_relic/transaction_sample_test.rb +164 -0
  177. data/test/new_relic/version_number_test.rb +89 -0
  178. data/test/test_contexts.rb +29 -0
  179. data/test/test_helper.rb +154 -0
  180. data/ui/helpers/developer_mode_helper.rb +357 -0
  181. data/ui/helpers/google_pie_chart.rb +48 -0
  182. data/ui/views/layouts/newrelic_default.rhtml +47 -0
  183. data/ui/views/newrelic/_explain_plans.rhtml +27 -0
  184. data/ui/views/newrelic/_sample.rhtml +20 -0
  185. data/ui/views/newrelic/_segment.rhtml +28 -0
  186. data/ui/views/newrelic/_segment_limit_message.rhtml +1 -0
  187. data/ui/views/newrelic/_segment_row.rhtml +12 -0
  188. data/ui/views/newrelic/_show_sample_detail.rhtml +24 -0
  189. data/ui/views/newrelic/_show_sample_sql.rhtml +24 -0
  190. data/ui/views/newrelic/_show_sample_summary.rhtml +3 -0
  191. data/ui/views/newrelic/_sql_row.rhtml +16 -0
  192. data/ui/views/newrelic/_stack_trace.rhtml +15 -0
  193. data/ui/views/newrelic/_table.rhtml +12 -0
  194. data/ui/views/newrelic/explain_sql.rhtml +43 -0
  195. data/ui/views/newrelic/file/images/arrow-close.png +0 -0
  196. data/ui/views/newrelic/file/images/arrow-open.png +0 -0
  197. data/ui/views/newrelic/file/images/blue_bar.gif +0 -0
  198. data/ui/views/newrelic/file/images/file_icon.png +0 -0
  199. data/ui/views/newrelic/file/images/gray_bar.gif +0 -0
  200. data/ui/views/newrelic/file/images/new-relic-rpm-desktop.gif +0 -0
  201. data/ui/views/newrelic/file/images/new_relic_rpm_desktop.gif +0 -0
  202. data/ui/views/newrelic/file/images/textmate.png +0 -0
  203. data/ui/views/newrelic/file/javascript/jquery-1.4.2.js +6240 -0
  204. data/ui/views/newrelic/file/javascript/transaction_sample.js +120 -0
  205. data/ui/views/newrelic/file/stylesheets/style.css +490 -0
  206. data/ui/views/newrelic/index.rhtml +71 -0
  207. data/ui/views/newrelic/sample_not_found.rhtml +2 -0
  208. data/ui/views/newrelic/show_sample.rhtml +80 -0
  209. data/ui/views/newrelic/show_source.rhtml +3 -0
  210. data/ui/views/newrelic/threads.rhtml +53 -0
  211. data/vendor/gems/dependency_detection-0.0.1.build/LICENSE +5 -0
  212. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection/version.rb +3 -0
  213. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +62 -0
  214. data/vendor/gems/metric_parser-0.1.0.pre1/lib/metric_parser.rb +1 -0
  215. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/action_mailer.rb +14 -0
  216. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_merchant.rb +31 -0
  217. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_record.rb +33 -0
  218. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/apdex.rb +89 -0
  219. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/background_transaction.rb +7 -0
  220. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/client.rb +46 -0
  221. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller.rb +67 -0
  222. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_cpu.rb +43 -0
  223. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_ext.rb +17 -0
  224. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database.rb +48 -0
  225. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database_pool.rb +24 -0
  226. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net.rb +28 -0
  227. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net_parser.rb +17 -0
  228. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/errors.rb +11 -0
  229. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/external.rb +55 -0
  230. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/frontend.rb +40 -0
  231. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/gc.rb +20 -0
  232. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/hibernate_session.rb +7 -0
  233. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java.rb +31 -0
  234. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java_parser.rb +17 -0
  235. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp.rb +34 -0
  236. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp_tag.rb +7 -0
  237. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +55 -0
  238. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/metric_parser.rb +122 -0
  239. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/orm.rb +27 -0
  240. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/other_transaction.rb +40 -0
  241. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet.rb +7 -0
  242. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_context_listener.rb +7 -0
  243. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_filter.rb +7 -0
  244. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr.rb +27 -0
  245. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr_request_handler.rb +15 -0
  246. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring.rb +54 -0
  247. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_controller.rb +6 -0
  248. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_view.rb +6 -0
  249. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_action.rb +20 -0
  250. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_result.rb +20 -0
  251. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/version.rb +5 -0
  252. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +70 -0
  253. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_frontend.rb +18 -0
  254. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_service.rb +14 -0
  255. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_transaction.rb +133 -0
  256. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser.rb +64 -0
  257. metadata +398 -0
@@ -0,0 +1,278 @@
1
+ ENV['SKIP_RAILS'] = 'true'
2
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
3
+ require "new_relic/agent/browser_monitoring"
4
+
5
+ class NewRelic::Agent::BrowserMonitoringTest < Test::Unit::TestCase
6
+ include NewRelic::Agent::BrowserMonitoring
7
+
8
+ def setup
9
+ NewRelic::Agent.manual_start
10
+ @browser_monitoring_key = "fred"
11
+ @episodes_file = "this_is_my_file"
12
+ NewRelic::Agent.instance.instance_eval do
13
+ @beacon_configuration = NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => true, "browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"})
14
+ end
15
+ Thread.current[:newrelic_most_recent_transaction] = "MyCoolTransaction"
16
+ end
17
+
18
+ def teardown
19
+ mocha_teardown
20
+ Thread.current[:newrelic_start_time] = nil
21
+ Thread.current[:newrelic_metric_frame] = nil
22
+ Thread.current[:newrelic_most_recent_transaction] = nil
23
+ end
24
+
25
+ def test_browser_timing_header_with_no_beacon_configuration
26
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns( nil)
27
+ header = browser_timing_header
28
+ assert_equal "", header
29
+ end
30
+
31
+ def test_browser_timing_header
32
+ header = browser_timing_header
33
+ assert_equal "<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>", header
34
+ end
35
+
36
+ def test_browser_timing_header_with_rum_enabled_not_specified
37
+ NewRelic::Agent.instance.expects(:beacon_configuration).at_least_once.returns( NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
38
+ header = browser_timing_header
39
+ assert_equal "<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>", header
40
+ end
41
+
42
+ def test_browser_timing_header_with_rum_enabled_false
43
+ NewRelic::Agent.instance.expects(:beacon_configuration).twice.returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => false, "browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
44
+ header = browser_timing_header
45
+ assert_equal "", header
46
+ end
47
+
48
+ def test_browser_timing_header_disable_all_tracing
49
+ header = nil
50
+ NewRelic::Agent.disable_all_tracing do
51
+ header = browser_timing_header
52
+ end
53
+ assert_equal "", header
54
+ end
55
+
56
+ def test_browser_timing_header_disable_transaction_tracing
57
+ header = nil
58
+ NewRelic::Agent.disable_transaction_tracing do
59
+ header = browser_timing_header
60
+ end
61
+ assert_equal "", header
62
+ end
63
+
64
+ def test_browser_timing_footer
65
+ browser_timing_header
66
+ NewRelic::Control.instance.expects(:license_key).returns("a" * 13)
67
+
68
+ Thread.current[:newrelic_start_time] = Time.now
69
+
70
+ footer = browser_timing_footer
71
+ snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
72
+ NREUMQ.push(["load",new Date().getTime()]);
73
+ var e=document.createElement("script");'
74
+ assert footer.include?(snippet), "Expected footer to include snippet: #{snippet}, but instead was #{footer}"
75
+ end
76
+
77
+ def test_browser_timing_footer_without_calling_header
78
+ Thread.current[:newrelic_start_time] = nil
79
+ assert_equal "", browser_timing_footer
80
+ end
81
+
82
+ def test_browser_timing_footer_with_no_browser_key_rum_enabled
83
+ browser_timing_header
84
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => true, "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
85
+ footer = browser_timing_footer
86
+ assert_equal "", footer
87
+ end
88
+
89
+ def test_browser_timing_footer_with_no_browser_key_rum_disabled
90
+ browser_timing_header
91
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => false, "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
92
+ footer = browser_timing_footer
93
+ assert_equal "", footer
94
+ end
95
+
96
+ def test_browser_timing_footer_with_rum_enabled_not_specified
97
+ browser_timing_header
98
+ Thread.current[:newrelic_start_time] = Time.now
99
+
100
+ license_bytes = [];
101
+ ("a" * 13).each_byte {|byte| license_bytes << byte}
102
+ config = NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file", "license_bytes" => license_bytes})
103
+ config.expects(:license_bytes).returns(license_bytes).at_least_once
104
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns(config).at_least_once
105
+ footer = browser_timing_footer
106
+ beginning_snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
107
+ NREUMQ.push(["load",new Date().getTime()]);
108
+ var e=document.createElement("script");'
109
+ ending_snippet = "])</script>"
110
+ assert(footer.include?(beginning_snippet), "expected footer to include beginning snippet: #{beginning_snippet}, but was #{footer}")
111
+ assert(footer.include?(ending_snippet), "expected footer to include ending snippet: #{ending_snippet}, but was #{footer}")
112
+ end
113
+
114
+ def test_browser_timing_footer_with_no_beacon_configuration
115
+ browser_timing_header
116
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns( nil)
117
+ footer = browser_timing_footer
118
+ assert_equal "", footer
119
+ end
120
+
121
+ def test_browser_timing_footer_with_no_start_time
122
+ browser_timing_header
123
+ Thread.current[:newrelic_start_time] = nil
124
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
125
+ footer = browser_timing_footer
126
+ assert_equal('', footer)
127
+ end
128
+
129
+
130
+ def test_browser_timing_footer_disable_all_tracing
131
+ browser_timing_header
132
+ footer = nil
133
+ NewRelic::Agent.disable_all_tracing do
134
+ footer = browser_timing_footer
135
+ end
136
+ assert_equal "", footer
137
+ end
138
+
139
+ def test_browser_timing_footer_disable_transaction_tracing
140
+ browser_timing_header
141
+ footer = nil
142
+ NewRelic::Agent.disable_transaction_tracing do
143
+ footer = browser_timing_footer
144
+ end
145
+ assert_equal "", footer
146
+ end
147
+
148
+ def test_browser_timing_footer_browser_monitoring_key_missing
149
+ fake_config = mock('beacon configuration')
150
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns(fake_config)
151
+ fake_config.expects(:nil?).returns(false)
152
+ fake_config.expects(:rum_enabled).returns(true)
153
+ fake_config.expects(:browser_monitoring_key).returns(nil)
154
+ self.expects(:generate_footer_js).never
155
+ assert_equal('', browser_timing_footer, "should not return a footer when there is no key")
156
+ end
157
+
158
+ def test_generate_footer_js_null_case
159
+ self.expects(:browser_monitoring_start_time).returns(nil)
160
+ assert_equal('', generate_footer_js, "should not send javascript when there is no start time")
161
+ end
162
+
163
+ def test_generate_footer_js_with_start_time
164
+ self.expects(:browser_monitoring_start_time).returns(Time.at(100))
165
+ fake_bc = mock('beacon configuration')
166
+ fake_bc.expects(:application_id).returns(1)
167
+ fake_bc.expects(:beacon).returns('beacon')
168
+ fake_bc.expects(:browser_monitoring_key).returns('a' * 40)
169
+ NewRelic::Agent.instance.expects(:beacon_configuration).returns(fake_bc)
170
+ self.expects(:footer_js_string).with('beacon', 'a' * 40, 1).returns('footer js')
171
+ assert_equal('footer js', generate_footer_js, 'should generate and return the footer JS when there is a start time')
172
+ end
173
+
174
+ def test_browser_monitoring_transaction_name_basic
175
+ Thread.current[:newrelic_most_recent_transaction] = 'a transaction name'
176
+ assert_equal('a transaction name', browser_monitoring_transaction_name, "should take the value from the thread local")
177
+ end
178
+
179
+ def test_browser_monitoring_transaction_name_empty
180
+ Thread.current[:newrelic_most_recent_transaction] = ''
181
+ assert_equal('', browser_monitoring_transaction_name, "should take the value even when it is empty")
182
+ end
183
+
184
+ def test_browser_monitoring_transaction_name_nil
185
+ Thread.current[:newrelic_most_recent_transaction] = nil
186
+ assert_equal('<unknown>', browser_monitoring_transaction_name, "should fill in a default when it is nil")
187
+ end
188
+
189
+ def test_browser_monitoring_start_time
190
+ Thread.current[:newrelic_start_time] = Time.at(100)
191
+ assert_equal(Time.at(100), browser_monitoring_start_time, "should take the value from the thread local")
192
+ end
193
+
194
+ def test_clamp_to_positive
195
+ assert_equal(0.0, clamp_to_positive(-1), "should clamp a negative value to zero")
196
+ assert_equal(1232, clamp_to_positive(1232), "should pass through the value when it is positive")
197
+ assert_equal(0, clamp_to_positive(0), "should not mess with zero when passing it through")
198
+ end
199
+
200
+ def test_browser_monitoring_app_time_nonzero
201
+ start = Time.now
202
+ self.expects(:browser_monitoring_start_time).returns(start - 1)
203
+ Time.expects(:now).returns(start)
204
+ assert_equal(1000, browser_monitoring_app_time, 'should return a rounded time')
205
+ end
206
+
207
+ def test_browser_monitoring_queue_time_nil
208
+ Thread.current[:newrelic_queue_time] = nil
209
+ assert_equal(0.0, browser_monitoring_queue_time, 'should return zero when there is no queue time')
210
+ end
211
+
212
+ def test_browser_monitoring_queue_time_zero
213
+ Thread.current[:newrelic_queue_time] = 0.0
214
+ assert_equal(0.0, browser_monitoring_queue_time, 'should return zero when there is zero queue time')
215
+ end
216
+
217
+ def test_browser_monitoring_queue_time_ducks
218
+ Thread.current[:newrelic_queue_time] = 'a duck'
219
+ assert_equal(0.0, browser_monitoring_queue_time, 'should return zero when there is an incorrect queue time')
220
+ end
221
+
222
+ def test_browser_monitoring_queue_time_nonzero
223
+ Thread.current[:newrelic_queue_time] = 3.00002
224
+ assert_equal(3000, browser_monitoring_queue_time, 'should return a rounded time')
225
+ end
226
+
227
+ def test_footer_js_string_basic
228
+ beacon = ''
229
+ license_key = ''
230
+ application_id = 1
231
+
232
+ Thread.current[:newrelic_queue_time] = nil
233
+ # mocking this because JRuby thinks that Time.now - Time.now
234
+ # always takes at least 1ms
235
+ self.expects(:browser_monitoring_app_time).returns(0)
236
+ Thread.current[:newrelic_most_recent_transaction] = 'most recent transaction'
237
+
238
+ self.expects(:obfuscate).with('most recent transaction').returns('most recent transaction')
239
+
240
+ value = footer_js_string(beacon, license_key, application_id)
241
+ assert_equal("<script type=\"text/javascript\">if (!NREUMQ.f) { NREUMQ.f=function() {\nNREUMQ.push([\"load\",new Date().getTime()]);\nvar e=document.createElement(\"script\");\ne.type=\"text/javascript\";e.async=true;e.src=\"this_is_my_file\";\ndocument.body.appendChild(e);\nif(NREUMQ.a)NREUMQ.a();\n};\nNREUMQ.a=window.onload;window.onload=NREUMQ.f;\n};\nNREUMQ.push([\"nrf2\",\"\",\"\",1,\"most recent transaction\",0,0,new Date().getTime()])</script>", value, "should return the javascript given some default values")
242
+ end
243
+
244
+ def test_html_safe_if_needed_unsafed
245
+ string = mock('string')
246
+ # here to handle 1.9 encoding - we stub this out because it should
247
+ # be handled automatically and is outside the scope of this test
248
+ string.stubs(:respond_to?).with(:encoding).returns(false)
249
+ string.expects(:respond_to?).with(:html_safe).returns(false)
250
+ assert_equal(string, html_safe_if_needed(string))
251
+ end
252
+
253
+ def test_html_safe_if_needed_safed
254
+ string = mock('string')
255
+ string.expects(:respond_to?).with(:html_safe).returns(true)
256
+ string.expects(:html_safe).returns(string)
257
+ # here to handle 1.9 encoding - we stub this out because it should
258
+ # be handled automatically and is outside the scope of this test
259
+ string.stubs(:respond_to?).with(:encoding).returns(false)
260
+ assert_equal(string, html_safe_if_needed(string))
261
+ end
262
+
263
+ def test_obfuscate_basic
264
+ text = 'a happy piece of small text'
265
+ key = (1..40).to_a
266
+ NewRelic::Agent.instance.beacon_configuration.expects(:license_bytes).returns(key)
267
+ output = obfuscate(text)
268
+ assert_equal('YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1', output, "should output obfuscated text")
269
+ end
270
+
271
+ def test_obfuscate_long_string
272
+ text = 'a happy piece of small text' * 5
273
+ key = (1..40).to_a
274
+ NewRelic::Agent.instance.beacon_configuration.expects(:license_bytes).returns(key)
275
+ output = obfuscate(text)
276
+ assert_equal('YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1YyNsZHZ3cSl6YmluZCJsYiV1amllZit4aHl2YiRtZ3d4cCp7ZWhiZyNrYyZ0ZWhmZyx5ZHp3ZSVuZnh5cyt8ZGRhZiRqYCd7ZGtnYC11Z3twZCZvaXl6cix9aGdgYSVpYSh6Z2pgYSF2Znxx', output, "should output obfuscated text")
277
+ end
278
+ end
@@ -0,0 +1,81 @@
1
+ # Run faster standalone
2
+ ENV['SKIP_RAILS'] = 'true'
3
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
4
+ class NewRelic::Agent::BusyCalculatorTest < Test::Unit::TestCase
5
+ attr_reader :now
6
+ def setup
7
+ @now = Time.now.to_f
8
+ NewRelic::Agent::BusyCalculator.reset
9
+ @instance_busy = NewRelic::MethodTraceStats.new
10
+ NewRelic::Agent::BusyCalculator.stubs(:instance_busy_stats).returns(@instance_busy)
11
+ end
12
+
13
+ def test_normal
14
+ # start the timewindow 10 seconds ago
15
+ # start a request at 10 seconds, 5 seconds long
16
+ NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
17
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 10.0)
18
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 5.0)
19
+ assert_equal 5, NewRelic::Agent::BusyCalculator.accumulator
20
+ NewRelic::Agent::BusyCalculator.harvest_busy
21
+
22
+ assert_equal 1, @instance_busy.call_count
23
+ assert_in_delta 0.50, @instance_busy.total_call_time, 0.05
24
+ end
25
+ def test_split
26
+ # start the timewindow 10 seconds ago
27
+ # start a request at 5 seconds, don't finish
28
+ NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
29
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 5.0)
30
+ NewRelic::Agent::BusyCalculator.harvest_busy
31
+
32
+ assert_equal 1, @instance_busy.call_count, @instance_busy
33
+ assert_in_delta 0.50, @instance_busy.total_call_time, 0.05
34
+ end
35
+ def test_reentrancy
36
+ # start the timewindow 10 seconds ago
37
+ # start a request at 5 seconds, don't finish, but make two more
38
+ # complete calls, which should be ignored.
39
+ NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
40
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 5.0)
41
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 4.5)
42
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 4.0)
43
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 3.5)
44
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 3.0)
45
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 2.0)
46
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 1.0)
47
+ NewRelic::Agent::BusyCalculator.harvest_busy
48
+
49
+ assert_equal 1, @instance_busy.call_count
50
+ assert_in_delta 0.50, @instance_busy.total_call_time, 0.05
51
+ end
52
+ def test_concurrency
53
+ # start the timewindow 10 seconds ago
54
+ # start a request at 10 seconds, 5 seconds long
55
+ NewRelic::Agent::BusyCalculator.stubs(:harvest_start).returns(now - 10.0)
56
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 8.0)
57
+ worker = Thread.new do
58
+ # Get busy for 6 - 3 seconds
59
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 6.0)
60
+ NewRelic::Agent::BusyCalculator.dispatcher_start(now - 5.0)
61
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 4.0)
62
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 3.0)
63
+ end
64
+ # Get busy for 8 - 2 seconds
65
+ NewRelic::Agent::BusyCalculator.dispatcher_finish(now - 2.0)
66
+ worker.join
67
+ NewRelic::Agent::BusyCalculator.harvest_busy
68
+
69
+ assert_equal 1, @instance_busy.call_count
70
+ # 3 + 6 = 9, or 90%
71
+ assert_in_delta 0.90, @instance_busy.total_call_time, 0.1
72
+
73
+ end
74
+ def test_dont_ignore_zero_counts
75
+ assert_equal 0, @instance_busy.call_count, "Problem with test--instance busy not starting off at zero."
76
+ NewRelic::Agent::BusyCalculator.harvest_busy
77
+ NewRelic::Agent::BusyCalculator.harvest_busy
78
+ NewRelic::Agent::BusyCalculator.harvest_busy
79
+ assert_equal 3, @instance_busy.call_count
80
+ end
81
+ end
@@ -0,0 +1,162 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..',
2
+ 'test_helper'))
3
+ require 'new_relic/agent/database'
4
+ class NewRelic::Agent::DatabaseTest < Test::Unit::TestCase
5
+ def teardown
6
+ NewRelic::Agent::Database::Obfuscator.instance.reset
7
+ end
8
+
9
+ def test_process_resultset
10
+ resultset = [["column"]]
11
+ assert_equal([nil, [["column"]]],
12
+ NewRelic::Agent::Database.process_resultset(resultset))
13
+ end
14
+
15
+ def test_explain_sql_select_with_mysql_connection
16
+ config = {:adapter => 'mysql'}
17
+ config.default('val')
18
+ sql = 'SELECT foo'
19
+ connection = mock('connection')
20
+ plan = {
21
+ "select_type"=>"SIMPLE", "key_len"=>nil, "table"=>"blogs", "id"=>"1",
22
+ "possible_keys"=>nil, "type"=>"ALL", "Extra"=>"", "rows"=>"2",
23
+ "ref"=>nil, "key"=>nil
24
+ }
25
+ result = mock('explain plan')
26
+ result.expects(:each_hash).yields(plan)
27
+ # two rows, two columns
28
+ connection.expects(:execute).with('EXPLAIN SELECT foo').returns(result)
29
+ NewRelic::Agent::Database.expects(:get_connection).with(config).returns(connection)
30
+
31
+ result = NewRelic::Agent::Database.explain_sql(sql, config)
32
+ assert_equal(plan.keys.sort, result[0].sort)
33
+ assert_equal(plan.values.compact.sort, result[1][0].compact.sort)
34
+ end
35
+
36
+ def test_explain_sql_one_select_with_pg_connection
37
+ config = {:adapter => 'postgresql'}
38
+ config.default('val')
39
+ sql = 'select count(id) from blogs limit 1'
40
+ connection = mock('connection')
41
+ plan = [{"QUERY PLAN"=>"Limit (cost=11.75..11.76 rows=1 width=4)"},
42
+ {"QUERY PLAN"=>" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"},
43
+ {"QUERY PLAN"=>" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"}]
44
+ connection.expects(:execute).returns(plan)
45
+ NewRelic::Agent::Database.expects(:get_connection).with(config).returns(connection)
46
+ assert_equal([['QUERY PLAN'],
47
+ [["Limit (cost=11.75..11.76 rows=1 width=4)"],
48
+ [" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"],
49
+ [" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"]]],
50
+ NewRelic::Agent::Database.explain_sql(sql, config))
51
+ end
52
+
53
+ def test_explain_sql_no_sql
54
+ assert_equal(nil, NewRelic::Agent::Database.explain_sql(nil, nil))
55
+ end
56
+
57
+ def test_explain_sql_no_connection_config
58
+ assert_equal(nil, NewRelic::Agent::Database.explain_sql('select foo', nil))
59
+ end
60
+
61
+ def test_explain_sql_non_select
62
+ assert_equal([], NewRelic::Agent::Database.explain_sql('foo',
63
+ mock('config')))
64
+ end
65
+
66
+ def test_explain_sql_one_select_no_connection
67
+ # NB this test raises an error in the log, much as it might if a
68
+ # user supplied a config that was not valid. This is generally
69
+ # expected behavior - the get_connection method shouldn't allow
70
+ # errors to percolate up.
71
+ config = mock('config')
72
+ config.stubs(:[]).returns(nil)
73
+ assert_equal([], NewRelic::Agent::Database.explain_sql('SELECT', config))
74
+ end
75
+
76
+ def test_handle_exception_in_explain
77
+ fake_error = Exception.new('a message')
78
+ NewRelic::Control.instance.log.expects(:error).with('Error getting query plan: a message')
79
+ # backtrace can be basically any string, just should get logged
80
+ NewRelic::Control.instance.log.expects(:debug).with(instance_of(String))
81
+
82
+ NewRelic::Agent::Database.handle_exception_in_explain do
83
+ raise(fake_error)
84
+ end
85
+ end
86
+
87
+ def test_sql_normalization
88
+ # basic statement
89
+ assert_equal "INSERT INTO X values(?,?, ? , ?)",
90
+ NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('test',0, 1 , 2)")
91
+
92
+ # escaped literals
93
+ assert_equal "INSERT INTO X values(?, ?,?, ? , ?)",
94
+ NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son')")
95
+
96
+ # multiple string literals
97
+ assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
98
+ NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('jim''s ssn','x',0, 1 , 2)")
99
+
100
+ # empty string literal
101
+ # NOTE: the empty string literal resolves to empty string, which for our purposes is acceptable
102
+ assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
103
+ NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('','x',0, 1 , 2)")
104
+
105
+ # try a select statement
106
+ assert_equal "select * from table where name=? and ssn=?",
107
+ NewRelic::Agent::Database.obfuscate_sql("select * from table where name='jim gochee' and ssn=0012211223")
108
+
109
+ # number literals embedded in sql - oh well
110
+ assert_equal "select * from table_? where name=? and ssn=?",
111
+ NewRelic::Agent::Database.obfuscate_sql("select * from table_007 where name='jim gochee' and ssn=0012211223")
112
+ end
113
+
114
+ def test_sql_normalization__single_quotes
115
+ assert_equal "INSERT ? into table",
116
+ NewRelic::Agent::Database.obfuscate_sql("INSERT 'this isn''t a real value' into table")
117
+ assert_equal "INSERT ? into table",
118
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT '"' into table])
119
+ assert_equal "INSERT ? into table",
120
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT ' "some text" \" ' into table])
121
+ # could not get this one licked. no biggie
122
+ # assert_equal "INSERT ? into table",
123
+ # @agent.send(:default_sql_obfuscator, %q[INSERT '\'' into table])
124
+ assert_equal "INSERT ? into table",
125
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT ''' ' into table])
126
+ end
127
+
128
+ def test_sql_normalization__double_quotes
129
+ assert_equal "INSERT ? into table",
130
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT "this isn't a real value" into table])
131
+ assert_equal "INSERT ? into table",
132
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT "'" into table])
133
+ assert_equal "INSERT ? into table",
134
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT " \" " into table])
135
+ assert_equal "INSERT ? into table",
136
+ NewRelic::Agent::Database.obfuscate_sql(%q[INSERT " 'some text' " into table])
137
+ end
138
+
139
+ def test_sql_obfuscation_filters
140
+ NewRelic::Agent::Database.set_sql_obfuscator(:replace) do |string|
141
+ "1" + string
142
+ end
143
+
144
+ sql = "SELECT * FROM TABLE 123 'jim'"
145
+
146
+ assert_equal "1" + sql, NewRelic::Agent::Database.obfuscate_sql(sql)
147
+
148
+ NewRelic::Agent::Database.set_sql_obfuscator(:before) do |string|
149
+ "2" + string
150
+ end
151
+
152
+ assert_equal "12" + sql, NewRelic::Agent::Database.obfuscate_sql(sql)
153
+
154
+ NewRelic::Agent::Database.set_sql_obfuscator(:after) do |string|
155
+ string + "3"
156
+ end
157
+
158
+ assert_equal "12" + sql + "3", NewRelic::Agent::Database.obfuscate_sql(sql)
159
+
160
+ NewRelic::Agent::Database::Obfuscator.instance.reset
161
+ end
162
+ end