wd_newrelic_rpm 3.5.5 → 3.5.6

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 (146) hide show
  1. data/.gitignore +2 -0
  2. data/CHANGELOG +60 -0
  3. data/Rakefile +14 -18
  4. data/gem-public_cert.pem +20 -0
  5. data/lib/new_relic/agent.rb +3 -0
  6. data/lib/new_relic/agent/agent.rb +86 -97
  7. data/lib/new_relic/agent/agent_logger.rb +9 -1
  8. data/lib/new_relic/agent/busy_calculator.rb +5 -0
  9. data/lib/new_relic/agent/configuration/defaults.rb +3 -3
  10. data/lib/new_relic/agent/configuration/manager.rb +12 -0
  11. data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -0
  12. data/lib/new_relic/agent/configuration/yaml_source.rb +5 -1
  13. data/lib/new_relic/agent/cross_process_monitoring.rb +164 -20
  14. data/lib/new_relic/agent/error_collector.rb +13 -2
  15. data/lib/new_relic/agent/event_listener.rb +39 -0
  16. data/lib/new_relic/agent/instrumentation/browser_monitoring_timings.rb +18 -8
  17. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +1 -1
  18. data/lib/new_relic/agent/instrumentation/sinatra.rb +8 -1
  19. data/lib/new_relic/agent/new_relic_service.rb +90 -10
  20. data/lib/new_relic/agent/pipe_service.rb +9 -0
  21. data/lib/new_relic/agent/sql_sampler.rb +10 -3
  22. data/lib/new_relic/agent/stats_engine/transactions.rb +1 -0
  23. data/lib/new_relic/agent/thread_profiler.rb +20 -7
  24. data/lib/new_relic/agent/worker_loop.rb +2 -1
  25. data/lib/new_relic/coerce.rb +37 -0
  26. data/lib/new_relic/commands/deployments.rb +1 -1
  27. data/lib/new_relic/control/frameworks/rails.rb +29 -5
  28. data/lib/new_relic/control/frameworks/rails3.rb +2 -11
  29. data/lib/new_relic/control/instance_methods.rb +11 -7
  30. data/lib/new_relic/control/server_methods.rb +5 -37
  31. data/lib/new_relic/latest_changes.rb +31 -0
  32. data/lib/new_relic/local_environment.rb +1 -1
  33. data/lib/new_relic/metric_data.rb +13 -2
  34. data/lib/new_relic/noticed_error.rb +8 -1
  35. data/lib/new_relic/rack/agent_hooks.rb +20 -0
  36. data/lib/new_relic/rack/error_collector.rb +11 -1
  37. data/lib/new_relic/recipes.rb +32 -10
  38. data/lib/new_relic/transaction_sample.rb +12 -3
  39. data/lib/new_relic/transaction_sample/segment.rb +6 -3
  40. data/lib/new_relic/version.rb +10 -15
  41. data/newrelic.yml +12 -19
  42. data/newrelic_rpm.gemspec +22 -464
  43. data/test/multiverse/.gitignore +1 -0
  44. data/test/multiverse/lib/multiverse/environment.rb +1 -1
  45. data/test/multiverse/lib/multiverse/suite.rb +2 -0
  46. data/test/multiverse/suites/active_record/Envfile +3 -3
  47. data/test/multiverse/suites/active_record/ar_method_aliasing.rb +1 -1
  48. data/test/multiverse/suites/active_record/config/newrelic.yml +2 -2
  49. data/test/multiverse/suites/agent_only/Envfile +2 -1
  50. data/test/multiverse/suites/agent_only/config/newrelic.yml +3 -1
  51. data/test/multiverse/suites/agent_only/cross_process_test.rb +56 -0
  52. data/test/multiverse/suites/{logging → agent_only}/logging_test.rb +42 -22
  53. data/test/multiverse/suites/agent_only/no_dns_resolv.rb +17 -0
  54. data/test/multiverse/suites/{rum_auto_instrumentation/sanity_test.rb → agent_only/rum_instrumentation_test.rb} +25 -46
  55. data/test/multiverse/suites/agent_only/service_timeout_test.rb +6 -3
  56. data/test/multiverse/suites/agent_only/ssl_test.rb +22 -0
  57. data/test/multiverse/suites/{no_load → agent_only}/start_up_test.rb +9 -2
  58. data/test/multiverse/suites/agent_only/testing_app.rb +17 -0
  59. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +6 -5
  60. data/test/multiverse/suites/datamapper/config/newrelic.yml +1 -1
  61. data/test/multiverse/suites/{rails_3_queue_time → rails}/Envfile +3 -0
  62. data/test/multiverse/suites/rails/app.rb +49 -0
  63. data/test/multiverse/suites/{rails_3_views → rails}/app/views/foos/_foo.html.haml +0 -0
  64. data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/_a_partial.html.erb +0 -0
  65. data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/_mid_partial.html.erb +0 -0
  66. data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/_top_partial.html.erb +0 -0
  67. data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/deep_partial.html.erb +0 -0
  68. data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/haml_view.html.haml +0 -0
  69. data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/index.html.erb +0 -0
  70. data/test/multiverse/suites/rails/config/newrelic.yml +32 -0
  71. data/test/multiverse/suites/{rails_3_error_tracing → rails}/error_tracing_test.rb +51 -88
  72. data/test/multiverse/suites/rails/gc_instrumentation_test.rb +79 -0
  73. data/test/multiverse/suites/{rails_3_queue_time → rails}/queue_time_test.rb +3 -23
  74. data/test/multiverse/suites/{rails_3_views → rails}/view_instrumentation_test.rb +21 -61
  75. data/test/multiverse/suites/resque/Envfile +7 -4
  76. data/test/multiverse/suites/resque/Rakefile +8 -0
  77. data/test/multiverse/suites/resque/config/newrelic.yml +1 -1
  78. data/test/multiverse/suites/resque/instrumentation_test.rb +118 -41
  79. data/test/multiverse/suites/resque/resque_setup.rb +15 -0
  80. data/test/multiverse/suites/sinatra/config/newrelic.yml +1 -2
  81. data/test/multiverse/suites/sinatra/sinatra_error_tracing_test.rb +38 -0
  82. data/test/multiverse/suites/sinatra/sinatra_test.rb +17 -0
  83. data/test/multiverse/test/suite_examples/one/a/config/newrelic.yml +1 -1
  84. data/test/multiverse/test/suite_examples/one/b/config/newrelic.yml +1 -1
  85. data/test/new_relic/agent/agent/connect_test.rb +24 -100
  86. data/test/new_relic/agent/agent/start_worker_thread_test.rb +3 -3
  87. data/test/new_relic/agent/agent_test.rb +126 -31
  88. data/test/new_relic/agent/browser_monitoring_test.rb +1 -1
  89. data/test/new_relic/agent/busy_calculator_test.rb +8 -0
  90. data/test/new_relic/agent/configuration/manager_test.rb +28 -0
  91. data/test/new_relic/agent/configuration/yaml_source_test.rb +12 -2
  92. data/test/new_relic/agent/cross_process_monitoring_test.rb +144 -31
  93. data/test/new_relic/agent/error_collector_test.rb +16 -0
  94. data/test/new_relic/agent/event_listener_test.rb +46 -0
  95. data/test/new_relic/agent/instrumentation/browser_monitoring_timings_test.rb +57 -30
  96. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +1 -0
  97. data/test/new_relic/agent/new_relic_service_test.rb +95 -2
  98. data/test/new_relic/agent/pipe_channel_manager_test.rb +3 -3
  99. data/test/new_relic/agent/pipe_service_test.rb +21 -1
  100. data/test/new_relic/agent/rpm_agent_test.rb +1 -1
  101. data/test/new_relic/agent/sql_sampler_test.rb +20 -0
  102. data/test/new_relic/agent/thread_profiler_test.rb +53 -8
  103. data/test/new_relic/agent/worker_loop_test.rb +19 -16
  104. data/test/new_relic/agent_test.rb +1 -2
  105. data/test/new_relic/coerce_test.rb +65 -0
  106. data/test/new_relic/command/deployments_test.rb +1 -1
  107. data/test/new_relic/control_test.rb +23 -44
  108. data/test/new_relic/fake_collector.rb +34 -6
  109. data/test/new_relic/local_environment_test.rb +1 -1
  110. data/test/new_relic/metric_data_test.rb +29 -0
  111. data/test/new_relic/noticed_error_test.rb +8 -0
  112. data/test/new_relic/rack/agent_hooks_test.rb +30 -0
  113. data/test/new_relic/rack/error_collector_test.rb +16 -0
  114. data/test/new_relic/transaction_sample/segment_test.rb +7 -0
  115. data/test/new_relic/transaction_sample_test.rb +36 -8
  116. data/test/new_relic/version_number_test.rb +6 -30
  117. data/test/script/ci.sh +6 -5
  118. data/test/test_contexts.rb +2 -1
  119. data/test/test_helper.rb +23 -6
  120. data/ui/helpers/google_pie_chart.rb +1 -0
  121. metadata +68 -67
  122. data/newrelic_rpm.gemspec.erb +0 -54
  123. data/test/fixtures/gemspec_no_build.rb +0 -442
  124. data/test/fixtures/gemspec_with_build.rb +0 -442
  125. data/test/fixtures/gemspec_with_build_and_stage.rb +0 -442
  126. data/test/multiverse/suites/logging/Envfile +0 -4
  127. data/test/multiverse/suites/logging/config/newrelic.yml +0 -22
  128. data/test/multiverse/suites/monitor_mode_false/Envfile +0 -2
  129. data/test/multiverse/suites/monitor_mode_false/config/newrelic.yml +0 -25
  130. data/test/multiverse/suites/monitor_mode_false/no_dns_resolv.rb +0 -29
  131. data/test/multiverse/suites/no_load/Envfile +0 -2
  132. data/test/multiverse/suites/no_load/config/newrelic.yml +0 -22
  133. data/test/multiverse/suites/rails_3_error_tracing/Envfile +0 -15
  134. data/test/multiverse/suites/rails_3_error_tracing/config/newrelic.yml +0 -165
  135. data/test/multiverse/suites/rails_3_gc/Envfile +0 -8
  136. data/test/multiverse/suites/rails_3_gc/config/newrelic.yml +0 -167
  137. data/test/multiverse/suites/rails_3_gc/instrumentation_test.rb +0 -92
  138. data/test/multiverse/suites/rails_3_queue_time/config/newrelic.yml +0 -165
  139. data/test/multiverse/suites/rails_3_views/.gitignore +0 -3
  140. data/test/multiverse/suites/rails_3_views/Envfile +0 -16
  141. data/test/multiverse/suites/rails_3_views/config/newrelic.yml +0 -164
  142. data/test/multiverse/suites/resque/dump.rdb +0 -0
  143. data/test/multiverse/suites/rum_auto_instrumentation/Envfile +0 -4
  144. data/test/multiverse/suites/rum_auto_instrumentation/config/newrelic.yml +0 -24
  145. data/test/multiverse/suites/rum_auto_instrumentation/responses/worst_case_small.html +0 -5000
  146. data/test/new_relic/fake_service.rb +0 -53
@@ -79,6 +79,6 @@ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
79
79
  @mock_response = mock()
80
80
  @mock_response.expects(:is_a?).with(Net::HTTPSuccess).returns(true)
81
81
  mock_connection.expects(:request).returns(@mock_response)
82
- NewRelic::Control.instance.stubs(:http_connection).returns(mock_connection)
82
+ NewRelic::Agent::NewRelicService.any_instance.stubs(:http_connection).returns(mock_connection)
83
83
  end
84
84
  end
@@ -12,42 +12,6 @@ class NewRelic::ControlTest < Test::Unit::TestCase
12
12
  NewRelic::Agent.shutdown
13
13
  end
14
14
 
15
- def test_cert_file_path
16
- assert @control.cert_file_path
17
- assert_equal File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'cert', 'cacert.pem')), @control.cert_file_path
18
- end
19
-
20
- # This test does not actually use the ruby agent in any way - it's
21
- # testing that the CA file we ship actually validates our server's
22
- # certificate. It's used for customers who enable verify_certificate
23
- def test_cert_file
24
- require 'socket'
25
- require 'openssl'
26
-
27
- s = TCPSocket.new 'collector.newrelic.com', 443
28
- ctx = OpenSSL::SSL::SSLContext.new
29
- ctx.ca_file = @control.cert_file_path
30
- ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
31
- s = OpenSSL::SSL::SSLSocket.new s, ctx
32
- s.connect
33
- # should not raise an error
34
- end
35
-
36
- # see above, but for staging, as well. This allows us to test new
37
- # certificates in a non-customer-facing place before setting them
38
- # live.
39
- def test_staging_cert_file
40
- require 'socket'
41
- require 'openssl'
42
-
43
- s = TCPSocket.new 'staging-collector.newrelic.com', 443
44
- ctx = OpenSSL::SSL::SSLContext.new
45
- ctx.ca_file = @control.cert_file_path
46
- ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
47
- s = OpenSSL::SSL::SSLSocket.new s, ctx
48
- s.connect
49
- # should not raise an error
50
- end
51
15
 
52
16
  def test_test_config
53
17
  if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 4
@@ -67,6 +31,10 @@ class NewRelic::ControlTest < Test::Unit::TestCase
67
31
  control.local_env
68
32
  end
69
33
 
34
+ def test_settings_accessor
35
+ assert_not_nil control.settings
36
+ end
37
+
70
38
  def test_root
71
39
  assert File.directory?(NewRelic::Control.newrelic_root), NewRelic::Control.newrelic_root
72
40
  if defined?(Rails)
@@ -83,22 +51,30 @@ class NewRelic::ControlTest < Test::Unit::TestCase
83
51
  end
84
52
 
85
53
  def test_resolve_ip_for_localhost
86
- assert_equal nil, control.send(:convert_to_ip_address, 'localhost')
54
+ with_config(:ssl => false, :verify_certificate => false) do
55
+ assert_equal nil, control.send(:convert_to_ip_address, 'localhost')
56
+ end
87
57
  end
88
58
 
89
59
  def test_resolve_ip_for_non_existent_domain
90
- Resolv.stubs(:getaddress).raises(Resolv::ResolvError)
91
- IPSocket.stubs(:getaddress).raises(SocketError)
92
- assert_equal nil, control.send(:convert_to_ip_address, 'q1239988737.us')
60
+ with_config(:ssl => false, :verify_certificate => false) do
61
+ Resolv.stubs(:getaddress).raises(Resolv::ResolvError)
62
+ IPSocket.stubs(:getaddress).raises(SocketError)
63
+ assert_equal nil, control.send(:convert_to_ip_address, 'q1239988737.us')
64
+ end
93
65
  end
94
66
 
95
67
  def test_resolves_valid_ip
96
- Resolv.stubs(:getaddress).with('collector.newrelic.com').returns('204.93.223.153')
97
- assert_equal '204.93.223.153', control.send(:convert_to_ip_address, 'collector.newrelic.com')
68
+ with_config(:ssl => false, :verify_certificate => false) do
69
+ Resolv.stubs(:getaddress).with('collector.newrelic.com').returns('204.93.223.153')
70
+ assert_equal '204.93.223.153', control.send(:convert_to_ip_address, 'collector.newrelic.com')
71
+ end
98
72
  end
99
73
 
100
74
  def test_do_not_resolve_if_we_need_to_verify_a_cert
101
- assert_equal nil, control.send(:convert_to_ip_address, 'localhost')
75
+ with_config(:ssl => false, :verify_certificate => false) do
76
+ assert_equal nil, control.send(:convert_to_ip_address, 'localhost')
77
+ end
102
78
  with_config(:ssl => true, :verify_certificate => true) do
103
79
  assert_equal 'localhost', control.send(:convert_to_ip_address, 'localhost')
104
80
  end
@@ -140,7 +116,10 @@ class NewRelic::ControlTest < Test::Unit::TestCase
140
116
  old_ipsocket = IPSocket
141
117
  Object.instance_eval { remove_const :Resolv}
142
118
  Object.instance_eval {remove_const:'IPSocket' }
143
- assert_equal(nil, control.send(:convert_to_ip_address, 'collector.newrelic.com'), "DNS is down, should be no IP for server")
119
+
120
+ with_config(:ssl => false, :verify_certificate => false) do
121
+ assert_equal(nil, control.send(:convert_to_ip_address, 'collector.newrelic.com'), "DNS is down, should be no IP for server")
122
+ end
144
123
 
145
124
  Object.instance_eval {const_set('Resolv', old_resolv); const_set('IPSocket', old_ipsocket)}
146
125
  # these are here to make sure that the constant tomfoolery above
@@ -71,20 +71,48 @@ module NewRelic
71
71
  uri.query && uri.query.include?('marshal_format=json')
72
72
  end
73
73
 
74
- def run(port=30303)
74
+ # We generate a "unique" port for ourselves based off our pid
75
+ # If this logic changes, look for multiverse newrelic.yml files to update
76
+ # with it duplicated (since we can't easily pull this ruby into a yml)
77
+ def self.determine_port
78
+ 30_000 + ($$ % 10_000)
79
+ end
80
+
81
+ def determine_port
82
+ FakeCollector.determine_port
83
+ end
84
+
85
+ @seen_port_failure = false
86
+
87
+ def run(port=nil)
88
+ port ||= determine_port
75
89
  return if @thread && @thread.alive?
76
90
  serve_on_port(port) do
77
91
  @thread = Thread.new do
92
+ begin
78
93
  ::Rack::Handler::WEBrick.run(self,
79
94
  :Port => port,
80
- :Logger => WEBrick::Log.new("/dev/null"),
81
- :AccessLog => [nil, nil])
95
+ :Logger => ::WEBrick::Log.new("/dev/null"),
96
+ :AccessLog => [ ['/dev/null', ::WEBrick::AccessLog::COMMON_LOG_FORMAT] ]
97
+ )
98
+ rescue Errno::EADDRINUSE => ex
99
+ msg = "Port #{port} for FakeCollector was in use"
100
+ if !@seen_port_failure
101
+ # This is slow, so only do it the first collision we detect
102
+ lsof = `lsof | grep #{port}`
103
+ msg = msg + "\n#{lsof}"
104
+ @seen_port_failure = true
105
+ end
106
+
107
+ raise Errno::EADDRINUSE.new(msg)
108
+ end
82
109
  end
83
110
  @thread.abort_on_exception = true
84
111
  end
85
112
  end
86
113
 
87
114
  def serve_on_port(port)
115
+ port ||= determine_port
88
116
  if is_port_available?('127.0.0.1', port)
89
117
  yield
90
118
  loop do
@@ -127,7 +155,7 @@ module NewRelic
127
155
 
128
156
  # might we need this? I'll just leave it here for now
129
157
  class FakeCollectorProcess < FakeCollector
130
- def run(port=30303)
158
+ def run(port)
131
159
  serve_on_port(port) do
132
160
  @pid = Process.fork do
133
161
  ::Rack::Handler::WEBrick.run(self, :Port => port)
@@ -262,9 +290,9 @@ if $0 == __FILE__
262
290
  end
263
291
 
264
292
  def invoke(method, post={}, code=200)
265
- uri = URI.parse("http://127.0.0.1:30303/agent_listener/8/12345/#{method}")
293
+ uri = URI.parse("http://127.0.0.1:#{determine_port}/agent_listener/8/12345/#{method}")
266
294
  request = Net::HTTP::Post.new("#{uri.path}?#{uri.query}")
267
- if uri.query && uri.query.include?('marsha_format=json')
295
+ if uri.query && uri.query.include?('marshal_format=json')
268
296
  request.body = JSON.dump(post)
269
297
  else
270
298
  request.body = Marshal.dump(post)
@@ -53,7 +53,7 @@ class NewRelic::LocalEnvironmentTest < Test::Unit::TestCase
53
53
  assert_equal 0, s.size
54
54
  e.gather_environment_info
55
55
  s = e.snapshot
56
- assert_match /1\.(8\.[67]|9\.\d)/, s.assoc('Ruby version').last, s.inspect
56
+ assert_match /1\.8\.[67]|1\.9\.|2\.0/, s.assoc('Ruby version').last, s.inspect
57
57
  assert_equal 'test', s.assoc('Framework').last, s.inspect
58
58
  # Make sure the processor count is determined on linux systems
59
59
  if File.exists? '/proc/cpuinfo'
@@ -151,4 +151,33 @@ class NewRelic::MetricDataTest < Test::Unit::TestCase
151
151
  expected = [ 1234, [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
152
152
  assert_equal expected, md.to_collector_array
153
153
  end
154
+
155
+ # Rationals in metric data? -- https://support.newrelic.com/tickets/28053
156
+ def test_to_collector_array_with_rationals
157
+ stats = NewRelic::MethodTraceStats.new
158
+ stats.call_count = Rational(1, 1)
159
+ stats.total_call_time = Rational(2, 1)
160
+ stats.total_exclusive_time = Rational(3, 1)
161
+ stats.min_call_time = Rational(4, 1)
162
+ stats.max_call_time = Rational(5, 1)
163
+ stats.sum_of_squares = Rational(6, 1)
164
+
165
+ md = NewRelic::MetricData.new(nil, stats, 1234)
166
+ expected = [1234, [1, 2.0, 3.0, 4.0, 5.0, 6.0]]
167
+ assert_equal expected, md.to_collector_array
168
+ end
169
+
170
+ def test_to_collector_array_with_bad_values
171
+ stats = NewRelic::MethodTraceStats.new
172
+ stats.call_count = nil
173
+ stats.total_call_time = "junk"
174
+ stats.total_exclusive_time = Object.new
175
+ stats.min_call_time = []
176
+ stats.max_call_time = {}
177
+ stats.sum_of_squares = Exception.new("Boo")
178
+
179
+ md = NewRelic::MetricData.new(nil, stats, 1234)
180
+ expected = [1234, [0, 0, 0, 0, 0, 0]]
181
+ assert_equal expected, md.to_collector_array
182
+ end
154
183
  end
@@ -16,6 +16,14 @@ class NewRelic::Agent::NoticedErrorTest < Test::Unit::TestCase
16
16
  assert_equal expected, error.to_collector_array
17
17
  end
18
18
 
19
+ def test_to_collector_array_with_bad_values
20
+ error = NewRelic::NoticedError.new(@path, @params, nil, Rational(10, 1))
21
+ expected = [
22
+ 10_000.0, @path, "<no message>", "Error", @params
23
+ ]
24
+ assert_equal expected, error.to_collector_array
25
+ end
26
+
19
27
  def test_handles_non_string_exception_messages
20
28
  e = Exception.new({ :non => :string })
21
29
  error = NewRelic::NoticedError.new(@path, @params, e, @time)
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+ require 'new_relic/rack/agent_hooks'
3
+
4
+ class AgentHooksTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @app = stub_everything
8
+ @hooks = NewRelic::Rack::AgentHooks.new(@app)
9
+ @env = {:env => "env"}
10
+
11
+ NewRelic::Agent.instance.events.stubs(:notify)
12
+ end
13
+
14
+ def test_before_call
15
+ NewRelic::Agent.instance.events.expects(:notify).with(:before_call, @env)
16
+
17
+ @hooks.call(@env)
18
+ end
19
+
20
+ def test_after_call
21
+ result = stub
22
+ @app.stubs(:call).returns(result)
23
+
24
+ NewRelic::Agent.instance.events.expects(:notify).with(:after_call, @env, result)
25
+
26
+ @hooks.call(@env)
27
+ end
28
+
29
+ end
30
+
@@ -66,6 +66,22 @@ module NewRelic::Rack
66
66
  assert(NewRelic::Agent.instance.error_collector.errors.empty?,
67
67
  'noticed an error that should have been ignored')
68
68
  end
69
+
70
+ def test_handles_parameter_parsing_exceptions
71
+ bad_request = stub(:env => {}, :path => '/', :referer => '')
72
+ bad_request.stubs(:params).raises(TypeError, "can't convert nil into Hash")
73
+ Rack::Request.stubs(:new).returns(bad_request)
74
+
75
+ assert_raise RuntimeError do
76
+ get '/'
77
+ end
78
+
79
+ assert_equal('unhandled error',
80
+ NewRelic::Agent.instance.error_collector.errors[0].message)
81
+ assert_match(/failed to capture request parameters/i,
82
+ NewRelic::Agent.instance.error_collector.errors[0].params[:request_params]['error'])
83
+ end
84
+
69
85
  end
70
86
  end
71
87
 
@@ -51,6 +51,13 @@ class NewRelic::TransactionSample::SegmentTest < Test::Unit::TestCase
51
51
  assert_equal(expected_array, parent.to_array)
52
52
  end
53
53
 
54
+ def test_to_array_with_bad_values
55
+ segment = NewRelic::TransactionSample::Segment.new(nil, nil, nil)
56
+ segment.end_trace(Rational(10, 1))
57
+ expected = [0, 10_000.0, "<unknown>", {}, []]
58
+ assert_equal(expected, segment.to_array)
59
+ end
60
+
54
61
  if RUBY_VERSION >= '1.9.2'
55
62
  def test_to_json
56
63
  parent = NewRelic::TransactionSample::Segment.new(1, 'Custom/test/parent', 1)
@@ -12,6 +12,12 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
12
12
 
13
13
  NewRelic::Agent::Database.stubs(:get_connection).returns @connection_stub
14
14
  @t = make_sql_transaction(::SQL_STATEMENT, ::SQL_STATEMENT)
15
+
16
+ if NewRelic::Agent::NewRelicService::JsonMarshaller.is_supported?
17
+ @marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
18
+ else
19
+ @marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
20
+ end
15
21
  end
16
22
 
17
23
  def teardown
@@ -189,6 +195,13 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
189
195
  assert_equal expected_array, @t.to_array
190
196
  end
191
197
 
198
+
199
+ def test_to_array_with_bad_values
200
+ transaction = NewRelic::TransactionSample.new(nil)
201
+ expected = [0.0, {}, nil, [0, 0, "ROOT", {}, []]]
202
+ assert_equal expected, transaction.to_array
203
+ end
204
+
192
205
  if RUBY_VERSION >= '1.9.2'
193
206
  def test_to_json
194
207
  expected_string = JSON.dump([@t.start_time.to_f,
@@ -200,20 +213,35 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
200
213
  end
201
214
 
202
215
  def test_to_collector_array
203
- if NewRelic::Agent::NewRelicService::JsonMarshaller.is_supported?
204
- marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
205
- trace_tree = compress(@t.to_json)
206
- else
207
- marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
208
- trace_tree = @t.to_array
209
- end
210
216
  expected_array = [(@t.start_time.to_f * 1000).round,
211
217
  (@t.duration * 1000).round,
212
218
  @t.params[:path], @t.params[:uri],
213
219
  trace_tree,
214
220
  @t.guid, nil, !!@t.force_persist]
215
221
 
216
- assert_equal expected_array, @t.to_collector_array(marshaller.default_encoder)
222
+ assert_equal expected_array, @t.to_collector_array(@marshaller.default_encoder)
223
+ end
224
+
225
+ def test_to_collector_array_with_bad_values
226
+ transaction = NewRelic::TransactionSample.new(nil)
227
+ transaction.root_segment.end_trace(Rational(10, 1))
228
+
229
+ expected = [
230
+ 0, 10_000,
231
+ nil, nil,
232
+ trace_tree(transaction),
233
+ transaction.guid,
234
+ nil, false]
235
+
236
+ assert_equal expected, transaction.to_collector_array(@marshaller.default_encoder)
237
+ end
238
+
239
+ def trace_tree(transaction=@t)
240
+ if NewRelic::Agent::NewRelicService::JsonMarshaller.is_supported?
241
+ trace_tree = compress(transaction.to_json)
242
+ else
243
+ trace_tree = transaction.to_array
244
+ end
217
245
  end
218
246
 
219
247
  def compress(string)
@@ -82,40 +82,16 @@ class NewRelic::VersionNumberTest < Test::Unit::TestCase
82
82
  assert v0 < '1.2.0.1'
83
83
  assert v0 > '1.1.0.1'
84
84
  end
85
+
85
86
  def test_string
86
87
  assert_equal '1.2.0', NewRelic::VersionNumber.new('1.2.0').to_s
87
88
  assert_equal '1.2', NewRelic::VersionNumber.new('1.2').to_s
88
89
  end
89
90
 
90
- def test_gemspec_version_parsing
91
- gemspec_contents = File.read(File.join(File.dirname(__FILE__), '..', '..', 'newrelic_rpm.gemspec'))
92
- gemspec_contents =~ /s\.version\s*=\s*"(.*)"/
93
- real_version = $1
94
- assert_equal real_version, NewRelic::VERSION::STRING
95
- end
96
-
97
- def test_gemspec_parse_no_build
98
- version = NewRelic::VERSION.parse_build_from_gemspec(NewRelic.fixture_path('gemspec_no_build.rb'))
99
- assert_nil version
100
- end
101
-
102
- def test_gemspec_parse_with_build
103
- version = NewRelic::VERSION.parse_build_from_gemspec(NewRelic.fixture_path('gemspec_with_build.rb'))
104
- assert_equal '123', version
105
- end
106
-
107
- def test_gemspec_parse_with_build_and_stage
108
- version = NewRelic::VERSION.parse_build_from_gemspec(NewRelic.fixture_path('gemspec_with_build_and_stage.rb'))
109
- assert_equal '123.dev', version
110
- end
111
-
112
- def test_gemspec_parse_no_rubygems
113
- Kernel.stubs(:const_defined?).with(:Gem).returns(false)
114
- version = NewRelic::VERSION.parse_build_from_gemspec(NewRelic.fixture_path('gemspec_with_build_and_stage.rb'))
115
- assert_equal '123.dev', version
116
- end
117
-
118
- def test_gemspec_parse_nonexistent
119
- assert_nil NewRelic::VERSION.parse_build_from_gemspec('/really/not/a/real/path')
91
+ def test_build_version_string
92
+ version_string = NewRelic::VERSION.build_version_string(1, 2, 3, '4.beta')
93
+ assert_equal('1.2.3.4.beta', version_string)
94
+ version_string = NewRelic::VERSION.build_version_string(1, 2, 3, nil)
95
+ assert_equal('1.2.3', version_string)
120
96
  end
121
97
  end
@@ -64,13 +64,10 @@ fi
64
64
 
65
65
  echo `which ruby`
66
66
  ruby -v
67
+ gem --version
67
68
 
68
69
  rake -h > /dev/null || gem install rake
69
70
 
70
- echo "generating gemspec"
71
- rake gemspec
72
-
73
-
74
71
  # make sure that we're in the project root
75
72
  script_dirname=`dirname $0`
76
73
  cd "$script_dirname/../../"
@@ -87,13 +84,17 @@ rpm_test_app_cache=~/workspace/.rpm_test_app_cache
87
84
  echo "updating local cache of rpm_test_app in $rpm_test_app_cache"
88
85
  git clone --mirror git://github.com/newrelic/rpm_test_app.git $rpm_test_app_cache || true
89
86
  cd $rpm_test_app_cache
87
+ git fetch || true
90
88
  )
91
89
 
92
90
  git clone $rpm_test_app_cache rpm_test_app
93
91
  cd rpm_test_app
94
92
 
93
+ git fetch || true
95
94
  git checkout -t origin/$BRANCH || git checkout $BRANCH
96
-
95
+ if [ -x $HOME/.rbenv/plugins/rbenv-gemsets ]; then
96
+ echo "$RUBY-$BRANCH" > .rbenv-gemsets
97
+ fi
97
98
 
98
99
  # Re-write database.yml to this here doc
99
100
  ( cat << "YAML" ) > config/database.yml