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
data/test/setup.rb ADDED
@@ -0,0 +1,74 @@
1
+
2
+ # Equivalent to a header guard in C/C++
3
+ # Used to prevent the class/module from being loaded more than once
4
+ unless defined? LOGGING_TEST_SETUP
5
+ LOGGING_TEST_SETUP = true
6
+
7
+ require 'rubygems'
8
+ require 'test/unit'
9
+ require 'fileutils'
10
+ require 'stringio'
11
+ begin
12
+ require 'turn'
13
+ rescue LoadError; end
14
+
15
+ # This line is needed for Ruby 1.9 -- hashes throw a "KeyError" in 1.9
16
+ # whereas they throw an "IndexError" in 1.8
17
+ #
18
+ KeyError = IndexError if not defined? KeyError
19
+
20
+ require File.join(File.dirname(__FILE__), %w[.. lib logging])
21
+
22
+
23
+ module TestLogging
24
+ module LoggingTestCase
25
+
26
+ TMP = 'tmp'
27
+
28
+ def setup
29
+ super
30
+
31
+ FileUtils.rm_rf TMP
32
+ FileUtils.mkdir TMP
33
+
34
+ ::Logging.module_eval do
35
+ ::Logging::LEVELS.clear
36
+ ::Logging::LNAMES.clear
37
+ remove_const :MAX_LEVEL_LENGTH if const_defined? :MAX_LEVEL_LENGTH
38
+ remove_const :OBJ_FORMAT if const_defined? :OBJ_FORMAT
39
+ end
40
+
41
+ ::Logging::Repository.class_eval do
42
+ if defined?(@singleton__instance__)
43
+ @singleton__instance__ = nil
44
+ else
45
+ @__instance__ = nil
46
+ class << self
47
+ nonce = class << Singleton; self; end
48
+ if defined?(nonce::FirstInstanceCall)
49
+ define_method(:instance, nonce::FirstInstanceCall)
50
+ else
51
+ remove_method(:instance)
52
+ Singleton.__init__(::Logging::Repository)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ def teardown
60
+ super
61
+ ::Logging.backtrace
62
+ ::Logging.__send__(:remove_instance_variable, :@backtrace)
63
+ h = ::Logging::Appender.instance_variable_get(:@appenders)
64
+ h.each_value {|a| a.close(false) unless a.nil? || a.closed?}
65
+ h.clear
66
+ FileUtils.rm_rf TMP
67
+ end
68
+
69
+ end # module LoggingTestCase
70
+ end # module TestLogging
71
+
72
+ end # unless defined?
73
+
74
+ # EOF
@@ -0,0 +1,166 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestAppender < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def setup
10
+ super
11
+
12
+ ::Logging.init
13
+ @levels = ::Logging::LEVELS
14
+ @event = ::Logging::LogEvent.new('logger', @levels['debug'],
15
+ 'message', false)
16
+ @appender = ::Logging::Appender.new 'test_appender'
17
+ end
18
+
19
+ def test_append
20
+ ary = []
21
+ @appender.instance_variable_set :@ary, ary
22
+ def @appender.write( event )
23
+ str = event.instance_of?(::Logging::LogEvent) ?
24
+ @layout.format(event) : event.to_s
25
+ @ary << str
26
+ end
27
+
28
+ assert_nothing_raised {@appender.append @event}
29
+ assert_equal "DEBUG logger : message\n", ary.pop
30
+
31
+ @appender.level = :info
32
+ @appender.append @event
33
+ assert_nil ary.pop
34
+
35
+ @event.level = @levels['info']
36
+ @appender.append @event
37
+ assert_equal " INFO logger : message\n", ary.pop
38
+
39
+ @appender.close
40
+ assert_raise(RuntimeError) {@appender.append @event}
41
+ end
42
+
43
+ def test_class_stderr
44
+ stderr = ::Logging::Appender.stderr
45
+ assert_instance_of ::Logging::Appenders::Stderr, stderr
46
+ assert_equal 'stderr', stderr.name
47
+ assert_same stderr, ::Logging::Appender.stderr
48
+ end
49
+
50
+ def test_class_stdout
51
+ stdout = ::Logging::Appender.stdout
52
+ assert_instance_of ::Logging::Appenders::Stdout, stdout
53
+ assert_equal 'stdout', stdout.name
54
+ assert_same stdout, ::Logging::Appender.stdout
55
+ end
56
+
57
+ def test_close
58
+ assert_equal false, @appender.closed?
59
+
60
+ @appender.close
61
+ assert_equal true, @appender.closed?
62
+ end
63
+
64
+ def test_closed_eh
65
+ assert_equal false, @appender.closed?
66
+
67
+ @appender.close
68
+ assert_equal true, @appender.closed?
69
+ end
70
+
71
+ def test_concat
72
+ ary = []
73
+ @appender.instance_variable_set :@ary, ary
74
+ def @appender.write( event )
75
+ str = event.instance_of?(::Logging::LogEvent) ?
76
+ @layout.format(event) : event.to_s
77
+ @ary << str
78
+ end
79
+
80
+ assert_nothing_raised {@appender << 'log message'}
81
+ assert_equal 'log message', ary.pop
82
+
83
+ @appender.level = :off
84
+ @appender << 'another log message'
85
+ assert_nil ary.pop
86
+
87
+ layout = @appender.layout
88
+ def layout.footer() 'this is the footer' end
89
+
90
+ @appender.close
91
+ assert_raise(RuntimeError) {@appender << 'log message'}
92
+ assert_equal 'this is the footer', ary.pop
93
+ end
94
+
95
+ def test_flush
96
+ assert_same @appender, @appender.flush
97
+ end
98
+
99
+ def test_initialize
100
+ assert_raise(TypeError) {::Logging::Appender.new 'test', :layout => []}
101
+
102
+ layout = ::Logging::Layouts::Basic.new
103
+ @appender = ::Logging::Appender.new 'test', :layout => layout
104
+ assert_same layout, @appender.instance_variable_get(:@layout)
105
+ end
106
+
107
+ def test_layout
108
+ assert_instance_of ::Logging::Layouts::Basic, @appender.layout
109
+ end
110
+
111
+ def test_layout_eq
112
+ layout = ::Logging::Layouts::Basic.new
113
+ assert_not_equal layout, @appender.layout
114
+
115
+ assert_raise(TypeError) {@appender.layout = Object.new}
116
+ assert_raise(TypeError) {@appender.layout = 'not a layout'}
117
+
118
+ @appender.layout = layout
119
+ assert_same layout, @appender.layout
120
+ end
121
+
122
+ def test_level
123
+ assert_equal 0, @appender.level
124
+ end
125
+
126
+ def test_level_eq
127
+ assert_equal 0, @appender.level
128
+
129
+ assert_raise(ArgumentError) {@appender.level = -1}
130
+ assert_raise(ArgumentError) {@appender.level = 6}
131
+ assert_raise(ArgumentError) {@appender.level = Object}
132
+ assert_raise(ArgumentError) {@appender.level = 'bob'}
133
+ assert_raise(ArgumentError) {@appender.level = :wtf}
134
+
135
+ @appender.level = 'INFO'
136
+ assert_equal 1, @appender.level
137
+
138
+ @appender.level = :warn
139
+ assert_equal 2, @appender.level
140
+
141
+ @appender.level = 'error'
142
+ assert_equal 3, @appender.level
143
+
144
+ @appender.level = 4
145
+ assert_equal 4, @appender.level
146
+
147
+ @appender.level = 'off'
148
+ assert_equal 5, @appender.level
149
+
150
+ @appender.level = :all
151
+ assert_equal 0, @appender.level
152
+ end
153
+
154
+ def test_name
155
+ assert_equal 'test_appender', @appender.name
156
+ end
157
+
158
+ def test_inspect
159
+ expected = "<Appender:0x%x name=\"test_appender\">" % @appender.object_id
160
+ assert_equal expected, @appender.inspect
161
+ end
162
+
163
+ end # class TestAppender
164
+ end # module TestLogging
165
+
166
+ # EOF
@@ -0,0 +1,110 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestLayout < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def setup
10
+ super
11
+ @layout = ::Logging::Layout.new
12
+ end
13
+
14
+ def test_header
15
+ assert_equal '', @layout.header
16
+ end
17
+
18
+ def test_initialize
19
+ obj_format = lambda {|l| l.instance_variable_get :@obj_format}
20
+
21
+ assert_equal :string, obj_format[@layout]
22
+
23
+ @layout = ::Logging::Layout.new 'format_as' => 'blah'
24
+ assert_equal :string, obj_format[@layout]
25
+
26
+ @layout = ::Logging::Layout.new :format_as => :inspect
27
+ assert_equal :inspect, obj_format[@layout]
28
+
29
+ @layout = ::Logging::Layout.new 'format_as' => :yaml
30
+ assert_equal :yaml, obj_format[@layout]
31
+
32
+ @layout = ::Logging::Layout.new
33
+ assert_equal :string, obj_format[@layout]
34
+
35
+ ::Logging.format_as :yaml
36
+ @layout = ::Logging::Layout.new
37
+ assert_equal :yaml, obj_format[@layout]
38
+ end
39
+
40
+ def test_footer
41
+ assert_equal '', @layout.footer
42
+ end
43
+
44
+ def test_format
45
+ assert_nil @layout.format(::Logging::LogEvent.new('a','b','c',false))
46
+ end
47
+
48
+ def test_format_obj
49
+ obj = 'test string'
50
+ r = @layout.format_obj obj
51
+ assert_same obj, r
52
+
53
+ obj = RuntimeError.new
54
+ r = @layout.format_obj obj
55
+ assert_equal '<RuntimeError> RuntimeError', r
56
+
57
+ obj = TypeError.new 'only works with Integers'
58
+ r = @layout.format_obj obj
59
+ assert_equal '<TypeError> only works with Integers', r
60
+
61
+ obj = Exception.new 'some exception'
62
+ obj.set_backtrace %w( this is the backtrace )
63
+ r = @layout.format_obj obj
64
+ obj = "<Exception> some exception\n\tthis\n\tis\n\tthe\n\tbacktrace"
65
+ assert_equal obj, r
66
+
67
+ obj = [1, 2, 3, 4]
68
+ r = @layout.format_obj obj
69
+ assert_equal "<Array> #{[1,2,3,4]}", r
70
+
71
+ obj = %w( one two three four )
72
+ @layout = ::Logging::Layout.new :format_as => :inspect
73
+ r = @layout.format_obj obj
74
+ assert_equal '<Array> ["one", "two", "three", "four"]', r
75
+
76
+ @layout = ::Logging::Layout.new :format_as => :yaml
77
+ r = @layout.format_obj obj
78
+ assert_equal "<Array> \n--- \n- one\n- two\n- three\n- four\n", r
79
+
80
+ r = @layout.format_obj Class
81
+ assert_equal "<Class> Class", r
82
+ end
83
+
84
+ def test_format_obj_without_backtrace
85
+ @layout = ::Logging::Layout.new :backtrace => 'off'
86
+
87
+ obj = Exception.new 'some exception'
88
+ obj.set_backtrace %w( this is the backtrace )
89
+ r = @layout.format_obj obj
90
+ obj = "<Exception> some exception"
91
+ assert_equal obj, r
92
+
93
+ ::Logging.backtrace :off
94
+ @layout = ::Logging::Layout.new
95
+
96
+ obj = ArgumentError.new 'wrong type of argument'
97
+ obj.set_backtrace %w( this is the backtrace )
98
+ r = @layout.format_obj obj
99
+ obj = "<ArgumentError> wrong type of argument"
100
+ assert_equal obj, r
101
+ end
102
+
103
+ def test_initializer
104
+ assert_raise(ArgumentError) {::Logging::Layout.new :backtrace => 'foo'}
105
+ end
106
+
107
+ end # class TestLayout
108
+ end # module TestLogging
109
+
110
+ # EOF
@@ -0,0 +1,80 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestLogEvent < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def setup
10
+ super
11
+
12
+ @appender = EventAppender.new('test')
13
+ @logger = ::Logging::Logger['TestLogger']
14
+ @logger.add_appenders @appender
15
+
16
+ @logger.info 'message 1'
17
+ @event = @appender.event
18
+ end
19
+
20
+ def test_data
21
+ assert_equal 'message 1', @event.data
22
+ end
23
+
24
+ def test_data_eq
25
+ @event.data = 'message 2'
26
+ assert_equal 'message 2', @event.data
27
+ end
28
+
29
+ def test_file
30
+ assert_equal '', @event.file
31
+
32
+ @logger.trace = true
33
+ @logger.warn 'warning message'
34
+ assert_match %r/test_log_event.rb\z/, @appender.event.file
35
+ end
36
+
37
+ def test_level
38
+ assert_equal 1, @event.level
39
+ end
40
+
41
+ def test_level_eq
42
+ @event.level = 3
43
+ assert_equal 3, @event.level
44
+ end
45
+
46
+ def test_line
47
+ assert_equal '', @event.file
48
+
49
+ @logger.trace = true
50
+ @logger.error 'error message'
51
+ assert_match %r/\d+/, @appender.event.line
52
+ end
53
+
54
+ def test_logger
55
+ assert_equal 'TestLogger', @event.logger
56
+ end
57
+
58
+ def test_logger_eq
59
+ @event.logger = 'MyLogger'
60
+ assert_equal 'MyLogger', @event.logger
61
+ end
62
+
63
+ def test_method
64
+ assert_equal '', @event.file
65
+
66
+ @logger.trace = true
67
+ @logger.debug 'debug message'
68
+ assert_equal 'test_method', @appender.event.method
69
+ end
70
+
71
+ end # class TestLogEvent
72
+
73
+ class EventAppender < ::Logging::Appender
74
+ attr_reader :event
75
+ def append( event ) @event = event end
76
+ end
77
+
78
+ end # module TestLogging
79
+
80
+ # EOF
@@ -0,0 +1,734 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[setup])
3
+
4
+ module TestLogging
5
+
6
+ class TestLogger < Test::Unit::TestCase
7
+ include LoggingTestCase
8
+
9
+ def setup
10
+ super
11
+ end
12
+
13
+ def test_initialize
14
+ assert_nothing_raised {::Logging::Logger[:test]}
15
+ assert_equal ::Logging::Logger[:test], ::Logging::Logger['test']
16
+ assert_nothing_raised {::Logging::Logger.new(Object)}
17
+ end
18
+
19
+ def test_add
20
+ root = ::Logging::Logger[:root]
21
+ root.level = 'info'
22
+
23
+ a1 = SioAppender.new 'a1'
24
+ a2 = SioAppender.new 'a2'
25
+ log = ::Logging::Logger.new 'A Logger'
26
+
27
+ root.add_appenders a1
28
+ assert_nil a1.readline
29
+ assert_nil a2.readline
30
+
31
+ log.add(0, 'this should NOT be logged')
32
+ assert_nil a1.readline
33
+ assert_nil a2.readline
34
+
35
+ log.add(1, 'this should be logged')
36
+ assert_equal " INFO A Logger : this should be logged\n", a1.readline
37
+ assert_nil a1.readline
38
+ assert_nil a2.readline
39
+
40
+ log.add(2,[1,2,3,4])
41
+ assert_equal " WARN A Logger : <Array> #{[1,2,3,4]}\n", a1.readline
42
+ assert_nil a1.readline
43
+ assert_nil a2.readline
44
+
45
+ log.add_appenders a2
46
+ log.add(3, 'an error has occurred')
47
+ assert_equal "ERROR A Logger : an error has occurred\n", a1.readline
48
+ assert_equal "ERROR A Logger : an error has occurred\n", a2.readline
49
+ assert_nil a1.readline
50
+ assert_nil a2.readline
51
+
52
+ log.additive = false
53
+ log.add(3, 'another error has occurred')
54
+ assert_equal "ERROR A Logger : another error has occurred\n", a2.readline
55
+ assert_nil a1.readline
56
+ assert_nil a2.readline
57
+
58
+ log.add_appenders a1
59
+ log.add(4, 'fatal exception')
60
+ assert_equal "FATAL A Logger : fatal exception\n", a1.readline
61
+ assert_equal "FATAL A Logger : fatal exception\n", a2.readline
62
+ assert_nil a1.readline
63
+ assert_nil a2.readline
64
+
65
+
66
+ log.level = :warn
67
+ log.add(2) do
68
+ str = 'a string of data'
69
+ str
70
+ end
71
+ assert_equal " WARN A Logger : a string of data\n", a1.readline
72
+ assert_equal " WARN A Logger : a string of data\n", a2.readline
73
+ assert_nil a1.readline
74
+ assert_nil a2.readline
75
+
76
+ log.add(1) do
77
+ rb_raise(RuntimeError, "this block should not be executed")
78
+ end
79
+ assert_nil a1.readline
80
+ assert_nil a2.readline
81
+ end
82
+
83
+ def test_add_appenders
84
+ log = ::Logging::Logger.new 'A'
85
+
86
+ appenders = lambda {log.instance_variable_get :@appenders}
87
+ assert_equal [], appenders[]
88
+
89
+ assert_raise(ArgumentError) {log.add_appenders Object.new}
90
+ assert_raise(ArgumentError) {log.add_appenders 'not an appender'}
91
+
92
+ a = ::Logging::Appender.new 'test_appender_1'
93
+ b = ::Logging::Appender.new 'test_appender_2'
94
+ c = ::Logging::Appender.new 'test_appender_3'
95
+
96
+ log.add_appenders a
97
+ assert_equal [a], appenders[]
98
+
99
+ log.add_appenders a
100
+ assert_equal [a], appenders[]
101
+
102
+ log.add_appenders b
103
+ assert_equal [a,b], appenders[]
104
+
105
+ log.add_appenders c
106
+ assert_equal [a,b,c], appenders[]
107
+
108
+ log.add_appenders a, c
109
+ assert_equal [a,b,c], appenders[]
110
+
111
+ log.clear_appenders
112
+ assert_equal [], appenders[]
113
+
114
+ log.add_appenders a, c
115
+ assert_equal [a,c], appenders[]
116
+ end
117
+
118
+ def test_additive
119
+ root = ::Logging::Logger.new :root
120
+ log = ::Logging::Logger.new 'A'
121
+
122
+ assert_raise(NoMethodError) {root.additive}
123
+ assert_equal true, log.additive
124
+ end
125
+
126
+ def test_additive_eq
127
+ root = ::Logging::Logger.new :root
128
+ log = ::Logging::Logger.new 'A'
129
+
130
+ assert_raise(NoMethodError) {root.additive = false}
131
+ assert_equal true, log.additive
132
+
133
+ log.additive = false
134
+ assert_equal false, log.additive
135
+
136
+ log.additive = true
137
+ assert_equal true, log.additive
138
+
139
+ log.additive = 'false'
140
+ assert_equal false, log.additive
141
+
142
+ log.additive = 'true'
143
+ assert_equal true, log.additive
144
+
145
+ log.additive = nil
146
+ assert_equal true, log.additive
147
+
148
+ assert_raise(ArgumentError) {log.additive = Object}
149
+ end
150
+
151
+ def test_appenders_eq
152
+ log = ::Logging::Logger.new '42'
153
+
154
+ appenders = lambda {log.instance_variable_get :@appenders}
155
+ assert_equal [], appenders[]
156
+
157
+ assert_raise(ArgumentError) {log.appenders = Object.new}
158
+ assert_raise(ArgumentError) {log.appenders = 'not an appender'}
159
+
160
+ a = ::Logging::Appender.new 'test_appender_1'
161
+ b = ::Logging::Appender.new 'test_appender_2'
162
+ c = ::Logging::Appender.new 'test_appender_3'
163
+
164
+ log.appenders = a, b, c
165
+ assert_equal [a, b, c], appenders[]
166
+
167
+ log.appenders = b
168
+ assert_equal [b], appenders[]
169
+
170
+ log.appenders = c, a, b
171
+ assert_equal [c,a,b], appenders[]
172
+
173
+ log.appenders = nil
174
+ assert_equal [], appenders[]
175
+
176
+ log.appenders = %w[test_appender_1 test_appender_3]
177
+ assert_equal [a,c], appenders[]
178
+
179
+ assert_raise(ArgumentError) {log.appenders = 'unknown'}
180
+ end
181
+
182
+ def test_class_aref
183
+ root = ::Logging::Logger[:root]
184
+ assert_same root, ::Logging::Logger[:root]
185
+
186
+ a = []
187
+ assert_same ::Logging::Logger['Array'], ::Logging::Logger[Array]
188
+ assert_same ::Logging::Logger['Array'], ::Logging::Logger[a]
189
+
190
+ assert_not_same ::Logging::Logger['Array'], ::Logging::Logger[:root]
191
+ assert_not_same ::Logging::Logger['A'], ::Logging::Logger['A::B']
192
+ end
193
+
194
+ def test_class_root
195
+ root = ::Logging::Logger[:root]
196
+ assert_same root, ::Logging::Logger.root
197
+ end
198
+
199
+ def test_clear_appenders
200
+ log = ::Logging::Logger.new 'Elliott'
201
+
202
+ appenders = lambda {log.instance_variable_get :@appenders}
203
+ assert_equal [], appenders[]
204
+
205
+ a = ::Logging::Appender.new 'test_appender_1'
206
+ b = ::Logging::Appender.new 'test_appender_2'
207
+ c = ::Logging::Appender.new 'test_appender_3'
208
+
209
+ log.add_appenders a, b, c
210
+ assert_equal [a,b,c], appenders[]
211
+
212
+ log.clear_appenders
213
+ assert_equal [], appenders[]
214
+ end
215
+
216
+ def test_concat
217
+ a1 = SioAppender.new 'a1'
218
+ a2 = SioAppender.new 'a2'
219
+ log = ::Logging::Logger.new 'A'
220
+
221
+ ::Logging::Logger[:root].add_appenders a1
222
+ assert_nil a1.readline
223
+ assert_nil a2.readline
224
+
225
+ log << "this is line one of the log file\n"
226
+ assert_equal "this is line one of the log file\n", a1.readline
227
+ assert_nil a1.readline
228
+ assert_nil a2.readline
229
+
230
+ log << "this is line two of the log file\n"
231
+ log << "this is line three of the log file\n"
232
+ assert_equal "this is line two of the log file\n", a1.readline
233
+ assert_equal "this is line three of the log file\n", a1.readline
234
+ assert_nil a1.readline
235
+ assert_nil a2.readline
236
+
237
+ log.add_appenders a2
238
+ log << "this is line four of the log file\n"
239
+ assert_equal "this is line four of the log file\n", a1.readline
240
+ assert_equal "this is line four of the log file\n", a2.readline
241
+ assert_nil a1.readline
242
+ assert_nil a2.readline
243
+
244
+ log.additive = false
245
+ log << "this is line five of the log file\n"
246
+ assert_equal "this is line five of the log file\n", a2.readline
247
+ assert_nil a1.readline
248
+ assert_nil a2.readline
249
+
250
+ log.add_appenders a1
251
+ log << "this is line six of the log file\n"
252
+ assert_equal "this is line six of the log file\n", a1.readline
253
+ assert_equal "this is line six of the log file\n", a2.readline
254
+ assert_nil a1.readline
255
+ assert_nil a2.readline
256
+ end
257
+
258
+ def test_inspect
259
+ root = ::Logging::Logger.new :root
260
+
261
+ str = "<#{root.class.name}:0x%x name=\"#{root.name}\">" % root.object_id
262
+ assert_equal str, root.inspect
263
+ end
264
+
265
+ def test_level
266
+ root = ::Logging::Logger.new :root
267
+ log = ::Logging::Logger.new 'A'
268
+
269
+ assert_equal 0, root.level
270
+ assert_equal 0, log.level
271
+
272
+ root.level = :warn
273
+ assert_equal 2, root.level
274
+ assert_equal 2, log.level
275
+
276
+ log.level = nil
277
+ assert_equal 2, root.level
278
+ assert_equal 2, log.level
279
+
280
+ log.level = :error
281
+ assert_equal 2, root.level
282
+ assert_equal 3, log.level
283
+ end
284
+
285
+ def test_level_eq
286
+ root = ::Logging::Logger.new :root
287
+ log = ::Logging::Logger.new 'A'
288
+ logb = ::Logging::Logger.new 'A::B'
289
+
290
+ assert_equal 0, root.level
291
+ assert_equal 0, log.level
292
+ assert_equal 0, logb.level
293
+ assert_equal true, root.debug?
294
+ assert_equal true, log.debug?
295
+ assert_equal true, logb.debug?
296
+
297
+ assert_raise(ArgumentError) {root.level = -1}
298
+ assert_raise(ArgumentError) {root.level = 6}
299
+ assert_raise(ArgumentError) {root.level = Object}
300
+ assert_raise(ArgumentError) {root.level = 'bob'}
301
+ assert_raise(ArgumentError) {root.level = :wtf}
302
+
303
+ root.level = 'INFO'
304
+ assert_equal 1, root.level
305
+ assert_equal 1, log.level
306
+ assert_equal 1, logb.level
307
+ assert_equal false, root.debug?
308
+ assert_equal true, root.info?
309
+ assert_equal false, log.debug?
310
+ assert_equal true , log.info?
311
+ assert_equal false, logb.debug?
312
+ assert_equal true , logb.info?
313
+
314
+ root.level = :warn
315
+ assert_equal 2, root.level
316
+ assert_equal 2, log.level
317
+ assert_equal 2, logb.level
318
+ assert_equal false, root.info?
319
+ assert_equal true, root.warn?
320
+ assert_equal false, log.info?
321
+ assert_equal true , log.warn?
322
+ assert_equal false, logb.info?
323
+ assert_equal true , logb.warn?
324
+
325
+ root.level = 'error'
326
+ assert_equal 3, root.level
327
+ assert_equal 3, log.level
328
+ assert_equal 3, logb.level
329
+ assert_equal false, root.warn?
330
+ assert_equal true, root.error?
331
+ assert_equal false, log.warn?
332
+ assert_equal true , log.error?
333
+ assert_equal false, logb.warn?
334
+ assert_equal true , logb.error?
335
+
336
+ root.level = 4
337
+ assert_equal 4, root.level
338
+ assert_equal 4, log.level
339
+ assert_equal 4, logb.level
340
+ assert_equal false, root.error?
341
+ assert_equal true, root.fatal?
342
+ assert_equal false, log.error?
343
+ assert_equal true , log.fatal?
344
+ assert_equal false, logb.error?
345
+ assert_equal true , logb.fatal?
346
+
347
+ log.level = nil
348
+ assert_equal 4, root.level
349
+ assert_equal 4, log.level
350
+ assert_equal 4, logb.level
351
+ assert_equal false, root.error?
352
+ assert_equal true, root.fatal?
353
+ assert_equal false, log.error?
354
+ assert_equal true , log.fatal?
355
+ assert_equal false, logb.error?
356
+ assert_equal true , logb.fatal?
357
+
358
+ log.level = :DEBUG
359
+ assert_equal 4, root.level
360
+ assert_equal 0, log.level
361
+ assert_equal 0, logb.level
362
+ assert_equal false, root.error?
363
+ assert_equal true, root.fatal?
364
+ assert_equal true, log.debug?
365
+ assert_equal true, logb.debug?
366
+
367
+ log.level = :off
368
+ assert_equal 4, root.level
369
+ assert_equal 5, log.level
370
+ assert_equal 5, logb.level
371
+ assert_equal false, root.error?
372
+ assert_equal true, root.fatal?
373
+ assert_equal false, log.fatal?
374
+ assert_equal false, logb.fatal?
375
+
376
+ root.level = :all
377
+ assert_equal 0, root.level
378
+ assert_equal 5, log.level
379
+ assert_equal 5, logb.level
380
+ assert_equal true, root.debug?
381
+ assert_equal false, log.fatal?
382
+ assert_equal false, logb.fatal?
383
+
384
+ log.level = nil
385
+ assert_equal 0, root.level
386
+ assert_equal 0, log.level
387
+ assert_equal 0, logb.level
388
+ assert_equal true, root.debug?
389
+ assert_equal true, log.debug?
390
+ assert_equal true, logb.debug?
391
+
392
+ logb.level = :warn
393
+ assert_equal 0, root.level
394
+ assert_equal 0, log.level
395
+ assert_equal 2, logb.level
396
+ assert_equal true, root.debug?
397
+ assert_equal true, log.debug?
398
+ assert_equal false, logb.info?
399
+ assert_equal true, logb.warn?
400
+
401
+ log.level = :info
402
+ logb.level = nil
403
+ assert_equal 0, root.level
404
+ assert_equal 1, log.level
405
+ assert_equal 1, logb.level
406
+ assert_equal true, root.debug?
407
+ assert_equal false, logb.debug?
408
+ assert_equal true, log.info?
409
+ assert_equal false, logb.debug?
410
+ assert_equal true, logb.info?
411
+ end
412
+
413
+ def test_log
414
+ root = ::Logging::Logger[:root]
415
+ root.level = 'info'
416
+
417
+ a1 = SioAppender.new 'a1'
418
+ a2 = SioAppender.new 'a2'
419
+ log = ::Logging::Logger.new 'A Logger'
420
+
421
+ root.add_appenders a1
422
+ assert_nil a1.readline
423
+ assert_nil a2.readline
424
+
425
+ log.debug 'this should NOT be logged'
426
+ assert_nil a1.readline
427
+ assert_nil a2.readline
428
+
429
+ log.info 'this should be logged'
430
+ assert_equal " INFO A Logger : this should be logged\n", a1.readline
431
+ assert_nil a1.readline
432
+ assert_nil a2.readline
433
+
434
+ log.warn [1,2,3,4]
435
+ assert_equal " WARN A Logger : <Array> #{[1,2,3,4]}\n", a1.readline
436
+ assert_nil a1.readline
437
+ assert_nil a2.readline
438
+
439
+ log.add_appenders a2
440
+ log.error 'an error has occurred'
441
+ assert_equal "ERROR A Logger : an error has occurred\n", a1.readline
442
+ assert_equal "ERROR A Logger : an error has occurred\n", a2.readline
443
+ assert_nil a1.readline
444
+ assert_nil a2.readline
445
+
446
+ log.additive = false
447
+ log.error 'another error has occurred'
448
+ assert_equal "ERROR A Logger : another error has occurred\n", a2.readline
449
+ assert_nil a1.readline
450
+ assert_nil a2.readline
451
+
452
+ log.add_appenders a1
453
+ log.fatal 'fatal exception'
454
+ assert_equal "FATAL A Logger : fatal exception\n", a1.readline
455
+ assert_equal "FATAL A Logger : fatal exception\n", a2.readline
456
+ assert_nil a1.readline
457
+ assert_nil a2.readline
458
+
459
+ assert_equal false, log.debug
460
+ assert_equal true, log.info
461
+ assert_equal " INFO A Logger : <NilClass> nil\n", a1.readline
462
+ assert_equal " INFO A Logger : <NilClass> nil\n", a2.readline
463
+ assert_equal true, log.warn
464
+ assert_equal " WARN A Logger : <NilClass> nil\n", a1.readline
465
+ assert_equal " WARN A Logger : <NilClass> nil\n", a2.readline
466
+ assert_equal true, log.error
467
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a1.readline
468
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a2.readline
469
+ assert_equal true, log.fatal
470
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a1.readline
471
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a2.readline
472
+
473
+ log.level = :warn
474
+ assert_equal false, log.debug
475
+ assert_equal false, log.info
476
+ assert_equal true, log.warn
477
+ assert_equal " WARN A Logger : <NilClass> nil\n", a1.readline
478
+ assert_equal " WARN A Logger : <NilClass> nil\n", a2.readline
479
+ assert_equal true, log.error
480
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a1.readline
481
+ assert_equal "ERROR A Logger : <NilClass> nil\n", a2.readline
482
+ assert_equal true, log.fatal
483
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a1.readline
484
+ assert_equal "FATAL A Logger : <NilClass> nil\n", a2.readline
485
+
486
+ assert_raise(NoMethodError) {log.critical 'this log level does not exist'}
487
+
488
+ log.warn do
489
+ str = 'a string of data'
490
+ str
491
+ end
492
+ assert_equal " WARN A Logger : a string of data\n", a1.readline
493
+ assert_equal " WARN A Logger : a string of data\n", a2.readline
494
+ assert_nil a1.readline
495
+ assert_nil a2.readline
496
+
497
+ log.info do
498
+ rb_raise(RuntimeError, "this block should not be executed")
499
+ end
500
+ assert_nil a1.readline
501
+ assert_nil a2.readline
502
+ end
503
+
504
+ def test_log_eh
505
+ ::Logging::Logger[:root].level = 'info'
506
+ log = ::Logging::Logger['A Logger']
507
+
508
+ assert_equal false, log.debug?
509
+ assert_equal true, log.info?
510
+ assert_equal true, log.warn?
511
+ assert_equal true, log.error?
512
+ assert_equal true, log.fatal?
513
+
514
+ log.level = :warn
515
+ assert_equal false, log.debug?
516
+ assert_equal false, log.info?
517
+ assert_equal true, log.warn?
518
+ assert_equal true, log.error?
519
+ assert_equal true, log.fatal?
520
+
521
+ assert_raise(NoMethodError) do
522
+ log.critical? 'this log level does not exist'
523
+ end
524
+ end
525
+
526
+ def test_name
527
+ root = ::Logging::Logger.new :root
528
+ log = ::Logging::Logger.new 'A'
529
+
530
+ assert_equal 'root', root.name
531
+ assert_equal 'A', log.name
532
+ end
533
+
534
+ def test_parent
535
+ logger = ::Logging::Logger
536
+ root = logger.new :root
537
+
538
+ assert_raise(NoMethodError) {root.parent}
539
+
540
+ assert_same root, logger['A'].parent
541
+ assert_same logger['A'], logger['A::B'].parent
542
+ assert_same logger['A::B'], logger['A::B::C::D'].parent
543
+ assert_same logger['A::B'], logger['A::B::C::E'].parent
544
+ assert_same logger['A::B'], logger['A::B::C::F'].parent
545
+
546
+ assert_same logger['A::B'], logger['A::B::C'].parent
547
+ assert_same logger['A::B::C'], logger['A::B::C::D'].parent
548
+ assert_same logger['A::B::C'], logger['A::B::C::E'].parent
549
+ assert_same logger['A::B::C'], logger['A::B::C::F'].parent
550
+
551
+ assert_same logger['A::B::C::E'], logger['A::B::C::E::G'].parent
552
+ end
553
+
554
+ def test_remove_appenders
555
+ log = ::Logging::Logger['X']
556
+
557
+ appenders = lambda {log.instance_variable_get :@appenders}
558
+ assert_equal [], appenders[]
559
+
560
+ a = ::Logging::Appender.new 'test_appender_1'
561
+ b = ::Logging::Appender.new 'test_appender_2'
562
+ c = ::Logging::Appender.new 'test_appender_3'
563
+
564
+ log.add_appenders a, b, c
565
+ assert_equal [a,b,c], appenders[]
566
+
567
+ assert_raise(ArgumentError) {log.remove_appenders Object.new}
568
+ assert_raise(ArgumentError) {log.remove_appenders 10}
569
+
570
+ log.remove_appenders b
571
+ assert_equal [a,c], appenders[]
572
+
573
+ log.remove_appenders 'test_appender_1'
574
+ assert_equal [c], appenders[]
575
+
576
+ log.remove_appenders c
577
+ assert_equal [], appenders[]
578
+
579
+ log.remove_appenders a, b, c
580
+ assert_equal [], appenders[]
581
+
582
+ log.add_appenders a, b, c
583
+ assert_equal [a,b,c], appenders[]
584
+
585
+ log.remove_appenders a, c
586
+ assert_equal [b], appenders[]
587
+ end
588
+
589
+ def test_spaceship
590
+ logs = %w(
591
+ A A::B A::B::C A::B::C::D A::B::C::E A::B::C::E::G A::B::C::F
592
+ ).map {|x| ::Logging::Logger[x]}
593
+ logs.unshift ::Logging::Logger[:root]
594
+
595
+ logs.inject do |a,b|
596
+ assert_equal(-1, a <=> b, "'#{a.name}' <=> '#{b.name}'")
597
+ b
598
+ end
599
+
600
+ assert_equal 1, logs[1] <=> ::Logging::Logger[:root]
601
+ assert_raise(ArgumentError) {logs[1] <=> Object.new}
602
+ assert_raise(ArgumentError) {::Logging::Logger[:root] <=> 'string'}
603
+ end
604
+
605
+ def test_trace
606
+ log = ::Logging::Logger[:root]
607
+ assert_equal false, log.trace
608
+
609
+ log.trace = true
610
+ assert_equal true, log.trace
611
+
612
+ log = ::Logging::Logger['A']
613
+ assert_equal false, log.trace
614
+
615
+ log.trace = true
616
+ assert_equal true, log.trace
617
+ end
618
+
619
+ def test_trace_eq
620
+ log = ::Logging::Logger.new 'A'
621
+ assert_equal false, log.trace
622
+
623
+ log.trace = true
624
+ assert_equal true, log.trace
625
+
626
+ log.trace = false
627
+ assert_equal false, log.trace
628
+
629
+ log.trace = 'true'
630
+ assert_equal true, log.trace
631
+
632
+ log.trace = 'false'
633
+ assert_equal false, log.trace
634
+
635
+ log.trace = nil
636
+ assert_equal false, log.trace
637
+
638
+ assert_raise(ArgumentError) {log.trace = Object}
639
+ end
640
+
641
+ def test_dump_configuration
642
+ log_a = ::Logging::Logger['A-logger']
643
+ log_b = ::Logging::Logger['A-logger::B-logger']
644
+ log_c = ::Logging::Logger['A-logger::B-logger::C-logger']
645
+ log_d = ::Logging::Logger['A-logger::D-logger']
646
+
647
+ sio = StringIO.new
648
+
649
+ log_a._dump_configuration( sio )
650
+ assert_equal(
651
+ "A-logger ........................................ debug +A -T\n", sio.to_s)
652
+
653
+ log_b._dump_configuration( sio )
654
+ assert_equal(
655
+ "A-logger::B-logger .............................. debug +A -T\n", sio.to_s)
656
+
657
+ log_c._dump_configuration( sio )
658
+ assert_equal(
659
+ "A-logger::B-logger::C-logger .................... debug +A -T\n", sio.to_s)
660
+
661
+ log_d._dump_configuration( sio )
662
+ assert_equal(
663
+ "A-logger::D-logger .............................. debug +A -T\n", sio.to_s)
664
+
665
+ log_b.level = :warn
666
+ log_b.trace = true
667
+ log_b._dump_configuration( sio )
668
+ assert_equal(
669
+ "A-logger::B-logger .............................. *warn +A +T\n", sio.to_s)
670
+
671
+ log_c.additive = false
672
+ log_c._dump_configuration( sio )
673
+ assert_equal(
674
+ "A-logger::B-logger::C-logger .................... warn -A -T\n", sio.to_s)
675
+
676
+ # with an indent specified
677
+ log_a._dump_configuration( sio, 4 )
678
+ assert_equal(
679
+ " A-logger .................................... debug +A -T\n", sio.to_s)
680
+
681
+ log_b._dump_configuration( sio, 8 )
682
+ assert_equal(
683
+ " A-logger::B-logger ...................... *warn +A +T\n", sio.to_s)
684
+
685
+ log_c._dump_configuration( sio, 10 )
686
+ assert_equal(
687
+ " A-logger::B-logger::C-logger .......... warn -A -T\n", sio.to_s)
688
+
689
+ log_d._dump_configuration( sio, 22 )
690
+ assert_equal(
691
+ " A-logger::D-logger ........ debug +A -T\n", sio.to_s)
692
+
693
+ log_c.level = 0
694
+ log_c._dump_configuration( sio, 26 )
695
+ assert_equal(
696
+ " A-logger::B...::C-logger *debug -A -T\n", sio.to_s)
697
+ end
698
+
699
+ end # class TestLogger
700
+
701
+ class SioAppender < ::Logging::Appenders::IO
702
+
703
+ def initialize( name, opts = {} )
704
+ @sio = StringIO.new
705
+ super(name, @sio, opts)
706
+ begin readline rescue EOFError end
707
+ end
708
+
709
+ def readline
710
+ @pos ||= 0
711
+ @sio.seek @pos
712
+ begin
713
+ line = @sio.readline
714
+ @pos = @sio.tell
715
+ line
716
+ rescue EOFError
717
+ nil
718
+ end
719
+ end
720
+
721
+ end # class SioAppender
722
+
723
+ end # module TestLogging
724
+
725
+ class StringIO
726
+ def to_s
727
+ seek 0
728
+ str = read
729
+ seek 0
730
+ return str
731
+ end
732
+ end
733
+
734
+ # EOF