appsignal 4.0.6-java → 4.0.8-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/Rakefile +9 -9
  4. data/appsignal.gemspec +22 -1
  5. data/ext/agent.rb +27 -27
  6. data/lib/appsignal/check_in.rb +1 -1
  7. data/lib/appsignal/config.rb +1 -3
  8. data/lib/appsignal/integrations/resque.rb +1 -6
  9. data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
  10. data/lib/appsignal/version.rb +1 -1
  11. data/lib/appsignal.rb +10 -8
  12. metadata +2 -192
  13. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  14. data/.github/ISSUE_TEMPLATE/chore.md +0 -14
  15. data/.github/workflows/ci.yml +0 -3285
  16. data/.github/workflows/create_release_from_tag.yml +0 -62
  17. data/.gitignore +0 -35
  18. data/.gitmodules +0 -3
  19. data/.rspec +0 -4
  20. data/.yardopts +0 -8
  21. data/benchmark.rake +0 -139
  22. data/gemfiles/capistrano2.gemfile +0 -6
  23. data/gemfiles/capistrano3.gemfile +0 -7
  24. data/gemfiles/dry-monitor.gemfile +0 -5
  25. data/gemfiles/grape.gemfile +0 -5
  26. data/gemfiles/hanami-2.0.gemfile +0 -7
  27. data/gemfiles/hanami-2.1.gemfile +0 -7
  28. data/gemfiles/http5.gemfile +0 -5
  29. data/gemfiles/no_dependencies.gemfile +0 -10
  30. data/gemfiles/padrino.gemfile +0 -7
  31. data/gemfiles/psych-3.gemfile +0 -5
  32. data/gemfiles/psych-4.gemfile +0 -5
  33. data/gemfiles/que-1.gemfile +0 -5
  34. data/gemfiles/que-2.gemfile +0 -5
  35. data/gemfiles/rails-6.0.gemfile +0 -10
  36. data/gemfiles/rails-6.1.gemfile +0 -11
  37. data/gemfiles/rails-7.0.gemfile +0 -11
  38. data/gemfiles/rails-7.1.gemfile +0 -11
  39. data/gemfiles/rails-7.2.gemfile +0 -11
  40. data/gemfiles/redis-4.gemfile +0 -5
  41. data/gemfiles/redis-5.gemfile +0 -6
  42. data/gemfiles/resque-2.gemfile +0 -6
  43. data/gemfiles/sequel.gemfile +0 -10
  44. data/gemfiles/sinatra.gemfile +0 -5
  45. data/gemfiles/webmachine1.gemfile +0 -7
  46. data/gemfiles/webmachine2.gemfile +0 -6
  47. data/mono.yml +0 -16
  48. data/spec/.rubocop.yml +0 -7
  49. data/spec/lib/appsignal/auth_check_spec.rb +0 -84
  50. data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
  51. data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
  52. data/spec/lib/appsignal/check_in/cron_spec.rb +0 -210
  53. data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -557
  54. data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
  55. data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
  56. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
  57. data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
  58. data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
  59. data/spec/lib/appsignal/cli/install_spec.rb +0 -848
  60. data/spec/lib/appsignal/cli_spec.rb +0 -56
  61. data/spec/lib/appsignal/config_spec.rb +0 -1380
  62. data/spec/lib/appsignal/demo_spec.rb +0 -83
  63. data/spec/lib/appsignal/environment_spec.rb +0 -190
  64. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
  65. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
  66. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
  67. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
  68. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
  69. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
  70. data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
  71. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
  72. data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
  73. data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
  74. data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
  75. data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
  76. data/spec/lib/appsignal/extension_spec.rb +0 -178
  77. data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
  78. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
  79. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
  80. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
  81. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
  82. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
  83. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
  84. data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
  85. data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
  86. data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
  87. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
  88. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
  89. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
  90. data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
  91. data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
  92. data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
  93. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
  94. data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
  95. data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
  96. data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
  97. data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
  98. data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
  99. data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
  100. data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
  101. data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
  102. data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
  103. data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
  104. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
  105. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
  106. data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
  107. data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
  108. data/spec/lib/appsignal/hooks_spec.rb +0 -124
  109. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
  110. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
  111. data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
  112. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
  113. data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
  114. data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
  115. data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
  116. data/spec/lib/appsignal/integrations/que_spec.rb +0 -187
  117. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
  118. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
  119. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
  120. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
  121. data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
  122. data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
  123. data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
  124. data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
  125. data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
  126. data/spec/lib/appsignal/loaders_spec.rb +0 -144
  127. data/spec/lib/appsignal/logger_spec.rb +0 -205
  128. data/spec/lib/appsignal/marker_spec.rb +0 -51
  129. data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
  130. data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
  131. data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
  132. data/spec/lib/appsignal/probes_spec.rb +0 -414
  133. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
  134. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
  135. data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
  136. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
  137. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
  138. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
  139. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
  140. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
  141. data/spec/lib/appsignal/rack_spec.rb +0 -243
  142. data/spec/lib/appsignal/sample_data_spec.rb +0 -238
  143. data/spec/lib/appsignal/span_spec.rb +0 -141
  144. data/spec/lib/appsignal/system_spec.rb +0 -126
  145. data/spec/lib/appsignal/transaction_spec.rb +0 -2115
  146. data/spec/lib/appsignal/transmitter_spec.rb +0 -198
  147. data/spec/lib/appsignal/utils/data_spec.rb +0 -166
  148. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
  149. data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
  150. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
  151. data/spec/lib/appsignal/utils/json_spec.rb +0 -44
  152. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
  153. data/spec/lib/appsignal_spec.rb +0 -1919
  154. data/spec/lib/puma/appsignal_spec.rb +0 -334
  155. data/spec/spec_helper.rb +0 -179
  156. data/spec/support/fixtures/generated_config.yml +0 -24
  157. data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
  158. data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
  159. data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
  160. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
  161. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
  162. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
  163. data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
  164. data/spec/support/fixtures/uploaded_file.txt +0 -0
  165. data/spec/support/hanami/hanami_app.rb +0 -29
  166. data/spec/support/helpers/action_mailer_helpers.rb +0 -25
  167. data/spec/support/helpers/activejob_helpers.rb +0 -27
  168. data/spec/support/helpers/api_request_helper.rb +0 -60
  169. data/spec/support/helpers/cli_helpers.rb +0 -40
  170. data/spec/support/helpers/config_helpers.rb +0 -66
  171. data/spec/support/helpers/dependency_helper.rb +0 -155
  172. data/spec/support/helpers/directory_helper.rb +0 -27
  173. data/spec/support/helpers/env_helpers.rb +0 -41
  174. data/spec/support/helpers/environment_metdata_helper.rb +0 -16
  175. data/spec/support/helpers/example_exception.rb +0 -13
  176. data/spec/support/helpers/example_standard_error.rb +0 -13
  177. data/spec/support/helpers/loader_helper.rb +0 -21
  178. data/spec/support/helpers/log_helpers.rb +0 -36
  179. data/spec/support/helpers/rails_helper.rb +0 -28
  180. data/spec/support/helpers/std_streams_helper.rb +0 -94
  181. data/spec/support/helpers/system_helpers.rb +0 -8
  182. data/spec/support/helpers/take_at_most_helper.rb +0 -21
  183. data/spec/support/helpers/time_helpers.rb +0 -11
  184. data/spec/support/helpers/transaction_helpers.rb +0 -122
  185. data/spec/support/helpers/wait_for_helper.rb +0 -39
  186. data/spec/support/matchers/contains_log.rb +0 -26
  187. data/spec/support/matchers/have_colorized_text.rb +0 -28
  188. data/spec/support/matchers/transaction.rb +0 -200
  189. data/spec/support/mocks/appsignal_mock.rb +0 -18
  190. data/spec/support/mocks/dummy_app.rb +0 -20
  191. data/spec/support/mocks/fake_gc_profiler.rb +0 -19
  192. data/spec/support/mocks/fake_gvl_tools.rb +0 -28
  193. data/spec/support/mocks/hash_like.rb +0 -10
  194. data/spec/support/mocks/mock_probe.rb +0 -13
  195. data/spec/support/mocks/puma_mock.rb +0 -43
  196. data/spec/support/shared_examples/instrument.rb +0 -48
  197. data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
  198. data/spec/support/stubs/delayed_job.rb +0 -0
  199. data/spec/support/stubs/sidekiq/api.rb +0 -4
  200. data/spec/support/testing.rb +0 -203
  201. data/support/bundler_wrapper +0 -12
  202. 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