ngmoco-request-log-analyzer 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/.gitignore +10 -0
  2. data/DESIGN.rdoc +41 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +39 -0
  5. data/Rakefile +8 -0
  6. data/bin/request-log-analyzer +114 -0
  7. data/lib/cli/command_line_arguments.rb +301 -0
  8. data/lib/cli/database_console.rb +26 -0
  9. data/lib/cli/database_console_init.rb +43 -0
  10. data/lib/cli/progressbar.rb +213 -0
  11. data/lib/cli/tools.rb +46 -0
  12. data/lib/request_log_analyzer.rb +44 -0
  13. data/lib/request_log_analyzer/aggregator.rb +49 -0
  14. data/lib/request_log_analyzer/aggregator/database_inserter.rb +83 -0
  15. data/lib/request_log_analyzer/aggregator/echo.rb +29 -0
  16. data/lib/request_log_analyzer/aggregator/summarizer.rb +175 -0
  17. data/lib/request_log_analyzer/controller.rb +332 -0
  18. data/lib/request_log_analyzer/database.rb +102 -0
  19. data/lib/request_log_analyzer/database/base.rb +115 -0
  20. data/lib/request_log_analyzer/database/connection.rb +38 -0
  21. data/lib/request_log_analyzer/database/request.rb +22 -0
  22. data/lib/request_log_analyzer/database/source.rb +13 -0
  23. data/lib/request_log_analyzer/database/warning.rb +14 -0
  24. data/lib/request_log_analyzer/file_format.rb +160 -0
  25. data/lib/request_log_analyzer/file_format/amazon_s3.rb +71 -0
  26. data/lib/request_log_analyzer/file_format/apache.rb +141 -0
  27. data/lib/request_log_analyzer/file_format/merb.rb +67 -0
  28. data/lib/request_log_analyzer/file_format/rack.rb +11 -0
  29. data/lib/request_log_analyzer/file_format/rails.rb +176 -0
  30. data/lib/request_log_analyzer/file_format/rails_development.rb +12 -0
  31. data/lib/request_log_analyzer/filter.rb +30 -0
  32. data/lib/request_log_analyzer/filter/anonymize.rb +39 -0
  33. data/lib/request_log_analyzer/filter/field.rb +42 -0
  34. data/lib/request_log_analyzer/filter/timespan.rb +45 -0
  35. data/lib/request_log_analyzer/line_definition.rb +111 -0
  36. data/lib/request_log_analyzer/log_processor.rb +99 -0
  37. data/lib/request_log_analyzer/mailer.rb +62 -0
  38. data/lib/request_log_analyzer/output.rb +113 -0
  39. data/lib/request_log_analyzer/output/fixed_width.rb +220 -0
  40. data/lib/request_log_analyzer/output/html.rb +184 -0
  41. data/lib/request_log_analyzer/request.rb +175 -0
  42. data/lib/request_log_analyzer/source.rb +72 -0
  43. data/lib/request_log_analyzer/source/database_loader.rb +87 -0
  44. data/lib/request_log_analyzer/source/log_parser.rb +274 -0
  45. data/lib/request_log_analyzer/tracker.rb +206 -0
  46. data/lib/request_log_analyzer/tracker/duration.rb +104 -0
  47. data/lib/request_log_analyzer/tracker/frequency.rb +95 -0
  48. data/lib/request_log_analyzer/tracker/hourly_spread.rb +107 -0
  49. data/lib/request_log_analyzer/tracker/timespan.rb +81 -0
  50. data/lib/request_log_analyzer/tracker/traffic.rb +106 -0
  51. data/request-log-analyzer.gemspec +40 -0
  52. data/spec/database.yml +23 -0
  53. data/spec/fixtures/apache_combined.log +5 -0
  54. data/spec/fixtures/apache_common.log +10 -0
  55. data/spec/fixtures/decompression.log +12 -0
  56. data/spec/fixtures/decompression.log.bz2 +0 -0
  57. data/spec/fixtures/decompression.log.gz +0 -0
  58. data/spec/fixtures/decompression.log.zip +0 -0
  59. data/spec/fixtures/decompression.tar.gz +0 -0
  60. data/spec/fixtures/decompression.tgz +0 -0
  61. data/spec/fixtures/header_and_footer.log +6 -0
  62. data/spec/fixtures/merb.log +84 -0
  63. data/spec/fixtures/merb_prefixed.log +9 -0
  64. data/spec/fixtures/multiple_files_1.log +5 -0
  65. data/spec/fixtures/multiple_files_2.log +2 -0
  66. data/spec/fixtures/rails.db +0 -0
  67. data/spec/fixtures/rails_1x.log +59 -0
  68. data/spec/fixtures/rails_22.log +12 -0
  69. data/spec/fixtures/rails_22_cached.log +10 -0
  70. data/spec/fixtures/rails_unordered.log +24 -0
  71. data/spec/fixtures/syslog_1x.log +5 -0
  72. data/spec/fixtures/test_file_format.log +13 -0
  73. data/spec/fixtures/test_language_combined.log +14 -0
  74. data/spec/fixtures/test_order.log +16 -0
  75. data/spec/integration/command_line_usage_spec.rb +84 -0
  76. data/spec/integration/munin_plugins_rails_spec.rb +58 -0
  77. data/spec/integration/scout_spec.rb +151 -0
  78. data/spec/lib/helpers.rb +52 -0
  79. data/spec/lib/macros.rb +18 -0
  80. data/spec/lib/matchers.rb +77 -0
  81. data/spec/lib/mocks.rb +76 -0
  82. data/spec/lib/testing_format.rb +46 -0
  83. data/spec/spec_helper.rb +24 -0
  84. data/spec/unit/aggregator/database_inserter_spec.rb +93 -0
  85. data/spec/unit/aggregator/summarizer_spec.rb +26 -0
  86. data/spec/unit/controller/controller_spec.rb +41 -0
  87. data/spec/unit/controller/log_processor_spec.rb +18 -0
  88. data/spec/unit/database/base_class_spec.rb +183 -0
  89. data/spec/unit/database/connection_spec.rb +34 -0
  90. data/spec/unit/database/database_spec.rb +133 -0
  91. data/spec/unit/file_format/amazon_s3_format_spec.rb +49 -0
  92. data/spec/unit/file_format/apache_format_spec.rb +203 -0
  93. data/spec/unit/file_format/file_format_api_spec.rb +69 -0
  94. data/spec/unit/file_format/line_definition_spec.rb +75 -0
  95. data/spec/unit/file_format/merb_format_spec.rb +52 -0
  96. data/spec/unit/file_format/rails_format_spec.rb +164 -0
  97. data/spec/unit/filter/anonymize_filter_spec.rb +21 -0
  98. data/spec/unit/filter/field_filter_spec.rb +66 -0
  99. data/spec/unit/filter/filter_spec.rb +17 -0
  100. data/spec/unit/filter/timespan_filter_spec.rb +58 -0
  101. data/spec/unit/mailer_spec.rb +30 -0
  102. data/spec/unit/request_spec.rb +111 -0
  103. data/spec/unit/source/log_parser_spec.rb +119 -0
  104. data/spec/unit/tracker/duration_tracker_spec.rb +130 -0
  105. data/spec/unit/tracker/frequency_tracker_spec.rb +88 -0
  106. data/spec/unit/tracker/hourly_spread_spec.rb +79 -0
  107. data/spec/unit/tracker/timespan_tracker_spec.rb +73 -0
  108. data/spec/unit/tracker/tracker_api_spec.rb +124 -0
  109. data/spec/unit/tracker/traffic_tracker_spec.rb +107 -0
  110. data/tasks/github-gem.rake +323 -0
  111. data/tasks/request_log_analyzer.rake +26 -0
  112. metadata +220 -0
@@ -0,0 +1,75 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::LineDefinition do
4
+
5
+ before(:each) do
6
+ @line_definition = RequestLogAnalyzer::LineDefinition.new(:test, {
7
+ :teaser => /Testing /,
8
+ :regexp => /Testing (\w+), tries\: (\d+)/,
9
+ :captures => [{ :name => :what, :type => :string }, { :name => :tries, :type => :integer }]
10
+ })
11
+ end
12
+
13
+ describe '#matches' do
14
+
15
+ it "should return false on an unmatching line" do
16
+ @line_definition.matches("nonmatching").should be_false
17
+ end
18
+
19
+ it "should return false when only the teaser matches" do
20
+ @line_definition.matches("Testing LineDefinition").should be_false
21
+ end
22
+
23
+ it "should parse a line and capture the expected values" do
24
+ @line_definition.matches("Testing LineDefinition, tries: 123").should == {:line_definition => @line_definition, :captures => ['LineDefinition', '123'] }
25
+ end
26
+
27
+ it "should know which names it can capture" do
28
+ @line_definition.captures?(:what).should be_true
29
+ @line_definition.captures?(:tries).should be_true
30
+ @line_definition.captures?(:bogus).should be_false
31
+ end
32
+
33
+ end
34
+
35
+ describe '#convert_captured_values' do
36
+
37
+ before(:each) do
38
+ @request = mock('request')
39
+ @request.stub!(:convert_value).and_return('foo')
40
+ end
41
+
42
+ it "should call convert_value for every captured value" do
43
+ @request.should_receive(:convert_value).twice
44
+ @line_definition.convert_captured_values(['test', '123'], @request)
45
+ end
46
+
47
+ it "should set the converted values" do
48
+ @line_definition.convert_captured_values(['test', '123'], @request).should == {:what => 'foo', :tries => 'foo'}
49
+ end
50
+
51
+ context 'when using :provides option' do
52
+ before(:each) do
53
+ @ld = RequestLogAnalyzer::LineDefinition.new(:test, :regexp => /Hash\: (\{.+\})/,
54
+ :captures => [{ :name => :hash, :type => :hash, :provides => {:bar => :string}}])
55
+
56
+ @request = mock('request')
57
+
58
+ @request.stub!(:convert_value).with("{:bar=>'baz'}", anything).and_return(:bar => 'baz')
59
+ @request.stub!(:convert_value).with('baz', anything).and_return('foo')
60
+ end
61
+
62
+ it "should call Request#convert_value for the initial hash and the value in the hash" do
63
+ @request.should_receive(:convert_value).with("{:bar=>'baz'}", anything).and_return(:bar => 'baz')
64
+ @request.should_receive(:convert_value).with("baz", anything)
65
+ @ld.convert_captured_values(["{:bar=>'baz'}"], @request)
66
+ end
67
+
68
+ it "should set the provides fields" do
69
+ # The captures field must be set and converted as well
70
+ @ld.convert_captured_values(["{:bar=>'baz'}"], @request)[:bar].should eql('foo')
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::FileFormat::Merb do
4
+
5
+ it "should be a valid file format" do
6
+ RequestLogAnalyzer::FileFormat.load(:merb).should be_valid
7
+ end
8
+
9
+ describe '#parse_line' do
10
+ before(:each) do
11
+ @file_format = RequestLogAnalyzer::FileFormat.load(:merb)
12
+ end
13
+
14
+ it "should parse a :started line correctly" do
15
+ line = '~ Started request handling: Fri Aug 29 11:10:23 +0200 2008'
16
+ @file_format.should parse_line(line).as(:started).and_capture(:timestamp => 20080829111023)
17
+ end
18
+
19
+ it "should parse a prefixed :started line correctly" do
20
+ line = '~ Aug 31 18:35:24 typekit-web001 merb: ~ Started request handling: Mon Aug 31 18:35:25 +0000 2009'
21
+ @file_format.should parse_line(line).as(:started).and_capture(:timestamp => 20090831183525)
22
+ end
23
+
24
+ it "should parse a :params line correctly" do
25
+ line = '~ Params: {"_method"=>"delete", "authenticity_token"=>"[FILTERED]", "action"=>"delete", "controller"=>"session"}'
26
+ @file_format.should parse_line(line).as(:params).and_capture(:controller => 'session', :action => 'delete', :namespace => nil)
27
+ end
28
+
29
+ it "should parse a :completed line correctly" do
30
+ line = '~ {:dispatch_time=>0.006117, :after_filters_time=>6.1e-05, :before_filters_time=>0.000712, :action_time=>0.005833}'
31
+ @file_format.should parse_line(line).as(:completed).and_capture(:dispatch_time => 0.006117,
32
+ :before_filters_time => 0.000712, :action_time => 0.005833, :after_filters_time => 6.1e-05)
33
+ end
34
+ end
35
+
36
+ describe '#parse_io' do
37
+ before(:each) do
38
+ @log_parser = RequestLogAnalyzer::Source::LogParser.new(RequestLogAnalyzer::FileFormat.load(:merb))
39
+ end
40
+
41
+ it "should parse a stream and find valid Merb requests" do
42
+ @log_parser.parse_file(log_fixture(:merb)) do |request|
43
+ request.should be_kind_of(RequestLogAnalyzer::FileFormat::Merb::Request)
44
+ end
45
+ end
46
+
47
+ it "should find 11 completed requests" do
48
+ @log_parser.should_receive(:handle_request).exactly(11).times
49
+ @log_parser.parse_file(log_fixture(:merb))
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,164 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::FileFormat::Rails do
4
+
5
+ describe '.create' do
6
+
7
+ context 'without providing a lines argument' do
8
+ before(:each) { @rails = RequestLogAnalyzer::FileFormat.load(:rails) }
9
+
10
+ it "should create a valid file format" do
11
+ @rails.should be_valid
12
+ end
13
+
14
+ it "should parse the production lines" do
15
+ production_rails = RequestLogAnalyzer::FileFormat.load(:rails, 'production')
16
+ @rails.line_definitions.should == production_rails.line_definitions
17
+ end
18
+ end
19
+
20
+ context 'using a comma separated list of lines as argument' do
21
+ before(:each) { @rails = RequestLogAnalyzer::FileFormat.load(:rails, 'minimal,failure') }
22
+
23
+ it "should return a valid language" do
24
+ @rails.should be_valid
25
+ end
26
+
27
+ it "should at least parse :processing and :completed lines" do
28
+ @rails.line_definitions.should include(:processing, :completed, :failure)
29
+ end
30
+ end
31
+
32
+ RequestLogAnalyzer::FileFormat::Rails::LINE_COLLECTIONS.keys.each do |constant|
33
+
34
+ context "using the '#{constant}' line collection constant" do
35
+ before(:each) { @rails = RequestLogAnalyzer::FileFormat.load(:rails, constant) }
36
+
37
+ it "should return a valid language" do
38
+ @rails.should be_valid
39
+ end
40
+
41
+ it "should at least parse :processing and :completed lines" do
42
+ @rails.line_definitions.should include(:processing, :completed)
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '#parse_line' do
49
+ before(:each) { @rails = RequestLogAnalyzer::FileFormat.load(:rails, :all) }
50
+
51
+ {'with prefix' => 'LINE PREFIX: ', 'without prefix' => '' }.each do |context, prefix|
52
+ context context do
53
+ it "should parse a :processing line correctly" do
54
+ line = prefix + 'Processing PeopleController#index (for 1.1.1.1 at 2008-08-14 21:16:30) [GET]'
55
+ @rails.should parse_line(line).as(:processing).and_capture(:controller => 'PeopleController', :action => 'index', :timestamp => 20080814211630, :method => 'GET')
56
+ end
57
+
58
+ it "should parse a Rails 2.1 style :completed line correctly" do
59
+ line = prefix + 'Completed in 0.21665 (4 reqs/sec) | Rendering: 0.00926 (4%) | DB: 0.00000 (0%) | 200 OK [http://demo.nu/employees]'
60
+ @rails.should parse_line(line).as(:completed).and_capture(:duration => 0.21665, :db => 0.0, :view => 0.00926, :status => 200, :url => 'http://demo.nu/employees')
61
+ end
62
+
63
+ it "should parse a Rails 2.2 style :completed line correctly" do
64
+ line = prefix + 'Completed in 614ms (View: 120, DB: 31) | 200 OK [http://floorplanner.local/demo]'
65
+ @rails.should parse_line(line).as(:completed).and_capture(:duration => 0.614, :db => 0.031, :view => 0.120, :status => 200, :url => 'http://floorplanner.local/demo')
66
+ end
67
+
68
+ it "should parse a :failure line with exception correctly" do
69
+ line = prefix + "NoMethodError (undefined method `update_domain_account' for nil:NilClass):"
70
+ @rails.should parse_line(line).as(:failure).and_capture(:error => 'NoMethodError', :message => "undefined method `update_domain_account' for nil:NilClass")
71
+ end
72
+
73
+ it "should parse a :cache_hit line correctly" do
74
+ line = prefix + 'Filter chain halted as [#<ActionController::Caching::Actions::ActionCacheFilter:0x2a999ad620 @check=nil, @options={:store_options=>{}, :layout=>nil, :cache_path=>#<Proc:0x0000002a999b8890@/app/controllers/cached_controller.rb:8>}>] rendered_or_redirected.'
75
+ @rails.should parse_line(line).as(:cache_hit)
76
+ end
77
+
78
+ it "should parse a :parameters line correctly" do
79
+ line = prefix + ' Parameters: {"action"=>"cached", "controller"=>"cached"}'
80
+ @rails.should parse_line(line).as(:parameters).and_capture(:params => {:action => 'cached', :controller => 'cached'})
81
+ end
82
+
83
+ it "should parse a :rendered line correctly" do
84
+ line = prefix + 'Rendered layouts/_footer (2.9ms)'
85
+ @rails.should parse_line(line).as(:rendered).and_capture(:render_file => 'layouts/_footer', :render_duration => 0.0029)
86
+ end
87
+
88
+ it "should parse a :query_executed line with colors" do
89
+ line = prefix + ' User Load (0.4ms) SELECT * FROM `users` WHERE (`users`.`id` = 18205844) '
90
+ @rails.should parse_line(line).as(:query_executed).and_capture(:query_class => 'User', :query_duration => 0.0004, :query_sql => 'SELECT * FROM users WHERE (users.id = :int)')
91
+ end
92
+
93
+ it "should parse a :query_executed line without colors" do
94
+ line = prefix + ' User Load (0.4ms) SELECT * FROM `users` WHERE (`users`.`id` = 18205844) '
95
+ @rails.should parse_line(line).as(:query_executed).and_capture(:query_class => 'User', :query_duration => 0.0004, :query_sql => 'SELECT * FROM users WHERE (users.id = :int)')
96
+ end
97
+
98
+ it "should parse a :query_cached line with colors" do
99
+ line = prefix + ' CACHE (0.0ms) SELECT * FROM `users` WHERE (`users`.`id` = 0) '
100
+ @rails.should parse_line(line).as(:query_cached).and_capture(:cached_duration => 0.0, :cached_sql => 'SELECT * FROM users WHERE (users.id = :int)')
101
+ end
102
+
103
+ it "should parse a :query_cached line without colors" do
104
+ line = prefix + ' CACHE (0.0ms) SELECT * FROM `users` WHERE (`users`.`id` = 0) '
105
+ @rails.should parse_line(line).as(:query_cached).and_capture(:cached_duration => 0.0, :cached_sql => 'SELECT * FROM users WHERE (users.id = :int)')
106
+ end
107
+
108
+ it "should not parse an unsupported line" do
109
+ line = prefix + 'nonsense line that should not be parsed as anything'
110
+ @rails.should_not parse_line(line)
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ describe '#parse_io' do
117
+ before(:each) do
118
+ @log_parser = RequestLogAnalyzer::Source::LogParser.new(
119
+ RequestLogAnalyzer::FileFormat.load(:rails), :parse_strategy => 'cautious')
120
+ end
121
+
122
+ it "should parse a Rails 2.1 style log and find valid Rails requests without warnings" do
123
+ request_counter.should_receive(:hit!).exactly(4).times
124
+ @log_parser.should_not_receive(:warn)
125
+
126
+ @log_parser.parse_file(log_fixture(:rails_1x)) do |request|
127
+ request_counter.hit! if request.kind_of?(RequestLogAnalyzer::FileFormat::Rails::Request) && request.completed?
128
+ end
129
+ end
130
+
131
+ it "should parse a Rails 2.2 style log and find valid Rails requests without warnings" do
132
+ request_counter.should_receive(:hit!).once
133
+ @log_parser.should_not_receive(:warn)
134
+
135
+ @log_parser.parse_file(log_fixture(:rails_22)) do |request|
136
+ request_counter.hit! if request.kind_of?(RequestLogAnalyzer::FileFormat::Rails::Request) && request.completed?
137
+ end
138
+ end
139
+
140
+ it "should parse a Rails SyslogLogger file with prefix and find valid requests without warnings" do
141
+ request_counter.should_receive(:hit!).once
142
+ @log_parser.should_not_receive(:warn)
143
+
144
+ @log_parser.parse_file(log_fixture(:syslog_1x)) do |request|
145
+ request_counter.hit! if request.kind_of?(RequestLogAnalyzer::FileFormat::Rails::Request) && request.completed?
146
+ end
147
+ end
148
+
149
+ it "should parse cached requests" do
150
+ @log_parser.should_not_receive(:warn)
151
+ @log_parser.parse_file(log_fixture(:rails_22_cached)) do |request|
152
+ request.should be_completed
153
+ request =~ :cache_hit
154
+ end
155
+ end
156
+
157
+ it "should detect unordered requests in the logs" do
158
+ @log_parser.should_not_receive(:handle_request)
159
+ @log_parser.should_receive(:warn).with(:unclosed_request, anything).once
160
+ @log_parser.should_receive(:warn).with(:no_current_request, anything).twice
161
+ @log_parser.parse_file(log_fixture(:rails_unordered))
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::Filter::Anonymize, 'anonymize request' do
4
+
5
+ before(:each) do
6
+ @filter = RequestLogAnalyzer::Filter::Anonymize.new(testing_format)
7
+ end
8
+
9
+ it "should anonimize ip" do
10
+ @filter.filter(request(:ip => '123.123.123.123'))[:ip].should_not eql('123.123.123.123')
11
+ end
12
+
13
+ it "should anonimize url" do
14
+ @filter.filter(request(:url => 'https://test.mysite.com/employees'))[:url].should eql('http://example.com/employees')
15
+ end
16
+
17
+ it "should fuzz durations" do
18
+ @filter.filter(request(:duration => 100))[:duration].should_not eql(100)
19
+ end
20
+
21
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::Filter::Field, 'string in accept mode' do
4
+
5
+ before(:each) do
6
+ @filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => 'test', :mode => :select)
7
+ end
8
+
9
+ it "should reject a request if the field value does not match" do
10
+ @filter.filter(request(:test => 'not test')).should be_nil
11
+ end
12
+
13
+ it "should reject a request if the field name does not match" do
14
+ @filter.filter(request(:testing => 'test')).should be_nil
15
+ end
16
+
17
+ it "should accept a request if the both name and value match" do
18
+ @filter.filter(request(:test => 'test')).should_not be_nil
19
+ end
20
+
21
+ it "should accept a request if the value is not the first value" do
22
+ @filter.filter(request([{:test => 'ignore'}, {:test => 'test'}])).should_not be_nil
23
+ end
24
+ end
25
+
26
+ describe RequestLogAnalyzer::Filter::Field, 'string in reject mode' do
27
+
28
+ before(:each) do
29
+ @filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => 'test', :mode => :reject)
30
+ end
31
+
32
+ it "should accept a request if the field value does not match" do
33
+ @filter.filter(request(:test => 'not test')).should_not be_nil
34
+ end
35
+
36
+ it "should accept a request if the field name does not match" do
37
+ @filter.filter(request(:testing => 'test')).should_not be_nil
38
+ end
39
+
40
+ it "should reject a request if the both name and value match" do
41
+ @filter.filter(request(:test => 'test')).should be_nil
42
+ end
43
+
44
+ it "should reject a request if the value is not the first value" do
45
+ @filter.filter(request([{:test => 'ignore'}, {:test => 'test'}])).should be_nil
46
+ end
47
+ end
48
+
49
+ describe RequestLogAnalyzer::Filter::Field, 'regexp in accept mode' do
50
+
51
+ before(:each) do
52
+ @filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => '/test/', :mode => :select)
53
+ end
54
+
55
+ it "should reject a request if the field value does not match" do
56
+ @filter.filter(request(:test => 'a working test')).should_not be_nil
57
+ end
58
+
59
+ it "should reject a request if the field name does not match" do
60
+ @filter.filter(request(:testing => 'test')).should be_nil
61
+ end
62
+
63
+ it "should accept a request if the value is not the first value" do
64
+ @filter.filter(request([{:test => 'ignore'}, {:test => 'testing 123'}])).should_not be_nil
65
+ end
66
+ end
@@ -0,0 +1,17 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::Filter::Base, 'base filter' do
4
+
5
+ before(:each) do
6
+ @filter = RequestLogAnalyzer::Filter::Base.new(testing_format)
7
+ end
8
+
9
+ it "should return everything" do
10
+ @filter.filter(request(:ip => '123.123.123.123'))[:ip].should eql('123.123.123.123')
11
+ end
12
+
13
+ it "should return nil on nil request" do
14
+ @filter.filter(nil).should be_nil
15
+ end
16
+
17
+ end
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe RequestLogAnalyzer::Filter::Timespan, 'both before and after' do
4
+
5
+ before(:each) do
6
+ @filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :after => DateTime.parse('2009-01-01'), :before => DateTime.parse('2009-02-02'))
7
+ end
8
+
9
+ it "should reject a request before the after date" do
10
+ @filter.filter(request(:timestamp => 20081212000000)).should be_nil
11
+ end
12
+
13
+ it "should reject a request after the before date" do
14
+ @filter.filter(request(:timestamp => 20090303000000)).should be_nil
15
+ end
16
+
17
+ it "should accept a request between the after and before dates" do
18
+ @filter.filter(request(:timestamp => 20090102000000)).should_not be_nil
19
+ end
20
+ end
21
+
22
+ describe RequestLogAnalyzer::Filter::Timespan, 'only before' do
23
+
24
+ before(:each) do
25
+ @filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :before => DateTime.parse('2009-02-02'))
26
+ end
27
+
28
+ it "should accept a request before the after date" do
29
+ @filter.filter(request(:timestamp => 20081212000000)).should_not be_nil
30
+ end
31
+
32
+ it "should reject a request after the before date" do
33
+ @filter.filter(request(:timestamp => 20090303000000)).should be_nil
34
+ end
35
+
36
+ it "should accept a request between the after and before dates" do
37
+ @filter.filter(request(:timestamp => 20090102000000)).should_not be_nil
38
+ end
39
+ end
40
+
41
+ describe RequestLogAnalyzer::Filter::Timespan, 'only after' do
42
+
43
+ before(:each) do
44
+ @filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :after => DateTime.parse('2009-01-01'))
45
+ end
46
+
47
+ it "should reject a request before the after date" do
48
+ @filter.filter(request(:timestamp => 20081212000000)).should be_nil
49
+ end
50
+
51
+ it "should accept a request after the before date" do
52
+ @filter.filter(request(:timestamp => 20090303000000)).should_not be_nil
53
+ end
54
+
55
+ it "should accept a request between the after and before dates" do
56
+ @filter.filter(request(:timestamp => 20090102000000)).should_not be_nil
57
+ end
58
+ end