TwP-logging 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|