TwP-logging 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +169 -0
- data/README.rdoc +102 -0
- data/Rakefile +42 -0
- data/data/bad_logging_1.rb +13 -0
- data/data/bad_logging_2.rb +21 -0
- data/data/logging.rb +42 -0
- data/data/logging.yaml +63 -0
- data/data/simple_logging.rb +13 -0
- data/lib/logging.rb +408 -0
- data/lib/logging/appender.rb +303 -0
- data/lib/logging/appenders/buffering.rb +167 -0
- data/lib/logging/appenders/console.rb +62 -0
- data/lib/logging/appenders/email.rb +75 -0
- data/lib/logging/appenders/file.rb +54 -0
- data/lib/logging/appenders/growl.rb +197 -0
- data/lib/logging/appenders/io.rb +69 -0
- data/lib/logging/appenders/rolling_file.rb +291 -0
- data/lib/logging/appenders/syslog.rb +201 -0
- data/lib/logging/config/configurator.rb +190 -0
- data/lib/logging/config/yaml_configurator.rb +195 -0
- data/lib/logging/layout.rb +119 -0
- data/lib/logging/layouts/basic.rb +34 -0
- data/lib/logging/layouts/pattern.rb +296 -0
- data/lib/logging/log_event.rb +51 -0
- data/lib/logging/logger.rb +490 -0
- data/lib/logging/repository.rb +172 -0
- data/lib/logging/root_logger.rb +61 -0
- data/lib/logging/stats.rb +278 -0
- data/lib/logging/utils.rb +130 -0
- data/logging.gemspec +41 -0
- data/test/appenders/test_buffered_io.rb +183 -0
- data/test/appenders/test_console.rb +66 -0
- data/test/appenders/test_email.rb +171 -0
- data/test/appenders/test_file.rb +93 -0
- data/test/appenders/test_growl.rb +128 -0
- data/test/appenders/test_io.rb +142 -0
- data/test/appenders/test_rolling_file.rb +207 -0
- data/test/appenders/test_syslog.rb +194 -0
- data/test/benchmark.rb +87 -0
- data/test/config/test_configurator.rb +70 -0
- data/test/config/test_yaml_configurator.rb +40 -0
- data/test/layouts/test_basic.rb +43 -0
- data/test/layouts/test_pattern.rb +177 -0
- data/test/setup.rb +74 -0
- data/test/test_appender.rb +166 -0
- data/test/test_layout.rb +110 -0
- data/test/test_log_event.rb +80 -0
- data/test/test_logger.rb +734 -0
- data/test/test_logging.rb +267 -0
- data/test/test_repository.rb +126 -0
- data/test/test_root_logger.rb +81 -0
- data/test/test_stats.rb +274 -0
- data/test/test_utils.rb +116 -0
- metadata +156 -0
@@ -0,0 +1,130 @@
|
|
1
|
+
|
2
|
+
class Hash
|
3
|
+
|
4
|
+
# call-seq:
|
5
|
+
# getopt( key, default = nil, :as => class )
|
6
|
+
#
|
7
|
+
# Returns the value associated with the _key_. If the has does not contain
|
8
|
+
# the _key_, then the _default_ value is returned.
|
9
|
+
#
|
10
|
+
# Optionally, the value can be converted into to an instance of the given
|
11
|
+
# _class_. The supported classes are:
|
12
|
+
#
|
13
|
+
# Integer
|
14
|
+
# Float
|
15
|
+
# Array
|
16
|
+
# String
|
17
|
+
# Symbol
|
18
|
+
#
|
19
|
+
# If the value is +nil+, then no converstion will be performed.
|
20
|
+
#
|
21
|
+
def getopt( *args )
|
22
|
+
opts = args.last.instance_of?(Hash) ? args.pop : {}
|
23
|
+
key, default = args
|
24
|
+
|
25
|
+
val = if has_key?(key); self[key]
|
26
|
+
elsif has_key?(key.to_s); self[key.to_s]
|
27
|
+
elsif has_key?(key.to_s.intern); self[key.to_s.intern]
|
28
|
+
else default end
|
29
|
+
|
30
|
+
return if val.nil?
|
31
|
+
return val unless opts.has_key?(:as)
|
32
|
+
|
33
|
+
case opts[:as].name.intern
|
34
|
+
when :Integer; Integer(val)
|
35
|
+
when :Float; Float(val)
|
36
|
+
when :Array; Array(val)
|
37
|
+
when :String; String(val)
|
38
|
+
when :Symbol; String(val).intern
|
39
|
+
else val end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class String
|
44
|
+
|
45
|
+
# call-seq:
|
46
|
+
# reduce( width, ellipses = '...' ) #=> string
|
47
|
+
#
|
48
|
+
# Reduce the size of the current string to the given _width_ by removing
|
49
|
+
# characters from the middle of the string and replacing them with
|
50
|
+
# _ellipses_. If the _width_ is greater than the length of the string, the
|
51
|
+
# string is returned unchanged. If the _width_ is less than the length of
|
52
|
+
# the _ellipses_, then the _ellipses_ are returned.
|
53
|
+
#
|
54
|
+
def reduce( width, ellipses = '...')
|
55
|
+
raise ArgumentError, "width cannot be negative: #{width}" if width < 0
|
56
|
+
|
57
|
+
return self if length <= width
|
58
|
+
|
59
|
+
remove = length - width + ellipses.length
|
60
|
+
return ellipses.dup if remove >= length
|
61
|
+
|
62
|
+
left_end = (length + 1 - remove) / 2
|
63
|
+
right_start = left_end + remove
|
64
|
+
|
65
|
+
left = self[0,left_end]
|
66
|
+
right = self[right_start,length-right_start]
|
67
|
+
|
68
|
+
left << ellipses << right
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class Module
|
73
|
+
|
74
|
+
# call-seq:
|
75
|
+
# logger_name #=> string
|
76
|
+
#
|
77
|
+
# Returns a predictable logger name for the current module or class. If
|
78
|
+
# used within an anonymous class, the first non-anonymous class name will
|
79
|
+
# be used as the logger name. If used within a meta-class, the name of the
|
80
|
+
# actual class will be used as the logger name. If used within an
|
81
|
+
# anonymous module, the string 'anonymous' will be returned.
|
82
|
+
#
|
83
|
+
def logger_name
|
84
|
+
return name unless name.nil? or name.empty?
|
85
|
+
|
86
|
+
# check if this is a metaclass (or eigenclass)
|
87
|
+
if ancestors.include? Class
|
88
|
+
inspect =~ %r/#<Class:([^#>]+)>/
|
89
|
+
return $1
|
90
|
+
end
|
91
|
+
|
92
|
+
# see if we have a superclass
|
93
|
+
if respond_to? :superclass
|
94
|
+
return superclass.logger_name
|
95
|
+
end
|
96
|
+
|
97
|
+
# we are an anonymous module
|
98
|
+
::Logging.log_internal(-2) {
|
99
|
+
'cannot return a predictable, unique name for anonymous modules'
|
100
|
+
}
|
101
|
+
return 'anonymous'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class ReentrantMutex < Mutex
|
106
|
+
|
107
|
+
def initialize
|
108
|
+
super
|
109
|
+
@locker = nil
|
110
|
+
end
|
111
|
+
|
112
|
+
alias :original_synchronize :synchronize
|
113
|
+
|
114
|
+
def synchronize
|
115
|
+
if @locker == Thread.current
|
116
|
+
yield
|
117
|
+
else
|
118
|
+
original_synchronize {
|
119
|
+
begin
|
120
|
+
@locker = Thread.current
|
121
|
+
yield
|
122
|
+
ensure
|
123
|
+
@locker = nil
|
124
|
+
end
|
125
|
+
}
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end # class ReentrantMutex
|
129
|
+
|
130
|
+
# EOF
|
data/logging.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{logging}
|
5
|
+
s.version = "0.9.7"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Tim Pease"]
|
9
|
+
s.date = %q{2009-02-23}
|
10
|
+
s.description = %q{Logging is a flexible logging library for use in Ruby programs based on the design of Java's log4j library. It features a hierarchical logging system, custom level names, multiple output destinations per log event, custom formatting, and more.}
|
11
|
+
s.email = %q{tim.pease@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["History.txt", "README.rdoc"]
|
13
|
+
s.files = ["History.txt", "README.rdoc", "Rakefile", "data/bad_logging_1.rb", "data/bad_logging_2.rb", "data/logging.rb", "data/logging.yaml", "data/simple_logging.rb", "lib/logging.rb", "lib/logging/appender.rb", "lib/logging/appenders/buffering.rb", "lib/logging/appenders/console.rb", "lib/logging/appenders/email.rb", "lib/logging/appenders/file.rb", "lib/logging/appenders/growl.rb", "lib/logging/appenders/io.rb", "lib/logging/appenders/rolling_file.rb", "lib/logging/appenders/syslog.rb", "lib/logging/config/configurator.rb", "lib/logging/config/yaml_configurator.rb", "lib/logging/layout.rb", "lib/logging/layouts/basic.rb", "lib/logging/layouts/pattern.rb", "lib/logging/log_event.rb", "lib/logging/logger.rb", "lib/logging/repository.rb", "lib/logging/root_logger.rb", "lib/logging/stats.rb", "lib/logging/utils.rb", "logging.gemspec", "test/appenders/test_buffered_io.rb", "test/appenders/test_console.rb", "test/appenders/test_email.rb", "test/appenders/test_file.rb", "test/appenders/test_growl.rb", "test/appenders/test_io.rb", "test/appenders/test_rolling_file.rb", "test/appenders/test_syslog.rb", "test/benchmark.rb", "test/config/test_configurator.rb", "test/config/test_yaml_configurator.rb", "test/layouts/test_basic.rb", "test/layouts/test_pattern.rb", "test/setup.rb", "test/test_appender.rb", "test/test_layout.rb", "test/test_log_event.rb", "test/test_logger.rb", "test/test_logging.rb", "test/test_repository.rb", "test/test_root_logger.rb", "test/test_stats.rb", "test/test_utils.rb"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://logging.rubyforge.org/}
|
16
|
+
s.rdoc_options = ["--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{logging}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{A flexible and extendable logging library for Ruby}
|
21
|
+
s.test_files = ["test/appenders/test_buffered_io.rb", "test/appenders/test_console.rb", "test/appenders/test_email.rb", "test/appenders/test_file.rb", "test/appenders/test_growl.rb", "test/appenders/test_io.rb", "test/appenders/test_rolling_file.rb", "test/appenders/test_syslog.rb", "test/config/test_configurator.rb", "test/config/test_yaml_configurator.rb", "test/layouts/test_basic.rb", "test/layouts/test_pattern.rb", "test/test_appender.rb", "test/test_layout.rb", "test/test_log_event.rb", "test/test_logger.rb", "test/test_logging.rb", "test/test_repository.rb", "test/test_root_logger.rb", "test/test_stats.rb", "test/test_utils.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<flexmock>, [">= 0.8.2"])
|
29
|
+
s.add_runtime_dependency(%q<lockfile>, [">= 1.4.3"])
|
30
|
+
s.add_development_dependency(%q<bones>, [">= 2.4.0"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<flexmock>, [">= 0.8.2"])
|
33
|
+
s.add_dependency(%q<lockfile>, [">= 1.4.3"])
|
34
|
+
s.add_dependency(%q<bones>, [">= 2.4.0"])
|
35
|
+
end
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<flexmock>, [">= 0.8.2"])
|
38
|
+
s.add_dependency(%q<lockfile>, [">= 1.4.3"])
|
39
|
+
s.add_dependency(%q<bones>, [">= 2.4.0"])
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
3
|
+
|
4
|
+
module TestLogging
|
5
|
+
module TestAppenders
|
6
|
+
|
7
|
+
class TestBufferedIO < Test::Unit::TestCase
|
8
|
+
include LoggingTestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
super
|
12
|
+
::Logging.init
|
13
|
+
@levels = ::Logging::LEVELS
|
14
|
+
|
15
|
+
@sio = StringIO.new
|
16
|
+
@appender = ::Logging::Appenders::IO.new(
|
17
|
+
'test_appender', @sio,
|
18
|
+
:auto_flushing => 3, :immediate_at => :error
|
19
|
+
)
|
20
|
+
|
21
|
+
begin readline rescue EOFError end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_append
|
25
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
26
|
+
[1, 2, 3, 4], false)
|
27
|
+
@appender.append event
|
28
|
+
assert_raise(EOFError) {readline}
|
29
|
+
|
30
|
+
@appender.append event
|
31
|
+
assert_raise(EOFError) {readline}
|
32
|
+
|
33
|
+
event.level = @levels['debug']
|
34
|
+
event.data = 'the big log message'
|
35
|
+
@appender.append event
|
36
|
+
|
37
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
38
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
39
|
+
assert_equal "DEBUG TestLogger : the big log message\n", readline
|
40
|
+
assert_raise(EOFError) {readline}
|
41
|
+
|
42
|
+
@appender.close
|
43
|
+
assert_raise(RuntimeError) {@appender.append event}
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_append_error
|
47
|
+
# setup an internal logger to capture error messages from the IO
|
48
|
+
# appender
|
49
|
+
log = StringIO.new
|
50
|
+
Logging::Logger[Logging].add_appenders(
|
51
|
+
Logging::Appenders::IO.new('__internal_io', log)
|
52
|
+
)
|
53
|
+
Logging::Logger[Logging].level = 'all'
|
54
|
+
|
55
|
+
|
56
|
+
# close the string IO object so we get an error
|
57
|
+
@sio.close
|
58
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
59
|
+
[1, 2, 3, 4], false)
|
60
|
+
@appender.append event
|
61
|
+
log.seek 0
|
62
|
+
assert_raise(EOFError) {log.readline}
|
63
|
+
|
64
|
+
@appender.append event
|
65
|
+
log.seek 0
|
66
|
+
assert_raise(EOFError) {log.readline}
|
67
|
+
|
68
|
+
@appender.append event
|
69
|
+
log.seek 0
|
70
|
+
assert_equal "INFO Logging : appender \"test_appender\" has been disabled", log.readline.strip
|
71
|
+
assert_equal "ERROR Logging : <IOError> not opened for writing", log.readline.strip
|
72
|
+
|
73
|
+
assert_equal false, @appender.closed?
|
74
|
+
assert_equal 5, @appender.level
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_close
|
78
|
+
assert_equal false, @sio.closed?
|
79
|
+
assert_equal false, @appender.closed?
|
80
|
+
|
81
|
+
@appender.close
|
82
|
+
assert_equal true, @sio.closed?
|
83
|
+
assert_equal true, @appender.closed?
|
84
|
+
|
85
|
+
[STDIN, STDERR, STDOUT].each do |io|
|
86
|
+
@appender = ::Logging::Appenders::IO.new 'test', io
|
87
|
+
@appender.close
|
88
|
+
assert_equal false, io.closed?
|
89
|
+
assert_equal true, @appender.closed?
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_concat
|
94
|
+
@appender << "this is a test message\n"
|
95
|
+
assert_raise(EOFError) {readline}
|
96
|
+
|
97
|
+
@appender << "this is another message\n"
|
98
|
+
assert_raise(EOFError) {readline}
|
99
|
+
|
100
|
+
@appender << "some other line\n"
|
101
|
+
|
102
|
+
assert_equal "this is a test message\n", readline
|
103
|
+
assert_equal "this is another message\n", readline
|
104
|
+
assert_equal "some other line\n", readline
|
105
|
+
assert_raise(EOFError) {readline}
|
106
|
+
|
107
|
+
@appender.close
|
108
|
+
assert_raise(RuntimeError) {@appender << 'message'}
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_concat_error
|
112
|
+
# setup an internal logger to capture error messages from the IO
|
113
|
+
# appender
|
114
|
+
log = StringIO.new
|
115
|
+
Logging::Logger[Logging].add_appenders(
|
116
|
+
Logging::Appenders::IO.new('__internal_io', log)
|
117
|
+
)
|
118
|
+
Logging::Logger[Logging].level = 'all'
|
119
|
+
|
120
|
+
# close the string IO object so we get an error
|
121
|
+
@sio.close
|
122
|
+
@appender << 'oopsy'
|
123
|
+
log.seek 0
|
124
|
+
assert_raise(EOFError) {log.readline}
|
125
|
+
|
126
|
+
@appender << 'whoopsy'
|
127
|
+
log.seek 0
|
128
|
+
assert_raise(EOFError) {log.readline}
|
129
|
+
|
130
|
+
@appender << 'pooh'
|
131
|
+
log.seek 0
|
132
|
+
assert_equal "INFO Logging : appender \"test_appender\" has been disabled", log.readline.strip
|
133
|
+
assert_equal "ERROR Logging : <IOError> not opened for writing", log.readline.strip
|
134
|
+
|
135
|
+
# and the appender does not close itself
|
136
|
+
assert_equal false, @appender.closed?
|
137
|
+
assert_equal 5, @appender.level
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_flush
|
141
|
+
ary = []
|
142
|
+
@sio.instance_variable_set :@ary, ary
|
143
|
+
def @sio.flush() @ary << :flush end
|
144
|
+
|
145
|
+
@appender << "this is a test message\n"
|
146
|
+
assert_raise(EOFError) {readline}
|
147
|
+
|
148
|
+
@appender.flush
|
149
|
+
assert_equal :flush, ary.pop
|
150
|
+
assert_equal "this is a test message\n", readline
|
151
|
+
assert_raise(EOFError) {readline}
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_immediate_at
|
155
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
156
|
+
[1, 2, 3, 4], false)
|
157
|
+
@appender.append event
|
158
|
+
assert_raise(EOFError) {readline}
|
159
|
+
|
160
|
+
event.level = @levels['error']
|
161
|
+
event.data = 'an error message'
|
162
|
+
@appender.append event
|
163
|
+
|
164
|
+
assert_equal " WARN TestLogger : <Array> #{[1, 2, 3, 4]}\n", readline
|
165
|
+
assert_equal "ERROR TestLogger : an error message\n", readline
|
166
|
+
assert_raise(EOFError) {readline}
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
def readline
|
171
|
+
@pos ||= 0
|
172
|
+
@sio.seek @pos
|
173
|
+
line = @sio.readline
|
174
|
+
@pos = @sio.tell
|
175
|
+
line
|
176
|
+
end
|
177
|
+
|
178
|
+
end # class TestBufferedIO
|
179
|
+
|
180
|
+
end # module TestAppenders
|
181
|
+
end # module TestLogging
|
182
|
+
|
183
|
+
# EOF
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
3
|
+
|
4
|
+
module TestLogging
|
5
|
+
module TestAppenders
|
6
|
+
|
7
|
+
class TestStdout < Test::Unit::TestCase
|
8
|
+
include LoggingTestCase
|
9
|
+
|
10
|
+
def test_initialize
|
11
|
+
::Logging::Repository.instance
|
12
|
+
|
13
|
+
appender = ::Logging::Appenders::Stdout.new
|
14
|
+
assert_equal 'stdout', appender.name
|
15
|
+
assert_same STDOUT, appender.instance_variable_get(:@io)
|
16
|
+
|
17
|
+
appender.close
|
18
|
+
assert_equal true, appender.closed?
|
19
|
+
assert_equal false, STDOUT.closed?
|
20
|
+
|
21
|
+
appender = ::Logging::Appenders::Stdout.new('foo')
|
22
|
+
assert_equal 'foo', appender.name
|
23
|
+
|
24
|
+
appender = ::Logging::Appenders::Stdout.new(:level => :warn)
|
25
|
+
assert_equal 'stdout', appender.name
|
26
|
+
assert_equal 2, appender.level
|
27
|
+
|
28
|
+
appender = ::Logging::Appenders::Stdout.new('bar', :level => :error)
|
29
|
+
assert_equal 'bar', appender.name
|
30
|
+
assert_equal 3, appender.level
|
31
|
+
end
|
32
|
+
|
33
|
+
end # class TestStdout
|
34
|
+
|
35
|
+
class TestStderr < Test::Unit::TestCase
|
36
|
+
include LoggingTestCase
|
37
|
+
|
38
|
+
def test_initialize
|
39
|
+
::Logging::Repository.instance
|
40
|
+
|
41
|
+
appender = ::Logging::Appenders::Stderr.new
|
42
|
+
assert_equal 'stderr', appender.name
|
43
|
+
assert_same STDERR, appender.instance_variable_get(:@io)
|
44
|
+
|
45
|
+
appender.close
|
46
|
+
assert_equal true, appender.closed?
|
47
|
+
assert_equal false, STDERR.closed?
|
48
|
+
|
49
|
+
appender = ::Logging::Appenders::Stderr.new('foo')
|
50
|
+
assert_equal 'foo', appender.name
|
51
|
+
|
52
|
+
appender = ::Logging::Appenders::Stderr.new(:level => :warn)
|
53
|
+
assert_equal 'stderr', appender.name
|
54
|
+
assert_equal 2, appender.level
|
55
|
+
|
56
|
+
appender = ::Logging::Appenders::Stderr.new('bar', :level => :error)
|
57
|
+
assert_equal 'bar', appender.name
|
58
|
+
assert_equal 3, appender.level
|
59
|
+
end
|
60
|
+
|
61
|
+
end # class TestStderr
|
62
|
+
|
63
|
+
end # module TestAppenders
|
64
|
+
end # module TestLogging
|
65
|
+
|
66
|
+
# EOF
|
@@ -0,0 +1,171 @@
|
|
1
|
+
|
2
|
+
require File.join(File.dirname(__FILE__), %w[.. setup])
|
3
|
+
require 'flexmock'
|
4
|
+
|
5
|
+
module TestLogging
|
6
|
+
module TestAppenders
|
7
|
+
|
8
|
+
class TestEmail < Test::Unit::TestCase
|
9
|
+
include FlexMock::TestCase
|
10
|
+
include LoggingTestCase
|
11
|
+
|
12
|
+
def setup
|
13
|
+
super
|
14
|
+
::Logging.init
|
15
|
+
@levels = ::Logging::LEVELS
|
16
|
+
|
17
|
+
flexmock(Net::SMTP).new_instances do |m|
|
18
|
+
m.should_receive(:start).at_least.once.with(
|
19
|
+
'test.logging', 'test', 'test', :cram_md5, Proc).and_yield(m)
|
20
|
+
m.should_receive(:sendmail).at_least.once.with(String, 'me', ['you'])
|
21
|
+
end
|
22
|
+
|
23
|
+
@appender = ::Logging::Appenders::Email.new('email',
|
24
|
+
'from' => 'me', 'to' => 'you',
|
25
|
+
:buffer_size => '3', :immediate_at => 'error, fatal',
|
26
|
+
:domain => 'test.logging', :acct => 'test', :passwd => 'test'
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_initialize
|
31
|
+
assert_raise(ArgumentError, 'Must specify from address') {
|
32
|
+
::Logging::Appenders::Email.new('email')
|
33
|
+
}
|
34
|
+
assert_raise(ArgumentError, 'Must specify to address') {
|
35
|
+
::Logging::Appenders::Email.new('email', :from => 'me')
|
36
|
+
}
|
37
|
+
assert_nothing_raised {
|
38
|
+
::Logging::Appenders::Email.new('email', :from => 'me', :to => 'you')
|
39
|
+
}
|
40
|
+
|
41
|
+
appender = ::Logging::Appenders::Email.new('email',
|
42
|
+
'from' => 'me', 'to' => 'you'
|
43
|
+
)
|
44
|
+
|
45
|
+
assert_equal(100, appender.auto_flushing)
|
46
|
+
assert_equal([], appender.instance_variable_get(:@immediate))
|
47
|
+
assert_equal('localhost', appender.server)
|
48
|
+
assert_equal(25, appender.port)
|
49
|
+
|
50
|
+
domain = ENV['HOSTNAME'] || 'localhost.localdomain'
|
51
|
+
assert_equal(domain, appender.domain)
|
52
|
+
assert_equal(nil, appender.acct)
|
53
|
+
assert_equal(:cram_md5, appender.authtype)
|
54
|
+
assert_equal("Message of #{$0}", appender.subject)
|
55
|
+
|
56
|
+
appender = ::Logging::Appenders::Email.new('email',
|
57
|
+
'from' => 'lbrinn@gmail.com', 'to' => 'everyone',
|
58
|
+
:buffsize => '1000', :immediate_at => 'error, fatal',
|
59
|
+
:server => 'smtp.google.com', :port => '443',
|
60
|
+
:domain => 'google.com', :acct => 'lbrinn',
|
61
|
+
:passwd => '1234', :authtype => 'tls',
|
62
|
+
:subject => "I'm rich and you're not"
|
63
|
+
)
|
64
|
+
|
65
|
+
assert_equal('lbrinn@gmail.com', appender.instance_variable_get(:@from))
|
66
|
+
assert_equal(['everyone'], appender.instance_variable_get(:@to))
|
67
|
+
assert_equal(1000, appender.auto_flushing)
|
68
|
+
assert_equal('1234', appender.instance_variable_get(:@passwd))
|
69
|
+
assert_equal([nil, nil, nil, true, true],
|
70
|
+
appender.instance_variable_get(:@immediate))
|
71
|
+
assert_equal('smtp.google.com', appender.server)
|
72
|
+
assert_equal(443, appender.port)
|
73
|
+
assert_equal('google.com', appender.domain)
|
74
|
+
assert_equal('lbrinn', appender.acct)
|
75
|
+
assert_equal(:tls, appender.authtype)
|
76
|
+
assert_equal("I'm rich and you're not", appender.subject)
|
77
|
+
|
78
|
+
appender = ::Logging::Appenders::Email.new('email',
|
79
|
+
'from' => 'me', 'to' => 'you', :auto_flushing => 42
|
80
|
+
)
|
81
|
+
assert_equal(42, appender.auto_flushing)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_append
|
85
|
+
# with auto_flushing enabled, mail will be sent each time a log event
|
86
|
+
# occurs
|
87
|
+
@appender.auto_flushing = true
|
88
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['warn'],
|
89
|
+
[1, 2, 3, 4], false)
|
90
|
+
@appender.append event
|
91
|
+
assert_not_equal(@levels.length, @appender.level)
|
92
|
+
assert_equal(0, @appender.buffer.length)
|
93
|
+
|
94
|
+
# increase the buffer size and log a few events
|
95
|
+
@appender.auto_flushing = 3
|
96
|
+
@appender.append event
|
97
|
+
@appender.append event
|
98
|
+
assert_equal(2, @appender.buffer.length)
|
99
|
+
|
100
|
+
@appender.append event
|
101
|
+
assert_not_equal(@levels.length, @appender.level)
|
102
|
+
assert_equal(0, @appender.buffer.length)
|
103
|
+
|
104
|
+
# error and fatal messages should be send immediately (no buffering)
|
105
|
+
error = ::Logging::LogEvent.new('ErrLogger', @levels['error'],
|
106
|
+
'error message', false)
|
107
|
+
fatal = ::Logging::LogEvent.new('FatalLogger', @levels['fatal'],
|
108
|
+
'fatal message', false)
|
109
|
+
|
110
|
+
@appender.append event
|
111
|
+
@appender.append fatal
|
112
|
+
assert_not_equal(@levels.length, @appender.level)
|
113
|
+
assert_equal(0, @appender.buffer.length)
|
114
|
+
|
115
|
+
@appender.append error
|
116
|
+
assert_not_equal(@levels.length, @appender.level)
|
117
|
+
assert_equal(0, @appender.buffer.length)
|
118
|
+
|
119
|
+
@appender.append event
|
120
|
+
assert_equal(1, @appender.buffer.length)
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_concat
|
124
|
+
# with auto_flushing enabled, mail will be sent each time a log event
|
125
|
+
# occurs
|
126
|
+
@appender.auto_flushing = true
|
127
|
+
@appender << 'test message'
|
128
|
+
assert_not_equal(@levels.length, @appender.level)
|
129
|
+
assert_equal(0, @appender.buffer.length)
|
130
|
+
|
131
|
+
# increase the buffer size and log a few events
|
132
|
+
@appender.auto_flushing = 3
|
133
|
+
@appender << 'another test message'
|
134
|
+
@appender << 'a second test message'
|
135
|
+
assert_equal(2, @appender.buffer.length)
|
136
|
+
|
137
|
+
@appender << 'a third test message'
|
138
|
+
assert_not_equal(@levels.length, @appender.level)
|
139
|
+
assert_equal(0, @appender.buffer.length)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_flush
|
143
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['info'],
|
144
|
+
[1, 2, 3, 4], false)
|
145
|
+
@appender.append event
|
146
|
+
@appender << 'test message'
|
147
|
+
assert_equal(2, @appender.buffer.length)
|
148
|
+
|
149
|
+
@appender.flush
|
150
|
+
assert_not_equal(@levels.length, @appender.level)
|
151
|
+
assert_equal(0, @appender.buffer.length)
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_close
|
155
|
+
event = ::Logging::LogEvent.new('TestLogger', @levels['info'],
|
156
|
+
[1, 2, 3, 4], false)
|
157
|
+
@appender.append event
|
158
|
+
@appender << 'test message'
|
159
|
+
assert_equal(2, @appender.buffer.length)
|
160
|
+
|
161
|
+
@appender.close
|
162
|
+
assert_not_equal(@levels.length, @appender.level)
|
163
|
+
assert_equal(0, @appender.buffer.length)
|
164
|
+
assert(@appender.closed?)
|
165
|
+
end
|
166
|
+
|
167
|
+
end # class TestEmail
|
168
|
+
end # module TestLogging
|
169
|
+
end # module TestAppenders
|
170
|
+
|
171
|
+
# EOF
|