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.
Files changed (54) hide show
  1. data/History.txt +169 -0
  2. data/README.rdoc +102 -0
  3. data/Rakefile +42 -0
  4. data/data/bad_logging_1.rb +13 -0
  5. data/data/bad_logging_2.rb +21 -0
  6. data/data/logging.rb +42 -0
  7. data/data/logging.yaml +63 -0
  8. data/data/simple_logging.rb +13 -0
  9. data/lib/logging.rb +408 -0
  10. data/lib/logging/appender.rb +303 -0
  11. data/lib/logging/appenders/buffering.rb +167 -0
  12. data/lib/logging/appenders/console.rb +62 -0
  13. data/lib/logging/appenders/email.rb +75 -0
  14. data/lib/logging/appenders/file.rb +54 -0
  15. data/lib/logging/appenders/growl.rb +197 -0
  16. data/lib/logging/appenders/io.rb +69 -0
  17. data/lib/logging/appenders/rolling_file.rb +291 -0
  18. data/lib/logging/appenders/syslog.rb +201 -0
  19. data/lib/logging/config/configurator.rb +190 -0
  20. data/lib/logging/config/yaml_configurator.rb +195 -0
  21. data/lib/logging/layout.rb +119 -0
  22. data/lib/logging/layouts/basic.rb +34 -0
  23. data/lib/logging/layouts/pattern.rb +296 -0
  24. data/lib/logging/log_event.rb +51 -0
  25. data/lib/logging/logger.rb +490 -0
  26. data/lib/logging/repository.rb +172 -0
  27. data/lib/logging/root_logger.rb +61 -0
  28. data/lib/logging/stats.rb +278 -0
  29. data/lib/logging/utils.rb +130 -0
  30. data/logging.gemspec +41 -0
  31. data/test/appenders/test_buffered_io.rb +183 -0
  32. data/test/appenders/test_console.rb +66 -0
  33. data/test/appenders/test_email.rb +171 -0
  34. data/test/appenders/test_file.rb +93 -0
  35. data/test/appenders/test_growl.rb +128 -0
  36. data/test/appenders/test_io.rb +142 -0
  37. data/test/appenders/test_rolling_file.rb +207 -0
  38. data/test/appenders/test_syslog.rb +194 -0
  39. data/test/benchmark.rb +87 -0
  40. data/test/config/test_configurator.rb +70 -0
  41. data/test/config/test_yaml_configurator.rb +40 -0
  42. data/test/layouts/test_basic.rb +43 -0
  43. data/test/layouts/test_pattern.rb +177 -0
  44. data/test/setup.rb +74 -0
  45. data/test/test_appender.rb +166 -0
  46. data/test/test_layout.rb +110 -0
  47. data/test/test_log_event.rb +80 -0
  48. data/test/test_logger.rb +734 -0
  49. data/test/test_logging.rb +267 -0
  50. data/test/test_repository.rb +126 -0
  51. data/test/test_root_logger.rb +81 -0
  52. data/test/test_stats.rb +274 -0
  53. data/test/test_utils.rb +116 -0
  54. 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