logster 1.2.11 → 1.3.pre
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/.gitignore +18 -17
- data/.travis.yml +15 -16
- data/CHANGELOG.md +130 -130
- data/Gemfile +4 -4
- data/Guardfile +8 -8
- data/LICENSE.txt +22 -22
- data/README.md +99 -96
- data/Rakefile +24 -23
- data/assets/fonts/FontAwesome.otf +0 -0
- data/assets/fonts/fontawesome-webfont.eot +0 -0
- data/assets/fonts/fontawesome-webfont.svg +639 -639
- data/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/assets/fonts/fontawesome-webfont.woff +0 -0
- data/assets/fonts/fontawesome-webfont.woff2 +0 -0
- data/assets/images/Icon-144_rounded.png +0 -0
- data/assets/images/Icon-144_square.png +0 -0
- data/assets/images/icon_144x144.png +0 -0
- data/assets/images/icon_64x64.png +0 -0
- data/assets/javascript/client-app.js +81 -0
- data/assets/javascript/vendor.js +5302 -0
- data/assets/stylesheets/client-app.css +1 -0
- data/assets/stylesheets/vendor.css +4 -0
- data/build_client_app.sh +12 -0
- data/client-app/.editorconfig +20 -0
- data/client-app/.ember-cli +9 -0
- data/client-app/.eslintignore +19 -0
- data/client-app/.eslintrc.js +46 -0
- data/client-app/.gitignore +23 -0
- data/client-app/.travis.yml +27 -0
- data/client-app/.watchmanconfig +3 -0
- data/client-app/README.md +57 -0
- data/client-app/app/app.js +14 -0
- data/client-app/app/components/message-info.js +18 -0
- data/client-app/app/components/message-row.js +45 -0
- data/client-app/app/components/panel-resizer.js +75 -0
- data/client-app/app/components/tab-contents.js +27 -0
- data/client-app/app/components/tab-link.js +5 -0
- data/client-app/app/components/tabbed-section.js +32 -0
- data/client-app/app/components/time-formatter.js +25 -0
- data/client-app/app/components/update-time.js +21 -0
- data/client-app/app/controllers/index.js +83 -0
- data/client-app/app/controllers/show.js +13 -0
- data/client-app/app/index.html +29 -0
- data/client-app/app/initializers/app-init.js +55 -0
- data/client-app/app/lib/preload.js +14 -0
- data/client-app/app/lib/utilities.js +140 -0
- data/client-app/app/models/message-collection.js +158 -0
- data/client-app/app/models/message.js +99 -0
- data/client-app/app/resolver.js +3 -0
- data/client-app/app/router.js +14 -0
- data/client-app/app/routes/index.js +53 -0
- data/client-app/app/routes/show.js +14 -0
- data/{assets/stylesheets → client-app/app/styles}/app.css +387 -390
- data/{assets/javascript → client-app/app}/templates/application.hbs +2 -2
- data/client-app/app/templates/components/message-info.hbs +44 -0
- data/{assets/javascript → client-app/app/templates}/components/message-row.hbs +17 -17
- data/client-app/app/templates/components/tabbed-section.hbs +10 -0
- data/client-app/app/templates/components/time-formatter.hbs +1 -0
- data/{assets/javascript → client-app/app}/templates/index.hbs +57 -57
- data/{assets/javascript → client-app/app}/templates/show.hbs +4 -4
- data/client-app/config/environment.js +51 -0
- data/client-app/config/optional-features.json +3 -0
- data/client-app/config/targets.js +18 -0
- data/client-app/ember-cli-build.js +29 -0
- data/client-app/package-lock.json +11365 -0
- data/client-app/package.json +56 -0
- data/client-app/testem.js +25 -0
- data/client-app/tests/index.html +34 -0
- data/client-app/tests/integration/components/message-info-test.js +26 -0
- data/client-app/tests/integration/components/message-row-test.js +26 -0
- data/client-app/tests/integration/components/panel-resizer-test.js +26 -0
- data/client-app/tests/integration/components/tab-contents-test.js +26 -0
- data/client-app/tests/integration/components/tab-link-test.js +26 -0
- data/client-app/tests/integration/components/tabbed-section-test.js +26 -0
- data/client-app/tests/integration/components/time-formatter-test.js +26 -0
- data/client-app/tests/integration/components/update-time-test.js +26 -0
- data/client-app/tests/test-helper.js +8 -0
- data/client-app/tests/unit/controllers/index-test.js +12 -0
- data/client-app/tests/unit/controllers/show-test.js +12 -0
- data/client-app/tests/unit/initializers/app-init-test.js +31 -0
- data/client-app/tests/unit/routes/index-test.js +11 -0
- data/client-app/tests/unit/routes/show-test.js +11 -0
- data/lib/examples/sidekiq_logster_reporter.rb +21 -21
- data/lib/logster.rb +54 -54
- data/lib/logster/base_store.rb +130 -130
- data/lib/logster/configuration.rb +25 -25
- data/lib/logster/ignore_pattern.rb +65 -65
- data/lib/logster/logger.rb +102 -101
- data/lib/logster/message.rb +227 -226
- data/lib/logster/middleware/debug_exceptions.rb +26 -26
- data/lib/logster/middleware/reporter.rb +56 -54
- data/lib/logster/middleware/viewer.rb +220 -251
- data/lib/logster/rails/railtie.rb +58 -58
- data/lib/logster/redis_store.rb +481 -477
- data/lib/logster/version.rb +3 -3
- data/lib/logster/web.rb +14 -14
- data/logster.gemspec +34 -33
- data/test/examples/test_sidekiq_reporter_example.rb +46 -46
- data/test/fake_data/Gemfile +4 -4
- data/test/fake_data/generate.rb +10 -10
- data/test/logster/middleware/test_reporter.rb +21 -21
- data/test/logster/middleware/test_viewer.rb +96 -70
- data/test/logster/test_base_store.rb +147 -147
- data/test/logster/test_ignore_pattern.rb +41 -41
- data/test/logster/test_logger.rb +74 -74
- data/test/logster/test_message.rb +34 -34
- data/test/logster/test_redis_rate_limiter.rb +230 -230
- data/test/logster/test_redis_store.rb +427 -414
- data/test/test_helper.rb +38 -37
- data/vendor/assets/javascripts/logster.js.erb +39 -39
- metadata +83 -24
- data/assets/javascript/app.js +0 -817
- data/assets/javascript/components/message-info.hbs +0 -47
- data/assets/javascript/components/panel-resizer.hbs +0 -0
- data/assets/javascript/components/tab-contents.hbs +0 -1
- data/assets/javascript/components/tab-link.hbs +0 -1
- data/assets/javascript/components/tabbed-section.hbs +0 -6
- data/assets/javascript/external/ember-template-compiler.js +0 -22346
- data/assets/javascript/external/ember.js +0 -58500
- data/assets/javascript/external/ember.min.js +0 -17
- data/assets/javascript/external/jquery.min.js +0 -5
- data/assets/javascript/external/lodash.min.js +0 -87
- data/assets/javascript/external/moment.min.js +0 -6
- data/assets/stylesheets/font-awesome.min.css +0 -4
- data/bower.json +0 -25
data/lib/logster/version.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module Logster
|
|
2
|
-
VERSION = "1.
|
|
3
|
-
end
|
|
1
|
+
module Logster
|
|
2
|
+
VERSION = "1.3.pre"
|
|
3
|
+
end
|
data/lib/logster/web.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
require 'logster/middleware/viewer'
|
|
2
|
-
|
|
3
|
-
class Logster::Web
|
|
4
|
-
class FourOhFour
|
|
5
|
-
def call(env)
|
|
6
|
-
[404, {}, ["not found"]]
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def self.call(env)
|
|
11
|
-
@middleware ||= Logster::Middleware::Viewer.new(FourOhFour.new)
|
|
12
|
-
@middleware.call(env)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
1
|
+
require 'logster/middleware/viewer'
|
|
2
|
+
|
|
3
|
+
class Logster::Web
|
|
4
|
+
class FourOhFour
|
|
5
|
+
def call(env)
|
|
6
|
+
[404, {}, ["not found"]]
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.call(env)
|
|
11
|
+
@middleware ||= Logster::Middleware::Viewer.new(FourOhFour.new)
|
|
12
|
+
@middleware.call(env)
|
|
13
|
+
end
|
|
14
|
+
end
|
data/logster.gemspec
CHANGED
|
@@ -1,33 +1,34 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
-
require 'logster/version'
|
|
5
|
-
|
|
6
|
-
Gem::Specification.new do |spec|
|
|
7
|
-
spec.name = "logster"
|
|
8
|
-
spec.version = Logster::VERSION
|
|
9
|
-
spec.authors = ["UI for viewing logs in Rack"]
|
|
10
|
-
spec.email = ["sam.saffron@gmail.com"]
|
|
11
|
-
spec.summary = %q{UI for viewing logs in Rack}
|
|
12
|
-
spec.description = %q{UI for viewing logs in Rack}
|
|
13
|
-
spec.homepage = "https://github.com/discourse/logster"
|
|
14
|
-
spec.license = "MIT"
|
|
15
|
-
|
|
16
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
17
|
-
f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
|
|
18
|
-
end
|
|
19
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
20
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
21
|
-
spec.require_paths = ["lib"]
|
|
22
|
-
|
|
23
|
-
# NOTE dependency on rack is not explicit, this enables us to use
|
|
24
|
-
# logster outside of rack (for reporting)
|
|
25
|
-
|
|
26
|
-
spec.add_development_dependency "bundler", "~> 1.6"
|
|
27
|
-
spec.add_development_dependency "rake"
|
|
28
|
-
spec.add_development_dependency "rack"
|
|
29
|
-
spec.add_development_dependency "redis"
|
|
30
|
-
spec.add_development_dependency "guard"
|
|
31
|
-
spec.add_development_dependency "guard-minitest"
|
|
32
|
-
spec.add_development_dependency "timecop"
|
|
33
|
-
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'logster/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "logster"
|
|
8
|
+
spec.version = Logster::VERSION
|
|
9
|
+
spec.authors = ["UI for viewing logs in Rack"]
|
|
10
|
+
spec.email = ["sam.saffron@gmail.com"]
|
|
11
|
+
spec.summary = %q{UI for viewing logs in Rack}
|
|
12
|
+
spec.description = %q{UI for viewing logs in Rack}
|
|
13
|
+
spec.homepage = "https://github.com/discourse/logster"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
17
|
+
f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
|
|
18
|
+
end
|
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
21
|
+
spec.require_paths = ["lib"]
|
|
22
|
+
|
|
23
|
+
# NOTE dependency on rack is not explicit, this enables us to use
|
|
24
|
+
# logster outside of rack (for reporting)
|
|
25
|
+
|
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
|
27
|
+
spec.add_development_dependency "rake"
|
|
28
|
+
spec.add_development_dependency "rack"
|
|
29
|
+
spec.add_development_dependency "redis"
|
|
30
|
+
spec.add_development_dependency "guard"
|
|
31
|
+
spec.add_development_dependency "guard-minitest"
|
|
32
|
+
spec.add_development_dependency "timecop"
|
|
33
|
+
spec.add_development_dependency "byebug"
|
|
34
|
+
end
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
require_relative '../test_helper'
|
|
2
|
-
require 'logster/logger'
|
|
3
|
-
require 'logster/redis_store'
|
|
4
|
-
require 'logger'
|
|
5
|
-
require 'examples/sidekiq_logster_reporter'
|
|
6
|
-
|
|
7
|
-
class TestSidekiqReporter < MiniTest::Test
|
|
8
|
-
|
|
9
|
-
def setup
|
|
10
|
-
Logster.store = @store = Logster::RedisStore.new(Redis.new)
|
|
11
|
-
Logster.logger = @logger = Logster::Logger.new(Logster.store)
|
|
12
|
-
@store.clear_all
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def teardown
|
|
16
|
-
@store.clear_all
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def test_sidekiq_handler_example
|
|
20
|
-
handler = SidekiqLogsterReporter.new
|
|
21
|
-
error = nil
|
|
22
|
-
begin
|
|
23
|
-
raise TypeError.new
|
|
24
|
-
rescue => e
|
|
25
|
-
error = e
|
|
26
|
-
end
|
|
27
|
-
trace = error.backtrace
|
|
28
|
-
|
|
29
|
-
handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
|
|
30
|
-
|
|
31
|
-
report = @store.latest[0]
|
|
32
|
-
|
|
33
|
-
# Message is right format
|
|
34
|
-
assert_equal("Job exception: TypeError\n", report.message)
|
|
35
|
-
|
|
36
|
-
# A backtrace is joined()
|
|
37
|
-
assert_equal(trace.join("\n"), report.backtrace)
|
|
38
|
-
# The backtrace is deleted from the env
|
|
39
|
-
assert_nil(report.env['backtrace'])
|
|
40
|
-
assert_nil(report.env[:backtrace])
|
|
41
|
-
|
|
42
|
-
# The env is in the report
|
|
43
|
-
assert_equal("Test", report.env['code'])
|
|
44
|
-
assert_equal(20, report.env['params']['article_id'])
|
|
45
|
-
end
|
|
46
|
-
end
|
|
1
|
+
require_relative '../test_helper'
|
|
2
|
+
require 'logster/logger'
|
|
3
|
+
require 'logster/redis_store'
|
|
4
|
+
require 'logger'
|
|
5
|
+
require 'examples/sidekiq_logster_reporter'
|
|
6
|
+
|
|
7
|
+
class TestSidekiqReporter < MiniTest::Test
|
|
8
|
+
|
|
9
|
+
def setup
|
|
10
|
+
Logster.store = @store = Logster::RedisStore.new(Redis.new)
|
|
11
|
+
Logster.logger = @logger = Logster::Logger.new(Logster.store)
|
|
12
|
+
@store.clear_all
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def teardown
|
|
16
|
+
@store.clear_all
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_sidekiq_handler_example
|
|
20
|
+
handler = SidekiqLogsterReporter.new
|
|
21
|
+
error = nil
|
|
22
|
+
begin
|
|
23
|
+
raise TypeError.new
|
|
24
|
+
rescue => e
|
|
25
|
+
error = e
|
|
26
|
+
end
|
|
27
|
+
trace = error.backtrace
|
|
28
|
+
|
|
29
|
+
handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
|
|
30
|
+
|
|
31
|
+
report = @store.latest[0]
|
|
32
|
+
|
|
33
|
+
# Message is right format
|
|
34
|
+
assert_equal("Job exception: TypeError\n", report.message)
|
|
35
|
+
|
|
36
|
+
# A backtrace is joined()
|
|
37
|
+
assert_equal(trace.join("\n"), report.backtrace)
|
|
38
|
+
# The backtrace is deleted from the env
|
|
39
|
+
assert_nil(report.env['backtrace'])
|
|
40
|
+
assert_nil(report.env[:backtrace])
|
|
41
|
+
|
|
42
|
+
# The env is in the report
|
|
43
|
+
assert_equal("Test", report.env['code'])
|
|
44
|
+
assert_equal(20, report.env['params']['article_id'])
|
|
45
|
+
end
|
|
46
|
+
end
|
data/test/fake_data/Gemfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
|
|
3
|
-
gem 'redis'
|
|
4
|
-
gem 'logster', path: '../../'
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gem 'redis'
|
|
4
|
+
gem 'logster', path: '../../'
|
data/test/fake_data/generate.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
require 'redis'
|
|
2
|
-
require 'logster'
|
|
3
|
-
|
|
4
|
-
Logster.config.allow_grouping = true
|
|
5
|
-
Logster.config.application_version = "ABC123"
|
|
6
|
-
Logster.store = Logster::RedisStore.new
|
|
7
|
-
|
|
8
|
-
10.times do
|
|
9
|
-
Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
|
|
10
|
-
end
|
|
1
|
+
require 'redis'
|
|
2
|
+
require 'logster'
|
|
3
|
+
|
|
4
|
+
Logster.config.allow_grouping = true
|
|
5
|
+
Logster.config.application_version = "ABC123"
|
|
6
|
+
Logster.store = Logster::RedisStore.new
|
|
7
|
+
|
|
8
|
+
10.times do
|
|
9
|
+
Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
|
|
10
|
+
end
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
require_relative '../../test_helper'
|
|
2
|
-
require 'rack'
|
|
3
|
-
require 'logster/redis_store'
|
|
4
|
-
require 'logster/middleware/reporter'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class TestReporter < Minitest::Test
|
|
8
|
-
|
|
9
|
-
def test_logs_errors
|
|
10
|
-
Logster.store = Logster::TestStore.new
|
|
11
|
-
|
|
12
|
-
reporter = Logster::Middleware::Reporter.new(nil)
|
|
13
|
-
env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
|
|
14
|
-
status, = reporter.call(env)
|
|
15
|
-
|
|
16
|
-
assert_equal(200, status)
|
|
17
|
-
assert_equal(1, Logster.store.count)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
end
|
|
21
|
-
|
|
1
|
+
require_relative '../../test_helper'
|
|
2
|
+
require 'rack'
|
|
3
|
+
require 'logster/redis_store'
|
|
4
|
+
require 'logster/middleware/reporter'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TestReporter < Minitest::Test
|
|
8
|
+
|
|
9
|
+
def test_logs_errors
|
|
10
|
+
Logster.store = Logster::TestStore.new
|
|
11
|
+
|
|
12
|
+
reporter = Logster::Middleware::Reporter.new(nil)
|
|
13
|
+
env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
|
|
14
|
+
status, = reporter.call(env)
|
|
15
|
+
|
|
16
|
+
assert_equal(200, status)
|
|
17
|
+
assert_equal(1, Logster.store.count)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
@@ -1,70 +1,96 @@
|
|
|
1
|
-
require_relative '../../test_helper'
|
|
2
|
-
require 'rack'
|
|
3
|
-
require 'logster/redis_store'
|
|
4
|
-
require 'logster/middleware/viewer'
|
|
5
|
-
|
|
6
|
-
class TestViewer < Minitest::Test
|
|
7
|
-
|
|
8
|
-
class BrokenApp
|
|
9
|
-
def call(env)
|
|
10
|
-
[500, {}, ["broken"]]
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def setup
|
|
15
|
-
Logster.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Logster.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
assert_nil(viewer.send(:resolve_path, "/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
assert_equal("/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
1
|
+
require_relative '../../test_helper'
|
|
2
|
+
require 'rack'
|
|
3
|
+
require 'logster/redis_store'
|
|
4
|
+
require 'logster/middleware/viewer'
|
|
5
|
+
|
|
6
|
+
class TestViewer < Minitest::Test
|
|
7
|
+
|
|
8
|
+
class BrokenApp
|
|
9
|
+
def call(env)
|
|
10
|
+
[500, {}, ["broken"]]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def setup
|
|
15
|
+
Logster.config.subdirectory = "/logsie"
|
|
16
|
+
Logster.store = Logster::RedisStore.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def teardown
|
|
20
|
+
Logster.config.subdirectory = nil
|
|
21
|
+
Logster.store = nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def viewer
|
|
25
|
+
@viewer ||= Logster::Middleware::Viewer.new(nil)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def request
|
|
29
|
+
@request ||= Rack::MockRequest.new(Rack::Lint.new(viewer))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_path_resolution
|
|
33
|
+
assert_nil(viewer.send(:resolve_path, "/logs"))
|
|
34
|
+
assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
|
|
35
|
+
assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
|
|
36
|
+
assert_equal("/",viewer.send(:resolve_path, "/logsie"))
|
|
37
|
+
assert_equal("/",viewer.send(:resolve_path, "/logsie/"))
|
|
38
|
+
assert_equal("/hello/world",viewer.send(:resolve_path, "/logsie/hello/world"))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_search_raceguard_s
|
|
42
|
+
response = request.get('/logsie/messages.json?search=searchkey')
|
|
43
|
+
result = JSON.parse(response.body)
|
|
44
|
+
assert_equal('searchkey', result['search'])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_search_raceguard_sr
|
|
48
|
+
response = request.get('/logsie/messages.json?search=/regex/®ex_search=true')
|
|
49
|
+
result = JSON.parse(response.body)
|
|
50
|
+
assert_equal('/regex/', result['search'])
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_search_raceguard_f
|
|
54
|
+
response = request.get("/logsie/messages.json?filter=0_1_2_3_4")
|
|
55
|
+
result = JSON.parse(response.body)
|
|
56
|
+
assert_equal([0,1,2,3,4], result['filter'])
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_regex_parse
|
|
60
|
+
assert_equal(/hello/i, viewer.send(:parse_regex, '/hello/i'))
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_linking_to_a_valid_js_files
|
|
64
|
+
%w(
|
|
65
|
+
/logsie/javascript/client-app.js
|
|
66
|
+
/logsie/javascript/vendor.js
|
|
67
|
+
).each do |path|
|
|
68
|
+
response = request.get(path)
|
|
69
|
+
assert_equal(200, response.status)
|
|
70
|
+
assert_equal('application/javascript', response.headers['Content-Type'])
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_linking_to_a_valid_css_files
|
|
75
|
+
%w(
|
|
76
|
+
/logsie/stylesheets/client-app.css
|
|
77
|
+
/logsie/stylesheets/vendor.css
|
|
78
|
+
).each do |path|
|
|
79
|
+
response = request.get(path)
|
|
80
|
+
assert_equal(200, response.status)
|
|
81
|
+
assert_equal('text/css', response.headers['Content-Type'])
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_linking_to_an_invalid_ember_component_or_template
|
|
86
|
+
%w(
|
|
87
|
+
/logsie/javascript/templates/application.hbs
|
|
88
|
+
/logsie/javascript/templates/does_not_exist.js
|
|
89
|
+
/logsie/javascript/components/does_not_exist.js
|
|
90
|
+
/logsie/javascript/templates/../../app.js
|
|
91
|
+
).each do |path|
|
|
92
|
+
response = request.get(path)
|
|
93
|
+
assert_equal(404, response.status, "#{path} should have 404'ed")
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
require_relative '../test_helper'
|
|
2
|
-
require 'logster/base_store'
|
|
3
|
-
require 'logster/ignore_pattern'
|
|
4
|
-
|
|
5
|
-
class TestBaseStore < Minitest::Test
|
|
6
|
-
|
|
7
|
-
def setup
|
|
8
|
-
@store = Logster::TestStore.new
|
|
9
|
-
@store.clear_all
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def teardown
|
|
13
|
-
@store.clear_all
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def test_report_skip_empty
|
|
17
|
-
@store.skip_empty = true
|
|
18
|
-
@store.report(Logger::WARN, "test", nil)
|
|
19
|
-
@store.report(Logger::WARN, "test", '')
|
|
20
|
-
@store.report(Logger::WARN, "test", "foo") #
|
|
21
|
-
@store.skip_empty = false
|
|
22
|
-
@store.report(Logger::WARN, "test", nil) #
|
|
23
|
-
|
|
24
|
-
assert_equal(2, @store.count)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def test_report_skip_level
|
|
28
|
-
@store.level = nil
|
|
29
|
-
@store.report(Logger::DEBUG, "test", "A") #
|
|
30
|
-
@store.level = Logger::WARN
|
|
31
|
-
@store.report(Logger::DEBUG, "test", "A")
|
|
32
|
-
@store.report(Logger::INFO, "test", "B")
|
|
33
|
-
@store.report(Logger::WARN, "test", "C") #
|
|
34
|
-
@store.report(Logger::ERROR, "test", "D") #
|
|
35
|
-
assert_equal(3, @store.count)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def test_report_skip_ignore
|
|
39
|
-
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
|
|
40
|
-
@store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
|
|
41
|
-
@store.report(Logger::WARN, "test", "B")
|
|
42
|
-
@store.ignore = [
|
|
43
|
-
/^ActiveRecord::RecordNotFound \(Couldn't find Upload/,
|
|
44
|
-
/^Can't verify CSRF token authenticity/
|
|
45
|
-
]
|
|
46
|
-
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
|
|
47
|
-
@store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
|
|
48
|
-
@store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9489+78946947)")
|
|
49
|
-
@store.report(Logger::WARN, "test", "B")
|
|
50
|
-
|
|
51
|
-
assert_equal(4, @store.count)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def test_ignore_pattern_basic
|
|
55
|
-
@store.ignore = [
|
|
56
|
-
Logster::IgnorePattern.new(nil, {username: 'CausingErrors'})
|
|
57
|
-
]
|
|
58
|
-
@store.report(Logger::WARN, "test", "Foobar") #
|
|
59
|
-
@store.report(Logger::WARN, "test", "Foobar", { env: { username: 'CausingErrors' }})
|
|
60
|
-
@store.report(Logger::WARN, "test", "Foobar", env: nil)
|
|
61
|
-
@store.report(Logger::WARN, "test", "Something Else", { env: { username: 'CausingErrors' }})
|
|
62
|
-
@store.report(Logger::WARN, "test", "Something Else", { env: { 'username' => 'CausingErrors' }})
|
|
63
|
-
@store.report(Logger::WARN, "test", "Something Else", { env: { username: 'GoodPerson' }}) #
|
|
64
|
-
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
|
|
65
|
-
|
|
66
|
-
assert_equal(4, @store.count)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def test_ignore_pattern_real
|
|
70
|
-
@store.ignore = [
|
|
71
|
-
/^ActionController::RoutingError \(No route matches/,
|
|
72
|
-
Logster::IgnorePattern.new("Can't verify CSRF token authenticity", { REQUEST_URI: /\/trackback\/$/ })
|
|
73
|
-
]
|
|
74
|
-
# blocked
|
|
75
|
-
@store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
|
|
76
|
-
env: {
|
|
77
|
-
HTTP_HOST: 'meta.discourse.org',
|
|
78
|
-
REQUEST_URI: '/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/',
|
|
79
|
-
REQUEST_METHOD: 'POST',
|
|
80
|
-
HTTP_USER_AGENT: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
|
|
81
|
-
params: {
|
|
82
|
-
title: 'Something Spammy',
|
|
83
|
-
url: 'http://spam.example.net/whatever/spam.html',
|
|
84
|
-
excerpt: 'http://spam.example.com/pdf/blahblah.html free viagra',
|
|
85
|
-
blog_name: 'get free spam for cheap'
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
})
|
|
89
|
-
# logged
|
|
90
|
-
@store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
|
|
91
|
-
env: {
|
|
92
|
-
HTTP_HOST: 'meta.discourse.org',
|
|
93
|
-
REQUEST_URI: '/session',
|
|
94
|
-
REQUEST_METHOD: 'POST',
|
|
95
|
-
HTTP_USER_AGENT: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
|
|
96
|
-
params: {
|
|
97
|
-
username: 'user',
|
|
98
|
-
password: 'password',
|
|
99
|
-
form_authenticity_token: 'incorrect'
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
})
|
|
103
|
-
assert_equal(1, @store.count)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def test_timestamp
|
|
107
|
-
time = Time.now - 24*60*60
|
|
108
|
-
message = @store.report(Logger::WARN, "test", "B", timestamp: time)
|
|
109
|
-
|
|
110
|
-
assert_equal(time, message.timestamp)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def test_backtrace
|
|
114
|
-
# Create an error with a backtrace
|
|
115
|
-
error = TypeError.new
|
|
116
|
-
begin
|
|
117
|
-
raise error
|
|
118
|
-
rescue => e
|
|
119
|
-
error = e
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# Backtrace can be passed via backtrace param or env
|
|
123
|
-
message = @store.report(Logger::WARN, "test", "A", backtrace: error.backtrace)
|
|
124
|
-
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
125
|
-
message = @store.report(Logger::WARN, "test", "B", env: {backtrace: error.backtrace})
|
|
126
|
-
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
127
|
-
|
|
128
|
-
# Via env takes priority
|
|
129
|
-
message = @store.report(Logger::WARN, "test", "C", backtrace: "Garbage", env: {backtrace: error.backtrace})
|
|
130
|
-
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
131
|
-
|
|
132
|
-
# Backtrace is always a string
|
|
133
|
-
# Cannot do an equal assert here, because it uses `caller` when not provided
|
|
134
|
-
message = @store.report(Logger::WARN, "test", "D", backtrace: nil)
|
|
135
|
-
assert_kind_of(String, message.backtrace)
|
|
136
|
-
message = @store.report(Logger::WARN, "test", "E", env: {backtrace: nil})
|
|
137
|
-
assert_kind_of(String, message.backtrace)
|
|
138
|
-
message = @store.report(Logger::WARN, "test", "F", backtrace: nil, env: {backtrace: nil})
|
|
139
|
-
assert_kind_of(String, message.backtrace)
|
|
140
|
-
message = @store.report(Logger::WARN, "test", "G")
|
|
141
|
-
assert_kind_of(String, message.backtrace)
|
|
142
|
-
|
|
143
|
-
# Arrays are turned into strings via join \n
|
|
144
|
-
message = @store.report(Logger::WARN, "test", "H", backtrace: ["Foo", "Bar"])
|
|
145
|
-
assert_equal("Foo\nBar", message.backtrace)
|
|
146
|
-
end
|
|
147
|
-
end
|
|
1
|
+
require_relative '../test_helper'
|
|
2
|
+
require 'logster/base_store'
|
|
3
|
+
require 'logster/ignore_pattern'
|
|
4
|
+
|
|
5
|
+
class TestBaseStore < Minitest::Test
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
@store = Logster::TestStore.new
|
|
9
|
+
@store.clear_all
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
@store.clear_all
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_report_skip_empty
|
|
17
|
+
@store.skip_empty = true
|
|
18
|
+
@store.report(Logger::WARN, "test", nil)
|
|
19
|
+
@store.report(Logger::WARN, "test", '')
|
|
20
|
+
@store.report(Logger::WARN, "test", "foo") #
|
|
21
|
+
@store.skip_empty = false
|
|
22
|
+
@store.report(Logger::WARN, "test", nil) #
|
|
23
|
+
|
|
24
|
+
assert_equal(2, @store.count)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_report_skip_level
|
|
28
|
+
@store.level = nil
|
|
29
|
+
@store.report(Logger::DEBUG, "test", "A") #
|
|
30
|
+
@store.level = Logger::WARN
|
|
31
|
+
@store.report(Logger::DEBUG, "test", "A")
|
|
32
|
+
@store.report(Logger::INFO, "test", "B")
|
|
33
|
+
@store.report(Logger::WARN, "test", "C") #
|
|
34
|
+
@store.report(Logger::ERROR, "test", "D") #
|
|
35
|
+
assert_equal(3, @store.count)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_report_skip_ignore
|
|
39
|
+
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
|
|
40
|
+
@store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
|
|
41
|
+
@store.report(Logger::WARN, "test", "B")
|
|
42
|
+
@store.ignore = [
|
|
43
|
+
/^ActiveRecord::RecordNotFound \(Couldn't find Upload/,
|
|
44
|
+
/^Can't verify CSRF token authenticity/
|
|
45
|
+
]
|
|
46
|
+
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
|
|
47
|
+
@store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
|
|
48
|
+
@store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9489+78946947)")
|
|
49
|
+
@store.report(Logger::WARN, "test", "B")
|
|
50
|
+
|
|
51
|
+
assert_equal(4, @store.count)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_ignore_pattern_basic
|
|
55
|
+
@store.ignore = [
|
|
56
|
+
Logster::IgnorePattern.new(nil, {username: 'CausingErrors'})
|
|
57
|
+
]
|
|
58
|
+
@store.report(Logger::WARN, "test", "Foobar") #
|
|
59
|
+
@store.report(Logger::WARN, "test", "Foobar", { env: { username: 'CausingErrors' }})
|
|
60
|
+
@store.report(Logger::WARN, "test", "Foobar", env: nil)
|
|
61
|
+
@store.report(Logger::WARN, "test", "Something Else", { env: { username: 'CausingErrors' }})
|
|
62
|
+
@store.report(Logger::WARN, "test", "Something Else", { env: { 'username' => 'CausingErrors' }})
|
|
63
|
+
@store.report(Logger::WARN, "test", "Something Else", { env: { username: 'GoodPerson' }}) #
|
|
64
|
+
@store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
|
|
65
|
+
|
|
66
|
+
assert_equal(4, @store.count)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_ignore_pattern_real
|
|
70
|
+
@store.ignore = [
|
|
71
|
+
/^ActionController::RoutingError \(No route matches/,
|
|
72
|
+
Logster::IgnorePattern.new("Can't verify CSRF token authenticity", { REQUEST_URI: /\/trackback\/$/ })
|
|
73
|
+
]
|
|
74
|
+
# blocked
|
|
75
|
+
@store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
|
|
76
|
+
env: {
|
|
77
|
+
HTTP_HOST: 'meta.discourse.org',
|
|
78
|
+
REQUEST_URI: '/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/',
|
|
79
|
+
REQUEST_METHOD: 'POST',
|
|
80
|
+
HTTP_USER_AGENT: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
|
|
81
|
+
params: {
|
|
82
|
+
title: 'Something Spammy',
|
|
83
|
+
url: 'http://spam.example.net/whatever/spam.html',
|
|
84
|
+
excerpt: 'http://spam.example.com/pdf/blahblah.html free viagra',
|
|
85
|
+
blog_name: 'get free spam for cheap'
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
# logged
|
|
90
|
+
@store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
|
|
91
|
+
env: {
|
|
92
|
+
HTTP_HOST: 'meta.discourse.org',
|
|
93
|
+
REQUEST_URI: '/session',
|
|
94
|
+
REQUEST_METHOD: 'POST',
|
|
95
|
+
HTTP_USER_AGENT: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
|
|
96
|
+
params: {
|
|
97
|
+
username: 'user',
|
|
98
|
+
password: 'password',
|
|
99
|
+
form_authenticity_token: 'incorrect'
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
assert_equal(1, @store.count)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_timestamp
|
|
107
|
+
time = Time.now - 24*60*60
|
|
108
|
+
message = @store.report(Logger::WARN, "test", "B", timestamp: time)
|
|
109
|
+
|
|
110
|
+
assert_equal(time, message.timestamp)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_backtrace
|
|
114
|
+
# Create an error with a backtrace
|
|
115
|
+
error = TypeError.new
|
|
116
|
+
begin
|
|
117
|
+
raise error
|
|
118
|
+
rescue => e
|
|
119
|
+
error = e
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Backtrace can be passed via backtrace param or env
|
|
123
|
+
message = @store.report(Logger::WARN, "test", "A", backtrace: error.backtrace)
|
|
124
|
+
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
125
|
+
message = @store.report(Logger::WARN, "test", "B", env: {backtrace: error.backtrace})
|
|
126
|
+
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
127
|
+
|
|
128
|
+
# Via env takes priority
|
|
129
|
+
message = @store.report(Logger::WARN, "test", "C", backtrace: "Garbage", env: {backtrace: error.backtrace})
|
|
130
|
+
assert_equal(error.backtrace.join("\n"), message.backtrace)
|
|
131
|
+
|
|
132
|
+
# Backtrace is always a string
|
|
133
|
+
# Cannot do an equal assert here, because it uses `caller` when not provided
|
|
134
|
+
message = @store.report(Logger::WARN, "test", "D", backtrace: nil)
|
|
135
|
+
assert_kind_of(String, message.backtrace)
|
|
136
|
+
message = @store.report(Logger::WARN, "test", "E", env: {backtrace: nil})
|
|
137
|
+
assert_kind_of(String, message.backtrace)
|
|
138
|
+
message = @store.report(Logger::WARN, "test", "F", backtrace: nil, env: {backtrace: nil})
|
|
139
|
+
assert_kind_of(String, message.backtrace)
|
|
140
|
+
message = @store.report(Logger::WARN, "test", "G")
|
|
141
|
+
assert_kind_of(String, message.backtrace)
|
|
142
|
+
|
|
143
|
+
# Arrays are turned into strings via join \n
|
|
144
|
+
message = @store.report(Logger::WARN, "test", "H", backtrace: ["Foo", "Bar"])
|
|
145
|
+
assert_equal("Foo\nBar", message.backtrace)
|
|
146
|
+
end
|
|
147
|
+
end
|