rollbar 2.8.3 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.codeclimate.yml +18 -0
- data/.github/pull_request_template.md +34 -0
- data/.github/workflows/ci.yml +67 -0
- data/.gitignore +3 -1
- data/.rubocop.yml +206 -7
- data/Appraisals +10 -10
- data/CHANGELOG.md +257 -3
- data/Gemfile +74 -13
- data/README.md +38 -833
- data/Rakefile +0 -0
- data/THANKS.md +1 -0
- data/data/rollbar.snippet.js +1 -1
- data/docs/configuration.md +64 -3
- data/docs/plugins.md +46 -0
- data/gemfiles/rails50.gemfile +56 -0
- data/gemfiles/rails51.gemfile +57 -0
- data/gemfiles/rails52.gemfile +56 -0
- data/gemfiles/rails60.gemfile +52 -0
- data/gemfiles/rails61.gemfile +52 -0
- data/gemfiles/rails70.gemfile +52 -0
- data/gemfiles/rails71.gemfile +52 -0
- data/lib/generators/rollbar/rollbar_generator.rb +24 -20
- data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +19 -5
- data/lib/rails/rollbar_runner.rb +26 -22
- data/lib/rollbar/capistrano.rb +78 -38
- data/lib/rollbar/capistrano3.rb +62 -1
- data/lib/rollbar/capistrano_tasks.rb +166 -0
- data/lib/rollbar/configuration.rb +291 -71
- data/lib/rollbar/delay/active_job.rb +17 -0
- data/lib/rollbar/delay/delayed_job.rb +23 -0
- data/lib/rollbar/delay/girl_friday.rb +4 -9
- data/lib/rollbar/delay/resque.rb +3 -6
- data/lib/rollbar/delay/shoryuken.rb +36 -0
- data/lib/rollbar/delay/sidekiq.rb +6 -8
- data/lib/rollbar/delay/sucker_punch.rb +17 -22
- data/lib/rollbar/delay/thread.rb +74 -3
- data/lib/rollbar/deploy.rb +91 -0
- data/lib/rollbar/encoding/encoder.rb +22 -11
- data/lib/rollbar/encoding.rb +2 -7
- data/lib/rollbar/exception_reporter.rb +36 -12
- data/lib/rollbar/item/backtrace.rb +118 -0
- data/lib/rollbar/item/frame.rb +121 -0
- data/lib/rollbar/item/locals.rb +103 -0
- data/lib/rollbar/item.rb +314 -0
- data/lib/rollbar/js.rb +0 -28
- data/lib/rollbar/json.rb +7 -55
- data/lib/rollbar/language_support.rb +7 -19
- data/lib/rollbar/lazy_store.rb +8 -12
- data/lib/rollbar/logger.rb +71 -0
- data/lib/rollbar/logger_proxy.rb +18 -1
- data/lib/rollbar/middleware/js/json_value.rb +36 -0
- data/lib/rollbar/middleware/js.rb +297 -0
- data/lib/rollbar/middleware/rack/builder.rb +4 -4
- data/lib/rollbar/middleware/rack/test_session.rb +4 -4
- data/lib/rollbar/middleware/rack.rb +52 -0
- data/lib/rollbar/middleware/rails/rollbar.rb +19 -7
- data/lib/rollbar/middleware/rails/show_exceptions.rb +21 -9
- data/lib/rollbar/middleware/sinatra.rb +2 -40
- data/lib/rollbar/notifier/trace_with_bindings.rb +75 -0
- data/lib/rollbar/notifier.rb +913 -0
- data/lib/rollbar/plugin.rb +126 -0
- data/lib/rollbar/plugins/active_job.rb +54 -0
- data/lib/rollbar/plugins/basic_socket.rb +31 -0
- data/lib/rollbar/plugins/delayed_job/job_data.rb +50 -0
- data/lib/rollbar/plugins/delayed_job/plugin.rb +88 -0
- data/lib/rollbar/plugins/delayed_job.rb +12 -0
- data/lib/rollbar/plugins/error_context.rb +11 -0
- data/lib/rollbar/plugins/goalie.rb +65 -0
- data/lib/rollbar/plugins/rack.rb +18 -0
- data/lib/rollbar/plugins/rails/controller_methods.rb +56 -0
- data/lib/rollbar/plugins/rails/error_subscriber.rb +12 -0
- data/lib/rollbar/plugins/rails/railtie30.rb +18 -0
- data/lib/rollbar/plugins/rails/railtie32.rb +18 -0
- data/lib/rollbar/plugins/rails/railtie_mixin.rb +37 -0
- data/lib/rollbar/plugins/rails.rb +89 -0
- data/lib/rollbar/plugins/rake.rb +73 -0
- data/lib/rollbar/plugins/resque/failure.rb +39 -0
- data/lib/rollbar/plugins/resque.rb +11 -0
- data/lib/rollbar/plugins/sidekiq/plugin.rb +77 -0
- data/lib/rollbar/plugins/sidekiq.rb +37 -0
- data/lib/rollbar/plugins/thread.rb +14 -0
- data/lib/rollbar/plugins/validations.rb +45 -0
- data/lib/rollbar/plugins.rb +47 -0
- data/lib/rollbar/rails.rb +0 -1
- data/lib/rollbar/rake_tasks.rb +4 -66
- data/lib/rollbar/request_data_extractor.rb +157 -117
- data/lib/rollbar/rollbar_test.rb +38 -0
- data/lib/rollbar/scrubbers/params.rb +133 -0
- data/lib/rollbar/scrubbers/url.rb +90 -35
- data/lib/rollbar/scrubbers.rb +13 -0
- data/lib/rollbar/truncation/frames_strategy.rb +2 -1
- data/lib/rollbar/truncation/min_body_strategy.rb +3 -4
- data/lib/rollbar/truncation/mixin.rb +1 -1
- data/lib/rollbar/truncation/remove_any_key_strategy.rb +126 -0
- data/lib/rollbar/truncation/remove_extra_strategy.rb +37 -0
- data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
- data/lib/rollbar/truncation/strings_strategy.rb +6 -5
- data/lib/rollbar/truncation.rb +10 -4
- data/lib/rollbar/util/hash.rb +37 -6
- data/lib/rollbar/util/ip_anonymizer.rb +33 -0
- data/lib/rollbar/util/ip_obfuscator.rb +1 -1
- data/lib/rollbar/util.rb +101 -55
- data/lib/rollbar/version.rb +1 -1
- data/lib/rollbar.rb +91 -879
- data/lib/tasks/benchmark.rake +104 -0
- data/lib/tasks/tasks.rake +3 -3
- data/rollbar.gemspec +21 -32
- data/spec/support/rollbar_api.rb +67 -0
- metadata +78 -439
- data/.travis.yml +0 -155
- data/gemfiles/rails30.gemfile +0 -20
- data/gemfiles/rails31.gemfile +0 -16
- data/gemfiles/rails32.gemfile +0 -17
- data/gemfiles/rails40.gemfile +0 -17
- data/gemfiles/rails41.gemfile +0 -15
- data/gemfiles/rails42.gemfile +0 -15
- data/lib/rollbar/active_job.rb +0 -11
- data/lib/rollbar/active_record_extension.rb +0 -14
- data/lib/rollbar/core_ext/basic_socket.rb +0 -7
- data/lib/rollbar/core_ext/thread.rb +0 -9
- data/lib/rollbar/delayed_job.rb +0 -78
- data/lib/rollbar/encoding/legacy_encoder.rb +0 -20
- data/lib/rollbar/goalie.rb +0 -33
- data/lib/rollbar/js/frameworks/rails.rb +0 -29
- data/lib/rollbar/js/frameworks.rb +0 -6
- data/lib/rollbar/js/middleware.rb +0 -129
- data/lib/rollbar/js/version.rb +0 -5
- data/lib/rollbar/json/default.rb +0 -11
- data/lib/rollbar/json/oj.rb +0 -15
- data/lib/rollbar/rack.rb +0 -9
- data/lib/rollbar/rails/controller_methods.rb +0 -40
- data/lib/rollbar/railtie.rb +0 -46
- data/lib/rollbar/rake.rb +0 -38
- data/lib/rollbar/sidekiq.rb +0 -40
- data/lib/rollbar/tasks/rollbar.cap +0 -45
- data/spec/cacert.pem +0 -3988
- data/spec/controllers/home_controller_spec.rb +0 -455
- data/spec/delay/sidekiq_spec.rb +0 -61
- data/spec/delay/sucker_punch_spec.rb +0 -25
- data/spec/delayed/backend/test.rb +0 -139
- data/spec/delayed/serialization/test.rb +0 -0
- data/spec/dummyapp/.gitignore +0 -73
- data/spec/dummyapp/Rakefile +0 -7
- data/spec/dummyapp/app/assets/javascripts/application.js +0 -3
- data/spec/dummyapp/app/assets/stylesheets/application.css.scss +0 -37
- data/spec/dummyapp/app/controllers/application_controller.rb +0 -3
- data/spec/dummyapp/app/controllers/home_controller.rb +0 -60
- data/spec/dummyapp/app/controllers/users_controller.rb +0 -17
- data/spec/dummyapp/app/helpers/.gitkeep +0 -0
- data/spec/dummyapp/app/mailers/.gitkeep +0 -0
- data/spec/dummyapp/app/models/.gitkeep +0 -0
- data/spec/dummyapp/app/models/user.rb +0 -7
- data/spec/dummyapp/app/views/devise/registrations/edit.html.erb +0 -27
- data/spec/dummyapp/app/views/devise/registrations/new.html.erb +0 -20
- data/spec/dummyapp/app/views/devise/shared/_links.html.erb +0 -25
- data/spec/dummyapp/app/views/home/cause_exception.html.erb +0 -1
- data/spec/dummyapp/app/views/home/index.html.erb +0 -4
- data/spec/dummyapp/app/views/home/report_exception.html.erb +0 -1
- data/spec/dummyapp/app/views/js/test.html.erb +0 -1
- data/spec/dummyapp/app/views/layouts/_messages.html.erb +0 -5
- data/spec/dummyapp/app/views/layouts/_navigation.html.erb +0 -21
- data/spec/dummyapp/app/views/layouts/application.html.erb +0 -25
- data/spec/dummyapp/app/views/layouts/simple.html.erb +0 -18
- data/spec/dummyapp/app/views/users/index.html.erb +0 -8
- data/spec/dummyapp/app/views/users/show.html.erb +0 -3
- data/spec/dummyapp/config/application.rb +0 -59
- data/spec/dummyapp/config/boot.rb +0 -10
- data/spec/dummyapp/config/database.yml +0 -25
- data/spec/dummyapp/config/environment.rb +0 -5
- data/spec/dummyapp/config/environments/development.rb +0 -37
- data/spec/dummyapp/config/environments/production.rb +0 -67
- data/spec/dummyapp/config/environments/test.rb +0 -37
- data/spec/dummyapp/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummyapp/config/initializers/inflections.rb +0 -15
- data/spec/dummyapp/config/initializers/mime_types.rb +0 -5
- data/spec/dummyapp/config/initializers/rollbar.rb +0 -23
- data/spec/dummyapp/config/initializers/secret_token.rb +0 -7
- data/spec/dummyapp/config/initializers/session_store.rb +0 -8
- data/spec/dummyapp/config/initializers/wrap_parameters.rb +0 -16
- data/spec/dummyapp/config/locales/devise.en.yml +0 -58
- data/spec/dummyapp/config/locales/en.yml +0 -5
- data/spec/dummyapp/config/routes.rb +0 -17
- data/spec/dummyapp/config.ru +0 -4
- data/spec/dummyapp/db/migrate/20121121184652_devise_create_users.rb +0 -46
- data/spec/dummyapp/db/migrate/20121121184654_add_name_to_users.rb +0 -5
- data/spec/dummyapp/db/schema.rb +0 -35
- data/spec/dummyapp/db/seeds.rb +0 -12
- data/spec/dummyapp/lib/assets/.gitkeep +0 -0
- data/spec/dummyapp/public/404.html +0 -26
- data/spec/dummyapp/public/422.html +0 -26
- data/spec/dummyapp/public/500.html +0 -25
- data/spec/dummyapp/public/favicon.ico +0 -0
- data/spec/dummyapp/script/rails +0 -6
- data/spec/fixtures/file1 +0 -1
- data/spec/fixtures/file2 +0 -1
- data/spec/fixtures/payloads/message.json +0 -25
- data/spec/fixtures/payloads/sample.trace.json +0 -275
- data/spec/fixtures/payloads/sample.trace_chain.json +0 -530
- data/spec/generators/rollbar/rollbar_generator_spec.rb +0 -24
- data/spec/requests/home_spec.rb +0 -49
- data/spec/rollbar/active_job_spec.rb +0 -33
- data/spec/rollbar/configuration_spec.rb +0 -24
- data/spec/rollbar/delay/girl_friday_spec.rb +0 -41
- data/spec/rollbar/delay/resque_spec.rb +0 -37
- data/spec/rollbar/delay/thread_spec.rb +0 -27
- data/spec/rollbar/delayed_job/job_data.rb +0 -35
- data/spec/rollbar/delayed_job_spec.rb +0 -90
- data/spec/rollbar/encoding/encoder_spec.rb +0 -63
- data/spec/rollbar/js/frameworks/rails_spec.rb +0 -19
- data/spec/rollbar/js/middleware_spec.rb +0 -162
- data/spec/rollbar/json/oj_spec.rb +0 -18
- data/spec/rollbar/json_spec.rb +0 -110
- data/spec/rollbar/lazy_store_spec.rb +0 -99
- data/spec/rollbar/logger_proxy_spec.rb +0 -34
- data/spec/rollbar/middleware/rack/builder_spec.rb +0 -151
- data/spec/rollbar/middleware/sinatra_spec.rb +0 -197
- data/spec/rollbar/rake_spec.rb +0 -34
- data/spec/rollbar/request_data_extractor_spec.rb +0 -82
- data/spec/rollbar/scrubbers/url_spec.rb +0 -111
- data/spec/rollbar/sidekiq_spec.rb +0 -90
- data/spec/rollbar/truncation/frames_strategy_spec.rb +0 -70
- data/spec/rollbar/truncation/min_body_strategy_spec.rb +0 -57
- data/spec/rollbar/truncation/strings_strategy_spec.rb +0 -89
- data/spec/rollbar/truncation_spec.rb +0 -27
- data/spec/rollbar/util/hash_spec.rb +0 -22
- data/spec/rollbar/util_spec.rb +0 -19
- data/spec/rollbar_bc_spec.rb +0 -380
- data/spec/rollbar_spec.rb +0 -2067
- data/spec/spec_helper.rb +0 -49
- data/spec/support/cause_exception.rb +0 -1
- data/spec/support/encoding_helpers.rb +0 -8
- data/spec/support/encodings/iso_8859_9 +0 -1
- data/spec/support/fixture_helpers.rb +0 -10
- data/spec/support/get_ip_raising.rb +0 -7
- data/spec/support/helpers.rb +0 -5
- data/spec/support/notifier_helpers.rb +0 -36
- data/spec/support/shared_contexts.rb +0 -12
@@ -1,455 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe HomeController do
|
5
|
-
let(:logger_mock) { double("Rails.logger").as_null_object }
|
6
|
-
let(:notifier) { Rollbar.notifier }
|
7
|
-
|
8
|
-
before do
|
9
|
-
reset_configuration
|
10
|
-
preconfigure_rails_notifier
|
11
|
-
|
12
|
-
Rollbar.configure do |config|
|
13
|
-
config.access_token = test_access_token
|
14
|
-
config.logger = logger_mock
|
15
|
-
config.request_timeout = 60
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "rollbar base_data" do
|
20
|
-
it 'should have the Rails environment' do
|
21
|
-
data = Rollbar.notifier.send(:build_payload, 'error', 'message', nil, nil)
|
22
|
-
data['data'][:environment].should == ::Rails.env
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should have an overridden environment' do
|
26
|
-
Rollbar.configure do |config|
|
27
|
-
config.environment = 'dev'
|
28
|
-
end
|
29
|
-
|
30
|
-
data = Rollbar.notifier.send(:build_payload, 'error', 'message', nil, nil)
|
31
|
-
data['data'][:environment].should == 'dev'
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should use the default "unspecified" environment if rails env ends up being empty' do
|
35
|
-
old_env, ::Rails.env = ::Rails.env, ''
|
36
|
-
preconfigure_rails_notifier
|
37
|
-
|
38
|
-
data = Rollbar.notifier.send(:build_payload, 'error', 'message', nil, nil)
|
39
|
-
data['data'][:environment].should == 'unspecified'
|
40
|
-
|
41
|
-
::Rails.env = old_env
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context "rollbar controller methods with %s requests" % (local? ? 'local' : 'non-local') do
|
46
|
-
# TODO run these for a a more-real request
|
47
|
-
it "should build valid request data" do
|
48
|
-
data = @controller.rollbar_request_data
|
49
|
-
data.should have_key(:params)
|
50
|
-
data.should have_key(:url)
|
51
|
-
data.should have_key(:user_ip)
|
52
|
-
data.should have_key(:headers)
|
53
|
-
data.should have_key(:session)
|
54
|
-
data.should have_key(:method)
|
55
|
-
data.should have_key(:route)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should build empty person data when no one is logged-in" do
|
59
|
-
data = @controller.rollbar_person_data
|
60
|
-
data.should == {}
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'rollbar_scrub_headers' do
|
64
|
-
it 'should filter authentication by default' do
|
65
|
-
headers = {
|
66
|
-
'HTTP_AUTHORIZATION' => 'some-user',
|
67
|
-
'HTTP_USER_AGENT' => 'spec'
|
68
|
-
}
|
69
|
-
|
70
|
-
filtered = controller.send( :rollbar_headers, headers )
|
71
|
-
|
72
|
-
expect(filtered['Authorization']).to match(/\**/)
|
73
|
-
expect(filtered['User-Agent']).to be_eql('spec')
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should filter custom headers' do
|
77
|
-
Rollbar.configure do |config|
|
78
|
-
config.scrub_headers = ['Auth', 'Token']
|
79
|
-
end
|
80
|
-
|
81
|
-
headers = {
|
82
|
-
'HTTP_AUTH' => 'auth-value',
|
83
|
-
'HTTP_TOKEN' => 'token-value',
|
84
|
-
'HTTP_CONTENT_TYPE' => 'text/html'
|
85
|
-
}
|
86
|
-
|
87
|
-
filtered = controller.send( :rollbar_headers, headers )
|
88
|
-
expect(filtered['Auth']).to match(/\**/)
|
89
|
-
expect(filtered['Token']).to match(/\**/)
|
90
|
-
expect(filtered['Content-Type']).to be_eql('text/html')
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
context "rollbar_request_url" do
|
96
|
-
it "should build simple http urls" do
|
97
|
-
req = controller.request
|
98
|
-
req.host = 'rollbar.com'
|
99
|
-
|
100
|
-
controller.send(:rollbar_request_data)[:url].should == 'http://rollbar.com'
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should respect forwarded host" do
|
104
|
-
req = controller.request
|
105
|
-
req.host = '127.0.0.1:8080'
|
106
|
-
req.env['HTTP_X_FORWARDED_HOST'] = 'test.com'
|
107
|
-
|
108
|
-
controller.send(:rollbar_request_data)[:url].should == 'http://test.com'
|
109
|
-
end
|
110
|
-
|
111
|
-
it "should respect forwarded proto" do
|
112
|
-
req = controller.request
|
113
|
-
req.host = 'rollbar.com'
|
114
|
-
req.env['HTTP_X_FORWARDED_PROTO'] = 'https'
|
115
|
-
|
116
|
-
controller.send(:rollbar_request_data)[:url].should == 'https://rollbar.com'
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should respect forwarded port" do
|
120
|
-
req = controller.request
|
121
|
-
req.host = '127.0.0.1:8080'
|
122
|
-
req.env['HTTP_X_FORWARDED_HOST'] = 'test.com'
|
123
|
-
req.env['HTTP_X_FORWARDED_PORT'] = '80'
|
124
|
-
|
125
|
-
controller.send(:rollbar_request_data)[:url].should == 'http://test.com'
|
126
|
-
|
127
|
-
req.env['HTTP_X_FORWARDED_PORT'] = '81'
|
128
|
-
controller.send(:rollbar_request_data)[:url].should == 'http://test.com:81'
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
context "rollbar_user_ip" do
|
133
|
-
it "should use X-Real-Ip when set" do
|
134
|
-
controller.request.env["HTTP_X_REAL_IP"] = '1.1.1.1'
|
135
|
-
controller.request.env["HTTP_X_FORWARDED_FOR"] = '1.2.3.4'
|
136
|
-
controller.send(:rollbar_request_data)[:user_ip].should == '1.1.1.1'
|
137
|
-
end
|
138
|
-
|
139
|
-
it "should use X-Forwarded-For when set" do
|
140
|
-
controller.request.env["HTTP_X_FORWARDED_FOR"] = '1.2.3.4'
|
141
|
-
controller.send(:rollbar_request_data)[:user_ip].should == '1.2.3.4'
|
142
|
-
end
|
143
|
-
|
144
|
-
it "should use the remote_addr when neither is set" do
|
145
|
-
controller.send(:rollbar_request_data)[:user_ip].should == '0.0.0.0'
|
146
|
-
end
|
147
|
-
|
148
|
-
context "rollbar_user_ip obfuscator" do
|
149
|
-
before do
|
150
|
-
Rollbar.configure do |config|
|
151
|
-
config.user_ip_obfuscator_secret = 'secret'
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
it "should obfuscate the ip when user_ip_obfuscator_secret is set" do
|
156
|
-
real_ip = '1.1.1.1'
|
157
|
-
obfuscated_ip = '95.191.35.149'
|
158
|
-
controller.request.env["HTTP_X_REAL_IP"] = real_ip
|
159
|
-
controller.send(:rollbar_request_data)[:user_ip].should == obfuscated_ip
|
160
|
-
end
|
161
|
-
|
162
|
-
it "should clear the ip field when an invalid ip is provided" do
|
163
|
-
invalid_ip = '1.1.1.999'
|
164
|
-
controller.request.env["HTTP_X_REAL_IP"] = invalid_ip
|
165
|
-
controller.send(:rollbar_request_data)[:user_ip].should == nil
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
context "rollbar_route_params", :type => 'request' do
|
171
|
-
it "should save route params in request[:route]" do
|
172
|
-
route = controller.send(:rollbar_request_data)[:route]
|
173
|
-
|
174
|
-
route.should have_key(:controller)
|
175
|
-
route.should have_key(:action)
|
176
|
-
route.should have_key(:format)
|
177
|
-
|
178
|
-
route[:controller].should == 'home'
|
179
|
-
route[:action].should == 'index'
|
180
|
-
end
|
181
|
-
|
182
|
-
it "should save controller and action in the payload body" do
|
183
|
-
post '/report_exception'
|
184
|
-
|
185
|
-
route = controller.send(:rollbar_request_data)[:route]
|
186
|
-
|
187
|
-
route[:controller].should == 'home'
|
188
|
-
route[:action].should == 'report_exception'
|
189
|
-
|
190
|
-
Rollbar.last_report.should_not be_nil
|
191
|
-
Rollbar.last_report[:context].should == 'home#report_exception'
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
context "param_scrubbing", :type => "request" do
|
197
|
-
it "should scrub the default scrub_fields" do
|
198
|
-
params = {
|
199
|
-
:passwd => "hidden",
|
200
|
-
:password => "hidden",
|
201
|
-
:secret => "hidden",
|
202
|
-
:notpass => "visible",
|
203
|
-
:secret_token => "f6805fea1cae0fb79c5e63bbdcd12bc6",
|
204
|
-
}
|
205
|
-
|
206
|
-
post '/report_exception', params
|
207
|
-
|
208
|
-
filtered = Rollbar.last_report[:request][:params]
|
209
|
-
|
210
|
-
expect(filtered["passwd"]).to match(/\**/)
|
211
|
-
expect(filtered["password"]).to match(/\**/)
|
212
|
-
expect(filtered["secret"]).to match(/\**/)
|
213
|
-
expect(filtered["notpass"]).to match(/\**/)
|
214
|
-
expect(filtered["secret_token"]).to match(/\**/)
|
215
|
-
end
|
216
|
-
|
217
|
-
it "should scrub custom scrub_fields" do
|
218
|
-
Rollbar.configure do |config|
|
219
|
-
config.scrub_fields = [:notpass, :secret]
|
220
|
-
end
|
221
|
-
|
222
|
-
params = {
|
223
|
-
:passwd => "visible",
|
224
|
-
:password => "visible",
|
225
|
-
:secret => "hidden",
|
226
|
-
:notpass => "hidden"
|
227
|
-
}
|
228
|
-
|
229
|
-
post '/report_exception', params
|
230
|
-
|
231
|
-
filtered = Rollbar.last_report[:request][:params]
|
232
|
-
|
233
|
-
filtered["passwd"].should == "visible"
|
234
|
-
# config.filter_parameters is set to [:password] in
|
235
|
-
# spec/dummyapp/config/application.rb
|
236
|
-
expect(filtered["password"]).to match(/\**/)
|
237
|
-
expect(filtered["secret"]).to match(/\**/)
|
238
|
-
expect(filtered["notpass"]).to match(/\**/)
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
describe "GET 'index'" do
|
243
|
-
it "should be successful and report two messages" do
|
244
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success').twice
|
245
|
-
get 'index'
|
246
|
-
response.should be_success
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
describe "'report_exception'", :type => "request" do
|
251
|
-
it "should raise a NameError and report an exception after a GET" do
|
252
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success').once
|
253
|
-
|
254
|
-
get '/report_exception'
|
255
|
-
response.should be_success
|
256
|
-
end
|
257
|
-
|
258
|
-
it "should raise a NameError and have PUT params in the reported exception" do
|
259
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success')
|
260
|
-
|
261
|
-
put '/report_exception', :putparam => "putval"
|
262
|
-
|
263
|
-
Rollbar.last_report.should_not be_nil
|
264
|
-
Rollbar.last_report[:request][:params]["putparam"].should == "putval"
|
265
|
-
end
|
266
|
-
|
267
|
-
context 'using deprecated report_exception' do
|
268
|
-
it 'reports the errors successfully' do
|
269
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success')
|
270
|
-
|
271
|
-
put '/deprecated_report_exception', :putparam => "putval"
|
272
|
-
|
273
|
-
Rollbar.last_report.should_not be_nil
|
274
|
-
Rollbar.last_report[:request][:params]["putparam"].should == "putval"
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
it "should raise a NameError and have JSON POST params" do
|
279
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success')
|
280
|
-
@request.env["HTTP_ACCEPT"] = "application/json"
|
281
|
-
|
282
|
-
params = { :jsonparam => 'jsonval' }.to_json
|
283
|
-
post '/report_exception', params, { 'CONTENT_TYPE' => 'application/json' }
|
284
|
-
|
285
|
-
Rollbar.last_report.should_not be_nil
|
286
|
-
Rollbar.last_report[:request][:params]['jsonparam'].should == 'jsonval'
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
describe "'cause_exception'", :type => "request" do
|
291
|
-
it "should raise an uncaught exception and report a message" do
|
292
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success').once
|
293
|
-
|
294
|
-
expect { get '/cause_exception' }.to raise_exception
|
295
|
-
end
|
296
|
-
|
297
|
-
context 'show_exceptions' do
|
298
|
-
before(:each) do
|
299
|
-
if Dummy::Application.respond_to? :env_config
|
300
|
-
config = Dummy::Application.env_config
|
301
|
-
else
|
302
|
-
config = Dummy::Application.env_defaults
|
303
|
-
end
|
304
|
-
|
305
|
-
config['action_dispatch.show_exceptions'] = true
|
306
|
-
end
|
307
|
-
|
308
|
-
after(:each) do
|
309
|
-
if Dummy::Application.respond_to? :env_config
|
310
|
-
config = Dummy::Application.env_config
|
311
|
-
else
|
312
|
-
config = Dummy::Application.env_defaults
|
313
|
-
end
|
314
|
-
|
315
|
-
config['action_dispatch.show_exceptions'] = false
|
316
|
-
end
|
317
|
-
|
318
|
-
it "middleware should catch the exception and only report to rollbar once" do
|
319
|
-
logger_mock.should_receive(:info).with('[Rollbar] Success').once
|
320
|
-
|
321
|
-
get '/cause_exception'
|
322
|
-
end
|
323
|
-
|
324
|
-
it 'should not fail if the controller doesnt contain the person method' do
|
325
|
-
Rollbar.configure do |config|
|
326
|
-
config.person_method = 'invalid_method'
|
327
|
-
end
|
328
|
-
|
329
|
-
get '/cause_exception'
|
330
|
-
end
|
331
|
-
|
332
|
-
context 'with logged user' do
|
333
|
-
let(:user) do
|
334
|
-
User.create(:email => 'foo@bar.com',
|
335
|
-
:username => 'the_username')
|
336
|
-
end
|
337
|
-
|
338
|
-
before { cookies[:session_id] = user.id }
|
339
|
-
|
340
|
-
it 'sends the current user data' do
|
341
|
-
put '/report_exception', 'foo' => 'bar'
|
342
|
-
|
343
|
-
person_data = Rollbar.last_report[:person]
|
344
|
-
|
345
|
-
expect(person_data[:id]).to be_eql(user.id)
|
346
|
-
expect(person_data[:email]).to be_eql(user.email)
|
347
|
-
expect(person_data[:username]).to be_eql(user.username)
|
348
|
-
end
|
349
|
-
end
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
context 'with routing errors', :type => :request do
|
354
|
-
it 'raises a RoutingError exception' do
|
355
|
-
expect { get '/foo/bar', :foo => :bar }.to raise_exception
|
356
|
-
|
357
|
-
report = Rollbar.last_report
|
358
|
-
expect(report[:request][:params]['foo']).to be_eql('bar')
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
|
-
context 'with ip parsing raising error' do
|
363
|
-
it 'raise a IpSpoofAttackError exception' do
|
364
|
-
controller.request.env['action_dispatch.remote_ip'] = GetIpRaising.new
|
365
|
-
|
366
|
-
expect do
|
367
|
-
expect(controller.send(:rollbar_request_data)[:user_ip]).to be_nil
|
368
|
-
end.not_to raise_exception(GetIpRaising::IpSpoofAttackError)
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
context 'with file uploads',:type => "request" do
|
373
|
-
let(:file1) { fixture_file_upload('spec/fixtures/file1') }
|
374
|
-
let(:file2) { fixture_file_upload('spec/fixtures/file2') }
|
375
|
-
|
376
|
-
context 'with a single upload' do
|
377
|
-
it "saves attachment data" do
|
378
|
-
expect { post '/file_upload', :upload => file1 }.to raise_exception
|
379
|
-
|
380
|
-
upload_param = Rollbar.last_report[:request][:params]['upload']
|
381
|
-
|
382
|
-
expect(upload_param).to have_key(:filename)
|
383
|
-
expect(upload_param).to have_key(:type)
|
384
|
-
expect(upload_param).to have_key(:name)
|
385
|
-
expect(upload_param).to have_key(:head)
|
386
|
-
|
387
|
-
expect(upload_param[:tempfile]).to be_eql("Skipped value of class 'Tempfile'")
|
388
|
-
end
|
389
|
-
end
|
390
|
-
|
391
|
-
context 'with multiple uploads', :type => :request do
|
392
|
-
it "saves attachment data for all uploads" do
|
393
|
-
expect { post '/file_upload', :upload => [file1, file2] }.to raise_exception
|
394
|
-
sent_params = Rollbar.last_report[:request][:params]['upload']
|
395
|
-
|
396
|
-
expect(sent_params).to be_kind_of(Array)
|
397
|
-
expect(sent_params).to have(2).items
|
398
|
-
end
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
context 'with session data', :type => :request do
|
403
|
-
before { get '/set_session_data' }
|
404
|
-
it 'reports the session data' do
|
405
|
-
expect { get '/use_session_data' }.to raise_exception
|
406
|
-
|
407
|
-
session_data = Rollbar.last_report[:request][:session]
|
408
|
-
|
409
|
-
expect(session_data['some_value']).to be_eql('this-is-a-cool-value')
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
413
|
-
context 'with json ACCEPT header', :type => 'request' do
|
414
|
-
let(:params) { { :foo => :bar } }
|
415
|
-
|
416
|
-
it 'parses the correct headers' do
|
417
|
-
expect do
|
418
|
-
post '/cause_exception', params, { 'ACCEPT' => 'application/vnd.github.v3+json' }
|
419
|
-
end.to raise_exception
|
420
|
-
|
421
|
-
expect(Rollbar.last_report[:request][:params]['foo']).to be_eql('bar')
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
context 'with params to be scrubed from URL', :type => :request do
|
426
|
-
next unless Rollbar::LanguageSupport.can_scrub_url?
|
427
|
-
|
428
|
-
before do
|
429
|
-
Rollbar.configure do |config|
|
430
|
-
config.scrub_fields = [:password]
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
|
-
let(:headers) do
|
435
|
-
{
|
436
|
-
'ORIGINAL_FULLPATH' => '/cause_exception?password=my-secret-password'
|
437
|
-
}
|
438
|
-
end
|
439
|
-
|
440
|
-
it 'scrubs sensible data from URL' do
|
441
|
-
expect { get '/cause_exception', { :password => 'my-secret-password' }, headers }.to raise_exception
|
442
|
-
|
443
|
-
request_data = Rollbar.last_report[:request]
|
444
|
-
|
445
|
-
expect(request_data[:url]).to match('http:\/\/www.example.com\/cause_exception\?password=\*{3,8}')
|
446
|
-
end
|
447
|
-
end
|
448
|
-
|
449
|
-
after(:each) do
|
450
|
-
Rollbar.configure do |config|
|
451
|
-
config.logger = ::Rails.logger
|
452
|
-
end
|
453
|
-
end
|
454
|
-
|
455
|
-
end
|
data/spec/delay/sidekiq_spec.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
begin
|
4
|
-
require 'rollbar/delay/sidekiq'
|
5
|
-
require 'sidekiq/testing'
|
6
|
-
rescue LoadError
|
7
|
-
module Rollbar
|
8
|
-
module Delay
|
9
|
-
class Sidekiq
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe Rollbar::Delay::Sidekiq, :if => RUBY_VERSION != '1.8.7' do
|
16
|
-
let(:payload) { anything }
|
17
|
-
|
18
|
-
describe "#perform" do
|
19
|
-
it "performs payload" do
|
20
|
-
Rollbar.should_receive(:process_from_async_handler).with(payload)
|
21
|
-
subject.perform payload
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "#call" do
|
26
|
-
shared_examples "a Rollbar processor" do
|
27
|
-
|
28
|
-
it "processes payload" do
|
29
|
-
Rollbar.should_receive(:process_from_async_handler).with(payload)
|
30
|
-
|
31
|
-
subject.call payload
|
32
|
-
described_class.drain
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context "with default options" do
|
37
|
-
it "enqueues to default queue" do
|
38
|
-
options = Rollbar::Delay::Sidekiq::OPTIONS.merge('args' => payload)
|
39
|
-
::Sidekiq::Client.should_receive(:push).with options
|
40
|
-
|
41
|
-
subject.call payload
|
42
|
-
end
|
43
|
-
|
44
|
-
it_behaves_like "a Rollbar processor"
|
45
|
-
end
|
46
|
-
|
47
|
-
context "with custom options" do
|
48
|
-
let(:custom_config) { { 'queue' => 'custom_queue' } }
|
49
|
-
subject { Rollbar::Delay::Sidekiq.new custom_config }
|
50
|
-
|
51
|
-
it "enqueues to custom queue" do
|
52
|
-
options = Rollbar::Delay::Sidekiq::OPTIONS.merge(custom_config.merge('args' => payload))
|
53
|
-
::Sidekiq::Client.should_receive(:push).with options
|
54
|
-
|
55
|
-
subject.call payload
|
56
|
-
end
|
57
|
-
|
58
|
-
it_behaves_like "a Rollbar processor"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
begin
|
4
|
-
require 'rollbar/delay/sucker_punch'
|
5
|
-
require 'sucker_punch/testing/inline'
|
6
|
-
rescue LoadError
|
7
|
-
module Rollbar
|
8
|
-
module Delay
|
9
|
-
class SuckerPunch
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe Rollbar::Delay::SuckerPunch, :if => RUBY_VERSION != '1.8.7' do
|
16
|
-
describe '.call' do
|
17
|
-
let(:payload) { 'anything' }
|
18
|
-
|
19
|
-
it 'performs the task asynchronously' do
|
20
|
-
Rollbar.should_receive(:process_from_async_handler)
|
21
|
-
|
22
|
-
Rollbar::Delay::SuckerPunch.call(payload)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,139 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'delayed/backend/base'
|
3
|
-
|
4
|
-
# This code is taken from delayed_job/spec/delayed/backend/test.rb.
|
5
|
-
#
|
6
|
-
# It just works as a in memory job backend. Job#save is modified to create
|
7
|
-
# a new Delayed::Worker and call #work_off(1) so the job is processed inline.
|
8
|
-
|
9
|
-
module Delayed
|
10
|
-
module Backend
|
11
|
-
module Test
|
12
|
-
def self.run
|
13
|
-
worker.work_off(1)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.worker
|
17
|
-
prepare_worker unless @worker
|
18
|
-
|
19
|
-
@worker
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.prepare_worker
|
23
|
-
@worker = ::Delayed::Worker.new
|
24
|
-
end
|
25
|
-
|
26
|
-
class Job
|
27
|
-
attr_accessor :id
|
28
|
-
attr_accessor :priority
|
29
|
-
attr_accessor :attempts
|
30
|
-
attr_accessor :handler
|
31
|
-
attr_accessor :last_error
|
32
|
-
attr_accessor :run_at
|
33
|
-
attr_accessor :locked_at
|
34
|
-
attr_accessor :locked_by
|
35
|
-
attr_accessor :failed_at
|
36
|
-
attr_accessor :queue
|
37
|
-
|
38
|
-
include Delayed::Backend::Base
|
39
|
-
|
40
|
-
cattr_accessor :id
|
41
|
-
self.id = 0
|
42
|
-
|
43
|
-
def initialize(hash = {})
|
44
|
-
self.attempts = 0
|
45
|
-
self.priority = 0
|
46
|
-
self.id = (self.class.id += 1)
|
47
|
-
hash.each { |k, v| send("#{k}=", v) }
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.all
|
51
|
-
@jobs ||= []
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.count
|
55
|
-
all.size
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.delete_all
|
59
|
-
all.clear
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.create(attrs = {})
|
63
|
-
new(attrs).tap do |o|
|
64
|
-
o.save
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.create!(*args)
|
69
|
-
create(*args)
|
70
|
-
end
|
71
|
-
|
72
|
-
def self.clear_locks!(worker_name)
|
73
|
-
all.select { |j| j.locked_by == worker_name }.each do |j|
|
74
|
-
j.locked_by = nil
|
75
|
-
j.locked_at = nil
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Find a few candidate jobs to run (in case some immediately get locked by others).
|
80
|
-
def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time) # rubocop:disable CyclomaticComplexity, PerceivedComplexity
|
81
|
-
jobs = all.select do |j|
|
82
|
-
j.run_at <= db_time_now &&
|
83
|
-
(j.locked_at.nil? || j.locked_at < db_time_now - max_run_time || j.locked_by == worker_name) &&
|
84
|
-
!j.failed?
|
85
|
-
end
|
86
|
-
jobs.select! { |j| j.priority <= Worker.max_priority } if Worker.max_priority
|
87
|
-
jobs.select! { |j| j.priority >= Worker.min_priority } if Worker.min_priority
|
88
|
-
jobs.select! { |j| Worker.queues.include?(j.queue) } if Worker.queues.any?
|
89
|
-
jobs.sort_by! { |j| [j.priority, j.run_at] }[0..limit - 1]
|
90
|
-
end
|
91
|
-
|
92
|
-
# Lock this job for this worker.
|
93
|
-
# Returns true if we have the lock, false otherwise.
|
94
|
-
def lock_exclusively!(_max_run_time, worker)
|
95
|
-
now = self.class.db_time_now
|
96
|
-
if locked_by != worker
|
97
|
-
# We don't own this job so we will update the locked_by name and the locked_at
|
98
|
-
self.locked_at = now
|
99
|
-
self.locked_by = worker
|
100
|
-
end
|
101
|
-
|
102
|
-
true
|
103
|
-
end
|
104
|
-
|
105
|
-
def self.db_time_now
|
106
|
-
Time.current
|
107
|
-
end
|
108
|
-
|
109
|
-
def update_attributes(attrs = {})
|
110
|
-
attrs.each { |k, v| send(:"#{k}=", v) }
|
111
|
-
save
|
112
|
-
end
|
113
|
-
|
114
|
-
def destroy
|
115
|
-
self.class.all.delete(self)
|
116
|
-
end
|
117
|
-
|
118
|
-
def save
|
119
|
-
self.run_at ||= Time.current
|
120
|
-
|
121
|
-
self.class.all << self unless self.class.all.include?(self)
|
122
|
-
|
123
|
-
::Delayed::Backend::Test.run
|
124
|
-
|
125
|
-
true
|
126
|
-
end
|
127
|
-
|
128
|
-
def save!
|
129
|
-
save
|
130
|
-
end
|
131
|
-
|
132
|
-
def reload
|
133
|
-
reset
|
134
|
-
self
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
File without changes
|