logster 2.21.0 → 3.0.1
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 +24 -0
- data/README.md +29 -14
- data/assets/javascript/main-C9t0S9He.js +1 -0
- data/assets/javascript/modules-4-12-BnbZfQQN.js +1 -0
- data/assets/javascript/vendor.js +11 -5260
- data/assets/logster-config.json +18 -0
- data/assets/manifest.json +23 -0
- data/assets/stylesheets/main-et5OPj6E.css +1 -0
- data/lib/logster/configuration.rb +1 -0
- data/lib/logster/middleware/reporter.rb +34 -3
- data/lib/logster/middleware/viewer.rb +204 -32
- data/lib/logster/rails/railtie.rb +4 -20
- data/lib/logster/redis_store.rb +0 -2
- data/lib/logster/version.rb +1 -1
- data/lib/logster.rb +1 -1
- metadata +17 -186
- data/.github/workflows/ci.yml +0 -140
- data/.gitignore +0 -3
- data/.rubocop.yml +0 -12
- data/.streerc +0 -2
- data/Gemfile +0 -10
- data/Guardfile +0 -10
- data/Rakefile +0 -24
- data/assets/javascript/.gitkeep +0 -0
- data/assets/javascript/chunk.524.b7d0b89d25457a72409c.js +0 -22
- data/assets/javascript/chunk.582.5a04ae4713e692cd335a.js +0 -22
- data/assets/javascript/chunk.747.a730c497582bb6742a6e.js +0 -579
- data/assets/javascript/chunk.761.64949d89942c829e5c1b.js +0 -1213
- data/assets/javascript/client-app.js +0 -1389
- data/assets/stylesheets/.gitkeep +0 -0
- data/assets/stylesheets/client-app.css +0 -1
- data/assets/stylesheets/vendor.css +0 -1
- data/build_client_app.sh +0 -10
- data/client-app/.editorconfig +0 -19
- data/client-app/.ember-cli +0 -9
- data/client-app/.eslintignore +0 -20
- data/client-app/.eslintrc +0 -10
- data/client-app/.gitignore +0 -23
- data/client-app/.prettierignore +0 -21
- data/client-app/.prettierrc +0 -1
- data/client-app/.template-lintrc.js +0 -10
- data/client-app/.watchmanconfig +0 -3
- data/client-app/README.md +0 -56
- data/client-app/app/app.js +0 -12
- data/client-app/app/components/actions-menu.js +0 -50
- data/client-app/app/components/back-to-site-link.js +0 -9
- data/client-app/app/components/back-trace.js +0 -153
- data/client-app/app/components/env-tab.js +0 -68
- data/client-app/app/components/message-info.js +0 -151
- data/client-app/app/components/message-row.js +0 -46
- data/client-app/app/components/page-nav.js +0 -42
- data/client-app/app/components/panel-resizer.js +0 -108
- data/client-app/app/components/patterns-list.js +0 -142
- data/client-app/app/components/tab-contents.js +0 -23
- data/client-app/app/components/tabbed-section.js +0 -45
- data/client-app/app/components/time-formatter.js +0 -36
- data/client-app/app/controllers/index.js +0 -288
- data/client-app/app/controllers/show.js +0 -39
- data/client-app/app/helpers/logster-url.js +0 -12
- data/client-app/app/helpers/or.js +0 -7
- data/client-app/app/index.html +0 -31
- data/client-app/app/initializers/app-init.js +0 -71
- data/client-app/app/lib/decorators.js +0 -13
- data/client-app/app/lib/preload.js +0 -43
- data/client-app/app/lib/utilities.js +0 -230
- data/client-app/app/models/group.js +0 -34
- data/client-app/app/models/message-collection.js +0 -303
- data/client-app/app/models/message.js +0 -128
- data/client-app/app/models/pattern-item.js +0 -32
- data/client-app/app/resolver.js +0 -3
- data/client-app/app/router.js +0 -13
- data/client-app/app/routes/index.js +0 -64
- data/client-app/app/routes/settings.js +0 -32
- data/client-app/app/routes/show.js +0 -16
- data/client-app/app/services/events.js +0 -4
- data/client-app/app/styles/app.css +0 -898
- data/client-app/app/templates/application.hbs +0 -1
- data/client-app/app/templates/components/actions-menu.hbs +0 -31
- data/client-app/app/templates/components/back-to-site-link.hbs +0 -8
- data/client-app/app/templates/components/back-trace.hbs +0 -15
- data/client-app/app/templates/components/env-tab.hbs +0 -10
- data/client-app/app/templates/components/message-info.hbs +0 -86
- data/client-app/app/templates/components/message-row.hbs +0 -32
- data/client-app/app/templates/components/page-nav.hbs +0 -37
- data/client-app/app/templates/components/panel-resizer.hbs +0 -3
- data/client-app/app/templates/components/patterns-list.hbs +0 -78
- data/client-app/app/templates/components/tabbed-section.hbs +0 -18
- data/client-app/app/templates/components/time-formatter.hbs +0 -1
- data/client-app/app/templates/index.hbs +0 -192
- data/client-app/app/templates/settings.hbs +0 -47
- data/client-app/app/templates/show.hbs +0 -13
- data/client-app/config/ember-cli-update.json +0 -18
- data/client-app/config/environment.js +0 -51
- data/client-app/config/icons.js +0 -28
- data/client-app/config/optional-features.json +0 -6
- data/client-app/config/targets.js +0 -26
- data/client-app/ember-cli-build.js +0 -34
- data/client-app/package.json +0 -76
- data/client-app/preload-json-manager.rb +0 -35
- data/client-app/public/assets/images/icon_144x144.png +0 -0
- data/client-app/public/assets/images/icon_64x64.png +0 -0
- data/client-app/testem.js +0 -23
- data/client-app/tests/index.html +0 -41
- data/client-app/tests/integration/components/back-to-site-link-test.js +0 -20
- data/client-app/tests/integration/components/back-trace-test.js +0 -138
- data/client-app/tests/integration/components/env-tab-test.js +0 -220
- data/client-app/tests/integration/components/message-info-test.js +0 -122
- data/client-app/tests/integration/components/patterns-list-test.js +0 -76
- data/client-app/tests/test-helper.js +0 -12
- data/client-app/tests/unit/controllers/index-test.js +0 -77
- data/client-app/tests/unit/controllers/show-test.js +0 -12
- data/client-app/tests/unit/routes/index-test.js +0 -11
- data/client-app/tests/unit/routes/show-test.js +0 -11
- data/client-app/yarn.lock +0 -9905
- data/gemfiles/rails_6.1.gemfile +0 -12
- data/gemfiles/rails_7.0.gemfile +0 -12
- data/gemfiles/rails_7.1.gemfile +0 -9
- data/gemfiles/rails_7.2.gemfile +0 -9
- data/logster.gemspec +0 -43
- data/test/dummy/config/application.rb +0 -31
- data/test/dummy/config/boot.rb +0 -6
- data/test/dummy/config/environment.rb +0 -6
- data/test/examples/test_sidekiq_reporter_example.rb +0 -47
- data/test/fake_data/Gemfile +0 -6
- data/test/fake_data/generate.rb +0 -23
- data/test/logster/middleware/test_reporter.rb +0 -84
- data/test/logster/middleware/test_viewer.rb +0 -495
- data/test/logster/test_base_store.rb +0 -224
- data/test/logster/test_cache.rb +0 -39
- data/test/logster/test_defer_logger.rb +0 -36
- data/test/logster/test_group.rb +0 -92
- data/test/logster/test_ignore_pattern.rb +0 -42
- data/test/logster/test_logger.rb +0 -177
- data/test/logster/test_message.rb +0 -269
- data/test/logster/test_pattern.rb +0 -144
- data/test/logster/test_railtie.rb +0 -21
- data/test/logster/test_redis_rate_limiter.rb +0 -246
- data/test/logster/test_redis_store.rb +0 -1165
- data/test/test_helper.rb +0 -66
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "../test_helper"
|
|
4
|
-
require "logster/base_store"
|
|
5
|
-
require "logster/ignore_pattern"
|
|
6
|
-
|
|
7
|
-
class TestBaseStore < Minitest::Test
|
|
8
|
-
def setup
|
|
9
|
-
@store = Logster::TestStore.new
|
|
10
|
-
@store.clear_all
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def teardown
|
|
14
|
-
@store.clear_all
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def test_report_skip_empty
|
|
18
|
-
@store.skip_empty = true
|
|
19
|
-
@store.report(Logger::WARN, "test", nil)
|
|
20
|
-
@store.report(Logger::WARN, "test", "")
|
|
21
|
-
@store.report(Logger::WARN, "test", "foo") #
|
|
22
|
-
@store.skip_empty = false
|
|
23
|
-
@store.report(Logger::WARN, "test", nil) #
|
|
24
|
-
|
|
25
|
-
assert_equal(2, @store.count)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def test_report_skip_level
|
|
29
|
-
@store.level = nil
|
|
30
|
-
@store.report(Logger::DEBUG, "test", "A") #
|
|
31
|
-
@store.level = Logger::WARN
|
|
32
|
-
@store.report(Logger::DEBUG, "test", "A")
|
|
33
|
-
@store.report(Logger::INFO, "test", "B")
|
|
34
|
-
@store.report(Logger::WARN, "test", "C") #
|
|
35
|
-
@store.report(Logger::ERROR, "test", "D") #
|
|
36
|
-
assert_equal(3, @store.count)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def test_report_skip_ignore
|
|
40
|
-
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
|
|
41
|
-
@store.report(
|
|
42
|
-
Logger::FATAL,
|
|
43
|
-
"test",
|
|
44
|
-
"ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)",
|
|
45
|
-
)
|
|
46
|
-
@store.report(Logger::WARN, "test", "B")
|
|
47
|
-
@store.ignore = [
|
|
48
|
-
/^ActiveRecord::RecordNotFound \(Couldn't find Upload/,
|
|
49
|
-
/^Can't verify CSRF token authenticity/,
|
|
50
|
-
]
|
|
51
|
-
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
|
|
52
|
-
@store.report(
|
|
53
|
-
Logger::FATAL,
|
|
54
|
-
"test",
|
|
55
|
-
"ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)",
|
|
56
|
-
)
|
|
57
|
-
@store.report(
|
|
58
|
-
Logger::FATAL,
|
|
59
|
-
"test",
|
|
60
|
-
"ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9489+78946947)",
|
|
61
|
-
)
|
|
62
|
-
@store.report(Logger::WARN, "test", "B")
|
|
63
|
-
|
|
64
|
-
assert_equal(4, @store.count)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def test_ignore_pattern_basic
|
|
68
|
-
@store.ignore = [Logster::IgnorePattern.new(nil, username: "CausingErrors")]
|
|
69
|
-
@store.report(Logger::WARN, "test", "Foobar") #
|
|
70
|
-
@store.report(Logger::WARN, "test", "Foobar", env: { username: "CausingErrors" })
|
|
71
|
-
@store.report(Logger::WARN, "test", "Foobar", env: nil)
|
|
72
|
-
@store.report(Logger::WARN, "test", "Something Else", env: { username: "CausingErrors" })
|
|
73
|
-
@store.report(Logger::WARN, "test", "Something Else", env: { "username" => "CausingErrors" })
|
|
74
|
-
@store.report(Logger::WARN, "test", "Something Else", env: { username: "GoodPerson" }) #
|
|
75
|
-
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
|
|
76
|
-
|
|
77
|
-
assert_equal(4, @store.count)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def test_ignore_pattern_real
|
|
81
|
-
@store.ignore = [
|
|
82
|
-
/^ActionController::RoutingError \(No route matches/,
|
|
83
|
-
Logster::IgnorePattern.new(
|
|
84
|
-
"Can't verify CSRF token authenticity",
|
|
85
|
-
REQUEST_URI: %r{/trackback/$},
|
|
86
|
-
),
|
|
87
|
-
]
|
|
88
|
-
# blocked
|
|
89
|
-
@store.report(
|
|
90
|
-
Logger::WARN,
|
|
91
|
-
"whatever",
|
|
92
|
-
"Can't verify CSRF token authenticity",
|
|
93
|
-
env: {
|
|
94
|
-
HTTP_HOST: "meta.discourse.org",
|
|
95
|
-
REQUEST_URI: "/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/",
|
|
96
|
-
REQUEST_METHOD: "POST",
|
|
97
|
-
HTTP_USER_AGENT: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
|
|
98
|
-
params: {
|
|
99
|
-
title: "Something Spammy",
|
|
100
|
-
url: "http://spam.example.net/whatever/spam.html",
|
|
101
|
-
excerpt: "http://spam.example.com/pdf/blahblah.html free viagra",
|
|
102
|
-
blog_name: "get free spam for cheap",
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
)
|
|
106
|
-
# logged
|
|
107
|
-
@store.report(
|
|
108
|
-
Logger::WARN,
|
|
109
|
-
"whatever",
|
|
110
|
-
"Can't verify CSRF token authenticity",
|
|
111
|
-
env: {
|
|
112
|
-
HTTP_HOST: "meta.discourse.org",
|
|
113
|
-
REQUEST_URI: "/session",
|
|
114
|
-
REQUEST_METHOD: "POST",
|
|
115
|
-
HTTP_USER_AGENT:
|
|
116
|
-
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
|
|
117
|
-
params: {
|
|
118
|
-
username: "user",
|
|
119
|
-
password: "password",
|
|
120
|
-
form_authenticity_token: "incorrect",
|
|
121
|
-
},
|
|
122
|
-
},
|
|
123
|
-
)
|
|
124
|
-
assert_equal(1, @store.count)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def test_timestamp
|
|
128
|
-
time = Time.now - 24 * 60 * 60
|
|
129
|
-
message = @store.report(Logger::WARN, "test", "B", timestamp: time)
|
|
130
|
-
|
|
131
|
-
assert_equal(time, message.timestamp)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def test_backtrace
|
|
135
|
-
# Create an error with a backtrace
|
|
136
|
-
error = TypeError.new
|
|
137
|
-
begin
|
|
138
|
-
raise error
|
|
139
|
-
rescue => e
|
|
140
|
-
error = e
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Backtrace can be passed via backtrace param or env
|
|
144
|
-
message = @store.report(Logger::WARN, "test", "A", backtrace: error.backtrace)
|
|
145
|
-
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
146
|
-
message = @store.report(Logger::WARN, "test", "B", env: { backtrace: error.backtrace })
|
|
147
|
-
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
148
|
-
|
|
149
|
-
# Via env takes priority
|
|
150
|
-
message =
|
|
151
|
-
@store.report(
|
|
152
|
-
Logger::WARN,
|
|
153
|
-
"test",
|
|
154
|
-
"C",
|
|
155
|
-
backtrace: "Garbage",
|
|
156
|
-
env: {
|
|
157
|
-
backtrace: error.backtrace,
|
|
158
|
-
},
|
|
159
|
-
)
|
|
160
|
-
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
161
|
-
|
|
162
|
-
# Backtrace is always a string
|
|
163
|
-
# Cannot do an equal assert here, because it uses `caller` when not provided
|
|
164
|
-
message = @store.report(Logger::WARN, "test", "D", backtrace: nil)
|
|
165
|
-
assert_kind_of(String, message.backtrace)
|
|
166
|
-
message = @store.report(Logger::WARN, "test", "E", env: { backtrace: nil })
|
|
167
|
-
assert_kind_of(String, message.backtrace)
|
|
168
|
-
message = @store.report(Logger::WARN, "test", "F", backtrace: nil, env: { backtrace: nil })
|
|
169
|
-
assert_kind_of(String, message.backtrace)
|
|
170
|
-
message = @store.report(Logger::WARN, "test", "G")
|
|
171
|
-
assert_kind_of(String, message.backtrace)
|
|
172
|
-
|
|
173
|
-
# Arrays are turned into strings via join \n
|
|
174
|
-
message = @store.report(Logger::WARN, "test", "H", backtrace: %w[Foo Bar])
|
|
175
|
-
assert_equal("Foo\nBar", message.backtrace)
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
def test_chained_loggers_dont_have_superfluous_frames_in_backtrace
|
|
179
|
-
logger = Logster::Logger.new(@store)
|
|
180
|
-
other_store = Logster::TestStore.new
|
|
181
|
-
other_logger = Logster::Logger.new(other_store)
|
|
182
|
-
logger.chain(other_logger)
|
|
183
|
-
logger.warn("this is warning")
|
|
184
|
-
[@store, other_store].each do |store|
|
|
185
|
-
message = store.reported.first
|
|
186
|
-
assert_equal("this is warning", message.message)
|
|
187
|
-
# the first line in the backtrace should be the method that
|
|
188
|
-
# called the warn/info/error etc. method.
|
|
189
|
-
# in this case the first line should be this test method
|
|
190
|
-
assert_includes(message.backtrace.lines.first, __method__.to_s)
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def test_log_message_is_truncated_when_above_maximum_message_length
|
|
195
|
-
orig = Logster.config.maximum_message_length
|
|
196
|
-
Logster.config.maximum_message_length = 300
|
|
197
|
-
msg = @store.report(Logger::WARN, "", "a" * 400)
|
|
198
|
-
# 3 is the ... at the end to indicate truncated message
|
|
199
|
-
assert_equal(300 + 3, msg.message.size)
|
|
200
|
-
|
|
201
|
-
Logster.config.maximum_message_length = 100
|
|
202
|
-
msg = @store.report(Logger::WARN, "", "a" * 200)
|
|
203
|
-
assert_equal(100 + 3, msg.message.size)
|
|
204
|
-
ensure
|
|
205
|
-
Logster.config.maximum_message_length = orig
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def test_chained_loggers_shouldnt_mutate_env_passed_to_them
|
|
209
|
-
logger = Logster::Logger.new(@store)
|
|
210
|
-
other_store = Logster::TestStore.new
|
|
211
|
-
other_logger = Logster::Logger.new(other_store)
|
|
212
|
-
logger.chain(other_logger)
|
|
213
|
-
logger.add(Logger::WARN, "this is warning", "", { env: { backtrace: "11" } })
|
|
214
|
-
[@store, other_store].each do |store|
|
|
215
|
-
assert_equal("11", store.reported.first.backtrace)
|
|
216
|
-
refute_includes(store.reported.first.env.keys.map(&:to_sym), :backtrace)
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def test_envs_with_invalid_encoding_dont_raise_errors
|
|
221
|
-
msg = @store.report(Logger::WARN, "", "me have invalid encoding", env: { axe: "a\xF1xasa" })
|
|
222
|
-
assert_equal("a�xasa", msg.env[:axe])
|
|
223
|
-
end
|
|
224
|
-
end
|
data/test/logster/test_cache.rb
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "../test_helper"
|
|
4
|
-
require "logster/cache"
|
|
5
|
-
|
|
6
|
-
class TestCache < Minitest::Test
|
|
7
|
-
def setup
|
|
8
|
-
@cache = Logster::Cache.new(5)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def test_cache_works
|
|
12
|
-
prc = Proc.new { |key, value| @cache.fetch(key) { value } }
|
|
13
|
-
value = "I should be retured"
|
|
14
|
-
assert_equal(value, prc.call(:key1, value))
|
|
15
|
-
cached_value = value
|
|
16
|
-
value = "I shouldn't be returned"
|
|
17
|
-
assert_equal(cached_value, prc.call(:key1, value))
|
|
18
|
-
value2 = "value for key2"
|
|
19
|
-
assert_equal(value2, prc.call(:key2, value2))
|
|
20
|
-
|
|
21
|
-
value = value2 = "Now I should be returned"
|
|
22
|
-
Process.stub :clock_gettime, Process.clock_gettime(Process::CLOCK_MONOTONIC) + 6 do
|
|
23
|
-
assert_equal(value, prc.call(:key1, value))
|
|
24
|
-
assert_equal(value2, prc.call(:key2, value2))
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def test_cache_can_be_cleared
|
|
29
|
-
value = "cached"
|
|
30
|
-
prc = Proc.new { |key, val| @cache.fetch(key) { val } }
|
|
31
|
-
assert_equal(value, prc.call(:key1, value))
|
|
32
|
-
assert_equal("v2", prc.call(:key2, "v2"))
|
|
33
|
-
|
|
34
|
-
value = "new value"
|
|
35
|
-
@cache.clear(:key1)
|
|
36
|
-
assert_equal(value, prc.call(:key1, value))
|
|
37
|
-
assert_equal("v2", prc.call(:key2, "v2.2"))
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "../test_helper"
|
|
4
|
-
require "logster/defer_logger"
|
|
5
|
-
require "logster/logger"
|
|
6
|
-
|
|
7
|
-
class TestDeferLogger < Minitest::Test
|
|
8
|
-
def setup
|
|
9
|
-
@store = TestStore.new
|
|
10
|
-
@defer_logger = Logster::DeferLogger.new(@store)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def test_defer_logger_inherits_logger
|
|
14
|
-
assert(Logster::Logger === @defer_logger)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def test_work_is_done_async
|
|
18
|
-
queue = Logster::Scheduler.queue
|
|
19
|
-
assert_equal(0, queue.size)
|
|
20
|
-
|
|
21
|
-
@defer_logger.add(4, "hi this a test", "prog")
|
|
22
|
-
|
|
23
|
-
assert_equal(1, queue.size)
|
|
24
|
-
queue << :terminate
|
|
25
|
-
Logster::Scheduler.thread.join
|
|
26
|
-
assert_equal(1, @store.calls.size)
|
|
27
|
-
|
|
28
|
-
# we need to make sure the backtrace is passed from the main thread.
|
|
29
|
-
# Otherwise we'd only get a partial backtrace from
|
|
30
|
-
# the point the new thread was spawned
|
|
31
|
-
backtrace = @store.calls.first[3][:backtrace]
|
|
32
|
-
assert_includes(backtrace.lines.first, __method__.to_s)
|
|
33
|
-
|
|
34
|
-
assert_equal(0, queue.size)
|
|
35
|
-
end
|
|
36
|
-
end
|
data/test/logster/test_group.rb
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "../test_helper"
|
|
4
|
-
require "logster/group"
|
|
5
|
-
require "logster/message"
|
|
6
|
-
|
|
7
|
-
class TestGroup < Minitest::Test
|
|
8
|
-
def test_changed_is_true_for_new_instances
|
|
9
|
-
assert Logster::Group.new("/somekey/").changed?
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def test_from_json_works_correctly
|
|
13
|
-
time = (Time.now.to_f * 1000).to_i - 5000
|
|
14
|
-
json =
|
|
15
|
-
JSON.generate(
|
|
16
|
-
key: "/somekey/",
|
|
17
|
-
messages_keys: [111, 222, 333].map(&:to_s),
|
|
18
|
-
timestamp: time,
|
|
19
|
-
count: 3,
|
|
20
|
-
)
|
|
21
|
-
group = Logster::Group.from_json(json)
|
|
22
|
-
refute group.changed?
|
|
23
|
-
assert_equal 3, group.count
|
|
24
|
-
assert_equal time, group.timestamp
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_doesnt_add_duplicate_messages
|
|
28
|
-
group = get_group
|
|
29
|
-
msg1 = get_message
|
|
30
|
-
assert_equal 0, group.count
|
|
31
|
-
group.add_message(msg1)
|
|
32
|
-
assert_equal 1, group.count
|
|
33
|
-
assert_equal msg1.timestamp, group.timestamp
|
|
34
|
-
group.add_message(msg1)
|
|
35
|
-
assert_equal 1, group.count
|
|
36
|
-
|
|
37
|
-
msg2 = get_message
|
|
38
|
-
msg2.timestamp -= 10_000
|
|
39
|
-
group.add_message(msg2)
|
|
40
|
-
assert_equal 2, group.count
|
|
41
|
-
assert_equal msg1.timestamp, group.timestamp
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def test_adding_multiple_messages_works_correctly
|
|
45
|
-
group = get_group
|
|
46
|
-
messages = [get_message(10), get_message(5), get_message(74), get_message(26)]
|
|
47
|
-
messages << messages[0]
|
|
48
|
-
group.messages = messages
|
|
49
|
-
group.count = 4
|
|
50
|
-
assert_equal 4, group.count
|
|
51
|
-
assert_equal 74, group.timestamp
|
|
52
|
-
expected = messages.uniq(&:key).sort_by(&:timestamp).map(&:key).reverse
|
|
53
|
-
assert_equal expected, group.messages_keys
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def test_doesnt_exceed_max_size
|
|
57
|
-
Logster::Group.instance_variable_set(:@max_size, 5)
|
|
58
|
-
group = get_group
|
|
59
|
-
messages = [
|
|
60
|
-
get_message(10),
|
|
61
|
-
get_message(5),
|
|
62
|
-
get_message(74),
|
|
63
|
-
get_message(26),
|
|
64
|
-
get_message(44),
|
|
65
|
-
get_message(390),
|
|
66
|
-
]
|
|
67
|
-
messages.each { |m| group.add_message(m) }
|
|
68
|
-
# the count attr keeps track of the number of messages
|
|
69
|
-
# that has ever been added to the group.
|
|
70
|
-
# It should never decrease
|
|
71
|
-
assert_equal 6, group.count
|
|
72
|
-
assert_equal 390, group.timestamp
|
|
73
|
-
refute_includes group.messages_keys, messages.find { |m| m.timestamp == 10 }.key
|
|
74
|
-
|
|
75
|
-
group = get_group
|
|
76
|
-
group.messages = messages
|
|
77
|
-
assert_equal 390, group.timestamp
|
|
78
|
-
refute_includes group.messages.map(&:timestamp), 5
|
|
79
|
-
ensure
|
|
80
|
-
Logster::Group.remove_instance_variable(:@max_size)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
private
|
|
84
|
-
|
|
85
|
-
def get_group
|
|
86
|
-
Logster::Group.new("/groupkey/")
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def get_message(timestamp = nil)
|
|
90
|
-
Logster::Message.new(0, "", "testmessage", timestamp)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "../test_helper"
|
|
4
|
-
require "logster/ignore_pattern"
|
|
5
|
-
|
|
6
|
-
class TestIgnorePattern < Minitest::Test
|
|
7
|
-
def test_string_message_pattern
|
|
8
|
-
msg = Logster::Message.new(Logger::WARN, "test", "my error (oh no!)")
|
|
9
|
-
msg_frog = Logster::Message.new(Logger::WARN, "test", "a frog")
|
|
10
|
-
msg_nil = Logster::Message.new(Logger::WARN, "test", nil)
|
|
11
|
-
|
|
12
|
-
pattern = Logster::IgnorePattern.new("my error (")
|
|
13
|
-
|
|
14
|
-
assert pattern.matches? msg
|
|
15
|
-
assert !pattern.matches?(msg_frog)
|
|
16
|
-
assert !pattern.matches?(msg_nil)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def test_env_pattern
|
|
20
|
-
msg = Logster::Message.new(Logger::WARN, "test", "my error")
|
|
21
|
-
msg.env = { "frogs" => "are big" }
|
|
22
|
-
|
|
23
|
-
pattern = Logster::IgnorePattern.new(nil, frogs: "big")
|
|
24
|
-
|
|
25
|
-
assert pattern.matches? msg
|
|
26
|
-
|
|
27
|
-
msg.env = { legs: nil }
|
|
28
|
-
assert !(pattern.matches? msg)
|
|
29
|
-
|
|
30
|
-
msg.env = { legs: 3 }
|
|
31
|
-
assert !(pattern.matches? msg)
|
|
32
|
-
|
|
33
|
-
msg.env = { frogs: "small" }
|
|
34
|
-
assert !pattern.matches?(msg)
|
|
35
|
-
|
|
36
|
-
pattern = Logster::IgnorePattern.new(nil, "small")
|
|
37
|
-
assert pattern.matches? msg
|
|
38
|
-
|
|
39
|
-
msg.env = { frogs: "big" }
|
|
40
|
-
assert !(pattern.matches? msg)
|
|
41
|
-
end
|
|
42
|
-
end
|
data/test/logster/test_logger.rb
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "../test_helper"
|
|
4
|
-
require "logster/logger"
|
|
5
|
-
require "logger"
|
|
6
|
-
|
|
7
|
-
class TestStore < Logster::BaseStore
|
|
8
|
-
attr_accessor :calls
|
|
9
|
-
|
|
10
|
-
def report(*args)
|
|
11
|
-
(@calls ||= []) << args
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
class TestLogger < Minitest::Test
|
|
16
|
-
def setup
|
|
17
|
-
@store = TestStore.new
|
|
18
|
-
@logger = Logster::Logger.new(@store)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def test_only_logs_valid_encoding
|
|
22
|
-
@logger.add(4, "a \xE4 test", "prog")
|
|
23
|
-
_, _, message = @store.calls[0]
|
|
24
|
-
assert_equal true, message.valid_encoding?
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_per_thread_override
|
|
28
|
-
logger2 = Logster::Logger.new(@store)
|
|
29
|
-
logger2.override_level = 2
|
|
30
|
-
|
|
31
|
-
# we should not leak between objects
|
|
32
|
-
assert_nil @logger.override_level
|
|
33
|
-
|
|
34
|
-
@logger.override_level = 2
|
|
35
|
-
|
|
36
|
-
@logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
|
|
37
|
-
Thread.new { @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" }) }.join
|
|
38
|
-
|
|
39
|
-
@logger.override_level = nil
|
|
40
|
-
@logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
|
|
41
|
-
|
|
42
|
-
assert_equal 2, @store.calls.length
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def test_backtrace
|
|
46
|
-
@logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
|
|
47
|
-
assert_equal "backtrace", @store.calls[0][3][:backtrace]
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def test_chain
|
|
51
|
-
io = StringIO.new
|
|
52
|
-
@logger.chain Logger.new(io)
|
|
53
|
-
@logger.warn "boom"
|
|
54
|
-
|
|
55
|
-
assert_match(/W,.*boom/, io.string)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def test_backtrace_with_chain
|
|
59
|
-
@other_store = TestStore.new
|
|
60
|
-
@logger.chain(Logster::Logger.new(@other_store))
|
|
61
|
-
|
|
62
|
-
@logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
|
|
63
|
-
|
|
64
|
-
[@store, @other_store].each { |store| assert_equal "backtrace", store.calls[0][3][:backtrace] }
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def test_add_with_one_argument
|
|
68
|
-
@logger.add(2) { "test" }
|
|
69
|
-
@logger.add(2)
|
|
70
|
-
assert_equal 2, @store.calls.length
|
|
71
|
-
assert_equal "test", @store.calls.first[2]
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def test_subscribing_to_logger_events
|
|
75
|
-
custom_logger_klass =
|
|
76
|
-
Class.new do
|
|
77
|
-
attr_reader :events
|
|
78
|
-
|
|
79
|
-
def initialize
|
|
80
|
-
@events = []
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def log(severity, message, progname, opts, &block)
|
|
84
|
-
@events.push({ severity:, message:, progname:, opts:, block: })
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
custom_logger = custom_logger_klass.new
|
|
89
|
-
|
|
90
|
-
@logger.subscribe do |severity, message, progname, opts, &block|
|
|
91
|
-
custom_logger.log(severity, message, progname, opts, &block)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
@logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
|
|
95
|
-
@logger.add(1, nil, nil, backtrace: "backtrace") { "yielded message" }
|
|
96
|
-
|
|
97
|
-
first_event = custom_logger.events[0]
|
|
98
|
-
|
|
99
|
-
assert_equal(0, first_event[:severity])
|
|
100
|
-
assert_equal("test", first_event[:message])
|
|
101
|
-
assert_equal("prog", first_event[:progname])
|
|
102
|
-
assert_equal({ backtrace: "backtrace", env: { a: "x" } }, first_event[:opts])
|
|
103
|
-
assert_nil first_event[:block]
|
|
104
|
-
|
|
105
|
-
second_event = custom_logger.events[1]
|
|
106
|
-
|
|
107
|
-
assert_equal(1, second_event[:severity])
|
|
108
|
-
assert_nil second_event[:message]
|
|
109
|
-
assert_nil second_event[:progname]
|
|
110
|
-
assert_equal({ backtrace: "backtrace", env: nil }, second_event[:opts])
|
|
111
|
-
assert_equal("yielded message", second_event[:block].call)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
class NewLogger < Logster::Logger
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def test_inherited_logger_backtrace_with_chain
|
|
118
|
-
@other_store = TestStore.new
|
|
119
|
-
@logger = NewLogger.new(@store)
|
|
120
|
-
@logger.chain(Logster::Logger.new(@other_store))
|
|
121
|
-
|
|
122
|
-
@logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
|
|
123
|
-
|
|
124
|
-
[@store, @other_store].each { |store| assert_equal "backtrace", store.calls[0][3][:backtrace] }
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def test_progname_parameter
|
|
128
|
-
@logger.add(0, "test")
|
|
129
|
-
progname = @store.calls[0][1]
|
|
130
|
-
assert_nil progname
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
class PlayLogger
|
|
134
|
-
attr_accessor :skip_store
|
|
135
|
-
def initialize(tester)
|
|
136
|
-
@tester = tester
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def add(s, m, p, &block)
|
|
140
|
-
@tester.assert(skip_store)
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
def test_chain_with_ignore
|
|
145
|
-
@logger.chain PlayLogger.new(self)
|
|
146
|
-
@logger.skip_store = true
|
|
147
|
-
@logger.warn("testing")
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def test_logging_an_error_gets_backtrace_from_the_error
|
|
151
|
-
exception = error_instance(Exception)
|
|
152
|
-
std_err = error_instance(StandardError)
|
|
153
|
-
custom_err = error_instance(Class.new(StandardError))
|
|
154
|
-
|
|
155
|
-
@logger.error(exception)
|
|
156
|
-
@logger.fatal(std_err)
|
|
157
|
-
@logger.fatal(custom_err)
|
|
158
|
-
|
|
159
|
-
assert_equal exception.backtrace.join("\n"), @store.calls[0][3][:backtrace]
|
|
160
|
-
assert_equal std_err.backtrace.join("\n"), @store.calls[1][3][:backtrace]
|
|
161
|
-
assert_equal custom_err.backtrace.join("\n"), @store.calls[2][3][:backtrace]
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
def test_formatter
|
|
165
|
-
@logger.formatter = ->(severity, datetime, progname, msg) { "[test] #{msg}" }
|
|
166
|
-
@logger.add(0, "hello")
|
|
167
|
-
assert_equal "[test] hello", @store.calls[0][2]
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
private
|
|
171
|
-
|
|
172
|
-
def error_instance(error_class)
|
|
173
|
-
raise error_class.new
|
|
174
|
-
rescue error_class => e
|
|
175
|
-
e
|
|
176
|
-
end
|
|
177
|
-
end
|