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