summaryrefslogtreecommitdiff
path: root/std/log/handlers_test.ts
diff options
context:
space:
mode:
authorChris Knight <cknight1234@gmail.com>2020-04-09 12:45:24 +0100
committerGitHub <noreply@github.com>2020-04-09 13:45:24 +0200
commit475a47cfb7b83e05872ce084bc4b13d60697711b (patch)
tree3b1a1647f0c3e79bc665a16f7854b73bfe19efd5 /std/log/handlers_test.ts
parent198a045dbee7b0350055b7f88f1e0670da87fb3b (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.ts257
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"
+ );
+ },
});