TwP-logging 0.9.7

Sign up to get free protection for your applications and to get access to all the features.
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