diff options
author | Chris Knight <cknight1234@gmail.com> | 2020-04-09 12:45:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-09 13:45:24 +0200 |
commit | 475a47cfb7b83e05872ce084bc4b13d60697711b (patch) | |
tree | 3b1a1647f0c3e79bc665a16f7854b73bfe19efd5 /std/log/handlers_test.ts | |
parent | 198a045dbee7b0350055b7f88f1e0670da87fb3b (diff) |
feat(std/log): improvements and new log handler (#4674)
Diffstat (limited to 'std/log/handlers_test.ts')
-rw-r--r-- | std/log/handlers_test.ts | 257 |
1 files changed, 232 insertions, 25 deletions
diff --git a/std/log/handlers_test.ts b/std/log/handlers_test.ts index 4feffdaf9..13b6de3bd 100644 --- a/std/log/handlers_test.ts +++ b/std/log/handlers_test.ts @@ -1,8 +1,12 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. const { test } = Deno; -import { assertEquals } from "../testing/asserts.ts"; +import { assert, assertEquals, assertThrowsAsync } from "../testing/asserts.ts"; import { LogLevel, getLevelName, getLevelByName } from "./levels.ts"; -import { BaseHandler } from "./handlers.ts"; +import { BaseHandler, FileHandler, RotatingFileHandler } from "./handlers.ts"; +import { LogRecord } from "./logger.ts"; +import { existsSync } from "../fs/exists.ts"; + +const LOG_FILE = "./test_log.file"; class TestHandler extends BaseHandler { public messages: string[] = []; @@ -47,13 +51,9 @@ test(function simpleHandler(): void { for (const levelName in LogLevel) { const level = getLevelByName(levelName); - handler.handle({ - msg: `${levelName.toLowerCase()}-test`, - args: [], - datetime: new Date(), - level: level, - levelName: levelName, - }); + handler.handle( + new LogRecord(`${levelName.toLowerCase()}-test`, [], level) + ); } assertEquals(handler.level, testCase); @@ -67,13 +67,7 @@ test(function testFormatterAsString(): void { formatter: "test {levelName} {msg}", }); - handler.handle({ - msg: "Hello, world!", - args: [], - datetime: new Date(), - level: LogLevel.DEBUG, - levelName: "DEBUG", - }); + handler.handle(new LogRecord("Hello, world!", [], LogLevel.DEBUG)); assertEquals(handler.messages, ["test DEBUG Hello, world!"]); }); @@ -81,16 +75,229 @@ test(function testFormatterAsString(): void { test(function testFormatterAsFunction(): void { const handler = new TestHandler("DEBUG", { formatter: (logRecord): string => - `fn formmatter ${logRecord.levelName} ${logRecord.msg}`, + `fn formatter ${logRecord.levelName} ${logRecord.msg}`, }); - handler.handle({ - msg: "Hello, world!", - args: [], - datetime: new Date(), - level: LogLevel.ERROR, - levelName: "ERROR", - }); + handler.handle(new LogRecord("Hello, world!", [], LogLevel.ERROR)); + + assertEquals(handler.messages, ["fn formatter ERROR Hello, world!"]); +}); + +test({ + name: "FileHandler with mode 'w' will wipe clean existing log file", + async fn() { + const fileHandler = new FileHandler("WARNING", { + filename: LOG_FILE, + mode: "w", + }); + + await fileHandler.setup(); + fileHandler.handle(new LogRecord("Hello World", [], LogLevel.WARNING)); + await fileHandler.destroy(); + const firstFileSize = (await Deno.stat(LOG_FILE)).size; + + await fileHandler.setup(); + fileHandler.handle(new LogRecord("Hello World", [], LogLevel.WARNING)); + await fileHandler.destroy(); + const secondFileSize = (await Deno.stat(LOG_FILE)).size; + + assertEquals(secondFileSize, firstFileSize); + Deno.removeSync(LOG_FILE); + }, +}); + +test({ + name: "FileHandler with mode 'x' will throw if log file already exists", + async fn() { + await assertThrowsAsync( + async () => { + Deno.writeFileSync(LOG_FILE, new TextEncoder().encode("hello world")); + const fileHandler = new FileHandler("WARNING", { + filename: LOG_FILE, + mode: "x", + }); + await fileHandler.setup(); + }, + Deno.errors.AlreadyExists, + "ile exists" + ); + Deno.removeSync(LOG_FILE); + }, +}); + +test({ + name: + "RotatingFileHandler with mode 'w' will wipe clean existing log file and remove others", + async fn() { + Deno.writeFileSync(LOG_FILE, new TextEncoder().encode("hello world")); + Deno.writeFileSync( + LOG_FILE + ".1", + new TextEncoder().encode("hello world") + ); + Deno.writeFileSync( + LOG_FILE + ".2", + new TextEncoder().encode("hello world") + ); + Deno.writeFileSync( + LOG_FILE + ".3", + new TextEncoder().encode("hello world") + ); + + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 50, + maxBackupCount: 3, + mode: "w", + }); + await fileHandler.setup(); + await fileHandler.destroy(); + + assertEquals((await Deno.stat(LOG_FILE)).size, 0); + assert(!existsSync(LOG_FILE + ".1")); + assert(!existsSync(LOG_FILE + ".2")); + assert(!existsSync(LOG_FILE + ".3")); + + Deno.removeSync(LOG_FILE); + }, +}); + +test({ + name: + "RotatingFileHandler with mode 'x' will throw if any log file already exists", + async fn() { + await assertThrowsAsync( + async () => { + Deno.writeFileSync( + LOG_FILE + ".3", + new TextEncoder().encode("hello world") + ); + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 50, + maxBackupCount: 3, + mode: "x", + }); + await fileHandler.setup(); + }, + Deno.errors.AlreadyExists, + "Backup log file " + LOG_FILE + ".3 already exists" + ); + Deno.removeSync(LOG_FILE + ".3"); + Deno.removeSync(LOG_FILE); + }, +}); + +test({ + name: "RotatingFileHandler with first rollover", + async fn() { + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 25, + maxBackupCount: 3, + mode: "w", + }); + await fileHandler.setup(); + + fileHandler.handle(new LogRecord("AAA", [], LogLevel.ERROR)); // 'ERROR AAA\n' = 10 bytes + assertEquals((await Deno.stat(LOG_FILE)).size, 10); + fileHandler.handle(new LogRecord("AAA", [], LogLevel.ERROR)); + assertEquals((await Deno.stat(LOG_FILE)).size, 20); + fileHandler.handle(new LogRecord("AAA", [], LogLevel.ERROR)); + // Rollover occurred. Log file now has 1 record, rollover file has the original 2 + assertEquals((await Deno.stat(LOG_FILE)).size, 10); + assertEquals((await Deno.stat(LOG_FILE + ".1")).size, 20); + + await fileHandler.destroy(); + + Deno.removeSync(LOG_FILE); + Deno.removeSync(LOG_FILE + ".1"); + }, +}); + +test({ + name: "RotatingFileHandler with all backups rollover", + async fn() { + Deno.writeFileSync(LOG_FILE, new TextEncoder().encode("original log file")); + Deno.writeFileSync( + LOG_FILE + ".1", + new TextEncoder().encode("original log.1 file") + ); + Deno.writeFileSync( + LOG_FILE + ".2", + new TextEncoder().encode("original log.2 file") + ); + Deno.writeFileSync( + LOG_FILE + ".3", + new TextEncoder().encode("original log.3 file") + ); + + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 2, + maxBackupCount: 3, + mode: "a", + }); + await fileHandler.setup(); + fileHandler.handle(new LogRecord("AAA", [], LogLevel.ERROR)); // 'ERROR AAA\n' = 10 bytes + await fileHandler.destroy(); + + const decoder = new TextDecoder(); + assertEquals(decoder.decode(Deno.readFileSync(LOG_FILE)), "ERROR AAA\n"); + assertEquals( + decoder.decode(Deno.readFileSync(LOG_FILE + ".1")), + "original log file" + ); + assertEquals( + decoder.decode(Deno.readFileSync(LOG_FILE + ".2")), + "original log.1 file" + ); + assertEquals( + decoder.decode(Deno.readFileSync(LOG_FILE + ".3")), + "original log.2 file" + ); + assert(!existsSync(LOG_FILE + ".4")); + + Deno.removeSync(LOG_FILE); + Deno.removeSync(LOG_FILE + ".1"); + Deno.removeSync(LOG_FILE + ".2"); + Deno.removeSync(LOG_FILE + ".3"); + }, +}); + +test({ + name: "RotatingFileHandler maxBytes cannot be less than 1", + async fn() { + await assertThrowsAsync( + async () => { + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 0, + maxBackupCount: 3, + mode: "w", + }); + await fileHandler.setup(); + }, + Error, + "maxBytes cannot be less than 1" + ); + }, +}); - assertEquals(handler.messages, ["fn formmatter ERROR Hello, world!"]); +test({ + name: "RotatingFileHandler maxBackupCount cannot be less than 1", + async fn() { + await assertThrowsAsync( + async () => { + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 50, + maxBackupCount: 0, + mode: "w", + }); + await fileHandler.setup(); + }, + Error, + "maxBackupCount cannot be less than 1" + ); + }, }); |