ottobar-logging 0.9.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/History.txt +158 -0
  2. data/README.rdoc +102 -0
  3. data/Rakefile +41 -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 +107 -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 +49 -0
  25. data/lib/logging/logger.rb +491 -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/test/appenders/test_buffered_io.rb +183 -0
  31. data/test/appenders/test_console.rb +66 -0
  32. data/test/appenders/test_email.rb +171 -0
  33. data/test/appenders/test_file.rb +93 -0
  34. data/test/appenders/test_growl.rb +128 -0
  35. data/test/appenders/test_io.rb +142 -0
  36. data/test/appenders/test_rolling_file.rb +207 -0
  37. data/test/appenders/test_syslog.rb +191 -0
  38. data/test/benchmark.rb +87 -0
  39. data/test/config/test_configurator.rb +70 -0
  40. data/test/config/test_yaml_configurator.rb +40 -0
  41. data/test/layouts/test_basic.rb +43 -0
  42. data/test/layouts/test_pattern.rb +177 -0
  43. data/test/setup.rb +69 -0
  44. data/test/test_appender.rb +166 -0
  45. data/test/test_layout.rb +107 -0
  46. data/test/test_log_event.rb +80 -0
  47. data/test/test_logger.rb +734 -0
  48. data/test/test_logging.rb +267 -0
  49. data/test/test_repository.rb +126 -0
  50. data/test/test_root_logger.rb +81 -0
  51. data/test/test_stats.rb +274 -0
  52. data/test/test_utils.rb +114 -0
  53. metadata +152 -0
@@ -0,0 +1,69 @@
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
+ define_method(:instance, nonce::FirstInstanceCall)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def teardown
55
+ super
56
+ ::Logging.backtrace
57
+ ::Logging.__send__(:remove_instance_variable, :@backtrace)
58
+ h = ::Logging::Appender.instance_variable_get(:@appenders)
59
+ h.each_value {|a| a.close(false) unless a.nil? || a.closed?}
60
+ h.clear
61
+ FileUtils.rm_rf TMP
62
+ end
63
+
64
+ end # module LoggingTestCase
65
+ end # module TestLogging
66
+
67
+ end # unless defined?
68
+
69
+ # 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,107 @@
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
+ end
80
+
81
+ def test_format_obj_without_backtrace
82
+ @layout = ::Logging::Layout.new :backtrace => 'off'
83
+
84
+ obj = Exception.new 'some exception'
85
+ obj.set_backtrace %w( this is the backtrace )
86
+ r = @layout.format_obj obj
87
+ obj = "<Exception> some exception"
88
+ assert_equal obj, r
89
+
90
+ ::Logging.backtrace :off
91
+ @layout = ::Logging::Layout.new
92
+
93
+ obj = ArgumentError.new 'wrong type of argument'
94
+ obj.set_backtrace %w( this is the backtrace )
95
+ r = @layout.format_obj obj
96
+ obj = "<ArgumentError> wrong type of argument"
97
+ assert_equal obj, r
98
+ end
99
+
100
+ def test_initializer
101
+ assert_raise(ArgumentError) {::Logging::Layout.new :backtrace => 'foo'}
102
+ end
103
+
104
+ end # class TestLayout
105
+ end # module TestLogging
106
+
107
+ # 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