1# coding: US-ASCII
2require 'test/unit'
3require 'tempfile'
4begin
5  require 'syslog/logger'
6rescue LoadError
7  # skip.  see the bottom of this file.
8end
9
10# These tests ensure Syslog::Logger works like Logger
11
12class TestSyslogRootLogger < Test::Unit::TestCase
13
14  module MockSyslog
15    LEVEL_LABEL_MAP = {}
16
17    class << self
18
19      @line = nil
20
21      %w[ALERT ERR WARNING NOTICE INFO DEBUG].each do |name|
22        level = Syslog.const_get("LOG_#{name}")
23        LEVEL_LABEL_MAP[level] = name
24
25        eval <<-EOM
26          def #{name.downcase}(format, *args)
27            log(#{level}, format, *args)
28          end
29        EOM
30      end
31
32      def log(level, format, *args)
33        @line = "#{LEVEL_LABEL_MAP[level]} - #{format % args}"
34      end
35
36      attr_reader :line
37      attr_reader :program_name
38
39      def open(program_name)
40        @program_name = program_name
41      end
42
43      def reset
44        @line = ''
45      end
46
47    end
48  end
49
50  Syslog::Logger.syslog = MockSyslog
51
52  LEVEL_LABEL_MAP = {
53    Logger::DEBUG => 'DEBUG',
54    Logger::INFO => 'INFO',
55    Logger::WARN => 'WARN',
56    Logger::ERROR => 'ERROR',
57    Logger::FATAL => 'FATAL',
58    Logger::UNKNOWN => 'ANY',
59  }
60
61  def setup
62    @logger = Logger.new(nil)
63  end
64
65  class Log
66    attr_reader :line, :label, :datetime, :pid, :severity, :progname, :msg
67    def initialize(line)
68      @line = line
69      /\A(\w+), \[([^#]*)#(\d+)\]\s+(\w+) -- (\w*): ([\x0-\xff]*)/ =~ @line
70      @label, @datetime, @pid, @severity, @progname, @msg = $1, $2, $3, $4, $5, $6
71    end
72  end
73
74  def log_add(severity, msg, progname = nil, &block)
75    log(:add, severity, msg, progname, &block)
76  end
77
78  def log(msg_id, *arg, &block)
79    Log.new(log_raw(msg_id, *arg, &block))
80  end
81
82  def log_raw(msg_id, *arg, &block)
83    logdev = Tempfile.new(File.basename(__FILE__) + '.log')
84    @logger.instance_eval { @logdev = Logger::LogDevice.new(logdev) }
85    assert_equal true, @logger.__send__(msg_id, *arg, &block)
86    logdev.open
87    msg = logdev.read
88    logdev.close(true)
89    msg
90  end
91
92  def test_initialize
93    assert_equal Logger::DEBUG, @logger.level
94  end
95
96  def test_custom_formatter
97    @logger.formatter = Class.new {
98      def call severity, time, progname, msg
99        "hi mom!"
100      end
101    }.new
102
103    assert_match(/hi mom!/, log_raw(:fatal, 'fatal level message'))
104  end
105
106  def test_add
107    msg = log_add nil,           'unknown level message' # nil == unknown
108    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
109
110    msg = log_add Logger::FATAL, 'fatal level message'
111    assert_equal LEVEL_LABEL_MAP[Logger::FATAL],   msg.severity
112
113    msg = log_add Logger::ERROR, 'error level message'
114    assert_equal LEVEL_LABEL_MAP[Logger::ERROR],   msg.severity
115
116    msg = log_add Logger::WARN,  'warn level message'
117    assert_equal LEVEL_LABEL_MAP[Logger::WARN],    msg.severity
118
119    msg = log_add Logger::INFO,  'info level message'
120    assert_equal LEVEL_LABEL_MAP[Logger::INFO],    msg.severity
121
122    msg = log_add Logger::DEBUG, 'debug level message'
123    assert_equal LEVEL_LABEL_MAP[Logger::DEBUG],   msg.severity
124  end
125
126  def test_add_level_unknown
127    @logger.level = Logger::UNKNOWN
128
129    msg = log_add nil,           'unknown level message' # nil == unknown
130    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
131
132    msg = log_add Logger::FATAL, 'fatal level message'
133    assert_equal '', msg.line
134
135    msg = log_add Logger::ERROR, 'error level message'
136    assert_equal '', msg.line
137
138    msg = log_add Logger::WARN,  'warn level message'
139    assert_equal '', msg.line
140
141    msg = log_add Logger::INFO,  'info level message'
142    assert_equal '', msg.line
143
144    msg = log_add Logger::DEBUG, 'debug level message'
145    assert_equal '', msg.line
146  end
147
148  def test_add_level_fatal
149    @logger.level = Logger::FATAL
150
151    msg = log_add nil,           'unknown level message' # nil == unknown
152    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
153
154    msg = log_add Logger::FATAL, 'fatal level message'
155    assert_equal LEVEL_LABEL_MAP[Logger::FATAL],   msg.severity
156
157    msg = log_add Logger::ERROR, 'error level message'
158    assert_equal '', msg.line
159
160    msg = log_add Logger::WARN,  'warn level message'
161    assert_equal '', msg.line
162
163    msg = log_add Logger::INFO,  'info level message'
164    assert_equal '', msg.line
165
166    msg = log_add Logger::DEBUG, 'debug level message'
167    assert_equal '', msg.line
168  end
169
170  def test_add_level_error
171    @logger.level = Logger::ERROR
172
173    msg = log_add nil,           'unknown level message' # nil == unknown
174    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
175
176    msg = log_add Logger::FATAL, 'fatal level message'
177    assert_equal LEVEL_LABEL_MAP[Logger::FATAL],   msg.severity
178
179    msg = log_add Logger::ERROR, 'error level message'
180    assert_equal LEVEL_LABEL_MAP[Logger::ERROR],   msg.severity
181
182    msg = log_add Logger::WARN,  'warn level message'
183    assert_equal '', msg.line
184
185    msg = log_add Logger::INFO,  'info level message'
186    assert_equal '', msg.line
187
188    msg = log_add Logger::DEBUG, 'debug level message'
189    assert_equal '', msg.line
190  end
191
192  def test_add_level_warn
193    @logger.level = Logger::WARN
194
195    msg = log_add nil,           'unknown level message' # nil == unknown
196    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
197
198    msg = log_add Logger::FATAL, 'fatal level message'
199    assert_equal LEVEL_LABEL_MAP[Logger::FATAL],   msg.severity
200
201    msg = log_add Logger::ERROR, 'error level message'
202    assert_equal LEVEL_LABEL_MAP[Logger::ERROR],   msg.severity
203
204    msg = log_add Logger::WARN,  'warn level message'
205    assert_equal LEVEL_LABEL_MAP[Logger::WARN],   msg.severity
206
207    msg = log_add Logger::INFO,  'info level message'
208    assert_equal '', msg.line
209
210    msg = log_add Logger::DEBUG, 'debug level message'
211    assert_equal '', msg.line
212  end
213
214  def test_add_level_info
215    @logger.level = Logger::INFO
216
217    msg = log_add nil,           'unknown level message' # nil == unknown
218    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
219
220    msg = log_add Logger::FATAL, 'fatal level message'
221    assert_equal LEVEL_LABEL_MAP[Logger::FATAL],   msg.severity
222
223    msg = log_add Logger::ERROR, 'error level message'
224    assert_equal LEVEL_LABEL_MAP[Logger::ERROR],   msg.severity
225
226    msg = log_add Logger::WARN,  'warn level message'
227    assert_equal LEVEL_LABEL_MAP[Logger::WARN],    msg.severity
228
229    msg = log_add Logger::INFO,  'info level message'
230    assert_equal LEVEL_LABEL_MAP[Logger::INFO],    msg.severity
231
232    msg = log_add Logger::DEBUG, 'debug level message'
233    assert_equal '', msg.line
234  end
235
236  def test_add_level_debug
237    @logger.level = Logger::DEBUG
238
239    msg = log_add nil,           'unknown level message' # nil == unknown
240    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
241
242    msg = log_add Logger::FATAL, 'fatal level message'
243    assert_equal LEVEL_LABEL_MAP[Logger::FATAL],   msg.severity
244
245    msg = log_add Logger::ERROR, 'error level message'
246    assert_equal LEVEL_LABEL_MAP[Logger::ERROR],   msg.severity
247
248    msg = log_add Logger::WARN,  'warn level message'
249    assert_equal LEVEL_LABEL_MAP[Logger::WARN],    msg.severity
250
251    msg = log_add Logger::INFO,  'info level message'
252    assert_equal LEVEL_LABEL_MAP[Logger::INFO],    msg.severity
253
254    msg = log_add Logger::DEBUG, 'debug level message'
255    assert_equal LEVEL_LABEL_MAP[Logger::DEBUG],   msg.severity
256  end
257
258  def test_unknown
259    msg = log :unknown, 'unknown level message'
260    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
261
262    @logger.level = Logger::UNKNOWN
263    msg = log :unknown, 'unknown level message'
264    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
265
266    @logger.level = Logger::FATAL
267    msg = log :unknown, 'unknown level message'
268    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
269
270    @logger.level = Logger::ERROR
271    msg = log :unknown, 'unknown level message'
272    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
273
274    @logger.level = Logger::WARN
275    msg = log :unknown, 'unknown level message'
276    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
277
278    @logger.level = Logger::INFO
279    msg = log :unknown, 'unknown level message'
280    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
281
282    @logger.level = Logger::DEBUG
283    msg = log :unknown, 'unknown level message'
284    assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
285  end
286
287  def test_fatal
288    msg = log :fatal, 'fatal level message'
289    assert_equal LEVEL_LABEL_MAP[Logger::FATAL], msg.severity
290
291    @logger.level = Logger::UNKNOWN
292    msg = log :fatal, 'fatal level message'
293    assert_equal '', msg.line
294
295    @logger.level = Logger::FATAL
296    msg = log :fatal, 'fatal level message'
297    assert_equal LEVEL_LABEL_MAP[Logger::FATAL], msg.severity
298
299    @logger.level = Logger::ERROR
300    msg = log :fatal, 'fatal level message'
301    assert_equal LEVEL_LABEL_MAP[Logger::FATAL], msg.severity
302
303    @logger.level = Logger::WARN
304    msg = log :fatal, 'fatal level message'
305    assert_equal LEVEL_LABEL_MAP[Logger::FATAL], msg.severity
306
307    @logger.level = Logger::INFO
308    msg = log :fatal, 'fatal level message'
309    assert_equal LEVEL_LABEL_MAP[Logger::FATAL], msg.severity
310
311    @logger.level = Logger::DEBUG
312    msg = log :fatal, 'fatal level message'
313    assert_equal LEVEL_LABEL_MAP[Logger::FATAL], msg.severity
314  end
315
316  def test_fatal_eh
317    @logger.level = Logger::FATAL
318    assert_equal true, @logger.fatal?
319
320    @logger.level = Logger::UNKNOWN
321    assert_equal false, @logger.fatal?
322  end
323
324  def test_error
325    msg = log :error, 'error level message'
326    assert_equal LEVEL_LABEL_MAP[Logger::ERROR], msg.severity
327
328    @logger.level = Logger::UNKNOWN
329    msg = log :error, 'error level message'
330    assert_equal '', msg.line
331
332    @logger.level = Logger::FATAL
333    msg = log :error, 'error level message'
334    assert_equal '', msg.line
335
336    @logger.level = Logger::ERROR
337    msg = log :error, 'error level message'
338    assert_equal LEVEL_LABEL_MAP[Logger::ERROR], msg.severity
339
340    @logger.level = Logger::WARN
341    msg = log :error, 'error level message'
342    assert_equal LEVEL_LABEL_MAP[Logger::ERROR], msg.severity
343
344    @logger.level = Logger::INFO
345    msg = log :error, 'error level message'
346    assert_equal LEVEL_LABEL_MAP[Logger::ERROR], msg.severity
347
348    @logger.level = Logger::DEBUG
349    msg = log :error, 'error level message'
350    assert_equal LEVEL_LABEL_MAP[Logger::ERROR], msg.severity
351  end
352
353  def test_error_eh
354    @logger.level = Logger::ERROR
355    assert_equal true, @logger.error?
356
357    @logger.level = Logger::FATAL
358    assert_equal false, @logger.error?
359  end
360
361  def test_warn
362    msg = log :warn, 'warn level message'
363    assert_equal LEVEL_LABEL_MAP[Logger::WARN], msg.severity
364
365    @logger.level = Logger::UNKNOWN
366    msg = log :warn, 'warn level message'
367    assert_equal '', msg.line
368
369    @logger.level = Logger::FATAL
370    msg = log :warn, 'warn level message'
371    assert_equal '', msg.line
372
373    @logger.level = Logger::ERROR
374    msg = log :warn, 'warn level message'
375    assert_equal '', msg.line
376
377    @logger.level = Logger::WARN
378    msg = log :warn, 'warn level message'
379    assert_equal LEVEL_LABEL_MAP[Logger::WARN], msg.severity
380
381    @logger.level = Logger::INFO
382    msg = log :warn, 'warn level message'
383    assert_equal LEVEL_LABEL_MAP[Logger::WARN], msg.severity
384
385    @logger.level = Logger::DEBUG
386    msg = log :warn, 'warn level message'
387    assert_equal LEVEL_LABEL_MAP[Logger::WARN], msg.severity
388  end
389
390  def test_warn_eh
391    @logger.level = Logger::WARN
392    assert_equal true, @logger.warn?
393
394    @logger.level = Logger::ERROR
395    assert_equal false, @logger.warn?
396  end
397
398  def test_info
399    msg = log :info, 'info level message'
400    assert_equal LEVEL_LABEL_MAP[Logger::INFO], msg.severity
401
402    @logger.level = Logger::UNKNOWN
403    msg = log :info, 'info level message'
404    assert_equal '', msg.line
405
406    @logger.level = Logger::FATAL
407    msg = log :info, 'info level message'
408    assert_equal '', msg.line
409
410    @logger.level = Logger::ERROR
411    msg = log :info, 'info level message'
412    assert_equal '', msg.line
413
414    @logger.level = Logger::WARN
415    msg = log :info, 'info level message'
416    assert_equal '', msg.line
417
418    @logger.level = Logger::INFO
419    msg = log :info, 'info level message'
420    assert_equal LEVEL_LABEL_MAP[Logger::INFO], msg.severity
421
422    @logger.level = Logger::DEBUG
423    msg = log :info, 'info level message'
424    assert_equal LEVEL_LABEL_MAP[Logger::INFO], msg.severity
425  end
426
427  def test_info_eh
428    @logger.level = Logger::INFO
429    assert_equal true, @logger.info?
430
431    @logger.level = Logger::WARN
432    assert_equal false, @logger.info?
433  end
434
435  def test_debug
436    msg = log :debug, 'debug level message'
437    assert_equal LEVEL_LABEL_MAP[Logger::DEBUG], msg.severity
438
439    @logger.level = Logger::UNKNOWN
440    msg = log :debug, 'debug level message'
441    assert_equal '', msg.line
442
443    @logger.level = Logger::FATAL
444    msg = log :debug, 'debug level message'
445    assert_equal '', msg.line
446
447    @logger.level = Logger::ERROR
448    msg = log :debug, 'debug level message'
449    assert_equal '', msg.line
450
451    @logger.level = Logger::WARN
452    msg = log :debug, 'debug level message'
453    assert_equal '', msg.line
454
455    @logger.level = Logger::INFO
456    msg = log :debug, 'debug level message'
457    assert_equal '', msg.line
458
459    @logger.level = Logger::DEBUG
460    msg = log :debug, 'debug level message'
461    assert_equal LEVEL_LABEL_MAP[Logger::DEBUG], msg.severity
462  end
463
464  def test_debug_eh
465    @logger.level = Logger::DEBUG
466    assert_equal true, @logger.debug?
467
468    @logger.level = Logger::INFO
469    assert_equal false, @logger.debug?
470  end
471
472end if defined?(Syslog)
473
474class TestSyslogLogger < TestSyslogRootLogger
475
476  def setup
477    super
478    @logger = Syslog::Logger.new
479  end
480
481  SEVERITY_MAP = {}.tap { |map|
482    level2severity = Syslog::Logger::LEVEL_MAP.invert
483
484    MockSyslog::LEVEL_LABEL_MAP.each { |level, name|
485      map[name] = TestSyslogRootLogger::LEVEL_LABEL_MAP[level2severity[level]]
486    }
487  }
488
489  class Log
490    attr_reader :line, :label, :datetime, :pid, :severity, :progname, :msg
491    def initialize(line)
492      @line = line
493      return unless /\A(\w+) - (.*)\Z/ =~ @line
494      severity, @msg = $1, $2
495      @severity = SEVERITY_MAP[severity]
496    end
497  end
498
499  def log_add(severity, msg, progname = nil, &block)
500    log(:add, severity, msg, progname, &block)
501  end
502
503  def log(msg_id, *arg, &block)
504    Log.new(log_raw(msg_id, *arg, &block))
505  end
506
507  def log_raw(msg_id, *arg, &block)
508    assert_equal true, @logger.__send__(msg_id, *arg, &block)
509    msg = MockSyslog.line
510    MockSyslog.reset
511    return msg
512  end
513
514  def test_unknown_eh
515    @logger.level = Logger::UNKNOWN
516    assert_equal true, @logger.unknown?
517
518    @logger.level = Logger::UNKNOWN + 1
519    assert_equal false, @logger.unknown?
520  end
521
522end if defined?(Syslog)
523