airbrake 3.1.11 → 3.1.12
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +21 -0
- data/Rakefile +1 -0
- data/airbrake.gemspec +2 -1
- data/features/rails.feature +13 -1
- data/features/step_definitions/rails_application_steps.rb +1 -2
- data/lib/airbrake.rb +3 -1
- data/lib/airbrake/configuration.rb +18 -2
- data/lib/airbrake/notice.rb +2 -2
- data/lib/airbrake/rails/controller_methods.rb +3 -3
- data/lib/airbrake/rails/javascript_notifier.rb +2 -1
- data/lib/airbrake/rails3_tasks.rb +28 -7
- data/lib/airbrake/rake_handler.rb +7 -4
- data/lib/airbrake/sender.rb +1 -1
- data/lib/airbrake/version.rb +1 -1
- data/lib/templates/{javascript_notifier.erb → javascript_notifier} +0 -0
- data/resources/notice.xml +1 -1
- data/test/catcher_test.rb +101 -140
- data/test/helper.rb +58 -57
- data/test/notice_test.rb +5 -2
- metadata +30 -15
- data/resources/airbrake_2_4.xsd +0 -89
data/CHANGELOG
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
Version 3.1.12 - 2013-04-29 18:48:40 +0200
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
Arvind Kunday (1):
|
5
|
+
Removing the .erb template handler
|
6
|
+
|
7
|
+
Hrvoje Šimić (8):
|
8
|
+
introducing null logger for fallback
|
9
|
+
add missing logger requirement
|
10
|
+
being careful with silencing of rake backtrace in the airbrake:test task
|
11
|
+
support for Rails 4.0
|
12
|
+
start using remote XSD file when verifying XML in tests
|
13
|
+
throw a warning for unsupported user attributes
|
14
|
+
updating outdated step definition for current user feature
|
15
|
+
speeding up the test by using 'runner' instead of 'server'
|
16
|
+
|
17
|
+
knapo (1):
|
18
|
+
Fix Airbrake::Sender#log to log messages when logger is not passed to options.
|
19
|
+
|
20
|
+
|
1
21
|
Version 3.1.11 - 2013-04-11 12:44:09 +0200
|
2
22
|
===============================================================================
|
3
23
|
|
@@ -1144,3 +1164,4 @@ Nick Quaranto (3):
|
|
1144
1164
|
|
1145
1165
|
|
1146
1166
|
|
1167
|
+
|
data/Rakefile
CHANGED
data/airbrake.gemspec
CHANGED
@@ -23,13 +23,14 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_development_dependency("nokogiri", "~> 1.5.0")
|
24
24
|
s.add_development_dependency("rspec", "~> 2.6.0")
|
25
25
|
s.add_development_dependency("sham_rack", "~> 1.3.0")
|
26
|
-
s.add_development_dependency("shoulda", "~> 2.11.3")
|
27
26
|
s.add_development_dependency("capistrano")
|
28
27
|
s.add_development_dependency("aruba")
|
29
28
|
s.add_development_dependency("appraisal")
|
30
29
|
s.add_development_dependency("rspec-rails")
|
31
30
|
s.add_development_dependency("girl_friday")
|
32
31
|
s.add_development_dependency("json-schema")
|
32
|
+
s.add_development_dependency("shoulda-matchers")
|
33
|
+
s.add_development_dependency("shoulda-context")
|
33
34
|
|
34
35
|
s.authors = ["Airbrake"]
|
35
36
|
s.email = %q{support@airbrake.io}
|
data/features/rails.feature
CHANGED
@@ -228,7 +228,7 @@ Feature: Install the Gem in a Rails application
|
|
228
228
|
"""
|
229
229
|
config.api_key = "myapikey"
|
230
230
|
config.logger = Logger.new STDOUT
|
231
|
-
config.user_attributes = [:id, :name, :email, :username
|
231
|
+
config.user_attributes = [:id, :name, :email, :username]
|
232
232
|
"""
|
233
233
|
And I define a response for "TestController#index":
|
234
234
|
"""
|
@@ -240,6 +240,18 @@ Feature: Install the Gem in a Rails application
|
|
240
240
|
Then I should receive a Airbrake notification
|
241
241
|
And the Airbrake notification should contain the custom user details
|
242
242
|
|
243
|
+
Scenario: It should warn the user that she's using unsupported attributes for
|
244
|
+
current user
|
245
|
+
When I configure the Airbrake shim
|
246
|
+
And I configure the notifier to use the following configuration lines:
|
247
|
+
"""
|
248
|
+
config.api_key = "myapikey"
|
249
|
+
config.logger = Logger.new STDOUT
|
250
|
+
config.user_attributes = [:id, :name, :email, :username, :shoe_size]
|
251
|
+
"""
|
252
|
+
And I run `rails runner config/boot.rb`
|
253
|
+
Then I should see "Unsupported user attribute: 'shoe_size'"
|
254
|
+
|
243
255
|
Scenario: It should log the notice when failure happens
|
244
256
|
When Airbrake server is not responding
|
245
257
|
And I configure the notifier to use the following configuration lines:
|
@@ -84,7 +84,7 @@ end
|
|
84
84
|
|
85
85
|
When /^I perform a request to "([^\"]*)"$/ do |uri|
|
86
86
|
perform_request(uri)
|
87
|
-
step %{I run `bundle exec
|
87
|
+
step %{I run `bundle exec rails runner request.rb`}
|
88
88
|
end
|
89
89
|
|
90
90
|
When /^I perform a request to "([^\"]*)" in the "([^\"]*)" environment$/ do |uri, environment|
|
@@ -247,7 +247,6 @@ Then /^the Airbrake notification should contain the custom user details$/ do
|
|
247
247
|
step %{the last notice sent should contain "<name>Bender</name>"}
|
248
248
|
step %{the last notice sent should contain "<email>bender@beer.com</email>"}
|
249
249
|
step %{the last notice sent should contain "<username>b3nd0r</username>"}
|
250
|
-
step %{the last notice sent should contain "<class_name>User</class_name>"}
|
251
250
|
end
|
252
251
|
|
253
252
|
Then /^the Airbrake notification should contain user details$/ do
|
data/lib/airbrake.rb
CHANGED
@@ -6,6 +6,7 @@ end
|
|
6
6
|
require 'net/http'
|
7
7
|
require 'net/https'
|
8
8
|
require 'rubygems'
|
9
|
+
require 'logger'
|
9
10
|
|
10
11
|
begin
|
11
12
|
require 'active_support/core_ext/object/blank'
|
@@ -74,7 +75,8 @@ module Airbrake
|
|
74
75
|
|
75
76
|
# Look for the Rails logger currently defined
|
76
77
|
def logger
|
77
|
-
self.configuration.logger
|
78
|
+
self.configuration.logger ||
|
79
|
+
Logger.new(RUBY_PLATFORM =~ /(mingw|bccwin|wince|mswin32)/i ? 'NUL:' : '/dev/null')
|
78
80
|
end
|
79
81
|
|
80
82
|
# Call this method to modify defaults in your initializers.
|
@@ -104,9 +104,10 @@ module Airbrake
|
|
104
104
|
# Should Airbrake catch exceptions from Rake tasks?
|
105
105
|
# (boolean or nil; set to nil to catch exceptions when rake isn't running from a terminal; default is nil)
|
106
106
|
attr_accessor :rescue_rake_exceptions
|
107
|
+
alias_method :rescue_rake_exceptions?, :rescue_rake_exceptions
|
107
108
|
|
108
109
|
# User attributes that are being captured
|
109
|
-
|
110
|
+
attr_reader :user_attributes
|
110
111
|
|
111
112
|
# Only used for JSON API
|
112
113
|
attr_accessor :project_id
|
@@ -116,10 +117,12 @@ module Airbrake
|
|
116
117
|
attr_accessor :test_mode
|
117
118
|
alias_method :test_mode?, :test_mode
|
118
119
|
|
119
|
-
DEFAULT_PARAMS_FILTERS
|
120
|
+
DEFAULT_PARAMS_FILTERS = %w(password password_confirmation).freeze
|
120
121
|
|
121
122
|
DEFAULT_USER_ATTRIBUTES = %w(id).freeze
|
122
123
|
|
124
|
+
VALID_USER_ATTRIBUTES = %w(id name username email).freeze
|
125
|
+
|
123
126
|
DEFAULT_BACKTRACE_FILTERS = [
|
124
127
|
lambda { |line|
|
125
128
|
if defined?(Airbrake.configuration.project_root) && Airbrake.configuration.project_root.to_s != ''
|
@@ -260,6 +263,10 @@ module Airbrake
|
|
260
263
|
end
|
261
264
|
end
|
262
265
|
|
266
|
+
def user_attributes=(user_attributes)
|
267
|
+
@user_attributes = validate_user_attributes user_attributes
|
268
|
+
end
|
269
|
+
|
263
270
|
# Should Airbrake send notifications asynchronously
|
264
271
|
# (boolean, nil or callable; default is nil).
|
265
272
|
# Can be used as callable-setter when block provided.
|
@@ -319,5 +326,14 @@ module Airbrake
|
|
319
326
|
warn "[AIRBRAKE] You can't use the default async handler without girl_friday."\
|
320
327
|
" Please make sure you have girl_friday installed."
|
321
328
|
end
|
329
|
+
|
330
|
+
def validate_user_attributes(user_attributes)
|
331
|
+
user_attributes.each do |attribute|
|
332
|
+
next if VALID_USER_ATTRIBUTES.include? attribute
|
333
|
+
warn "[AIRBRAKE] Unsupported user attribute: '#{attribute}'. "\
|
334
|
+
"This attribute will not be shown in the Airbrake UI. "\
|
335
|
+
"Check http://git.io/h6YRpA for more info."
|
336
|
+
end
|
337
|
+
end
|
322
338
|
end
|
323
339
|
end
|
data/lib/airbrake/notice.rb
CHANGED
@@ -415,9 +415,9 @@ module Airbrake
|
|
415
415
|
end
|
416
416
|
|
417
417
|
def also_use_rack_params_filters
|
418
|
-
if
|
418
|
+
if cgi_data
|
419
419
|
@params_filters ||= []
|
420
|
-
@params_filters +=
|
420
|
+
@params_filters += cgi_data["action_dispatch.parameter_filter"] || []
|
421
421
|
end
|
422
422
|
end
|
423
423
|
|
@@ -45,11 +45,11 @@ module Airbrake
|
|
45
45
|
|
46
46
|
if respond_to?(:filter_parameters) # Rails 2
|
47
47
|
filter_parameters(hash)
|
48
|
-
elsif defined?(ActionDispatch::Http::ParameterFilter) # Rails 3
|
49
|
-
|
48
|
+
# elsif defined?(ActionDispatch::Http::ParameterFilter) # Rails 3
|
49
|
+
# ActionDispatch::Http::ParameterFilter.new(::Rails.application.config.filter_parameters).filter(hash)
|
50
50
|
else
|
51
51
|
hash
|
52
|
-
end
|
52
|
+
end
|
53
53
|
|
54
54
|
end
|
55
55
|
|
@@ -8,7 +8,7 @@ module Airbrake
|
|
8
8
|
private
|
9
9
|
|
10
10
|
def airbrake_javascript_notifier_options
|
11
|
-
path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier
|
11
|
+
path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier'
|
12
12
|
host = Airbrake.configuration.host.dup
|
13
13
|
port = Airbrake.configuration.port
|
14
14
|
host << ":#{port}" unless [80, 443].include?(port)
|
@@ -17,6 +17,7 @@ module Airbrake
|
|
17
17
|
:file => path,
|
18
18
|
:layout => false,
|
19
19
|
:use_full_path => false,
|
20
|
+
:handlers => [:erb],
|
20
21
|
:locals => {
|
21
22
|
:host => host,
|
22
23
|
:api_key => Airbrake.configuration.js_api_key,
|
@@ -1,12 +1,27 @@
|
|
1
1
|
require 'airbrake'
|
2
2
|
require File.join(File.dirname(__FILE__), 'shared_tasks')
|
3
3
|
|
4
|
-
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
def stub_rake_exception_handling!
|
5
|
+
# Override error handling in Rack so we don't clutter STDERR
|
6
|
+
# with unnecesarry stack trace
|
7
|
+
Rake.application.instance_eval do
|
8
|
+
class << self
|
9
|
+
def display_error_message_silent(exception)
|
10
|
+
puts exception
|
11
|
+
end
|
12
|
+
alias_method :display_error_message_old, :display_error_message
|
13
|
+
alias_method :display_error_message, :display_error_message_silent
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def unstub_rake_exception_handling!
|
19
|
+
# Turns Rake exception handling back to normal
|
20
|
+
Rake.application.instance_eval do
|
21
|
+
class << self
|
22
|
+
def display_error_message_silent(exception)
|
23
|
+
display_error_message_old(exception)
|
24
|
+
end
|
10
25
|
end
|
11
26
|
end
|
12
27
|
end
|
@@ -14,6 +29,9 @@ end
|
|
14
29
|
namespace :airbrake do
|
15
30
|
desc "Verify your gem installation by sending a test exception to the airbrake service"
|
16
31
|
task :test => [:environment] do
|
32
|
+
|
33
|
+
stub_rake_exception_handling!
|
34
|
+
|
17
35
|
Rails.logger = defined?(ActiveSupport::TaggedLogging) ?
|
18
36
|
ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) :
|
19
37
|
Logger.new(STDOUT)
|
@@ -87,7 +105,7 @@ namespace :airbrake do
|
|
87
105
|
end
|
88
106
|
|
89
107
|
Rails.application.routes.draw do
|
90
|
-
get 'verify' => 'application#verify', :as => 'verify'
|
108
|
+
get 'verify' => 'application#verify', :as => 'verify', :via => :get
|
91
109
|
end
|
92
110
|
|
93
111
|
puts 'Processing request.'
|
@@ -100,5 +118,8 @@ namespace :airbrake do
|
|
100
118
|
Rails.application.call(env)
|
101
119
|
|
102
120
|
wait_for_threads if defined? GirlFriday
|
121
|
+
|
122
|
+
unstub_rake_exception_handling!
|
103
123
|
end
|
104
124
|
end
|
125
|
+
|
@@ -8,19 +8,22 @@ module Airbrake::RakeHandler
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
def display_error_message_with_airbrake(
|
11
|
+
def display_error_message_with_airbrake(exception)
|
12
12
|
if Airbrake.sender && Airbrake.configuration &&
|
13
13
|
(Airbrake.configuration.rescue_rake_exceptions ||
|
14
14
|
(Airbrake.configuration.rescue_rake_exceptions===nil && !self.tty_output?))
|
15
15
|
|
16
|
-
Airbrake.notify_or_ignore(
|
16
|
+
Airbrake.notify_or_ignore(exception,
|
17
|
+
:component => 'rake',
|
18
|
+
:action => reconstruct_command_line,
|
19
|
+
:cgi_data => environment_info)
|
17
20
|
end
|
18
21
|
|
19
|
-
display_error_message_without_airbrake(
|
22
|
+
display_error_message_without_airbrake(exception)
|
20
23
|
end
|
21
24
|
|
22
25
|
def reconstruct_command_line
|
23
|
-
ARGV.join(
|
26
|
+
ARGV.join(' ')
|
24
27
|
end
|
25
28
|
|
26
29
|
def environment_info
|
data/lib/airbrake/sender.rb
CHANGED
@@ -137,7 +137,7 @@ module Airbrake
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def log(opts = {})
|
140
|
-
opts[:logger].send
|
140
|
+
(opts[:logger] || logger).send(opts[:level], LOG_PREFIX + opts[:message])
|
141
141
|
Airbrake.report_environment_info
|
142
142
|
Airbrake.report_response_body(opts[:response].body) if opts[:response] && opts[:response].respond_to?(:body)
|
143
143
|
Airbrake.report_notice(opts[:notice]) if opts[:notice]
|
data/lib/airbrake/version.rb
CHANGED
File without changes
|
data/resources/notice.xml
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key/><notifier><name>Airbrake Notifier</name><version>3.1.10</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>RuntimeError</class><message>RuntimeError: some message</message><backtrace><line number="5" file="[PROJECT_ROOT]/app/controllers/test_controller.rb" method="index"/><line number="4" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/implicit_render.rb" method="send_action"/><line number="167" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/abstract_controller/base.rb" method="process_action"/><line number="10" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/rendering.rb" method="process_action"/><line number="18" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/abstract_controller/callbacks.rb" method="block in process_action"/><line number="414" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="_run__1119964459555507863__process_action__2114797969435458246__callbacks"/><line number="405" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="__run_callback"/><line number="385" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="_run_process_action_callbacks"/><line number="81" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/abstract_controller/callbacks.rb" method="process_action"/><line number="29" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/rescue.rb" method="process_action"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/instrumentation.rb" method="block in process_action"/><line number="123" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/notifications.rb" method="block in instrument"/><line number="20" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/notifications/instrumenter.rb" method="instrument"/><line number="123" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/notifications.rb" method="instrument"/><line number="29" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/instrumentation.rb" method="process_action"/><line number="207" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/params_wrapper.rb" method="process_action"/><line number="121" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/abstract_controller/base.rb" method="process"/><line number="45" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/abstract_controller/rendering.rb" method="process"/><line number="203" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal.rb" method="dispatch"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal/rack_delegation.rb" method="dispatch"/><line number="246" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_controller/metal.rb" method="block in action"/><line number="73" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="73" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/routing/route_set.rb" method="dispatch"/><line number="36" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="68" file="[GEM_ROOT]/gems/journey-1.0.4/lib/journey/router.rb" method="block in call"/><line number="56" file="[GEM_ROOT]/gems/journey-1.0.4/lib/journey/router.rb" method="each"/><line number="56" file="[GEM_ROOT]/gems/journey-1.0.4/lib/journey/router.rb" method="call"/><line number="612" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/best_standards_support.rb" method="call"/><line number="23" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/etag.rb" method="call"/><line number="25" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/conditionalget.rb" method="call"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/head.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/params_parser.rb" method="call"/><line number="242" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/flash.rb" method="call"/><line number="210" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/session/abstract/id.rb" method="context"/><line number="205" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/session/abstract/id.rb" method="call"/><line number="341" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/cookies.rb" method="call"/><line number="28" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/callbacks.rb" method="block in call"/><line number="405" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="_run__1576280847308009310__call__2543261213916389519__callbacks"/><line number="405" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="__run_callback"/><line number="385" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="_run_call_callbacks"/><line number="81" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="27" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/callbacks.rb" method="call"/><line number="31" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/remote_ip.rb" method="call"/><line number="16" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/debug_exceptions.rb" method="call"/><line number="56" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/show_exceptions.rb" method="call"/><line number="32" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/rack/logger.rb" method="call_app"/><line number="16" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/rack/logger.rb" method="block in call"/><line number="22" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/tagged_logging.rb" method="tagged"/><line number="16" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/rack/logger.rb" method="call"/><line number="22" file="[GEM_ROOT]/gems/actionpack-3.2.13/lib/action_dispatch/middleware/request_id.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/methodoverride.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/runtime.rb" method="call"/><line number="72" file="[GEM_ROOT]/gems/activesupport-3.2.13/lib/active_support/cache/strategy/local_cache.rb" method="call"/><line number="15" file="[GEM_ROOT]/gems/rack-1.4.5/lib/rack/lock.rb" method="call"/><line number="136" file="[GEM_ROOT]/gems/rack-cache-1.2/lib/rack/cache/context.rb" method="forward"/><line number="245" file="[GEM_ROOT]/gems/rack-cache-1.2/lib/rack/cache/context.rb" method="fetch"/><line number="185" file="[GEM_ROOT]/gems/rack-cache-1.2/lib/rack/cache/context.rb" method="lookup"/><line number="66" file="[GEM_ROOT]/gems/rack-cache-1.2/lib/rack/cache/context.rb" method="call!"/><line number="51" file="[GEM_ROOT]/gems/rack-cache-1.2/lib/rack/cache/context.rb" method="call"/><line number="479" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/engine.rb" method="call"/><line number="223" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/application.rb" method="call"/><line number="30" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/railtie/configurable.rb" method="method_missing"/><line number="4" file="request.rb" method="<top (required)>"/><line number="51" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/commands/runner.rb" method="eval"/><line number="51" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/commands/runner.rb" method="<top (required)>"/><line number="64" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/commands.rb" method="require"/><line number="64" file="[GEM_ROOT]/gems/railties-3.2.13/lib/rails/commands.rb" method="<top (required)>"/><line number="6" file="script/rails" method="require"/><line number="6" file="script/rails" method="<main>"/></backtrace></error><request><url>http://example.com:123/test/index?param=value</url><component>test</component><action>index</action><params><var key="param">value</var><var key="controller">test</var><var key="action">index</var></params><cgi-data><var key="rack.version">["1", "1"]</var><var key="rack.input">#<StringIO:0x000000021d3498></var><var key="rack.errors">#<StringIO:0x000000021d3560></var><var key="rack.multithread">false</var><var key="rack.multiprocess">true</var><var key="rack.run_once">false</var><var key="REQUEST_METHOD">GET</var><var key="SERVER_NAME">example.com</var><var key="SERVER_PORT">123</var><var key="QUERY_STRING">param=value</var><var key="PATH_INFO">/test/index</var><var key="rack.url_scheme">http</var><var key="HTTPS">off</var><var key="SCRIPT_NAME"></var><var key="CONTENT_LENGTH">0</var><var key="ORIGINAL_FULLPATH">/test/index?param=value</var><var key="action_dispatch.routes">#<ActionDispatch::Routing::RouteSet:0x00000001ae8ea8></var><var key="action_dispatch.parameter_filter">["password"]</var><var key="action_dispatch.show_exceptions">true</var><var key="action_dispatch.show_detailed_exceptions">false</var><var key="action_dispatch.logger">#<ActiveSupport::TaggedLogging:0x0000000174daf0></var><var key="action_dispatch.backtrace_cleaner">#<Rails::BacktraceCleaner:0x00000002cb9218></var><var key="rack-cache.cache_key">Rack::Cache::Key</var><var key="rack-cache.verbose">false</var><var key="rack-cache.storage">#<Rack::Cache::Storage:0x00000002168b70></var><var key="rack-cache.metastore">rails:/</var><var key="rack-cache.entitystore">rails:/</var><var key="rack-cache.default_ttl">0</var><var key="rack-cache.ignore_headers">["Set-Cookie"]</var><var key="rack-cache.private_headers">["Authorization", "Cookie"]</var><var key="rack-cache.allow_reload">false</var><var key="rack-cache.allow_revalidate">false</var><var key="rack-cache.use_native_ttl">false</var><var key="action_dispatch.request_id">2c43f3810b99b182954b910220833d5a</var><var key="action_dispatch.remote_ip"></var><var key="rack.session"></var><var key="rack.session.options"><var key="path">/</var><var key="domain"></var><var key="expire_after"></var><var key="secure">false</var><var key="httponly">true</var><var key="defer">false</var><var key="renew">false</var><var key="secret">bb299e2337398a11690d55a857c1570cc8f62f19b5907d6b7ff9fd9d495a</var><var key="coder">#<Rack::Session::Cookie::Base64::Marshal:0x000000015f19e0></var><var key="id"></var></var><var key="rack.request.cookie_hash"></var><var key="action_dispatch.cookies">#<ActionDispatch::Cookies::CookieJar:0x000000030c17e8></var><var key="action_dispatch.request.unsigned_session_cookie"></var><var key="action_dispatch.request.path_parameters"><var key="controller">test</var><var key="action">index</var></var><var key="action_controller.instance">#<TestController:0x000000025fd7d0></var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string">param=value</var><var key="rack.request.query_hash"><var key="param">value</var></var><var key="action_dispatch.request.query_parameters"><var key="param">value</var></var><var key="action_dispatch.request.parameters"><var key="param">value</var><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/home/hrvoje/code/airbrake/tmp/rails_root</project-root><environment-name>production</environment-name><hostname>hrvoje-Aspire-5741G</hostname></server-environment><framework>Rails: 3.2.13</framework></notice>
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>3.1.11</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>RuntimeError</class><message>RuntimeError: some message</message><backtrace><line number="5" file="[PROJECT_ROOT]/app/controllers/test_controller.rb" method="index"/><line number="4" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/implicit_render.rb" method="send_action"/><line number="189" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/abstract_controller/base.rb" method="process_action"/><line number="10" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/rendering.rb" method="process_action"/><line number="18" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/abstract_controller/callbacks.rb" method="block in process_action"/><line number="373" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/callbacks.rb" method="_run__2671352232143607105__process_action__callbacks"/><line number="78" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="17" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/abstract_controller/callbacks.rb" method="process_action"/><line number="29" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/rescue.rb" method="process_action"/><line number="31" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/instrumentation.rb" method="block in process_action"/><line number="158" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/notifications.rb" method="block in instrument"/><line number="20" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/notifications/instrumenter.rb" method="instrument"/><line number="158" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/notifications.rb" method="instrument"/><line number="30" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/instrumentation.rb" method="process_action"/><line number="245" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/params_wrapper.rb" method="process_action"/><line number="136" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/abstract_controller/base.rb" method="process"/><line number="44" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/abstract_controller/rendering.rb" method="process"/><line number="196" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal.rb" method="dispatch"/><line number="13" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal/rack_delegation.rb" method="dispatch"/><line number="232" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_controller/metal.rb" method="block in action"/><line number="78" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="78" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/routing/route_set.rb" method="dispatch"/><line number="46" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="69" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/journey/router.rb" method="block in call"/><line number="57" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/journey/router.rb" method="each"/><line number="57" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/journey/router.rb" method="call"/><line number="651" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="23" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/etag.rb" method="call"/><line number="25" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/conditionalget.rb" method="call"/><line number="11" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/head.rb" method="call"/><line number="27" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/params_parser.rb" method="call"/><line number="241" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/flash.rb" method="call"/><line number="225" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/session/abstract/id.rb" method="context"/><line number="220" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/session/abstract/id.rb" method="call"/><line number="452" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/cookies.rb" method="call"/><line number="29" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/callbacks.rb" method="block in call"/><line number="373" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/callbacks.rb" method="_run__4190110547367303363__call__callbacks"/><line number="78" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="27" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/callbacks.rb" method="call"/><line number="76" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/remote_ip.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/debug_exceptions.rb" method="call"/><line number="30" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/show_exceptions.rb" method="call"/><line number="38" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/rack/logger.rb" method="call_app"/><line number="21" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/rack/logger.rb" method="block in call"/><line number="67" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/tagged_logging.rb" method="block in tagged"/><line number="25" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/tagged_logging.rb" method="tagged"/><line number="67" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/tagged_logging.rb" method="tagged"/><line number="21" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/rack/logger.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/actionpack-4.0.0.beta1/lib/action_dispatch/middleware/request_id.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/methodoverride.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/rack-1.5.2/lib/rack/runtime.rb" method="call"/><line number="72" file="[GEM_ROOT]/gems/activesupport-4.0.0.beta1/lib/active_support/cache/strategy/local_cache.rb" method="call"/><line number="510" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/engine.rb" method="call"/><line number="96" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/application.rb" method="call"/><line number="30" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/railtie/configurable.rb" method="method_missing"/><line number="4" file="request.rb" method="<top (required)>"/><line number="51" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/commands/runner.rb" method="eval"/><line number="51" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/commands/runner.rb" method="<top (required)>"/><line number="86" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/commands.rb" method="require"/><line number="86" file="[GEM_ROOT]/gems/railties-4.0.0.beta1/lib/rails/commands.rb" method="<top (required)>"/><line number="4" file="bin/rails" method="require"/><line number="4" file="bin/rails" method="<main>"/></backtrace></error><request><url>http://example.com:123/test/index</url><component>test</component><action>index</action><params><var key="controller">test</var><var key="action">index</var></params><cgi-data><var key="rack.version">["1", "2"]</var><var key="rack.input">#<StringIO:0x000000037d48a0></var><var key="rack.errors">#<StringIO:0x000000037d4940></var><var key="rack.multithread">true</var><var key="rack.multiprocess">true</var><var key="rack.run_once">false</var><var key="REQUEST_METHOD">GET</var><var key="SERVER_NAME">example.com</var><var key="SERVER_PORT">123</var><var key="QUERY_STRING"></var><var key="PATH_INFO">/test/index</var><var key="rack.url_scheme">http</var><var key="HTTPS">off</var><var key="SCRIPT_NAME"></var><var key="CONTENT_LENGTH">0</var><var key="ORIGINAL_FULLPATH">/test/index</var><var key="action_dispatch.routes">#<ActionDispatch::Routing::RouteSet:0x0000000291e5e0></var><var key="action_dispatch.parameter_filter">["password"]</var><var key="action_dispatch.redirect_filter">[]</var><var key="action_dispatch.show_exceptions">true</var><var key="action_dispatch.show_detailed_exceptions">false</var><var key="action_dispatch.logger">#<ActiveSupport::Logger:0x00000002645210></var><var key="action_dispatch.backtrace_cleaner">#<Rails::BacktraceCleaner:0x00000003bcb030></var><var key="action_dispatch.key_generator">#<ActiveSupport::CachingKeyGenerator:0x00000003bca6d0></var><var key="action_dispatch.http_auth_salt">http authentication</var><var key="action_dispatch.signed_cookie_salt">signed cookie</var><var key="action_dispatch.encrypted_cookie_salt">encrypted cookie</var><var key="action_dispatch.encrypted_signed_cookie_salt">signed encrypted cookie</var><var key="ROUTES_21558000_SCRIPT_NAME"></var><var key="action_dispatch.request_id">5978a867-c5e6-45a9-b2a8-442314b1d5b5</var><var key="action_dispatch.remote_ip"></var><var key="rack.session"></var><var key="rack.session.options"><var key="path">/</var><var key="domain"></var><var key="expire_after"></var><var key="secure">false</var><var key="httponly">true</var><var key="defer">false</var><var key="renew">false</var><var key="id"></var></var><var key="action_dispatch.request.path_parameters"><var key="controller">test</var><var key="action">index</var></var><var key="action_controller.instance">#<TestController:0x00000002729f00></var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string"></var><var key="rack.request.query_hash"></var><var key="action_dispatch.request.query_parameters"></var><var key="action_dispatch.request.parameters"><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.formats">["text/html"]</var><var key="rack.request.cookie_hash"></var><var key="action_dispatch.cookies">#<ActionDispatch::Cookies::CookieJar:0x00000003b11cc0></var><var key="action_dispatch.request.unsigned_session_cookie"></var></cgi-data></request><server-environment><project-root>/home/hrvoje/code/airbrake/tmp/rails_root</project-root><environment-name>production</environment-name><hostname>hrvoje-Aspire-5741G</hostname></server-environment><current-user><id>1</id><name>Bender</name><email>bender@beer.com</email><username>b3nd0r</username></current-user><framework>Rails: 4.0.0.beta1</framework></notice>
|
data/test/catcher_test.rb
CHANGED
@@ -12,7 +12,7 @@ module ActionDispatch
|
|
12
12
|
|
13
13
|
# Silence logger
|
14
14
|
def logger
|
15
|
-
|
15
|
+
Logger.new("/dev/null")
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -144,148 +144,109 @@ class ActionControllerCatcherTest < ActionDispatch::IntegrationTest
|
|
144
144
|
end
|
145
145
|
|
146
146
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
147
|
+
def deliver_notices_from_exceptions_raised_in_public_requests
|
148
|
+
@app = AirbrakeTestController.action(:boom)
|
149
|
+
get '/'
|
150
|
+
assert_caught_and_sent
|
151
|
+
end
|
152
|
+
|
153
|
+
def not_deliver_notices_from_exceptions_in_development_environments
|
154
|
+
Airbrake.configuration.development_environments = ["test"]
|
155
|
+
Airbrake.configuration.environment_name = "test"
|
156
|
+
@app = AirbrakeTestController.action(:boom)
|
157
|
+
get '/'
|
158
|
+
assert_caught_and_not_sent
|
159
|
+
end
|
160
|
+
|
161
|
+
def not_deliver_notices_from_actions_that_dont_raise
|
162
|
+
@app = AirbrakeTestController.action(:hello)
|
163
|
+
get '/'
|
164
|
+
assert_caught_and_not_sent
|
165
|
+
assert_equal 'hello', response.body
|
166
|
+
end
|
167
|
+
|
168
|
+
def not_deliver_ignored_exceptions_raised_by_actions
|
169
|
+
@app = AirbrakeTestController.action(:boom)
|
170
|
+
ignore(RuntimeError)
|
171
|
+
get '/'
|
172
|
+
assert_caught_and_not_sent
|
173
|
+
end
|
152
174
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
assert_caught_and_not_sent
|
175
|
+
def deliver_ignored_exception_raised_manually
|
176
|
+
@app = AirbrakeTestController.action(:manual_airbrake)
|
177
|
+
ignore(RuntimeError)
|
178
|
+
get '/'
|
179
|
+
assert_caught_and_sent
|
159
180
|
end
|
160
181
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
should "not deliver ignored exceptions raised by actions" do
|
169
|
-
@app = AirbrakeTestController.action(:boom)
|
170
|
-
ignore(RuntimeError)
|
171
|
-
get '/'
|
172
|
-
assert_caught_and_not_sent
|
173
|
-
end
|
174
|
-
|
175
|
-
should "deliver ignored exception raised manually" do
|
176
|
-
@app = AirbrakeTestController.action(:manual_airbrake)
|
177
|
-
ignore(RuntimeError)
|
178
|
-
get '/'
|
179
|
-
assert_caught_and_sent
|
180
|
-
end
|
181
|
-
|
182
|
-
should "not deliver manually sent notices in local requests" do
|
183
|
-
AirbrakeTestController.local = true
|
184
|
-
@app = AirbrakeTestController.action(:manual_airbrake)
|
185
|
-
get '/'
|
186
|
-
assert_caught_and_not_sent
|
187
|
-
AirbrakeTestController.local = false
|
188
|
-
end
|
189
|
-
|
190
|
-
should "not create actions from Airbrake methods" do
|
191
|
-
Airbrake::Rails::ControllerMethods.instance_methods.each do |method|
|
192
|
-
assert !(AirbrakeTestController.new.action_methods.include?(method))
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
should "ignore exceptions when user agent is being ignored by regular expression" do
|
197
|
-
Airbrake.configuration.ignore_user_agent_only = [/Ignored/]
|
198
|
-
@app = AirbrakeTestController.action(:boom)
|
199
|
-
get "/", {}, {"HTTP_USER_AGENT" => "ShouldBeIgnored"}
|
200
|
-
assert_caught_and_not_sent
|
201
|
-
end
|
202
|
-
|
203
|
-
should "ignore exceptions when user agent is being ignored by string" do
|
204
|
-
Airbrake.configuration.ignore_user_agent_only = ['IgnoredUserAgent']
|
205
|
-
@app = AirbrakeTestController.action(:boom)
|
206
|
-
get "/", {}, {"HTTP_USER_AGENT" => "IgnoredUserAgent"}
|
207
|
-
assert_caught_and_not_sent
|
208
|
-
end
|
209
|
-
|
210
|
-
should "not ignore exceptions when user agent is not being ignored" do
|
211
|
-
Airbrake.configuration.ignore_user_agent_only = ['IgnoredUserAgent']
|
212
|
-
@app = AirbrakeTestController.action(:boom)
|
213
|
-
get "/", {}, {"HTTP_USER_AGENT" => "NonIgnoredAgent"}
|
214
|
-
assert_caught_and_sent
|
215
|
-
end
|
216
|
-
|
217
|
-
should "send session data for manual notifications" do
|
218
|
-
@app = AirbrakeTestController.action(:manual_airbrake)
|
219
|
-
data = { 'one' => 'two' }
|
220
|
-
get "/", :session => data
|
221
|
-
assert_sent_hash data, "/notice/request/session"
|
222
|
-
end
|
223
|
-
|
224
|
-
should "send request data for manual notification" do
|
225
|
-
params = { 'controller' => "airbrake_test", 'action' => "index" }
|
226
|
-
@app = AirbrakeTestController.action(:manual_airbrake)
|
227
|
-
get "/", params
|
228
|
-
assert_sent_request_info_for @request
|
229
|
-
end
|
230
|
-
|
231
|
-
should "send request data for manual notification with non-standard port" do
|
232
|
-
params = { 'controller' => "airbrake_test", 'action' => "index" }
|
233
|
-
@app = AirbrakeTestController.action(:manual_airbrake)
|
234
|
-
get "/", params, {"SERVER_PORT" => 81}
|
235
|
-
assert_sent_request_info_for @request
|
182
|
+
def not_deliver_manually_sent_notices_in_local_requests
|
183
|
+
AirbrakeTestController.local = true
|
184
|
+
@app = AirbrakeTestController.action(:manual_airbrake)
|
185
|
+
get '/'
|
186
|
+
assert_caught_and_not_sent
|
187
|
+
AirbrakeTestController.local = false
|
236
188
|
end
|
237
189
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
190
|
+
def not_create_actions_from_airbrake_methods
|
191
|
+
Airbrake::Rails::ControllerMethods.instance_methods.each do |method|
|
192
|
+
assert !(AirbrakeTestController.new.action_methods.include?(method))
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def ignore_exceptions_when_user_agent_is_being_ignored_by_regular_expression
|
197
|
+
Airbrake.configuration.ignore_user_agent_only = [/Ignored/]
|
198
|
+
@app = AirbrakeTestController.action(:boom)
|
199
|
+
get "/", {}, {"HTTP_USER_AGENT" => "ShouldBeIgnored"}
|
200
|
+
assert_caught_and_not_sent
|
201
|
+
end
|
202
|
+
|
203
|
+
def ignore_exceptions_when_user_agent_is_being_ignored_by_string
|
204
|
+
Airbrake.configuration.ignore_user_agent_only = ['IgnoredUserAgent']
|
205
|
+
@app = AirbrakeTestController.action(:boom)
|
206
|
+
get "/", {}, {"HTTP_USER_AGENT" => "IgnoredUserAgent"}
|
207
|
+
assert_caught_and_not_sent
|
208
|
+
end
|
209
|
+
|
210
|
+
def not_ignore_exceptions_when_user_agent_is_not_being_ignored
|
211
|
+
Airbrake.configuration.ignore_user_agent_only = ['IgnoredUserAgent']
|
212
|
+
@app = AirbrakeTestController.action(:boom)
|
213
|
+
get "/", {}, {"HTTP_USER_AGENT" => "NonIgnoredAgent"}
|
214
|
+
assert_caught_and_sent
|
215
|
+
end
|
216
|
+
|
217
|
+
def send_session_data_for_manual_notifications
|
218
|
+
@app = AirbrakeTestController.action(:manual_airbrake)
|
219
|
+
data = { 'one' => 'two' }
|
220
|
+
get "/", :session => data
|
221
|
+
assert_sent_hash data, "/notice/request/session"
|
222
|
+
end
|
223
|
+
|
224
|
+
def send_request_data_for_manual_notification
|
225
|
+
params = { 'controller' => "airbrake_test", 'action' => "index" }
|
226
|
+
@app = AirbrakeTestController.action(:manual_airbrake)
|
227
|
+
get "/", params
|
228
|
+
assert_sent_request_info_for @request
|
229
|
+
end
|
230
|
+
|
231
|
+
def send_request_data_for_manual_notification_with_non_standard_port
|
232
|
+
params = { 'controller' => "airbrake_test", 'action' => "index" }
|
233
|
+
@app = AirbrakeTestController.action(:manual_airbrake)
|
234
|
+
get "/", params, {"SERVER_PORT" => 81}
|
235
|
+
assert_sent_request_info_for @request
|
236
|
+
end
|
237
|
+
|
238
|
+
def send_request_data_for_automatic_notification
|
239
|
+
params = { 'controller' => "airbrake_test", 'action' => "index" }
|
240
|
+
@app = AirbrakeTestController.action(:boom)
|
241
|
+
get "/", params
|
242
|
+
assert_sent_request_info_for @request
|
243
|
+
end
|
244
|
+
|
245
|
+
def send_request_data_for_automatic_notification_with_non_standard_port
|
246
|
+
params = { 'controller' => "airbrake_test", 'action' => "index" }
|
247
|
+
@app = AirbrakeTestController.action(:boom)
|
248
|
+
get "/", params, {"SERVER_PORT" => 81}
|
249
|
+
assert_sent_request_info_for @request
|
250
|
+
assert_sent_element 81, "/notice/request/cgi-data/var[@key = 'SERVER_PORT']"
|
251
|
+
end
|
291
252
|
end
|
data/test/helper.rb
CHANGED
@@ -5,7 +5,6 @@ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
|
5
5
|
|
6
6
|
require 'thread'
|
7
7
|
|
8
|
-
require 'shoulda'
|
9
8
|
require 'mocha'
|
10
9
|
|
11
10
|
require 'abstract_controller'
|
@@ -24,6 +23,9 @@ require 'json-schema'
|
|
24
23
|
|
25
24
|
require "airbrake"
|
26
25
|
|
26
|
+
require "shoulda-matchers"
|
27
|
+
require "shoulda-context"
|
28
|
+
|
27
29
|
begin require 'redgreen'; rescue LoadError; end
|
28
30
|
|
29
31
|
# Show backtraces for deprecated behavior for quicker cleanup.
|
@@ -47,77 +49,76 @@ class RoutedRackApp
|
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
class ActionController::IntegrationTest < ActiveSupport::TestCase
|
57
|
-
def self.build_app(routes = nil)
|
58
|
-
RoutedRackApp.new(routes || ActionDispatch::Routing::RouteSet.new) do |middleware|
|
59
|
-
middleware.use "ActionDispatch::Callbacks"
|
60
|
-
middleware.use "ActionDispatch::ParamsParser"
|
61
|
-
middleware.use "ActionDispatch::Cookies"
|
62
|
-
middleware.use "ActionDispatch::Flash"
|
63
|
-
middleware.use "ActionDispatch::Head"
|
64
|
-
yield(middleware) if block_given?
|
52
|
+
unless defined?(ActionDispatch::IntegrationTest)
|
53
|
+
class ActionController::IntegrationTest < ActiveSupport::TestCase
|
54
|
+
def self.build_app(routes = nil)
|
55
|
+
RoutedRackApp.new(routes || ActionDispatch::Routing::RouteSet.new) do |middleware|
|
56
|
+
yield(middleware) if block_given?
|
57
|
+
end
|
65
58
|
end
|
66
|
-
end
|
67
59
|
|
68
|
-
|
60
|
+
self.app = build_app
|
69
61
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
62
|
+
# Stub Rails dispatcher so it does not get controller references and
|
63
|
+
# simply return the controller#action as Rack::Body.
|
64
|
+
class StubDispatcher < ::ActionDispatch::Routing::RouteSet::Dispatcher
|
65
|
+
protected
|
66
|
+
def controller_reference(controller_param)
|
67
|
+
controller_param
|
68
|
+
end
|
77
69
|
|
78
|
-
|
79
|
-
|
70
|
+
def dispatch(controller, action, env)
|
71
|
+
[200, {'Content-Type' => 'text/html'}, ["#{controller}##{action}"]]
|
72
|
+
end
|
80
73
|
end
|
81
|
-
end
|
82
74
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
75
|
+
def self.stub_controllers
|
76
|
+
old_dispatcher = ActionDispatch::Routing::RouteSet::Dispatcher
|
77
|
+
ActionDispatch::Routing::RouteSet.module_eval { remove_const :Dispatcher }
|
78
|
+
ActionDispatch::Routing::RouteSet.module_eval { const_set :Dispatcher, StubDispatcher }
|
79
|
+
yield ActionDispatch::Routing::RouteSet.new
|
80
|
+
ensure
|
81
|
+
ActionDispatch::Routing::RouteSet.module_eval { remove_const :Dispatcher }
|
82
|
+
ActionDispatch::Routing::RouteSet.module_eval { const_set :Dispatcher, old_dispatcher }
|
83
|
+
end
|
92
84
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
85
|
+
def with_routing(&block)
|
86
|
+
temporary_routes = ActionDispatch::Routing::RouteSet.new
|
87
|
+
old_app, self.class.app = self.class.app, self.class.build_app(temporary_routes)
|
88
|
+
old_routes = SharedTestRoutes
|
89
|
+
silence_warnings { Object.const_set(:SharedTestRoutes, temporary_routes) }
|
98
90
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
91
|
+
yield temporary_routes
|
92
|
+
ensure
|
93
|
+
self.class.app = old_app
|
94
|
+
silence_warnings { Object.const_set(:SharedTestRoutes, old_routes) }
|
95
|
+
end
|
104
96
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
yield
|
109
|
-
else
|
110
|
-
begin
|
111
|
-
ActiveSupport::Dependencies.autoload_paths << path
|
97
|
+
def with_autoload_path(path)
|
98
|
+
path = File.join(File.dirname(__FILE__), "fixtures", path)
|
99
|
+
if ActiveSupport::Dependencies.autoload_paths.include?(path)
|
112
100
|
yield
|
113
|
-
|
114
|
-
|
115
|
-
|
101
|
+
else
|
102
|
+
begin
|
103
|
+
ActiveSupport::Dependencies.autoload_paths << path
|
104
|
+
yield
|
105
|
+
ensure
|
106
|
+
ActiveSupport::Dependencies.autoload_paths.reject! {|p| p == path}
|
107
|
+
ActiveSupport::Dependencies.clear
|
108
|
+
end
|
116
109
|
end
|
117
110
|
end
|
118
111
|
end
|
119
112
|
end
|
120
113
|
|
114
|
+
class ActionDispatch::IntegrationTest < ActiveSupport::TestCase
|
115
|
+
setup do
|
116
|
+
@routes = SharedTestRoutes
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
|
121
122
|
module ActionController
|
122
123
|
class Base
|
123
124
|
include ActionController::Testing
|
data/test/notice_test.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require File.expand_path '../helper', __FILE__
|
2
2
|
|
3
|
+
XSD_SCHEMA_PATH = "http://airbrake.io/airbrake_#{Airbrake::API_VERSION.tr(".","_")}.xsd"
|
4
|
+
FakeWeb.allow_net_connect = %r{#{XSD_SCHEMA_PATH}}
|
5
|
+
|
3
6
|
class NoticeTest < Test::Unit::TestCase
|
4
7
|
|
5
8
|
include DefinesConstants
|
@@ -61,8 +64,8 @@ class NoticeTest < Test::Unit::TestCase
|
|
61
64
|
end
|
62
65
|
|
63
66
|
def assert_valid_notice_document(document)
|
64
|
-
xsd_path =
|
65
|
-
schema = Nokogiri::XML::Schema.new(
|
67
|
+
xsd_path = URI(XSD_SCHEMA_PATH)
|
68
|
+
schema = Nokogiri::XML::Schema.new(Net::HTTP.get(xsd_path))
|
66
69
|
errors = schema.validate(document)
|
67
70
|
assert errors.empty?, errors.collect{|e| e.message }.join
|
68
71
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airbrake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: builder
|
@@ -156,23 +156,23 @@ dependencies:
|
|
156
156
|
- !ruby/object:Gem::Version
|
157
157
|
version: 1.3.0
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
|
-
name:
|
159
|
+
name: capistrano
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
161
161
|
none: false
|
162
162
|
requirements:
|
163
|
-
- -
|
163
|
+
- - ! '>='
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version:
|
165
|
+
version: '0'
|
166
166
|
type: :development
|
167
167
|
prerelease: false
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
169
|
none: false
|
170
170
|
requirements:
|
171
|
-
- -
|
171
|
+
- - ! '>='
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version:
|
173
|
+
version: '0'
|
174
174
|
- !ruby/object:Gem::Dependency
|
175
|
-
name:
|
175
|
+
name: aruba
|
176
176
|
requirement: !ruby/object:Gem::Requirement
|
177
177
|
none: false
|
178
178
|
requirements:
|
@@ -188,7 +188,7 @@ dependencies:
|
|
188
188
|
- !ruby/object:Gem::Version
|
189
189
|
version: '0'
|
190
190
|
- !ruby/object:Gem::Dependency
|
191
|
-
name:
|
191
|
+
name: appraisal
|
192
192
|
requirement: !ruby/object:Gem::Requirement
|
193
193
|
none: false
|
194
194
|
requirements:
|
@@ -204,7 +204,7 @@ dependencies:
|
|
204
204
|
- !ruby/object:Gem::Version
|
205
205
|
version: '0'
|
206
206
|
- !ruby/object:Gem::Dependency
|
207
|
-
name:
|
207
|
+
name: rspec-rails
|
208
208
|
requirement: !ruby/object:Gem::Requirement
|
209
209
|
none: false
|
210
210
|
requirements:
|
@@ -220,7 +220,7 @@ dependencies:
|
|
220
220
|
- !ruby/object:Gem::Version
|
221
221
|
version: '0'
|
222
222
|
- !ruby/object:Gem::Dependency
|
223
|
-
name:
|
223
|
+
name: girl_friday
|
224
224
|
requirement: !ruby/object:Gem::Requirement
|
225
225
|
none: false
|
226
226
|
requirements:
|
@@ -236,7 +236,7 @@ dependencies:
|
|
236
236
|
- !ruby/object:Gem::Version
|
237
237
|
version: '0'
|
238
238
|
- !ruby/object:Gem::Dependency
|
239
|
-
name:
|
239
|
+
name: json-schema
|
240
240
|
requirement: !ruby/object:Gem::Requirement
|
241
241
|
none: false
|
242
242
|
requirements:
|
@@ -252,7 +252,23 @@ dependencies:
|
|
252
252
|
- !ruby/object:Gem::Version
|
253
253
|
version: '0'
|
254
254
|
- !ruby/object:Gem::Dependency
|
255
|
-
name:
|
255
|
+
name: shoulda-matchers
|
256
|
+
requirement: !ruby/object:Gem::Requirement
|
257
|
+
none: false
|
258
|
+
requirements:
|
259
|
+
- - ! '>='
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: '0'
|
262
|
+
type: :development
|
263
|
+
prerelease: false
|
264
|
+
version_requirements: !ruby/object:Gem::Requirement
|
265
|
+
none: false
|
266
|
+
requirements:
|
267
|
+
- - ! '>='
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '0'
|
270
|
+
- !ruby/object:Gem::Dependency
|
271
|
+
name: shoulda-context
|
256
272
|
requirement: !ruby/object:Gem::Requirement
|
257
273
|
none: false
|
258
274
|
requirements:
|
@@ -310,12 +326,11 @@ files:
|
|
310
326
|
- lib/airbrake/sinatra.rb
|
311
327
|
- lib/airbrake/response.rb
|
312
328
|
- lib/rails/generators/airbrake/airbrake_generator.rb
|
313
|
-
- lib/templates/javascript_notifier
|
329
|
+
- lib/templates/javascript_notifier
|
314
330
|
- lib/templates/rescue.erb
|
315
331
|
- lib/airbrake_tasks.rb
|
316
332
|
- rails/init.rb
|
317
333
|
- resources/ca-bundle.crt
|
318
|
-
- resources/airbrake_2_4.xsd
|
319
334
|
- resources/README.md
|
320
335
|
- resources/airbrake_3_0.json
|
321
336
|
- resources/notice.xml
|
data/resources/airbrake_2_4.xsd
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
<?xml version="1.0"?>
|
2
|
-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
3
|
-
|
4
|
-
<xs:element name="notice">
|
5
|
-
<xs:complexType>
|
6
|
-
<xs:all>
|
7
|
-
<xs:element name="api-key" type="xs:string"/>
|
8
|
-
<xs:element name="notifier" type="notifier"/>
|
9
|
-
<xs:element name="error" type="error"/>
|
10
|
-
<xs:element name="request" type="request" minOccurs="0"/>
|
11
|
-
<xs:element name="server-environment" type="serverEnvironment"/>
|
12
|
-
<xs:element name="current-user" type="current-user" minOccurs="0"/>
|
13
|
-
<xs:element name="framework" type="xs:string" minOccurs="0"/>
|
14
|
-
</xs:all>
|
15
|
-
<xs:attribute name="version" type="xs:string" use="required"/>
|
16
|
-
</xs:complexType>
|
17
|
-
</xs:element>
|
18
|
-
|
19
|
-
<xs:complexType name="notifier">
|
20
|
-
<xs:all>
|
21
|
-
<xs:element name="name" type="xs:string"/>
|
22
|
-
<xs:element name="version" type="xs:string"/>
|
23
|
-
<xs:element name="url" type="xs:string"/>
|
24
|
-
</xs:all>
|
25
|
-
</xs:complexType>
|
26
|
-
|
27
|
-
<xs:complexType name="error">
|
28
|
-
<xs:all>
|
29
|
-
<xs:element name="class" type="xs:string"/>
|
30
|
-
<xs:element name="message" type="xs:string" minOccurs="0"/>
|
31
|
-
<xs:element name="backtrace" type="backtrace"/>
|
32
|
-
</xs:all>
|
33
|
-
</xs:complexType>
|
34
|
-
|
35
|
-
<xs:complexType name="backtrace">
|
36
|
-
<xs:sequence>
|
37
|
-
<xs:element name="line" maxOccurs="unbounded" minOccurs="0">
|
38
|
-
<xs:complexType>
|
39
|
-
<xs:attribute name="file" type="xs:string" use="required"/>
|
40
|
-
<xs:attribute name="number" type="xs:string" use="required"/>
|
41
|
-
<xs:attribute name="method" type="xs:string" use="optional"/>
|
42
|
-
</xs:complexType>
|
43
|
-
</xs:element>
|
44
|
-
</xs:sequence>
|
45
|
-
</xs:complexType>
|
46
|
-
|
47
|
-
<xs:complexType name="request">
|
48
|
-
<xs:all>
|
49
|
-
<xs:element name="url" type="xs:string"/>
|
50
|
-
<xs:element name="component" type="xs:string"/>
|
51
|
-
<xs:element name="action" type="xs:string" minOccurs="0"/>
|
52
|
-
<xs:element name="params" type="varList" minOccurs="0"/>
|
53
|
-
<xs:element name="session" type="varList" minOccurs="0"/>
|
54
|
-
<xs:element name="cgi-data" type="varList" minOccurs="0"/>
|
55
|
-
</xs:all>
|
56
|
-
</xs:complexType>
|
57
|
-
|
58
|
-
<xs:complexType name="varList">
|
59
|
-
<xs:sequence>
|
60
|
-
<xs:element name="var" type="var" maxOccurs="unbounded"/>
|
61
|
-
</xs:sequence>
|
62
|
-
</xs:complexType>
|
63
|
-
|
64
|
-
<xs:complexType name="var" mixed="true">
|
65
|
-
<xs:sequence>
|
66
|
-
<xs:element name="var" type="var" minOccurs="0" maxOccurs="unbounded"/>
|
67
|
-
</xs:sequence>
|
68
|
-
<xs:attribute name="key" type="xs:string" use="required"/>
|
69
|
-
</xs:complexType>
|
70
|
-
|
71
|
-
<xs:complexType name="serverEnvironment">
|
72
|
-
<xs:sequence>
|
73
|
-
<xs:element name="project-root" type="xs:string" minOccurs="0"/>
|
74
|
-
<xs:element name="environment-name" type="xs:string"/>
|
75
|
-
<xs:element name="app-version" type="xs:string" minOccurs="0"/>
|
76
|
-
<xs:element name="hostname" type="xs:string" minOccurs="0"/>
|
77
|
-
</xs:sequence>
|
78
|
-
</xs:complexType>
|
79
|
-
|
80
|
-
<xs:complexType name="current-user">
|
81
|
-
<xs:all>
|
82
|
-
<xs:element name="id" type="xs:string"/>
|
83
|
-
<xs:element name="name" type="xs:string" minOccurs="0"/>
|
84
|
-
<xs:element name="email" type="xs:string" minOccurs="0"/>
|
85
|
-
<xs:element name="username" type="xs:string" minOccurs="0"/>
|
86
|
-
</xs:all>
|
87
|
-
</xs:complexType>
|
88
|
-
|
89
|
-
</xs:schema>
|