appsignal 4.0.5 → 4.0.7
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 +4 -4
- data/CHANGELOG.md +20 -0
- data/Rakefile +9 -9
- data/appsignal.gemspec +22 -1
- data/build_matrix.yml +2 -1
- data/ext/agent.rb +27 -27
- data/lib/appsignal/check_in/scheduler.rb +3 -4
- data/lib/appsignal/check_in.rb +1 -1
- data/lib/appsignal/config.rb +1 -3
- data/lib/appsignal/integrations/que.rb +8 -2
- data/lib/appsignal/integrations/resque.rb +1 -6
- data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
- data/lib/appsignal/version.rb +1 -1
- metadata +2 -191
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- data/.github/ISSUE_TEMPLATE/chore.md +0 -14
- data/.github/workflows/ci.yml +0 -3150
- data/.github/workflows/create_release_from_tag.yml +0 -62
- data/.gitignore +0 -35
- data/.gitmodules +0 -3
- data/.rspec +0 -4
- data/.yardopts +0 -8
- data/benchmark.rake +0 -139
- data/gemfiles/capistrano2.gemfile +0 -6
- data/gemfiles/capistrano3.gemfile +0 -7
- data/gemfiles/dry-monitor.gemfile +0 -5
- data/gemfiles/grape.gemfile +0 -5
- data/gemfiles/hanami-2.0.gemfile +0 -7
- data/gemfiles/hanami-2.1.gemfile +0 -7
- data/gemfiles/http5.gemfile +0 -5
- data/gemfiles/no_dependencies.gemfile +0 -10
- data/gemfiles/padrino.gemfile +0 -7
- data/gemfiles/psych-3.gemfile +0 -5
- data/gemfiles/psych-4.gemfile +0 -5
- data/gemfiles/que.gemfile +0 -5
- data/gemfiles/rails-6.0.gemfile +0 -10
- data/gemfiles/rails-6.1.gemfile +0 -11
- data/gemfiles/rails-7.0.gemfile +0 -11
- data/gemfiles/rails-7.1.gemfile +0 -11
- data/gemfiles/rails-7.2.gemfile +0 -11
- data/gemfiles/redis-4.gemfile +0 -5
- data/gemfiles/redis-5.gemfile +0 -6
- data/gemfiles/resque-2.gemfile +0 -6
- data/gemfiles/sequel.gemfile +0 -10
- data/gemfiles/sinatra.gemfile +0 -5
- data/gemfiles/webmachine1.gemfile +0 -7
- data/gemfiles/webmachine2.gemfile +0 -6
- data/mono.yml +0 -16
- data/spec/.rubocop.yml +0 -7
- data/spec/lib/appsignal/auth_check_spec.rb +0 -84
- data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
- data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
- data/spec/lib/appsignal/check_in/cron_spec.rb +0 -202
- data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -443
- data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
- data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
- data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
- data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
- data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
- data/spec/lib/appsignal/cli/install_spec.rb +0 -848
- data/spec/lib/appsignal/cli_spec.rb +0 -56
- data/spec/lib/appsignal/config_spec.rb +0 -1380
- data/spec/lib/appsignal/demo_spec.rb +0 -83
- data/spec/lib/appsignal/environment_spec.rb +0 -190
- data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
- data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
- data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
- data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
- data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
- data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
- data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
- data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
- data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
- data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
- data/spec/lib/appsignal/extension_spec.rb +0 -178
- data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
- data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
- data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
- data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
- data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
- data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
- data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
- data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
- data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
- data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
- data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
- data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
- data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
- data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
- data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
- data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
- data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
- data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
- data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
- data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
- data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
- data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
- data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
- data/spec/lib/appsignal/hooks_spec.rb +0 -124
- data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
- data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
- data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
- data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
- data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
- data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
- data/spec/lib/appsignal/integrations/que_spec.rb +0 -152
- data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
- data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
- data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
- data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
- data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
- data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
- data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
- data/spec/lib/appsignal/loaders_spec.rb +0 -144
- data/spec/lib/appsignal/logger_spec.rb +0 -205
- data/spec/lib/appsignal/marker_spec.rb +0 -51
- data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
- data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
- data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
- data/spec/lib/appsignal/probes_spec.rb +0 -411
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
- data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
- data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
- data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
- data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
- data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
- data/spec/lib/appsignal/rack_spec.rb +0 -243
- data/spec/lib/appsignal/sample_data_spec.rb +0 -238
- data/spec/lib/appsignal/span_spec.rb +0 -141
- data/spec/lib/appsignal/system_spec.rb +0 -126
- data/spec/lib/appsignal/transaction_spec.rb +0 -2111
- data/spec/lib/appsignal/transmitter_spec.rb +0 -198
- data/spec/lib/appsignal/utils/data_spec.rb +0 -166
- data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
- data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
- data/spec/lib/appsignal/utils/json_spec.rb +0 -44
- data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
- data/spec/lib/appsignal_spec.rb +0 -1919
- data/spec/lib/puma/appsignal_spec.rb +0 -334
- data/spec/spec_helper.rb +0 -173
- data/spec/support/fixtures/generated_config.yml +0 -24
- data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
- data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
- data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
- data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
- data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
- data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
- data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
- data/spec/support/fixtures/uploaded_file.txt +0 -0
- data/spec/support/hanami/hanami_app.rb +0 -29
- data/spec/support/helpers/action_mailer_helpers.rb +0 -25
- data/spec/support/helpers/activejob_helpers.rb +0 -27
- data/spec/support/helpers/api_request_helper.rb +0 -20
- data/spec/support/helpers/cli_helpers.rb +0 -40
- data/spec/support/helpers/config_helpers.rb +0 -66
- data/spec/support/helpers/dependency_helper.rb +0 -150
- data/spec/support/helpers/directory_helper.rb +0 -27
- data/spec/support/helpers/env_helpers.rb +0 -41
- data/spec/support/helpers/environment_metdata_helper.rb +0 -16
- data/spec/support/helpers/example_exception.rb +0 -13
- data/spec/support/helpers/example_standard_error.rb +0 -13
- data/spec/support/helpers/loader_helper.rb +0 -21
- data/spec/support/helpers/log_helpers.rb +0 -36
- data/spec/support/helpers/rails_helper.rb +0 -28
- data/spec/support/helpers/std_streams_helper.rb +0 -94
- data/spec/support/helpers/system_helpers.rb +0 -8
- data/spec/support/helpers/take_at_most_helper.rb +0 -21
- data/spec/support/helpers/time_helpers.rb +0 -11
- data/spec/support/helpers/transaction_helpers.rb +0 -122
- data/spec/support/helpers/wait_for_helper.rb +0 -39
- data/spec/support/matchers/contains_log.rb +0 -26
- data/spec/support/matchers/have_colorized_text.rb +0 -28
- data/spec/support/matchers/transaction.rb +0 -200
- data/spec/support/mocks/appsignal_mock.rb +0 -18
- data/spec/support/mocks/dummy_app.rb +0 -20
- data/spec/support/mocks/fake_gc_profiler.rb +0 -19
- data/spec/support/mocks/fake_gvl_tools.rb +0 -28
- data/spec/support/mocks/hash_like.rb +0 -10
- data/spec/support/mocks/mock_probe.rb +0 -13
- data/spec/support/mocks/puma_mock.rb +0 -43
- data/spec/support/shared_examples/instrument.rb +0 -48
- data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
- data/spec/support/stubs/delayed_job.rb +0 -0
- data/spec/support/stubs/sidekiq/api.rb +0 -4
- data/spec/support/testing.rb +0 -194
- data/support/bundler_wrapper +0 -12
- data/support/install_deps +0 -33
@@ -1,198 +0,0 @@
|
|
1
|
-
describe Appsignal::Transmitter do
|
2
|
-
let(:config) do
|
3
|
-
build_config(:options => { :hostname => "app1.local" }, :logger => Logger.new(log))
|
4
|
-
end
|
5
|
-
let(:base_uri) { "action" }
|
6
|
-
let(:log) { StringIO.new }
|
7
|
-
let(:instance) { Appsignal::Transmitter.new(base_uri, config) }
|
8
|
-
|
9
|
-
describe "#uri" do
|
10
|
-
let(:uri) { instance.uri }
|
11
|
-
|
12
|
-
it "returns a URI object with configuration data" do
|
13
|
-
expect(uri.to_s).to start_with(config[:endpoint])
|
14
|
-
expect(uri.path).to eq("/1/action")
|
15
|
-
expect(CGI.parse(uri.query)).to eq(
|
16
|
-
"api_key" => ["abc"],
|
17
|
-
"hostname" => ["app1.local"],
|
18
|
-
"name" => ["TestApp"],
|
19
|
-
"environment" => ["production"],
|
20
|
-
"gem_version" => [Appsignal::VERSION]
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
context "when base_uri argument is a full URI" do
|
25
|
-
let(:base_uri) { "http://foo.bar/path" }
|
26
|
-
|
27
|
-
it "uses the full URI" do
|
28
|
-
expect(uri.to_s).to start_with("#{base_uri}?")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context "when base_uri argument is only a path" do
|
33
|
-
it "uses the config[:endpoint] base" do
|
34
|
-
expect(uri.to_s).to start_with("#{config[:endpoint]}/1/#{base_uri}?")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe "#transmit" do
|
40
|
-
before do
|
41
|
-
stub_request(:post, "https://push.appsignal.com/1/action").with(
|
42
|
-
:query => {
|
43
|
-
:api_key => "abc",
|
44
|
-
:environment => "production",
|
45
|
-
:gem_version => Appsignal::VERSION,
|
46
|
-
:hostname => config[:hostname],
|
47
|
-
:name => "TestApp"
|
48
|
-
},
|
49
|
-
:body => "{\"the\":\"payload\"}",
|
50
|
-
:headers => {
|
51
|
-
"Content-Type" => "application/json; charset=UTF-8"
|
52
|
-
}
|
53
|
-
).to_return(:status => 200)
|
54
|
-
end
|
55
|
-
|
56
|
-
let(:response) { instance.transmit({ :the => :payload }) }
|
57
|
-
|
58
|
-
it "returns Net::HTTP response" do
|
59
|
-
expect(response).to be_kind_of(Net::HTTPResponse)
|
60
|
-
expect(response.code).to eq "200"
|
61
|
-
end
|
62
|
-
|
63
|
-
describe "with :ndjson format" do
|
64
|
-
before do
|
65
|
-
stub_request(:post, "https://push.appsignal.com/1/action").with(
|
66
|
-
:query => {
|
67
|
-
:api_key => "abc",
|
68
|
-
:environment => "production",
|
69
|
-
:gem_version => Appsignal::VERSION,
|
70
|
-
:hostname => config[:hostname],
|
71
|
-
:name => "TestApp"
|
72
|
-
},
|
73
|
-
:body => "{\"the\":\"payload\"}\n{\"part\":\"two\"}",
|
74
|
-
:headers => {
|
75
|
-
"Content-Type" => "application/x-ndjson; charset=UTF-8"
|
76
|
-
}
|
77
|
-
).to_return(:status => 200)
|
78
|
-
end
|
79
|
-
|
80
|
-
let(:response) do
|
81
|
-
instance.transmit([{ :the => :payload }, { :part => :two }], :format => :ndjson)
|
82
|
-
end
|
83
|
-
|
84
|
-
it "returns Net::HTTP response" do
|
85
|
-
expect(response).to be_kind_of(Net::HTTPResponse)
|
86
|
-
expect(response.code).to eq "200"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context "with ca_file_path config option set" do
|
91
|
-
context "when file does not exist" do
|
92
|
-
before do
|
93
|
-
config.config_hash[:ca_file_path] = File.join(resources_dir, "cacert.pem")
|
94
|
-
end
|
95
|
-
|
96
|
-
it "ignores the config and logs a warning" do
|
97
|
-
expect(response).to be_kind_of(Net::HTTPResponse)
|
98
|
-
expect(response.code).to eq "200"
|
99
|
-
expect(log.string).to_not include "Ignoring non-existing or unreadable " \
|
100
|
-
"`ca_file_path`: #{config[:ca_file_path]}"
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
context "when not existing file" do
|
105
|
-
before do
|
106
|
-
config.config_hash[:ca_file_path] = File.join(tmp_dir, "ca_file_that_does_not_exist")
|
107
|
-
end
|
108
|
-
|
109
|
-
it "ignores the config and logs a warning" do
|
110
|
-
expect(response).to be_kind_of(Net::HTTPResponse)
|
111
|
-
expect(response.code).to eq "200"
|
112
|
-
expect(log.string).to include "Ignoring non-existing or unreadable " \
|
113
|
-
"`ca_file_path`: #{config[:ca_file_path]}"
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
context "when not readable file" do
|
118
|
-
let(:file) { File.join(tmp_dir, "ca_file") }
|
119
|
-
before do
|
120
|
-
config.config_hash[:ca_file_path] = file
|
121
|
-
File.open(file, "w") { |f| f.chmod 0o000 }
|
122
|
-
end
|
123
|
-
|
124
|
-
it "ignores the config and logs a warning" do
|
125
|
-
expect(response).to be_kind_of(Net::HTTPResponse)
|
126
|
-
expect(response.code).to eq "200"
|
127
|
-
expect(log.string).to include "Ignoring non-existing or unreadable " \
|
128
|
-
"`ca_file_path`: #{config[:ca_file_path]}"
|
129
|
-
end
|
130
|
-
|
131
|
-
after { File.delete file }
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "#http_post" do
|
137
|
-
subject { instance.send(:http_post, { "the" => "payload" }, :format => :json) }
|
138
|
-
|
139
|
-
it "sets the path" do
|
140
|
-
expect(subject.path).to eq instance.uri.request_uri
|
141
|
-
end
|
142
|
-
|
143
|
-
it "sets the correct headers" do
|
144
|
-
expect(subject["Content-Type"]).to eq "application/json; charset=UTF-8"
|
145
|
-
end
|
146
|
-
|
147
|
-
it "serialises the payload to JSON" do
|
148
|
-
expect(subject.body).to eq "{\"the\":\"payload\"}"
|
149
|
-
end
|
150
|
-
|
151
|
-
describe "with :ndjson format" do
|
152
|
-
subject do
|
153
|
-
instance.send(:http_post, [{ "the" => "payload" }, { "part" => "two" }], :format => :ndjson)
|
154
|
-
end
|
155
|
-
|
156
|
-
it "sets the correct headers" do
|
157
|
-
expect(subject["Content-Type"]).to eq "application/x-ndjson; charset=UTF-8"
|
158
|
-
end
|
159
|
-
|
160
|
-
it "serialises the payload to NDJSON" do
|
161
|
-
expect(subject.body).to eq "{\"the\":\"payload\"}\n{\"part\":\"two\"}"
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
describe "#http_client" do
|
167
|
-
subject { instance.send(:http_client) }
|
168
|
-
|
169
|
-
context "with a http uri" do
|
170
|
-
let(:config) { build_config(:env => :test) }
|
171
|
-
|
172
|
-
it { expect(subject).to be_instance_of(Net::HTTP) }
|
173
|
-
it { expect(subject.proxy?).to be_falsy }
|
174
|
-
it { expect(subject.use_ssl?).to be_falsy }
|
175
|
-
end
|
176
|
-
|
177
|
-
context "with a https uri" do
|
178
|
-
let(:config) { build_config(:env => :production) }
|
179
|
-
|
180
|
-
it { expect(subject).to be_instance_of(Net::HTTP) }
|
181
|
-
it { expect(subject.proxy?).to be_falsy }
|
182
|
-
it { expect(subject.use_ssl?).to be_truthy }
|
183
|
-
it { expect(subject.verify_mode).to eq OpenSSL::SSL::VERIFY_PEER }
|
184
|
-
it { expect(subject.ca_file).to eq config[:ca_file_path] }
|
185
|
-
end
|
186
|
-
|
187
|
-
context "with a proxy" do
|
188
|
-
let(:config) { build_config(:options => { :http_proxy => "http://localhost:8080" }) }
|
189
|
-
|
190
|
-
it "is of Net::HTTP class" do
|
191
|
-
expect(subject).to be_instance_of(Net::HTTP)
|
192
|
-
end
|
193
|
-
it { expect(subject.proxy?).to be_truthy }
|
194
|
-
it { expect(subject.proxy_address).to eq "localhost" }
|
195
|
-
it { expect(subject.proxy_port).to eq 8080 }
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
@@ -1,166 +0,0 @@
|
|
1
|
-
describe Appsignal::Utils::Data do
|
2
|
-
describe ".generate" do
|
3
|
-
subject { Appsignal::Utils::Data.generate(body) }
|
4
|
-
|
5
|
-
context "when extension is not loaded", :extension_installation_failure do
|
6
|
-
around do |example|
|
7
|
-
Appsignal::Testing.without_testing { example.run }
|
8
|
-
end
|
9
|
-
|
10
|
-
context "with valid hash body" do
|
11
|
-
let(:body) { hash_body }
|
12
|
-
|
13
|
-
it "does not error and returns MockData class" do
|
14
|
-
expect(subject).to be_kind_of(Appsignal::Extension::MockData)
|
15
|
-
expect(subject.to_s).to eql("{}")
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "with valid array body" do
|
20
|
-
let(:body) { array_body }
|
21
|
-
|
22
|
-
it "does not error and returns MockData class" do
|
23
|
-
expect(subject).to be_kind_of(Appsignal::Extension::MockData)
|
24
|
-
expect(subject.to_s).to eql("{}")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "with an invalid body" do
|
29
|
-
let(:body) { "body" }
|
30
|
-
|
31
|
-
it "raise a type error" do
|
32
|
-
expect do
|
33
|
-
subject
|
34
|
-
end.to raise_error TypeError
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context "when extension is loaded" do
|
40
|
-
context "with a valid hash body" do
|
41
|
-
let(:body) { hash_body }
|
42
|
-
|
43
|
-
it "returns a valid Data object" do
|
44
|
-
is_expected.to eq Appsignal::Utils::Data.generate(body)
|
45
|
-
is_expected.to_not eq Appsignal::Utils::Data.generate({})
|
46
|
-
end
|
47
|
-
|
48
|
-
describe "#to_s" do
|
49
|
-
it "returns a serialized hash" do
|
50
|
-
# rubocop:disable Style/StringConcatenation
|
51
|
-
expect(subject.to_s).to eq %({"":"test",) +
|
52
|
-
%("1":true,) +
|
53
|
-
%("bar":null,) +
|
54
|
-
%("baz":{"arr":[1,2],"foo":"bʊr"},) +
|
55
|
-
%("float":1.0,) +
|
56
|
-
%("foo":[1,2,"three",{"foo":"bar"}],) +
|
57
|
-
%("int":1,) +
|
58
|
-
%("int61":#{1 << 61},) +
|
59
|
-
%("int62":#{1 << 62},) +
|
60
|
-
%("int63":"bigint:#{1 << 63}",) +
|
61
|
-
%("int64":"bigint:#{1 << 64}",) +
|
62
|
-
%("the":"payload"})
|
63
|
-
# rubocop:enable Style/StringConcatenation
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context "with a valid array body" do
|
69
|
-
let(:body) { array_body }
|
70
|
-
|
71
|
-
it "returns a valid Data object" do
|
72
|
-
is_expected.to eq Appsignal::Utils::Data.generate(body)
|
73
|
-
is_expected.to_not eq Appsignal::Utils::Data.generate({})
|
74
|
-
end
|
75
|
-
|
76
|
-
describe "#to_s" do
|
77
|
-
it "returns a serialized array" do
|
78
|
-
# rubocop:disable Style/StringConcatenation, Style/RedundantStringEscape
|
79
|
-
expect(subject.to_s).to eq %([null,) +
|
80
|
-
%(true,) +
|
81
|
-
%(false,) +
|
82
|
-
%(\"string\",) +
|
83
|
-
%(1,) +
|
84
|
-
%(1.0,) +
|
85
|
-
%(#{1 << 61},) +
|
86
|
-
%(#{1 << 62},) +
|
87
|
-
%("bigint:#{1 << 63}",) +
|
88
|
-
%("bigint:#{1 << 64}",) +
|
89
|
-
%({\"arr\":[1,2,\"three\"],\"foo\":\"bʊr\"}])
|
90
|
-
# rubocop:enable Style/StringConcatenation, Style/RedundantStringEscape
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context "with a body that contains strings with invalid utf-8 content" do
|
96
|
-
let(:string_with_invalid_utf8) { [0x61, 0x61, 0x85].pack("c*") }
|
97
|
-
let(:body) do
|
98
|
-
{
|
99
|
-
"field_one" => [0x61, 0x61].pack("c*"),
|
100
|
-
:field_two => string_with_invalid_utf8,
|
101
|
-
"field_three" => [
|
102
|
-
"one", string_with_invalid_utf8
|
103
|
-
],
|
104
|
-
"field_four" => {
|
105
|
-
"one" => string_with_invalid_utf8
|
106
|
-
}
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "#to_s" do
|
111
|
-
it "returns a JSON representation in a String" do
|
112
|
-
# rubocop:disable Style/StringConcatenation
|
113
|
-
expect(subject.to_s).to eq %({"field_four":{"one":"aa�"},) +
|
114
|
-
%("field_one":"aa",) +
|
115
|
-
%("field_three":["one","aa�"],) +
|
116
|
-
%("field_two":"aa�"})
|
117
|
-
# rubocop:enable Style/StringConcatenation
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
context "with an invalid body" do
|
123
|
-
let(:body) { "body" }
|
124
|
-
|
125
|
-
it "raises a type error" do
|
126
|
-
expect do
|
127
|
-
subject
|
128
|
-
end.to raise_error TypeError
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def hash_body
|
135
|
-
{
|
136
|
-
"the" => "payload",
|
137
|
-
"int" => 1, # Fixnum
|
138
|
-
"int61" => 1 << 61, # Fixnum
|
139
|
-
"int62" => 1 << 62, # Bignum, this one still works
|
140
|
-
"int63" => 1 << 63, # Bignum, turnover point for C, too big for long
|
141
|
-
"int64" => 1 << 64, # Bignum
|
142
|
-
"float" => 1.0,
|
143
|
-
1 => true,
|
144
|
-
nil => "test",
|
145
|
-
:foo => [1, 2, "three", { "foo" => "bar" }],
|
146
|
-
"bar" => nil,
|
147
|
-
"baz" => { "foo" => "bʊr", "arr" => [1, 2] }
|
148
|
-
}
|
149
|
-
end
|
150
|
-
|
151
|
-
def array_body
|
152
|
-
[
|
153
|
-
nil,
|
154
|
-
true,
|
155
|
-
false,
|
156
|
-
"string",
|
157
|
-
1, # Fixnum
|
158
|
-
1.0, # Float
|
159
|
-
1 << 61, # Fixnum
|
160
|
-
1 << 62, # Bignum, this one still works
|
161
|
-
1 << 63, # Bignum, turnover point for C, too big for long
|
162
|
-
1 << 64, # Bignum
|
163
|
-
{ "arr" => [1, 2, "three"], "foo" => "bʊr" }
|
164
|
-
]
|
165
|
-
end
|
166
|
-
end
|
@@ -1,182 +0,0 @@
|
|
1
|
-
describe Appsignal::Utils::HashSanitizer do
|
2
|
-
let(:file) { uploaded_file }
|
3
|
-
let(:some_array) { [1, 2, 3] }
|
4
|
-
let(:some_hash) { { :a => 1, :b => 2 } }
|
5
|
-
let(:params) do
|
6
|
-
{
|
7
|
-
:text => "string",
|
8
|
-
"string" => "string key value",
|
9
|
-
:file => file,
|
10
|
-
:float => 0.0,
|
11
|
-
:bool_true => true,
|
12
|
-
:bool_false => false,
|
13
|
-
# Non-recursive appearances of the same array instance
|
14
|
-
:some_arrays => [some_array, some_array],
|
15
|
-
# Non-recursive appearances of the same hash instance
|
16
|
-
:some_hashes => { :a => some_hash, :b => some_hash },
|
17
|
-
:nil => nil,
|
18
|
-
:int => 1, # Fixnum
|
19
|
-
:int64 => 1 << 64, # Bignum
|
20
|
-
:hash => {
|
21
|
-
:nested_text => "string",
|
22
|
-
:nested_array => [
|
23
|
-
"something",
|
24
|
-
"else",
|
25
|
-
file,
|
26
|
-
{
|
27
|
-
:key => "value",
|
28
|
-
:file => file
|
29
|
-
}.tap do |hsh|
|
30
|
-
# Recursive hash-in-hash (should be [:nested_array][3][:recursive_hash])
|
31
|
-
hsh[:recursive_hash] = hsh
|
32
|
-
end
|
33
|
-
].tap do |ary|
|
34
|
-
# Recursive array-in-array (should be [:nested_array][4])
|
35
|
-
ary << ary
|
36
|
-
# Recursive array-in-hash (should be [:nested_array][3][:recursive_array])
|
37
|
-
ary[3][:recursive_array] = ary
|
38
|
-
end
|
39
|
-
}.tap do |hsh|
|
40
|
-
# Recursive hash-in-array (should be [:nested_array][5])
|
41
|
-
hsh[:nested_array] << hsh
|
42
|
-
end
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
describe ".sanitize" do
|
47
|
-
let(:sanitized_params) { described_class.sanitize(params) }
|
48
|
-
subject { sanitized_params }
|
49
|
-
|
50
|
-
it "returns a sanitized Hash" do
|
51
|
-
expect(subject).to_not eq(params)
|
52
|
-
is_expected.to be_instance_of Hash
|
53
|
-
expect(subject[:text]).to eq("string")
|
54
|
-
expect(subject["string"]).to eq("string key value")
|
55
|
-
expect(subject[:file]).to be_instance_of String
|
56
|
-
expect(subject[:file]).to include "::UploadedFile"
|
57
|
-
expect(subject[:float]).to eq(0.0)
|
58
|
-
expect(subject[:bool_true]).to be(true)
|
59
|
-
expect(subject[:bool_false]).to be(false)
|
60
|
-
expect(subject[:nil]).to be_nil
|
61
|
-
expect(subject[:int]).to eq(1)
|
62
|
-
expect(subject[:int64]).to eq(1 << 64)
|
63
|
-
expect(subject[:some_arrays]).to eq([[1, 2, 3], [1, 2, 3]])
|
64
|
-
expect(subject[:some_hashes]).to eq({ :a => { :a => 1, :b => 2 },
|
65
|
-
:b => { :a => 1, :b => 2 } })
|
66
|
-
end
|
67
|
-
|
68
|
-
it "does not change the original params" do
|
69
|
-
subject
|
70
|
-
expect(params[:file]).to eq(file)
|
71
|
-
expect(params[:hash][:nested_array][2]).to eq(file)
|
72
|
-
end
|
73
|
-
|
74
|
-
describe ":hash key" do
|
75
|
-
subject { sanitized_params[:hash] }
|
76
|
-
|
77
|
-
it "returns a sanitized Hash" do
|
78
|
-
expect(subject).to_not eq(params[:hash])
|
79
|
-
is_expected.to be_instance_of Hash
|
80
|
-
expect(subject[:nested_text]).to eq("string")
|
81
|
-
end
|
82
|
-
|
83
|
-
describe ":nested_array key" do
|
84
|
-
subject { sanitized_params[:hash][:nested_array] }
|
85
|
-
|
86
|
-
it "returns a sanitized Array" do
|
87
|
-
expect(subject).to_not eq(params[:hash][:nested_array])
|
88
|
-
is_expected.to be_instance_of Array
|
89
|
-
expect(subject[0]).to eq("something")
|
90
|
-
expect(subject[1]).to eq("else")
|
91
|
-
expect(subject[2]).to be_instance_of String
|
92
|
-
expect(subject[2]).to include "::UploadedFile"
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "nested hash" do
|
96
|
-
subject { sanitized_params[:hash][:nested_array][3] }
|
97
|
-
|
98
|
-
it "returns a sanitized Hash" do
|
99
|
-
expect(subject).to_not eq(params[:hash][:nested_array][3])
|
100
|
-
is_expected.to be_instance_of Hash
|
101
|
-
expect(subject[:key]).to eq("value")
|
102
|
-
expect(subject[:file]).to be_instance_of String
|
103
|
-
expect(subject[:file]).to include "::UploadedFile"
|
104
|
-
end
|
105
|
-
|
106
|
-
it "replaces a recursive array" do
|
107
|
-
expect(subject[:recursive_array]).to eq("[RECURSIVE VALUE]")
|
108
|
-
end
|
109
|
-
|
110
|
-
it "replaces a recursive hash" do
|
111
|
-
expect(subject[:recursive_hash]).to eq("[RECURSIVE VALUE]")
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
describe "nested array" do
|
116
|
-
it "replaces a recursive array" do
|
117
|
-
expect(sanitized_params[:hash][:nested_array][4]).to eq("[RECURSIVE VALUE]")
|
118
|
-
end
|
119
|
-
|
120
|
-
it "replaces a recursive hash" do
|
121
|
-
expect(sanitized_params[:hash][:nested_array][5]).to eq("[RECURSIVE VALUE]")
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
context "with filter_keys" do
|
128
|
-
let(:sanitized_params) do
|
129
|
-
described_class.sanitize(params, %w[text hash])
|
130
|
-
end
|
131
|
-
subject { sanitized_params }
|
132
|
-
|
133
|
-
it "returns a sanitized Hash with the given keys filtered out" do
|
134
|
-
expect(subject).to_not eq(params)
|
135
|
-
expect(subject[:text]).to eq(described_class::FILTERED)
|
136
|
-
expect(subject[:hash]).to eq(described_class::FILTERED)
|
137
|
-
|
138
|
-
expect(subject[:file]).to be_instance_of String
|
139
|
-
expect(subject[:file]).to include "::UploadedFile"
|
140
|
-
expect(subject[:float]).to eq(0.0)
|
141
|
-
expect(subject[:bool_true]).to be(true)
|
142
|
-
expect(subject[:bool_false]).to be(false)
|
143
|
-
expect(subject[:nil]).to be_nil
|
144
|
-
expect(subject[:int]).to eq(1)
|
145
|
-
end
|
146
|
-
|
147
|
-
context "with strings as key filter values" do
|
148
|
-
let(:sanitized_params) do
|
149
|
-
described_class.sanitize(params, %w[string])
|
150
|
-
end
|
151
|
-
|
152
|
-
it "sanitizes values" do
|
153
|
-
expect(subject["string"]).to eq("[FILTERED]")
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
describe ":hash key" do
|
158
|
-
let(:sanitized_params) do
|
159
|
-
described_class.sanitize(params, %w[nested_text])
|
160
|
-
end
|
161
|
-
subject { sanitized_params[:hash] }
|
162
|
-
|
163
|
-
it "sanitizes values in nested hashes" do
|
164
|
-
expect(subject[:nested_text]).to eq("[FILTERED]")
|
165
|
-
end
|
166
|
-
|
167
|
-
describe ":nested_array" do
|
168
|
-
describe ":nested_hash" do
|
169
|
-
let(:sanitized_params) do
|
170
|
-
described_class.sanitize(params, %w[key])
|
171
|
-
end
|
172
|
-
subject { sanitized_params[:hash][:nested_array][3] }
|
173
|
-
|
174
|
-
it "sanitizes values in deeply nested hashes and arrays" do
|
175
|
-
expect(subject[:key]).to eq("[FILTERED]")
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
describe Appsignal::Utils::IntegrationLogger do
|
2
|
-
let(:log_stream) { std_stream }
|
3
|
-
let(:logs) { log_contents(log_stream) }
|
4
|
-
let(:logger) do
|
5
|
-
Appsignal::Utils::IntegrationLogger.new(log_stream).tap do |l|
|
6
|
-
l.formatter = logger_formatter
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
it "logs messages" do
|
11
|
-
logger.debug("debug message")
|
12
|
-
logger.info("info message")
|
13
|
-
logger.warn("warning message")
|
14
|
-
logger.error("error message")
|
15
|
-
|
16
|
-
expect(logs).to contains_log(:debug, "debug message")
|
17
|
-
expect(logs).to contains_log(:info, "info message")
|
18
|
-
expect(logs).to contains_log(:warn, "warning message")
|
19
|
-
expect(logs).to contains_log(:error, "error message")
|
20
|
-
end
|
21
|
-
end
|