/test/syslog/test_syslog_logger.rb

https://github.com/kosaki/ruby · Ruby · 572 lines · 417 code · 151 blank · 4 comment · 3 complexity · 48ed0892b9e1ed5faa3a14472db4dbdd MD5 · raw file

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