PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/test/logger/test_logger.rb

https://github.com/fizx/ruby
Ruby | 510 lines | 452 code | 42 blank | 16 comment | 9 complexity | 8527f5ae62fbdb8f1f7863a414a086a0 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-3.0, GPL-2.0, BSD-3-Clause
  1. require 'test/unit'
  2. require 'logger'
  3. require 'tempfile'
  4. class TestLoggerSeverity < Test::Unit::TestCase
  5. def test_enum
  6. logger_levels = Logger.constants
  7. levels = ["WARN", "UNKNOWN", "INFO", "FATAL", "DEBUG", "ERROR"]
  8. Logger::Severity.constants.each do |level|
  9. assert(levels.include?(level.to_s))
  10. assert(logger_levels.include?(level))
  11. end
  12. assert_equal(levels.size, Logger::Severity.constants.size)
  13. end
  14. end
  15. class TestLogger < Test::Unit::TestCase
  16. include Logger::Severity
  17. def setup
  18. @logger = Logger.new(nil)
  19. @filename = __FILE__ + ".#{$$}"
  20. end
  21. def teardown
  22. unless $DEBUG
  23. File.unlink(@filename) if File.exist?(@filename)
  24. end
  25. end
  26. class Log
  27. attr_reader :label, :datetime, :pid, :severity, :progname, :msg
  28. def initialize(line)
  29. /\A(\w+), \[([^#]*)#(\d+)\]\s+(\w+) -- (\w*): ([\x0-\xff]*)/ =~ line
  30. @label, @datetime, @pid, @severity, @progname, @msg = $1, $2, $3, $4, $5, $6
  31. end
  32. end
  33. def log_add(logger, severity, msg, progname = nil, &block)
  34. log(logger, :add, severity, msg, progname, &block)
  35. end
  36. def log(logger, msg_id, *arg, &block)
  37. Log.new(log_raw(logger, msg_id, *arg, &block))
  38. end
  39. def log_raw(logger, msg_id, *arg, &block)
  40. logdev = Tempfile.new(File.basename(__FILE__) + '.log')
  41. logger.instance_eval { @logdev = Logger::LogDevice.new(logdev) }
  42. logger.__send__(msg_id, *arg, &block)
  43. logdev.open
  44. msg = logdev.read
  45. logdev.close
  46. msg
  47. end
  48. def test_level
  49. @logger.level = UNKNOWN
  50. assert_equal(UNKNOWN, @logger.level)
  51. @logger.level = INFO
  52. assert_equal(INFO, @logger.level)
  53. @logger.sev_threshold = ERROR
  54. assert_equal(ERROR, @logger.sev_threshold)
  55. @logger.sev_threshold = WARN
  56. assert_equal(WARN, @logger.sev_threshold)
  57. assert_equal(WARN, @logger.level)
  58. @logger.level = DEBUG
  59. assert(@logger.debug?)
  60. assert(@logger.info?)
  61. @logger.level = INFO
  62. assert(!@logger.debug?)
  63. assert(@logger.info?)
  64. assert(@logger.warn?)
  65. @logger.level = WARN
  66. assert(!@logger.info?)
  67. assert(@logger.warn?)
  68. assert(@logger.error?)
  69. @logger.level = ERROR
  70. assert(!@logger.warn?)
  71. assert(@logger.error?)
  72. assert(@logger.fatal?)
  73. @logger.level = FATAL
  74. assert(!@logger.error?)
  75. assert(@logger.fatal?)
  76. @logger.level = UNKNOWN
  77. assert(!@logger.error?)
  78. assert(!@logger.fatal?)
  79. end
  80. def test_progname
  81. assert_nil(@logger.progname)
  82. @logger.progname = "name"
  83. assert_equal("name", @logger.progname)
  84. end
  85. def test_datetime_format
  86. dummy = STDERR
  87. logger = Logger.new(dummy)
  88. log = log_add(logger, INFO, "foo")
  89. assert_match(/^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\s*\d+ $/, log.datetime)
  90. logger.datetime_format = "%d%b%Y@%H:%M:%S"
  91. log = log_add(logger, INFO, "foo")
  92. assert_match(/^\d\d\w\w\w\d\d\d\d@\d\d:\d\d:\d\d$/, log.datetime)
  93. logger.datetime_format = ""
  94. log = log_add(logger, INFO, "foo")
  95. assert_match(/^$/, log.datetime)
  96. end
  97. def test_formatter
  98. dummy = STDERR
  99. logger = Logger.new(dummy)
  100. # default
  101. log = log(logger, :info, "foo")
  102. assert_equal("foo\n", log.msg)
  103. # config
  104. logger.formatter = proc { |severity, timestamp, progname, msg|
  105. "#{severity}:#{msg}\n\n"
  106. }
  107. line = log_raw(logger, :info, "foo")
  108. assert_equal("INFO:foo\n\n", line)
  109. # recover
  110. logger.formatter = nil
  111. log = log(logger, :info, "foo")
  112. assert_equal("foo\n", log.msg)
  113. # again
  114. o = Object.new
  115. def o.call(severity, timestamp, progname, msg)
  116. "<<#{severity}-#{msg}>>\n"
  117. end
  118. logger.formatter = o
  119. line = log_raw(logger, :info, "foo")
  120. assert_equal("<<INFO-foo>>\n", line)
  121. end
  122. def test_initialize
  123. logger = Logger.new(STDERR)
  124. assert_nil(logger.progname)
  125. assert_equal(DEBUG, logger.level)
  126. assert_nil(logger.datetime_format)
  127. end
  128. def test_add
  129. logger = Logger.new(nil)
  130. logger.progname = "my_progname"
  131. assert(logger.add(INFO))
  132. log = log_add(logger, nil, "msg")
  133. assert_equal("ANY", log.severity)
  134. assert_equal("my_progname", log.progname)
  135. logger.level = WARN
  136. assert(logger.log(INFO))
  137. assert_nil(log_add(logger, INFO, "msg").msg)
  138. log = log_add(logger, WARN, nil) { "msg" }
  139. assert_equal("msg\n", log.msg)
  140. log = log_add(logger, WARN, "") { "msg" }
  141. assert_equal("\n", log.msg)
  142. assert_equal("my_progname", log.progname)
  143. log = log_add(logger, WARN, nil, "progname?")
  144. assert_equal("progname?\n", log.msg)
  145. assert_equal("my_progname", log.progname)
  146. end
  147. def test_level_log
  148. logger = Logger.new(nil)
  149. logger.progname = "my_progname"
  150. log = log(logger, :debug, "custom_progname") { "msg" }
  151. assert_equal("msg\n", log.msg)
  152. assert_equal("custom_progname", log.progname)
  153. assert_equal("DEBUG", log.severity)
  154. assert_equal("D", log.label)
  155. #
  156. log = log(logger, :debug) { "msg_block" }
  157. assert_equal("msg_block\n", log.msg)
  158. assert_equal("my_progname", log.progname)
  159. log = log(logger, :debug, "msg_inline")
  160. assert_equal("msg_inline\n", log.msg)
  161. assert_equal("my_progname", log.progname)
  162. #
  163. log = log(logger, :info, "custom_progname") { "msg" }
  164. assert_equal("msg\n", log.msg)
  165. assert_equal("custom_progname", log.progname)
  166. assert_equal("INFO", log.severity)
  167. assert_equal("I", log.label)
  168. #
  169. log = log(logger, :warn, "custom_progname") { "msg" }
  170. assert_equal("msg\n", log.msg)
  171. assert_equal("custom_progname", log.progname)
  172. assert_equal("WARN", log.severity)
  173. assert_equal("W", log.label)
  174. #
  175. log = log(logger, :error, "custom_progname") { "msg" }
  176. assert_equal("msg\n", log.msg)
  177. assert_equal("custom_progname", log.progname)
  178. assert_equal("ERROR", log.severity)
  179. assert_equal("E", log.label)
  180. #
  181. log = log(logger, :fatal, "custom_progname") { "msg" }
  182. assert_equal("msg\n", log.msg)
  183. assert_equal("custom_progname", log.progname)
  184. assert_equal("FATAL", log.severity)
  185. assert_equal("F", log.label)
  186. #
  187. log = log(logger, :unknown, "custom_progname") { "msg" }
  188. assert_equal("msg\n", log.msg)
  189. assert_equal("custom_progname", log.progname)
  190. assert_equal("ANY", log.severity)
  191. assert_equal("A", log.label)
  192. end
  193. def test_close
  194. r, w = IO.pipe
  195. assert(!w.closed?)
  196. logger = Logger.new(w)
  197. logger.close
  198. assert(w.closed?)
  199. r.close
  200. end
  201. class MyError < StandardError
  202. end
  203. class MyMsg
  204. def inspect
  205. "my_msg"
  206. end
  207. end
  208. def test_format
  209. logger = Logger.new(nil)
  210. log = log_add(logger, INFO, "msg\n")
  211. assert_equal("msg\n\n", log.msg)
  212. begin
  213. raise MyError.new("excn")
  214. rescue MyError => e
  215. log = log_add(logger, INFO, e)
  216. assert_match(/^excn \(TestLogger::MyError\)/, log.msg)
  217. # expects backtrace is dumped across multi lines. 10 might be changed.
  218. assert(log.msg.split(/\n/).size >= 10)
  219. end
  220. log = log_add(logger, INFO, MyMsg.new)
  221. assert_equal("my_msg\n", log.msg)
  222. end
  223. def test_lshift
  224. r, w = IO.pipe
  225. logger = Logger.new(w)
  226. logger << "msg"
  227. read_ready, = IO.select([r], nil, nil, 0.1)
  228. w.close
  229. msg = r.read
  230. r.close
  231. assert_equal("msg", msg)
  232. #
  233. r, w = IO.pipe
  234. logger = Logger.new(w)
  235. logger << "msg2\n\n"
  236. read_ready, = IO.select([r], nil, nil, 0.1)
  237. w.close
  238. msg = r.read
  239. r.close
  240. assert_equal("msg2\n\n", msg)
  241. end
  242. end
  243. class TestLogDevice < Test::Unit::TestCase
  244. class LogExcnRaiser
  245. def write(*arg)
  246. raise 'disk is full'
  247. end
  248. def close
  249. end
  250. def stat
  251. Object.new
  252. end
  253. end
  254. def setup
  255. @filename = __FILE__ + ".#{$$}"
  256. end
  257. def teardown
  258. unless $DEBUG
  259. File.unlink(@filename) if File.exist?(@filename)
  260. end
  261. end
  262. def d(log, opt = {})
  263. Logger::LogDevice.new(log, opt)
  264. end
  265. def test_initialize
  266. logdev = d(STDERR)
  267. assert_equal(STDERR, logdev.dev)
  268. assert_nil(logdev.filename)
  269. assert_raises(TypeError) do
  270. d(nil)
  271. end
  272. #
  273. logdev = d(@filename)
  274. begin
  275. assert(File.exist?(@filename))
  276. assert(logdev.dev.sync)
  277. assert_equal(@filename, logdev.filename)
  278. logdev.write('hello')
  279. ensure
  280. logdev.close
  281. end
  282. # create logfile whitch is already exist.
  283. logdev = d(@filename)
  284. logdev.write('world')
  285. logfile = File.read(@filename)
  286. assert_equal(2, logfile.split(/\n/).size)
  287. assert_match(/^helloworld$/, logfile)
  288. end
  289. def test_write
  290. r, w = IO.pipe
  291. logdev = d(w)
  292. logdev.write("msg2\n\n")
  293. read_ready, = IO.select([r], nil, nil, 0.1)
  294. w.close
  295. msg = r.read
  296. r.close
  297. assert_equal("msg2\n\n", msg)
  298. #
  299. logdev = d(LogExcnRaiser.new)
  300. class << (stderr = '')
  301. alias write <<
  302. end
  303. $stderr, stderr = stderr, $stderr
  304. begin
  305. assert_nothing_raised do
  306. logdev.write('hello')
  307. end
  308. ensure
  309. logdev.close
  310. $stderr, stderr = stderr, $stderr
  311. end
  312. assert_equal "log writing failed. disk is full\n", stderr
  313. end
  314. def test_close
  315. r, w = IO.pipe
  316. logdev = d(w)
  317. logdev.write("msg2\n\n")
  318. read_ready, = IO.select([r], nil, nil, 0.1)
  319. assert(!w.closed?)
  320. logdev.close
  321. assert(w.closed?)
  322. r.close
  323. end
  324. def test_shifting_size
  325. logfile = File.basename(__FILE__) + '_1.log'
  326. logfile0 = logfile + '.0'
  327. logfile1 = logfile + '.1'
  328. logfile2 = logfile + '.2'
  329. logfile3 = logfile + '.3'
  330. File.unlink(logfile) if File.exist?(logfile)
  331. File.unlink(logfile0) if File.exist?(logfile0)
  332. File.unlink(logfile1) if File.exist?(logfile1)
  333. File.unlink(logfile2) if File.exist?(logfile2)
  334. logger = Logger.new(logfile, 4, 100)
  335. logger.error("0" * 15)
  336. assert(File.exist?(logfile))
  337. assert(!File.exist?(logfile0))
  338. logger.error("0" * 15)
  339. assert(File.exist?(logfile0))
  340. assert(!File.exist?(logfile1))
  341. logger.error("0" * 15)
  342. assert(File.exist?(logfile1))
  343. assert(!File.exist?(logfile2))
  344. logger.error("0" * 15)
  345. assert(File.exist?(logfile2))
  346. assert(!File.exist?(logfile3))
  347. logger.error("0" * 15)
  348. assert(!File.exist?(logfile3))
  349. logger.error("0" * 15)
  350. assert(!File.exist?(logfile3))
  351. logger.close
  352. File.unlink(logfile)
  353. File.unlink(logfile0)
  354. File.unlink(logfile1)
  355. File.unlink(logfile2)
  356. logfile = File.basename(__FILE__) + '_2.log'
  357. logfile0 = logfile + '.0'
  358. logfile1 = logfile + '.1'
  359. logfile2 = logfile + '.2'
  360. logfile3 = logfile + '.3'
  361. logger = Logger.new(logfile, 4, 150)
  362. logger.error("0" * 15)
  363. assert(File.exist?(logfile))
  364. assert(!File.exist?(logfile0))
  365. logger.error("0" * 15)
  366. assert(!File.exist?(logfile0))
  367. logger.error("0" * 15)
  368. assert(File.exist?(logfile0))
  369. assert(!File.exist?(logfile1))
  370. logger.error("0" * 15)
  371. assert(!File.exist?(logfile1))
  372. logger.error("0" * 15)
  373. assert(File.exist?(logfile1))
  374. assert(!File.exist?(logfile2))
  375. logger.error("0" * 15)
  376. assert(!File.exist?(logfile2))
  377. logger.error("0" * 15)
  378. assert(File.exist?(logfile2))
  379. assert(!File.exist?(logfile3))
  380. logger.error("0" * 15)
  381. assert(!File.exist?(logfile3))
  382. logger.error("0" * 15)
  383. assert(!File.exist?(logfile3))
  384. logger.error("0" * 15)
  385. assert(!File.exist?(logfile3))
  386. logger.close
  387. File.unlink(logfile)
  388. File.unlink(logfile0)
  389. File.unlink(logfile1)
  390. File.unlink(logfile2)
  391. end
  392. def test_shifting_age_variants
  393. logger = Logger.new(@filename, 'daily')
  394. logger.info('daily')
  395. logger.close
  396. logger = Logger.new(@filename, 'weekly')
  397. logger.info('weekly')
  398. logger.close
  399. logger = Logger.new(@filename, 'monthly')
  400. logger.info('monthly')
  401. logger.close
  402. end
  403. def test_shifting_age
  404. # shift_age other than 'daily', 'weekly', and 'monthly' means 'everytime'
  405. yyyymmdd = Time.now.strftime("%Y%m%d")
  406. filename1 = @filename + ".#{yyyymmdd}"
  407. filename2 = @filename + ".#{yyyymmdd}.1"
  408. filename3 = @filename + ".#{yyyymmdd}.2"
  409. begin
  410. logger = Logger.new(@filename, 'now')
  411. assert(File.exist?(@filename))
  412. assert(!File.exist?(filename1))
  413. assert(!File.exist?(filename2))
  414. assert(!File.exist?(filename3))
  415. logger.info("0" * 15)
  416. assert(File.exist?(@filename))
  417. assert(File.exist?(filename1))
  418. assert(!File.exist?(filename2))
  419. assert(!File.exist?(filename3))
  420. logger.warn("0" * 15)
  421. assert(File.exist?(@filename))
  422. assert(File.exist?(filename1))
  423. assert(File.exist?(filename2))
  424. assert(!File.exist?(filename3))
  425. logger.error("0" * 15)
  426. assert(File.exist?(@filename))
  427. assert(File.exist?(filename1))
  428. assert(File.exist?(filename2))
  429. assert(File.exist?(filename3))
  430. ensure
  431. [filename1, filename2, filename3].each do |filename|
  432. File.unlink(filename) if File.exist?(filename)
  433. end
  434. end
  435. end
  436. end
  437. class TestLoggerApplication < Test::Unit::TestCase
  438. def setup
  439. @app = Logger::Application.new('appname')
  440. @filename = __FILE__ + ".#{$$}"
  441. end
  442. def teardown
  443. unless $DEBUG
  444. File.unlink(@filename) if File.exist?(@filename)
  445. end
  446. end
  447. def test_initialize
  448. app = Logger::Application.new('appname')
  449. assert_equal('appname', app.appname)
  450. end
  451. def test_start
  452. @app.set_log(@filename)
  453. @app.level = Logger::UNKNOWN
  454. @app.start # logs FATAL log
  455. assert_equal(1, File.read(@filename).split(/\n/).size)
  456. end
  457. def test_logger
  458. @app.level = Logger::WARN
  459. @app.set_log(@filename)
  460. assert_equal(Logger::WARN, @app.logger.level)
  461. @app.logger = logger = Logger.new(STDOUT)
  462. assert_equal(logger, @app.logger)
  463. assert_equal(Logger::WARN, @app.logger.level)
  464. @app.log = @filename
  465. assert(logger != @app.logger)
  466. assert_equal(Logger::WARN, @app.logger.level)
  467. end
  468. end