request-log-analyzer 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/DESIGN +24 -10
- data/bin/request-log-analyzer +2 -27
- data/lib/cli/progressbar.rb +2 -19
- data/lib/cli/tools.rb +46 -0
- data/lib/request_log_analyzer/aggregator/database.rb +16 -5
- data/lib/request_log_analyzer/aggregator/echo.rb +1 -0
- data/lib/request_log_analyzer/aggregator/summarizer.rb +15 -13
- data/lib/request_log_analyzer/controller.rb +8 -4
- data/lib/request_log_analyzer/file_format/merb.rb +17 -4
- data/lib/request_log_analyzer/file_format/rails_development.rb +30 -92
- data/lib/request_log_analyzer/file_format.rb +8 -4
- data/lib/request_log_analyzer/filter/anonymize.rb +0 -3
- data/lib/request_log_analyzer/filter/field.rb +6 -1
- data/lib/request_log_analyzer/filter/timespan.rb +7 -1
- data/lib/request_log_analyzer/filter.rb +0 -4
- data/lib/request_log_analyzer/line_definition.rb +13 -2
- data/lib/request_log_analyzer/output/fixed_width.rb +7 -1
- data/lib/request_log_analyzer/output/html.rb +1 -0
- data/lib/request_log_analyzer/request.rb +4 -0
- data/lib/request_log_analyzer/source/log_parser.rb +19 -21
- data/lib/request_log_analyzer/source.rb +2 -1
- data/lib/request_log_analyzer/tracker/duration.rb +74 -14
- data/lib/request_log_analyzer/tracker/frequency.rb +22 -10
- data/lib/request_log_analyzer/tracker/hourly_spread.rb +18 -6
- data/lib/request_log_analyzer/tracker/timespan.rb +15 -8
- data/lib/request_log_analyzer.rb +4 -8
- data/spec/integration/command_line_usage_spec.rb +71 -0
- data/spec/lib/helper.rb +33 -0
- data/spec/lib/mocks.rb +47 -0
- data/spec/{file_formats/spec_format.rb → lib/testing_format.rb} +6 -1
- data/spec/spec_helper.rb +5 -41
- data/spec/{database_inserter_spec.rb → unit/aggregator/database_inserter_spec.rb} +40 -37
- data/spec/unit/aggregator/summarizer_spec.rb +28 -0
- data/spec/unit/controller/controller_spec.rb +43 -0
- data/spec/{log_processor_spec.rb → unit/controller/log_processor_spec.rb} +4 -3
- data/spec/{file_format_spec.rb → unit/file_format/file_format_api_spec.rb} +16 -4
- data/spec/{line_definition_spec.rb → unit/file_format/line_definition_spec.rb} +13 -6
- data/spec/{merb_format_spec.rb → unit/file_format/merb_format_spec.rb} +2 -2
- data/spec/{rails_format_spec.rb → unit/file_format/rails_format_spec.rb} +19 -11
- data/spec/unit/filter/anonymize_filter_spec.rb +22 -0
- data/spec/unit/filter/field_filter_spec.rb +69 -0
- data/spec/unit/filter/timespan_filter_spec.rb +61 -0
- data/spec/{log_parser_spec.rb → unit/source/log_parser_spec.rb} +7 -7
- data/spec/{request_spec.rb → unit/source/request_spec.rb} +5 -5
- data/spec/unit/tracker/duration_tracker_spec.rb +90 -0
- data/spec/unit/tracker/frequency_tracker_spec.rb +83 -0
- data/spec/unit/tracker/timespan_tracker_spec.rb +64 -0
- data/spec/unit/tracker/tracker_api_test.rb +45 -0
- metadata +50 -26
- data/spec/controller_spec.rb +0 -64
- data/spec/filter_spec.rb +0 -157
- data/spec/summarizer_spec.rb +0 -9
@@ -1,45 +1,41 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
2
|
-
require 'request_log_analyzer/aggregator/database'
|
3
|
-
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
4
2
|
|
5
3
|
describe RequestLogAnalyzer::Aggregator::Database, "schema creation" do
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
include RequestLogAnalyzer::Spec::Helper
|
6
|
+
|
10
7
|
before(:each) do
|
11
|
-
log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
12
|
-
@database_inserter = RequestLogAnalyzer::Aggregator::Database.new(log_parser, :database =>
|
13
|
-
end
|
14
|
-
|
15
|
-
after(:each) do
|
16
|
-
File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
|
8
|
+
log_parser = RequestLogAnalyzer::Source::LogParser.new(testing_format)
|
9
|
+
@database_inserter = RequestLogAnalyzer::Aggregator::Database.new(log_parser, :database => ':memory:')
|
17
10
|
end
|
11
|
+
|
18
12
|
|
19
13
|
it "should create the correct tables" do
|
20
14
|
ActiveRecord::Migration.should_receive(:create_table).with("warnings")
|
21
15
|
ActiveRecord::Migration.should_receive(:create_table).with("requests")
|
22
16
|
ActiveRecord::Migration.should_receive(:create_table).with("first_lines")
|
23
17
|
ActiveRecord::Migration.should_receive(:create_table).with("test_lines")
|
24
|
-
ActiveRecord::Migration.should_receive(:create_table).with("
|
18
|
+
ActiveRecord::Migration.should_receive(:create_table).with("eval_lines")
|
19
|
+
ActiveRecord::Migration.should_receive(:create_table).with("last_lines")
|
25
20
|
|
21
|
+
ActiveRecord::Migration.should_receive(:add_index).with("eval_lines", [:request_id])
|
26
22
|
ActiveRecord::Migration.should_receive(:add_index).with("first_lines", [:request_id])
|
27
|
-
ActiveRecord::Migration.should_receive(:add_index).with("test_lines",
|
28
|
-
ActiveRecord::Migration.should_receive(:add_index).with("last_lines",
|
23
|
+
ActiveRecord::Migration.should_receive(:add_index).with("test_lines", [:request_id])
|
24
|
+
ActiveRecord::Migration.should_receive(:add_index).with("last_lines", [:request_id])
|
29
25
|
|
30
26
|
@database_inserter.prepare
|
31
27
|
end
|
32
28
|
|
33
29
|
it "should create a default Request class" do
|
34
30
|
@database_inserter.prepare
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
TestingFormat::Database::Request.ancestors.should include(ActiveRecord::Base)
|
32
|
+
TestingFormat::Database::Request.column_names.should include('first_lineno')
|
33
|
+
TestingFormat::Database::Request.column_names.should include('last_lineno')
|
38
34
|
end
|
39
35
|
|
40
36
|
it "should create associations for the default Request class" do
|
41
37
|
@database_inserter.prepare
|
42
|
-
@request =
|
38
|
+
@request = TestingFormat::Database::Request.new
|
43
39
|
@request.should respond_to(:test_lines)
|
44
40
|
@request.test_lines.should
|
45
41
|
end
|
@@ -47,7 +43,7 @@ describe RequestLogAnalyzer::Aggregator::Database, "schema creation" do
|
|
47
43
|
it "should create the default table names" do
|
48
44
|
@database_inserter.prepare
|
49
45
|
@database_inserter.file_format.line_definitions.each do |name, definition|
|
50
|
-
klass =
|
46
|
+
klass = TestingFormat::Database.const_get("#{name}_line".camelize)
|
51
47
|
klass.column_names.should include('id')
|
52
48
|
klass.column_names.should include('lineno')
|
53
49
|
klass.column_names.should include('request_id')
|
@@ -57,46 +53,53 @@ describe RequestLogAnalyzer::Aggregator::Database, "schema creation" do
|
|
57
53
|
it "should create the correct fields in the table" do
|
58
54
|
@database_inserter.prepare
|
59
55
|
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
TestingFormat::Database::FirstLine.column_names.should include('request_no')
|
57
|
+
TestingFormat::Database::LastLine.column_names.should include('request_no')
|
58
|
+
TestingFormat::Database::TestLine.column_names.should include('test_capture')
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should create fields for provides" do
|
62
|
+
@database_inserter.prepare
|
63
|
+
TestingFormat::Database::EvalLine.column_names.should include('evaluated')
|
64
|
+
TestingFormat::Database::EvalLine.column_names.should include('greating')
|
65
|
+
TestingFormat::Database::EvalLine.column_names.should include('what')
|
63
66
|
end
|
64
67
|
|
65
68
|
end
|
66
69
|
|
67
70
|
describe RequestLogAnalyzer::Aggregator::Database, "record insertion" do
|
68
|
-
include
|
71
|
+
include RequestLogAnalyzer::Spec::Helper
|
69
72
|
|
70
73
|
before(:each) do
|
71
|
-
log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
72
|
-
@database_inserter = RequestLogAnalyzer::Aggregator::Database.new(log_parser, :database =>
|
74
|
+
log_parser = RequestLogAnalyzer::Source::LogParser.new(testing_format)
|
75
|
+
@database_inserter = RequestLogAnalyzer::Aggregator::Database.new(log_parser, :database => ':memory:')
|
73
76
|
@database_inserter.prepare
|
74
77
|
|
75
|
-
@incomplete_request =
|
76
|
-
@completed_request =
|
77
|
-
{:line_type => :test, :test_capture => "
|
78
|
+
@incomplete_request = testing_format.request( {:line_type => :first, :request_no => 564})
|
79
|
+
@completed_request = testing_format.request( {:line_type => :first, :request_no => 564},
|
80
|
+
{:line_type => :test, :test_capture => "awesome"},
|
81
|
+
{:line_type => :test, :test_capture => "indeed"},
|
82
|
+
{:line_type => :eval, :evaluated => "{ 'greating' => 'howdy'}", :greating => 'howdy' },
|
83
|
+
{:line_type => :last, :request_no => 564})
|
78
84
|
end
|
79
85
|
|
80
|
-
after(:each) do
|
81
|
-
File.unlink(TEST_DATABASE_FILE) if File.exist?(TEST_DATABASE_FILE)
|
82
|
-
end
|
83
|
-
|
84
86
|
it "should insert a record in the request table" do
|
85
|
-
|
87
|
+
TestingFormat::Database::Request.count.should == 0
|
86
88
|
@database_inserter.aggregate(@incomplete_request)
|
87
|
-
|
89
|
+
TestingFormat::Database::Request.count.should == 1
|
88
90
|
end
|
89
91
|
|
90
92
|
it "should insert records in all relevant line tables" do
|
91
93
|
@database_inserter.aggregate(@completed_request)
|
92
|
-
request =
|
94
|
+
request = TestingFormat::Database::Request.first
|
93
95
|
request.should have(2).test_lines
|
94
96
|
request.should have(1).first_lines
|
97
|
+
request.should have(1).eval_lines
|
95
98
|
request.should have(1).last_lines
|
96
99
|
end
|
97
100
|
|
98
101
|
it "should log a warning in the warnings table" do
|
99
|
-
|
102
|
+
TestingFormat::Database::Warning.should_receive(:create!).with(hash_including(:warning_type => 'test_warning'))
|
100
103
|
@database_inserter.warning(:test_warning, "Testing the warning system", 12)
|
101
104
|
end
|
102
105
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe RequestLogAnalyzer::Aggregator::Summarizer do
|
4
|
+
|
5
|
+
include RequestLogAnalyzer::Spec::Helper
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@summarizer = RequestLogAnalyzer::Aggregator::Summarizer.new(mock_source, :output => mock_output)
|
9
|
+
@summarizer.prepare
|
10
|
+
end
|
11
|
+
|
12
|
+
it "not raise exception when creating a report after aggregating multiple requests" do
|
13
|
+
@summarizer.aggregate(request(:data => 'bluh1'))
|
14
|
+
@summarizer.aggregate(request(:data => 'bluh2'))
|
15
|
+
|
16
|
+
lambda { @summarizer.report(mock_output) }.should_not raise_error
|
17
|
+
end
|
18
|
+
|
19
|
+
it "not raise exception when creating a report after aggregating a single request" do
|
20
|
+
@summarizer.aggregate(request(:data => 'bluh1'))
|
21
|
+
lambda { @summarizer.report(mock_output) }.should_not raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it "not raise exception when creating a report after aggregating no requests" do
|
25
|
+
lambda { @summarizer.report(mock_output) }.should_not raise_error
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe RequestLogAnalyzer::Controller do
|
4
|
+
|
5
|
+
include RequestLogAnalyzer::Spec::Helper
|
6
|
+
|
7
|
+
it "should use a custom output generator correctly" do
|
8
|
+
|
9
|
+
mock_output = mock('RequestLogAnalyzer::Output::Base')
|
10
|
+
mock_output.stub!(:io).and_return(mock_io)
|
11
|
+
mock_output.should_receive(:header)
|
12
|
+
mock_output.should_receive(:footer)
|
13
|
+
|
14
|
+
controller = RequestLogAnalyzer::Controller.new(mock_source, :output => mock_output)
|
15
|
+
|
16
|
+
controller.run!
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should call aggregators correctly when run" do
|
20
|
+
controller = RequestLogAnalyzer::Controller.new(mock_source, :output => mock_output)
|
21
|
+
|
22
|
+
mock_aggregator = mock('RequestLogAnalyzer::Aggregator::Base')
|
23
|
+
mock_aggregator.should_receive(:prepare).once.ordered
|
24
|
+
mock_aggregator.should_receive(:aggregate).with(an_instance_of(testing_format.request_class)).twice.ordered
|
25
|
+
mock_aggregator.should_receive(:finalize).once.ordered
|
26
|
+
mock_aggregator.should_receive(:report).once.ordered
|
27
|
+
|
28
|
+
controller.aggregators << mock_aggregator
|
29
|
+
controller.run!
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should call filters when run" do
|
33
|
+
controller = RequestLogAnalyzer::Controller.new(mock_source, :output => mock_output)
|
34
|
+
|
35
|
+
mock_filter = mock('RequestLogAnalyzer::Filter::Base')
|
36
|
+
mock_filter.should_receive(:filter).twice.and_return(nil)
|
37
|
+
controller.should_receive(:aggregate_request).twice.and_return(nil)
|
38
|
+
|
39
|
+
controller.filters << mock_filter
|
40
|
+
controller.run!
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -1,12 +1,13 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
2
3
|
require 'request_log_analyzer/log_processor'
|
3
4
|
|
4
5
|
describe RequestLogAnalyzer::LogProcessor, 'stripping log files' do
|
5
6
|
|
6
|
-
include
|
7
|
+
include RequestLogAnalyzer::Spec::Helper
|
7
8
|
|
8
9
|
before(:each) do
|
9
|
-
@log_stripper = RequestLogAnalyzer::LogProcessor.new(
|
10
|
+
@log_stripper = RequestLogAnalyzer::LogProcessor.new(testing_format, :strip, {})
|
10
11
|
end
|
11
12
|
|
12
13
|
it "should remove a junk line" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::FileFormat, :format_definition do
|
4
4
|
|
@@ -63,7 +63,18 @@ end
|
|
63
63
|
|
64
64
|
describe RequestLogAnalyzer::FileFormat, :load do
|
65
65
|
|
66
|
-
include
|
66
|
+
include RequestLogAnalyzer::Spec::Helper
|
67
|
+
|
68
|
+
it "should return an instance of a FileFormat class" do
|
69
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(TestingFormat)
|
70
|
+
@file_format.should be_kind_of(TestingFormat)
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
it "should return itself if it already is a FileFormat::Base instance" do
|
75
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(testing_format)
|
76
|
+
@file_format.should be_kind_of(TestingFormat)
|
77
|
+
end
|
67
78
|
|
68
79
|
it "should load a predefined file format from the /file_format dir" do
|
69
80
|
@file_format = RequestLogAnalyzer::FileFormat.load(:rails)
|
@@ -71,8 +82,9 @@ describe RequestLogAnalyzer::FileFormat, :load do
|
|
71
82
|
end
|
72
83
|
|
73
84
|
it "should load a provided format file" do
|
74
|
-
|
75
|
-
@file_format.
|
85
|
+
format_filename = File.dirname(__FILE__) + '/../../lib/testing_format.rb'
|
86
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(format_filename)
|
87
|
+
@file_format.should be_kind_of(TestingFormat)
|
76
88
|
end
|
77
89
|
|
78
90
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::LineDefinition, :parsing do
|
4
4
|
|
@@ -35,11 +35,11 @@ end
|
|
35
35
|
|
36
36
|
describe RequestLogAnalyzer::LineDefinition, :converting do
|
37
37
|
|
38
|
-
include
|
38
|
+
include RequestLogAnalyzer::Spec::Helper
|
39
39
|
|
40
40
|
before(:each) do
|
41
|
-
@file_format =
|
42
|
-
@request = @file_format.
|
41
|
+
@file_format = testing_format
|
42
|
+
@request = @file_format.request
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should convert captures to a hash of converted values" do
|
@@ -48,10 +48,17 @@ describe RequestLogAnalyzer::LineDefinition, :converting do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should convert captures to a hash" do
|
51
|
-
hash = @file_format.line_definitions[:test].convert_captured_values(["
|
52
|
-
hash[:test_capture].should == 'Testing is
|
51
|
+
hash = @file_format.line_definitions[:test].convert_captured_values(["great", nil], @request)
|
52
|
+
hash[:test_capture].should == 'Testing is great'
|
53
53
|
hash[:duration].should be_nil
|
54
54
|
end
|
55
|
+
|
56
|
+
it "should merge a hash capture into the line hash" do
|
57
|
+
hash = @file_format.line_definitions[:eval].convert_captured_values(["{ 'greating' => 'hello', 'what' => 'world'}"], @request)
|
58
|
+
hash[:evaluated].should == "{ 'greating' => 'hello', 'what' => 'world'}"
|
59
|
+
hash[:greating].should == 'hello'
|
60
|
+
hash[:what].should == 'world'
|
61
|
+
end
|
55
62
|
|
56
63
|
|
57
64
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Source::LogParser, :merb do
|
4
|
-
include
|
4
|
+
include RequestLogAnalyzer::Spec::Helper
|
5
5
|
|
6
6
|
before(:each) do
|
7
7
|
@log_parser = RequestLogAnalyzer::Source::LogParser.new(RequestLogAnalyzer::FileFormat.load(:merb))
|
@@ -1,10 +1,11 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Source::LogParser, "Rails" do
|
4
|
-
include
|
4
|
+
include RequestLogAnalyzer::Spec::Helper
|
5
5
|
|
6
6
|
before(:each) do
|
7
|
-
@log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
7
|
+
@log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
8
|
+
RequestLogAnalyzer::FileFormat.load(:rails), :parse_strategy => 'cautious')
|
8
9
|
end
|
9
10
|
|
10
11
|
it "should have a valid language definitions" do
|
@@ -66,27 +67,34 @@ describe RequestLogAnalyzer::Source::LogParser, "Rails" do
|
|
66
67
|
end
|
67
68
|
|
68
69
|
it "should detect unordered requests in the logs" do
|
70
|
+
# No valid request should be found in cautious mode
|
69
71
|
@log_parser.should_not_receive(:handle_request)
|
70
72
|
# the first Processing-line will not give a warning, but the next one will
|
71
73
|
@log_parser.should_receive(:warn).with(:unclosed_request, anything).once
|
72
|
-
# Both Completed
|
74
|
+
# Both Completed lines will give a warning
|
73
75
|
@log_parser.should_receive(:warn).with(:no_current_request, anything).twice
|
76
|
+
|
74
77
|
@log_parser.parse_file(log_fixture(:rails_unordered))
|
75
78
|
end
|
76
79
|
end
|
77
80
|
|
78
|
-
describe
|
79
|
-
include
|
81
|
+
describe RequestLogAnalyzer::FileFormat::RailsDevelopment, "Rails with development details" do
|
82
|
+
include RequestLogAnalyzer::Spec::Helper
|
80
83
|
|
81
84
|
before(:each) do
|
82
85
|
@file_format = RequestLogAnalyzer::FileFormat.load(:rails_development)
|
83
|
-
@request = @file_format.
|
86
|
+
@request = @file_format.request
|
84
87
|
end
|
85
88
|
|
86
89
|
it "should have a valid language definitions" do
|
87
90
|
@file_format.should be_valid
|
88
91
|
end
|
89
92
|
|
93
|
+
it "should have a different line definer than Rails" do
|
94
|
+
rails = RequestLogAnalyzer::FileFormat.load(:rails)
|
95
|
+
rails.class.line_definer.should_not == @file_format.class.line_definer
|
96
|
+
end
|
97
|
+
|
90
98
|
it "should parse a rendered line" do
|
91
99
|
info = @file_format.line_definitions[:rendered].match_for("Rendered layouts/_footer (2.9ms)", @request)
|
92
100
|
info[:render_file].should == 'layouts/_footer'
|
@@ -97,25 +105,25 @@ describe "RequestLogAnalyzer::FileFormat::RailsDevelopment - Rails with developm
|
|
97
105
|
info = @file_format.line_definitions[:query_executed].match_for(" [4;36;1mUser Load (0.4ms)[0m [0;1mSELECT * FROM `users` WHERE (`users`.`id` = 18205844) [0m", @request)
|
98
106
|
info[:query_class].should == 'User'
|
99
107
|
info[:query_duration].should == 0.0004
|
100
|
-
info[:query_sql].should == 'SELECT * FROM
|
108
|
+
info[:query_sql].should == 'SELECT * FROM users WHERE (users.id = :int)'
|
101
109
|
end
|
102
110
|
|
103
111
|
it "should parse a query executed line without colors" do
|
104
112
|
info = @file_format.line_definitions[:query_executed].match_for(" User Load (0.4ms) SELECT * FROM `users` WHERE (`users`.`id` = 18205844) ", @request)
|
105
113
|
info[:query_class].should == 'User'
|
106
114
|
info[:query_duration].should == 0.0004
|
107
|
-
info[:query_sql].should == 'SELECT * FROM
|
115
|
+
info[:query_sql].should == 'SELECT * FROM users WHERE (users.id = :int)'
|
108
116
|
end
|
109
117
|
|
110
118
|
it "should parse a cached query line with colors" do
|
111
119
|
info = @file_format.line_definitions[:query_cached].match_for(' [4;35;1mCACHE (0.0ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 0) [0m', @request)
|
112
120
|
info[:cached_duration].should == 0.0
|
113
|
-
info[:cached_sql].should == 'SELECT * FROM
|
121
|
+
info[:cached_sql].should == 'SELECT * FROM users WHERE (users.id = :int)'
|
114
122
|
end
|
115
123
|
|
116
124
|
it "should parse a cached query line without colors" do
|
117
125
|
info = @file_format.line_definitions[:query_cached].match_for(' CACHE (0.0ms) SELECT * FROM `users` WHERE (`users`.`id` = 0) ', @request)
|
118
126
|
info[:cached_duration].should == 0.0
|
119
|
-
info[:cached_sql].should == 'SELECT * FROM
|
127
|
+
info[:cached_sql].should == 'SELECT * FROM users WHERE (users.id = :int)'
|
120
128
|
end
|
121
129
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe RequestLogAnalyzer::Filter::Anonymize, 'anonymize request' do
|
4
|
+
include RequestLogAnalyzer::Spec::Helper
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@filter = RequestLogAnalyzer::Filter::Anonymize.new(testing_format)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should anonimize ip" do
|
11
|
+
@filter.filter(request(:ip => '123.123.123.123'))[:ip].should_not eql('123.123.123.123')
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should anonimize url" do
|
15
|
+
@filter.filter(request(:url => 'https://test.mysite.com/employees'))[:url].should eql('http://example.com/employees')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should fuzz durations" do
|
19
|
+
@filter.filter(request(:duration => 100))[:duration].should_not eql(100)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe RequestLogAnalyzer::Filter::Field, 'string in accept mode' do
|
4
|
+
include RequestLogAnalyzer::Spec::Helper
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => 'test', :mode => :select)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should reject a request if the field value does not match" do
|
11
|
+
@filter.filter(request(:test => 'not test')).should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should reject a request if the field name does not match" do
|
15
|
+
@filter.filter(request(:testing => 'test')).should be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should accept a request if the both name and value match" do
|
19
|
+
@filter.filter(request(:test => 'test')).should_not be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should accept a request if the value is not the first value" do
|
23
|
+
@filter.filter(request([{:test => 'ignore'}, {:test => 'test'}])).should_not be_nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe RequestLogAnalyzer::Filter::Field, 'string in reject mode' do
|
28
|
+
include RequestLogAnalyzer::Spec::Helper
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
@filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => 'test', :mode => :reject)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should accept a request if the field value does not match" do
|
35
|
+
@filter.filter(request(:test => 'not test')).should_not be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should accept a request if the field name does not match" do
|
39
|
+
@filter.filter(request(:testing => 'test')).should_not be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should reject a request if the both name and value match" do
|
43
|
+
@filter.filter(request(:test => 'test')).should be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should reject a request if the value is not the first value" do
|
47
|
+
@filter.filter(request([{:test => 'ignore'}, {:test => 'test'}])).should be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe RequestLogAnalyzer::Filter::Field, 'regexp in accept mode' do
|
52
|
+
include RequestLogAnalyzer::Spec::Helper
|
53
|
+
|
54
|
+
before(:each) do
|
55
|
+
@filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => '/test/', :mode => :select)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should reject a request if the field value does not match" do
|
59
|
+
@filter.filter(request(:test => 'a working test')).should_not be_nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should reject a request if the field name does not match" do
|
63
|
+
@filter.filter(request(:testing => 'test')).should be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should accept a request if the value is not the first value" do
|
67
|
+
@filter.filter(request([{:test => 'ignore'}, {:test => 'testing 123'}])).should_not be_nil
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe RequestLogAnalyzer::Filter::Timespan, 'both before and after' do
|
4
|
+
include RequestLogAnalyzer::Spec::Helper
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :after => DateTime.parse('2009-01-01'), :before => DateTime.parse('2009-02-02'))
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should reject a request before the after date" do
|
11
|
+
@filter.filter(request(:timestamp => 20081212000000)).should be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should reject a request after the before date" do
|
15
|
+
@filter.filter(request(:timestamp => 20090303000000)).should be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should accept a request between the after and before dates" do
|
19
|
+
@filter.filter(request(:timestamp => 20090102000000)).should_not be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe RequestLogAnalyzer::Filter::Timespan, 'only before' do
|
24
|
+
include RequestLogAnalyzer::Spec::Helper
|
25
|
+
|
26
|
+
before(:each) do
|
27
|
+
@filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :before => DateTime.parse('2009-02-02'))
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should accept a request before the after date" do
|
31
|
+
@filter.filter(request(:timestamp => 20081212000000)).should_not be_nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should reject a request after the before date" do
|
35
|
+
@filter.filter(request(:timestamp => 20090303000000)).should be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should accept a request between the after and before dates" do
|
39
|
+
@filter.filter(request(:timestamp => 20090102000000)).should_not be_nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe RequestLogAnalyzer::Filter::Timespan, 'only after' do
|
44
|
+
include RequestLogAnalyzer::Spec::Helper
|
45
|
+
|
46
|
+
before(:each) do
|
47
|
+
@filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :after => DateTime.parse('2009-01-01'))
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should reject a request before the after date" do
|
51
|
+
@filter.filter(request(:timestamp => 20081212000000)).should be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should accept a request after the before date" do
|
55
|
+
@filter.filter(request(:timestamp => 20090303000000)).should_not be_nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should accept a request between the after and before dates" do
|
59
|
+
@filter.filter(request(:timestamp => 20090102000000)).should_not be_nil
|
60
|
+
end
|
61
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Source::LogParser, :requests do
|
4
|
-
include
|
4
|
+
include RequestLogAnalyzer::Spec::Helper
|
5
5
|
|
6
6
|
before(:each) do
|
7
|
-
@log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
7
|
+
@log_parser = RequestLogAnalyzer::Source::LogParser.new(testing_format)
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should have multiple line definitions" do
|
@@ -16,13 +16,13 @@ describe RequestLogAnalyzer::Source::LogParser, :requests do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should parse more lines than requests" do
|
19
|
-
@log_parser.should_receive(:handle_request).with(an_instance_of(
|
19
|
+
@log_parser.should_receive(:handle_request).with(an_instance_of(TestingFormat::Request)).twice
|
20
20
|
@log_parser.parse_file(log_fixture(:test_language_combined))
|
21
21
|
@log_parser.parsed_lines.should > 2
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should parse requests spanned over multiple files" do
|
25
|
-
@log_parser.should_receive(:handle_request).with(an_instance_of(
|
25
|
+
@log_parser.should_receive(:handle_request).with(an_instance_of(TestingFormat::Request)).once
|
26
26
|
@log_parser.parse_files([log_fixture(:multiple_files_1), log_fixture(:multiple_files_2)])
|
27
27
|
end
|
28
28
|
|
@@ -47,10 +47,10 @@ describe RequestLogAnalyzer::Source::LogParser, :requests do
|
|
47
47
|
end
|
48
48
|
|
49
49
|
describe RequestLogAnalyzer::Source::LogParser, :warnings do
|
50
|
-
include
|
50
|
+
include RequestLogAnalyzer::Spec::Helper
|
51
51
|
|
52
52
|
before(:each) do
|
53
|
-
@log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
53
|
+
@log_parser = RequestLogAnalyzer::Source::LogParser.new(testing_format, :parse_strategy => 'cautious')
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should warn about teaser matching problems" do
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Request, :incomplete_request do
|
4
4
|
|
5
|
-
include
|
5
|
+
include RequestLogAnalyzer::Spec::Helper
|
6
6
|
|
7
7
|
before(:each) do
|
8
|
-
@incomplete_request =
|
8
|
+
@incomplete_request = testing_format.request
|
9
9
|
@incomplete_request << { :line_type => :test, :lineno => 1, :test_capture => 'awesome!' }
|
10
10
|
end
|
11
11
|
|
@@ -34,10 +34,10 @@ end
|
|
34
34
|
|
35
35
|
describe RequestLogAnalyzer::Request, :completed_request do
|
36
36
|
|
37
|
-
include
|
37
|
+
include RequestLogAnalyzer::Spec::Helper
|
38
38
|
|
39
39
|
before(:each) do
|
40
|
-
@completed_request =
|
40
|
+
@completed_request = testing_format.request
|
41
41
|
@completed_request << { :line_type => :first, :lineno => 1, :name => 'first line!' }
|
42
42
|
@completed_request << { :line_type => :test, :lineno => 4, :test_capture => 'testing' }
|
43
43
|
@completed_request << { :line_type => :test, :lineno => 7, :test_capture => 'testing some more' }
|