indy 0.3.4 → 0.4.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +8 -0
- data/Guardfile +12 -0
- data/History.txt +6 -0
- data/README.md +43 -14
- data/Rakefile +7 -0
- data/features/step_definitions/find_by.steps.rb +1 -1
- data/features/step_definitions/log_file.steps.rb +1 -1
- data/features/step_definitions/time.steps.rb +6 -6
- data/indy.gemspec +21 -13
- data/lib/indy.rb +10 -2
- data/lib/indy/indy.rb +87 -408
- data/lib/indy/log_definition.rb +115 -0
- data/lib/indy/log_formats.rb +15 -7
- data/lib/indy/search.rb +147 -0
- data/lib/indy/source.rb +143 -50
- data/lib/indy/time.rb +78 -0
- data/lib/indy/version.rb +1 -1
- data/performance/large.log +40000 -0
- data/performance/profile_spec.rb +7 -7
- data/performance/time_large_file_spec.rb +18 -0
- data/spec/helper.rb +5 -3
- data/spec/indy_private_spec.rb +24 -0
- data/spec/indy_spec.rb +153 -226
- data/spec/indy_struct_spec.rb +43 -0
- data/spec/log_definition_spec.rb +75 -0
- data/spec/log_format_spec.rb +62 -50
- data/spec/search_spec.rb +15 -25
- data/spec/source_spec.rb +43 -35
- data/spec/time_scope_spec.rb +162 -0
- data/spec/time_spec.rb +26 -192
- metadata +264 -164
- data/.autotest +0 -18
- data/.rvmrc +0 -1
- data/autotest/discover.rb +0 -2
- data/lib/indy/formats.rb +0 -3
- data/lib/indy/notes.txt +0 -9
- data/lib/indy/result_set.rb +0 -8
- data/lib/scanf.rb +0 -13
- data/spec/last_spec.rb +0 -42
- data/spec/result_set_spec.rb +0 -36
@@ -0,0 +1,43 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/helper"
|
2
|
+
|
3
|
+
describe 'Indy' do
|
4
|
+
|
5
|
+
context 'Struct::Entry' do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
log = [ "2000-09-07 14:06:41 INFO MyApp - Entering APPLICATION.",
|
9
|
+
"2000-09-07 14:07:42 DEBUG MyApp - Initializing APPLICATION.",
|
10
|
+
"2000-09-07 14:07:43 INFO MyApp - Exiting APPLICATION."].join("\n")
|
11
|
+
@entry_struct = Indy.search(log).all[1]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be returned by #for search" do
|
15
|
+
@entry_struct.should be_kind_of Struct::Entry
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should contain entire log entry as :raw_entry" do
|
19
|
+
@entry_struct.raw_entry.should == "2000-09-07 14:07:42 DEBUG MyApp - Initializing APPLICATION."
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'using Indy::DEFAULT_LOG_FORMAT' do
|
23
|
+
|
24
|
+
it "should contain :time" do
|
25
|
+
@entry_struct.time.should == "2000-09-07 14:07:42"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should contain :severity" do
|
29
|
+
@entry_struct.severity.should == "DEBUG"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should contain :application" do
|
33
|
+
@entry_struct.application.should == "MyApp"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should contain :message" do
|
37
|
+
@entry_struct.message.should == "Initializing APPLICATION."
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../lib/indy/log_definition")
|
2
|
+
|
3
|
+
describe 'Indy::LogDefinition' do
|
4
|
+
|
5
|
+
context '#new' do
|
6
|
+
|
7
|
+
context "with a valid hash" do
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
@ld = Indy::LogDefinition.new(:entry_regexp => /foo/, :entry_fields => [:field_one], :time_format => '%M-%d-%Y')
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should set entry_regexp" do
|
14
|
+
@ld.entry_regexp.should eq /foo/
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should set entry_fields" do
|
18
|
+
@ld.entry_fields.should eq [:field_one]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should set time_format" do
|
22
|
+
@ld.time_format.should eq '%M-%d-%Y'
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should raise ArgumentError when missing entry_fields" do
|
28
|
+
lambda{ Indy::LogDefinition.new(:entry_regexp => /foo/) }.should raise_error ArgumentError
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should raise ArgumentError when missing entry_regexp" do
|
32
|
+
lambda{ Indy::LogDefinition.new(:entry_fields => [:field_one]) }.should raise_error ArgumentError
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'private method' do
|
38
|
+
|
39
|
+
before(:each) do
|
40
|
+
@ld = Indy::LogDefinition.new(:entry_regexp => /^(\S+) (\S+) (.+)$/,
|
41
|
+
:entry_fields => [:time, :severity, :message],
|
42
|
+
:time_format => '%M-%d-%Y')
|
43
|
+
@field_captures = "2000-09-07 INFO The message!".match(@ld.entry_regexp).to_a
|
44
|
+
end
|
45
|
+
|
46
|
+
context "#parse_entry" do
|
47
|
+
|
48
|
+
it "should return a hash" do
|
49
|
+
@ld.send(:parse_entry, "2000-09-07 INFO The message!").class.should == Hash
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return correct key/value pairs" do
|
53
|
+
hash = @ld.send(:parse_entry, "2000-09-07 INFO The message!")
|
54
|
+
hash[:time].should == "2000-09-07"
|
55
|
+
hash[:message].should == "The message!"
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context "#parse_entry_captures" do
|
61
|
+
|
62
|
+
it "should return a hash" do
|
63
|
+
@ld.send(:parse_entry_captures, @field_captures).class.should == Hash
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should contain key/value pairs" do
|
67
|
+
hash = @ld.send(:parse_entry_captures, @field_captures)
|
68
|
+
hash[:time].should == "2000-09-07"
|
69
|
+
hash[:message].should == "The message!"
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
data/spec/log_format_spec.rb
CHANGED
@@ -2,57 +2,69 @@ require "#{File.dirname(__FILE__)}/helper"
|
|
2
2
|
|
3
3
|
describe Indy do
|
4
4
|
|
5
|
-
context "
|
6
|
-
|
7
|
-
|
8
|
-
:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
:
|
13
|
-
:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
:
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
:
|
23
|
-
:
|
24
|
-
|
25
|
-
}
|
26
|
-
|
27
|
-
log4r_default_format = {
|
28
|
-
:name => 'log4r_default_format',
|
29
|
-
:source => ["DEBUG mylog: This is a message with level DEBUG",
|
30
|
-
" INFO mylog: This is a message with level INFO",
|
31
|
-
" WARN louie: This is a message with level WARN",
|
32
|
-
"ERROR mylog: This is a message with level ERROR",
|
33
|
-
"FATAL mylog: This is a message with level FATAL"].join("\n"),
|
34
|
-
:regexp => Indy::LogFormats::LOG4R_DEFAULT_REGEXP,
|
35
|
-
:fields => Indy::LogFormats::LOG4R_DEFAULT_FIELDS,
|
36
|
-
:test_field => :application
|
37
|
-
}
|
38
|
-
|
39
|
-
[ common_log_format,
|
40
|
-
combined_log_format,
|
41
|
-
log4r_default_format ].each do |format|
|
42
|
-
|
43
|
-
it "#{format[:name]} should work" do
|
44
|
-
indy = Indy.new(:source => format[:source], :log_format => [format[:regexp],format[:fields]].flatten)
|
45
|
-
result = indy.for(format[:test_field] => 'louie')
|
46
|
-
result.length.should == 1
|
47
|
-
end
|
48
|
-
|
49
|
-
it "#{format[:name]} @pattern can be set to the Indy::LogFormat const" do
|
50
|
-
indy = Indy.new(:source => format[:source], :log_format => eval('Indy::' + format[:name].upcase))
|
51
|
-
result = indy.for(format[:test_field] => 'louie')
|
52
|
-
result.length.should == 1
|
53
|
-
|
54
|
-
end
|
5
|
+
context "log format can be set to" do
|
6
|
+
|
7
|
+
it 'Indy::COMMON_LOG_FORMAT' do
|
8
|
+
source = ["127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb1.gif HTTP/1.0\" 200 2326",
|
9
|
+
"127.0.0.1 - frank [10/Oct/2000:13:55:37 -0700] \"GET /apache_pb1.gif HTTP/1.0\" 200 2326",
|
10
|
+
"127.0.0.1 - louie [10/Oct/2000:13:55:37 -0700] \"GET /apache_pb2.gif HTTP/1.0\" 200 2327",
|
11
|
+
"127.0.0.1 - frank [10/Oct/2000:13:55:38 -0700] \"GET /apache_pb3.gif HTTP/1.0\" 404 300"].join("\n")
|
12
|
+
indy = Indy.new(:source => source).with(Indy::COMMON_LOG_FORMAT)
|
13
|
+
result = indy.for(:authuser => 'louie')
|
14
|
+
result.length.should == 1
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'Indy::COMBINED_LOG_FORMAT' do
|
18
|
+
source = ["127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb1.gif HTTP/1.0\" 200 2326 \"http://www.example.com/start.html\" \"Mozilla/4.08 [en] (Win98; I ;Nav)\"",
|
19
|
+
"127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] \"GET /apache_pb1.gif HTTP/1.0\" 200 2326 \"http://www.example.com/start.html\" \"Mozilla/4.08 [en] (Win98; I ;Nav)\"",
|
20
|
+
"127.0.0.1 - louie [10/Oct/2000:13:55:37 -0700] \"GET /apache_pb2.gif HTTP/1.0\" 200 2327 \"http://www.example.com/start.html\" \"Mozilla/4.08 [en] (Win98; I ;Nav)\"",
|
21
|
+
"127.0.0.1 - frank [10/Oct/2000:13:55:38 -0700] \"GET /apache_pb3.gif HTTP/1.0\" 404 300 \"http://www.example.com/start.html\" \"Mozilla/4.08 [en] (Win98; I ;Nav)\""].join("\n")
|
22
|
+
indy = Indy.new(:source => source).with(Indy::COMBINED_LOG_FORMAT)
|
23
|
+
result = indy.for(:authuser => 'louie')
|
24
|
+
result.length.should == 1
|
55
25
|
end
|
26
|
+
|
27
|
+
it 'Indy::LOG4R_DEFAULT_FORMAT' do
|
28
|
+
# http://log4r.rubyforge.org/rdoc/Log4r/rdoc/patternformatter.html
|
29
|
+
source = ["DEBUG mylog: This is a message with level DEBUG",
|
30
|
+
" INFO mylog: This is a message with level INFO",
|
31
|
+
" WARN louie: This is a message with level WARN",
|
32
|
+
"ERROR mylog: This is a message with level ERROR",
|
33
|
+
"FATAL mylog: This is a message with level FATAL"].join("\n")
|
34
|
+
indy = Indy.new(:source => source)
|
35
|
+
indy.with(Indy::LOG4R_DEFAULT_FORMAT)
|
36
|
+
result = indy.for(:application => 'louie')
|
37
|
+
result.length.should == 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'Indy::LOG4J_DEFAULT_FORMAT' do
|
41
|
+
# http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
|
42
|
+
source = ["This is a message with level DEBUG",
|
43
|
+
"This is a message with level INFO",
|
44
|
+
"This is a message with level WARN",
|
45
|
+
"This is a message with level ERROR",
|
46
|
+
"This is a message with level FATAL"].join("\n")
|
47
|
+
indy = Indy.new(:source => source).with(Indy::LOG4J_DEFAULT_FORMAT)
|
48
|
+
indy.all.length.should == 5
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
# http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/TTCCLayout.html
|
54
|
+
# example:
|
55
|
+
# 176 [main] INFO org.apache.log4j.examples.Sort - Populating an array of 2 elements in reverse order.
|
56
|
+
it "should accept a log4j TTCC layout regex without error" do
|
57
|
+
log_data =
|
58
|
+
"343 [main] INFO org.apache.log4j.examples.Sort - The next log statement should be an error message.
|
59
|
+
346 [main] ERROR org.apache.log4j.examples.SortAlgo.DUMP - Tried to dump an uninitialized array.
|
60
|
+
at org.apache.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
|
61
|
+
at org.apache.log4j.examples.Sort.main(Sort.java:64)
|
62
|
+
467 [main] INFO org.apache.log4j.examples.Sort - Exiting main method."
|
63
|
+
|
64
|
+
Indy.new( :source => log_data,
|
65
|
+
:entry_regexp => /^(\d{3})\s+\[(\S+)\]\s+(\S+)\s+(\S+)\s*([^-]*)\s*-\s+(.+?)(?=\n\d{3}|\Z)/m,
|
66
|
+
:entry_fields => [:time, :thread, :level, :category, :diagnostic, :message]
|
67
|
+
).class.should == Indy
|
56
68
|
end
|
57
69
|
|
58
70
|
end
|
data/spec/search_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'tempfile'
|
|
3
3
|
|
4
4
|
describe Indy do
|
5
5
|
|
6
|
-
context "search with string" do
|
6
|
+
context "#search with string param" do
|
7
7
|
|
8
8
|
before(:each) do
|
9
9
|
log_string = ["2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
@@ -12,8 +12,8 @@ describe Indy do
|
|
12
12
|
@indy = Indy.search(log_string)
|
13
13
|
end
|
14
14
|
|
15
|
-
it "should return
|
16
|
-
@indy.
|
15
|
+
it "should return all entries" do
|
16
|
+
@indy.all.length.should == 3
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should search entire string on each successive search" do
|
@@ -24,9 +24,9 @@ describe Indy do
|
|
24
24
|
|
25
25
|
end
|
26
26
|
|
27
|
-
context "search file" do
|
27
|
+
context "#search with :file param" do
|
28
28
|
|
29
|
-
before(:
|
29
|
+
before(:each) do
|
30
30
|
@file = Tempfile.new('file_search_spec')
|
31
31
|
@file.write([ "2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
32
32
|
"2000-09-07 14:08:41 INFO MyOtherApp - Exiting APPLICATION.",
|
@@ -48,54 +48,44 @@ describe Indy do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should search reopened file on each successive search" do
|
51
|
+
@indy.for(:application => 'MyApp').length.should == 2
|
51
52
|
@file.write("\n2000-09-07 14:10:55 INFO MyApp - really really Exiting APPLICATION.\n")
|
52
53
|
@file.flush
|
53
54
|
@indy.for(:application => 'MyApp').length.should == 3
|
54
|
-
@indy.for(:severity => 'INFO').length.should == 4
|
55
|
-
@indy.for(:application => 'MyApp').length.should == 3
|
56
55
|
end
|
57
56
|
|
58
57
|
end
|
59
58
|
|
60
|
-
context "search
|
59
|
+
context "#search with :cmd param" do
|
61
60
|
|
62
|
-
before(:
|
61
|
+
before(:each) do
|
63
62
|
@file = Tempfile.new('file_search_spec')
|
64
|
-
|
63
|
+
file_name = File.basename(@file.path)
|
64
|
+
Dir.chdir(File.dirname(@file.path))
|
65
65
|
@file.write([ "2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
66
66
|
"2000-09-07 14:08:41 INFO MyOtherApp - Exiting APPLICATION.",
|
67
67
|
"2000-09-07 14:10:55 INFO MyApp - Exiting APPLICATION."
|
68
68
|
].join("\n"))
|
69
69
|
@file.flush
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
cmd = is_windows? ?
|
71
|
+
"type #{file_name}" :
|
72
|
+
"cat #{file_name}"
|
73
73
|
@indy = Indy.search(:cmd => cmd)
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should return 2 records" do
|
77
|
-
@indy.for(:application => 'MyApp').length.should == 2
|
78
77
|
results = @indy.for(:application => 'MyApp')
|
79
|
-
results.
|
80
|
-
results.last.severity.should == 'INFO'
|
81
|
-
results.last.application.should == 'MyApp'
|
82
|
-
results.last.message.should == 'Exiting APPLICATION.'
|
83
|
-
results.last._time.class.should_not be_nil
|
84
|
-
|
78
|
+
results.length.should == 2
|
85
79
|
end
|
86
80
|
|
87
81
|
it "should execute cmd on each successive search" do
|
88
82
|
@indy.for(:application => 'MyApp').length.should == 2
|
89
83
|
@indy.for(:severity => 'INFO').length.should == 3
|
90
|
-
|
91
84
|
@file.write("\n2000-09-07 14:10:55 DEBUG MyApp - really really Exiting APPLICATION.\n")
|
92
85
|
@file.flush
|
93
|
-
|
94
86
|
@indy.for(:application => 'MyApp').length.should == 3
|
95
87
|
@indy.for(:severity => 'INFO').length.should == 3
|
96
88
|
end
|
97
89
|
|
98
|
-
|
99
90
|
end
|
100
|
-
|
101
|
-
end
|
91
|
+
end
|
data/spec/source_spec.rb
CHANGED
@@ -4,42 +4,51 @@ class Indy
|
|
4
4
|
|
5
5
|
describe Source do
|
6
6
|
|
7
|
-
|
8
|
-
lambda{ Source.new }.should raise_error( ArgumentError )
|
9
|
-
end
|
7
|
+
context "#new" do
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
it "should raise without parameter" do
|
10
|
+
lambda{ Source.new }.should raise_error( ArgumentError )
|
11
|
+
end
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
13
|
+
it "should raise with nil parameter" do
|
14
|
+
lambda{ Source.new(nil) }.should raise_error( Indy::Source::Invalid )
|
15
|
+
end
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
it "should raise with bad parameter" do
|
18
|
+
class NotString;end
|
19
|
+
lambda{ Source.new(NotString.new) }.should raise_error( Indy::Source::Invalid )
|
20
|
+
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
it "should raise if #execute_command returns empty string" do
|
23
|
+
IO.stub!(:popen).and_return('')
|
24
|
+
lambda{ Source.new(:cmd => 'a faux command').open }.should raise_error(Indy::Source::Invalid)
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
it "should return Indy::Source object" do
|
28
|
+
Source.new('logdata').class.should == Indy::Source
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
it "should respond to :open" do
|
32
|
+
Source.new('logdata').should respond_to(:open)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should respond to :num_entries" do
|
36
|
+
Source.new('logdata').should respond_to(:num_entries)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should respond to :entries" do
|
40
|
+
Source.new('logdata').should respond_to(:entries)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should handle Files" do
|
44
|
+
require 'tempfile'
|
45
|
+
Source.new(Tempfile.new('x')).class.should == Indy::Source
|
46
|
+
end
|
35
47
|
|
36
|
-
it "should handle Files" do
|
37
|
-
require 'tempfile'
|
38
|
-
Source.new(Tempfile.new('x')).class.should == Indy::Source
|
39
48
|
end
|
40
49
|
|
41
50
|
context "instance" do
|
42
|
-
|
51
|
+
|
43
52
|
before(:each) do
|
44
53
|
log = [ "2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
45
54
|
"2000-09-07 14:07:42 DEBUG MyApp - Initializing APPLICATION.",
|
@@ -47,18 +56,18 @@ class Indy
|
|
47
56
|
].join("\n")
|
48
57
|
@source = Source.new(log)
|
49
58
|
end
|
50
|
-
|
59
|
+
|
51
60
|
it "should return StringIO from :open" do
|
52
|
-
@source.open.class.should ==
|
61
|
+
@source.open.class.should == Array
|
53
62
|
end
|
54
63
|
|
55
|
-
it "should return
|
56
|
-
@source.
|
57
|
-
@source.
|
64
|
+
it "should return entries array from :entries" do
|
65
|
+
@source.entries.class.should == Array
|
66
|
+
@source.entries.length.should == 3
|
58
67
|
end
|
59
68
|
|
60
|
-
it "should return 3 from :
|
61
|
-
@source.
|
69
|
+
it "should return 3 from :num_entries" do
|
70
|
+
@source.num_entries.should == 3
|
62
71
|
end
|
63
72
|
|
64
73
|
end
|
@@ -81,5 +90,4 @@ class Indy
|
|
81
90
|
end
|
82
91
|
|
83
92
|
end
|
84
|
-
|
85
|
-
end
|
93
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/helper"
|
2
|
+
|
3
|
+
describe Indy do
|
4
|
+
|
5
|
+
context "search time scope" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@indy = Indy.search(
|
9
|
+
[ "2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
10
|
+
"2000-09-07 14:07:42 INFO MyApp - Initializing APPLICATION.",
|
11
|
+
"2000-09-07 14:07:43 INFO MyApp - Configuring APPLICATION.",
|
12
|
+
"2000-09-07 14:07:44 INFO MyApp - Running APPLICATION.",
|
13
|
+
"2000-09-07 14:07:45 INFO MyApp - Exiting APPLICATION."
|
14
|
+
].join("\n") )
|
15
|
+
end
|
16
|
+
|
17
|
+
context "after method" do
|
18
|
+
|
19
|
+
it "should find the correct entries" do
|
20
|
+
@indy.after(:time => '2000-09-07 14:07:42').all.length.should == 3
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should find 0 entries with a time that is past the log" do
|
24
|
+
@indy.after(:time => '2000-09-07 14:07:46').all.length.should == 0
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should find all entries with a time that is before the log" do
|
28
|
+
@indy.after(:time => '2000-09-07 14:07:40').all.length.should == 5
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should find entries using inclusive" do
|
32
|
+
@indy.after(:time => '2000-09-07 14:07:42', :inclusive => true).all.length.should == 4
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context "before method" do
|
38
|
+
|
39
|
+
it "should find the correct entries" do
|
40
|
+
@indy.before(:time => '2000-09-07 14:07:44').all.length.should == 3
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should find 0 entries with a time that is before the log" do
|
44
|
+
@indy.before(:time => '2000-09-07 14:07:40').all.length.should == 0
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should find all entries with a time that is after the log" do
|
48
|
+
@indy.before(:time => '2000-09-07 14:07:47').all.length.should == 5
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should find entries using inclusive" do
|
52
|
+
@indy.before(:time => '2000-09-07 14:07:44', :inclusive => true).all.length.should == 4
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
context "within method" do
|
58
|
+
|
59
|
+
it "should find the correct entries" do
|
60
|
+
@indy.within(:start_time => '2000-09-07 14:07:41', :end_time => '2000-09-07 14:07:43').all.length.should == 1
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should find the correct entries using inclusive" do
|
64
|
+
@indy.within(:start_time => '2000-09-07 14:07:41', :end_time => '2000-09-07 14:07:43', :inclusive => true).all.length.should == 3
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
context "search time scopes with span" do
|
72
|
+
|
73
|
+
before(:each) do
|
74
|
+
@indy = Indy.search(
|
75
|
+
[ "2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
76
|
+
"2000-09-07 14:08:41 INFO MyApp - Initializing APPLICATION.",
|
77
|
+
"2000-09-07 14:09:41 INFO MyApp - Configuring APPLICATION.",
|
78
|
+
"2000-09-07 14:10:50 INFO MyApp - Running APPLICATION.",
|
79
|
+
"2000-09-07 14:11:42 INFO MyApp - Exiting APPLICATION.",
|
80
|
+
"2000-09-07 14:12:15 INFO MyApp - Exiting APPLICATION."
|
81
|
+
].join("\n") )
|
82
|
+
end
|
83
|
+
|
84
|
+
it "using after should find the correct entries" do
|
85
|
+
@indy.after(:time => '2000-09-07 14:07:42', :span => 1).all.length.should == 1
|
86
|
+
end
|
87
|
+
|
88
|
+
it "using before should find the correct entries" do
|
89
|
+
@indy.before(:time => '2000-09-07 14:12:00', :span => 4).all.length.should == 4
|
90
|
+
end
|
91
|
+
|
92
|
+
it "using around should find the correct entries" do
|
93
|
+
@indy.around(:time => '2000-09-07 14:11:00', :span => 2).all.length.should == 2
|
94
|
+
end
|
95
|
+
|
96
|
+
it "using after and inclusive should find the correct entries" do
|
97
|
+
@indy.after(:time => '2000-09-07 14:07:41', :span => 2, :inclusive => true).all.length.should == 3
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
context "multiple time scope methods on the same instance" do
|
103
|
+
|
104
|
+
before(:each) do
|
105
|
+
@indy = Indy.search(
|
106
|
+
[ "2000-09-07 14:07:41 INFO MyApp - Entering APPLICATION.",
|
107
|
+
"2000-09-07 14:07:42 INFO MyApp - Initializing APPLICATION.",
|
108
|
+
"2000-09-07 14:07:43 INFO MyApp - Configuring APPLICATION.",
|
109
|
+
"2000-09-07 14:07:44 INFO MyApp - Running APPLICATION.",
|
110
|
+
"2000-09-07 14:07:45 INFO MyApp - Exiting APPLICATION."
|
111
|
+
].join("\n") )
|
112
|
+
end
|
113
|
+
|
114
|
+
# Issue #3 (by design) assumed that the time scope.
|
115
|
+
it "should each add scope criteria to the instance" do
|
116
|
+
@indy.after(:time => '2000-09-07 14:07:42').all.length.should == 3
|
117
|
+
@indy.before(:time => '2000-09-07 14:07:45').all.length.should == 2
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should specify the entire scope if #reset_scope was called" do
|
121
|
+
@indy.after(:time => '2000-09-07 14:07:42').all.length.should == 3
|
122
|
+
@indy.reset_scope
|
123
|
+
@indy.before(:time => '2000-09-07 14:07:45').all.length.should == 4
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
context "explicit time format" do
|
129
|
+
|
130
|
+
before(:each) do
|
131
|
+
pattern = "^([^\s]+) (.*)$"
|
132
|
+
@indy = Indy.new(:time_format => '%m-%d-%Y',
|
133
|
+
:source => "1-13-2002 message\n1-14-2002 another message\n1-15-2002 another message",
|
134
|
+
:log_format => [pattern, :time, :message])
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should search within time scope using a different format than explicitly set" do
|
138
|
+
pending 'Flexible time date time formatting is not implemented'
|
139
|
+
@indy.after(:time => 'Jan 13 2002').all.length.should == 2
|
140
|
+
@indy.after(:time => 'Jan 14 2002').all.last._time.mday.should == 15
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should parse dates when log includes non-conforming data" do
|
146
|
+
logdata = [ "12-03-2000 message1",
|
147
|
+
"13-03-2000 message2",
|
148
|
+
"14-03-2000 ",
|
149
|
+
" message4",
|
150
|
+
"a14-03-2000 message5",
|
151
|
+
"14-03-2000 message6\n\n\n\n",
|
152
|
+
"15-03-2000 message7",
|
153
|
+
"16-03-2000 message8\r\n",
|
154
|
+
"17-03-2000 message9"].join("\n")
|
155
|
+
@indy = Indy.new(
|
156
|
+
:source => logdata,
|
157
|
+
:log_format => [/^(\d[^\s]+\d) (.+)$/, :time, :message])
|
158
|
+
@indy.after(:time => '13-03-2000')
|
159
|
+
@indy.all.length.should == 4
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|