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