diff options
Diffstat (limited to 'std/log/handlers_test.ts')
-rw-r--r-- | std/log/handlers_test.ts | 132 |
1 files changed, 109 insertions, 23 deletions
diff --git a/std/log/handlers_test.ts b/std/log/handlers_test.ts index 5275a5ca0..cb73fa56f 100644 --- a/std/log/handlers_test.ts +++ b/std/log/handlers_test.ts @@ -120,14 +120,18 @@ test({ test({ name: "FileHandler with mode 'x' will throw if log file already exists", async fn() { + const fileHandler = new FileHandler("WARNING", { + filename: LOG_FILE, + mode: "x", + }); + Deno.writeFileSync(LOG_FILE, new TextEncoder().encode("hello world")); + 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); + + await fileHandler.destroy(); + Deno.removeSync(LOG_FILE); }, }); @@ -172,30 +176,32 @@ test({ name: "RotatingFileHandler with mode 'x' will throw if any log file already exists", async fn() { + 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 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" ); + + fileHandler.destroy(); Deno.removeSync(LOG_FILE + ".3"); Deno.removeSync(LOG_FILE); }, }); test({ - name: "RotatingFileHandler with first rollover", + name: "RotatingFileHandler with first rollover, monitor step by step", async fn() { const fileHandler = new RotatingFileHandler("WARNING", { filename: LOG_FILE, @@ -206,16 +212,43 @@ test({ await fileHandler.setup(); fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); // 'ERROR AAA\n' = 10 bytes + fileHandler.flush(); assertEquals((await Deno.stat(LOG_FILE)).size, 10); fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); + fileHandler.flush(); assertEquals((await Deno.stat(LOG_FILE)).size, 20); fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); + fileHandler.flush(); // 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 first rollover, check all at once", + async fn() { + const fileHandler = new RotatingFileHandler("WARNING", { + filename: LOG_FILE, + maxBytes: 25, + maxBackupCount: 3, + mode: "w", + }); + await fileHandler.setup(); + + fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); // 'ERROR AAA\n' = 10 bytes + fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); + fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); await fileHandler.destroy(); + assertEquals((await Deno.stat(LOG_FILE)).size, 10); + assertEquals((await Deno.stat(LOG_FILE + ".1")).size, 20); + Deno.removeSync(LOG_FILE); Deno.removeSync(LOG_FILE + ".1"); }, @@ -310,11 +343,29 @@ test({ }); test({ - name: "RotatingFileHandler fileSize equal to bytelength of message + 1", + name: "Window unload flushes buffer", + async fn() { + const fileHandler = new FileHandler("WARNING", { + filename: LOG_FILE, + mode: "w", + }); + await fileHandler.setup(); + fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); // 'ERROR AAA\n' = 10 bytes + + assertEquals((await Deno.stat(LOG_FILE)).size, 0); + dispatchEvent(new Event("unload")); + assertEquals((await Deno.stat(LOG_FILE)).size, 10); + + Deno.removeSync(LOG_FILE); + }, +}); + +test({ + name: "RotatingFileHandler: rotate on byte length, not msg length", async fn() { const fileHandler = new RotatingFileHandler("WARNING", { filename: LOG_FILE, - maxBytes: 100, + maxBytes: 7, maxBackupCount: 1, mode: "w", }); @@ -323,12 +374,47 @@ test({ const msg = "。"; const msgLength = msg.length; const msgByteLength = new TextEncoder().encode(msg).byteLength; - await fileHandler.log(msg); - const fileSzie = (await Deno.stat(LOG_FILE)).size; + assertNotEquals(msgLength, msgByteLength); + assertEquals(msgLength, 1); + assertEquals(msgByteLength, 3); + + fileHandler.log(msg); // logs 4 bytes (including '\n') + fileHandler.log(msg); // max bytes is 7, but this would be 8. Rollover. + + await fileHandler.destroy(); + + const fileSize1 = (await Deno.stat(LOG_FILE)).size; + const fileSize2 = (await Deno.stat(LOG_FILE + ".1")).size; + + assertEquals(fileSize1, msgByteLength + 1); + assertEquals(fileSize2, msgByteLength + 1); + + Deno.removeSync(LOG_FILE); + Deno.removeSync(LOG_FILE + ".1"); + }, +}); + +test({ + name: "FileHandler: Critical logs trigger immediate flush", + async fn() { + const fileHandler = new FileHandler("WARNING", { + filename: LOG_FILE, + mode: "w", + }); + await fileHandler.setup(); + + fileHandler.handle(new LogRecord("AAA", [], LogLevels.ERROR)); + + // ERROR won't trigger immediate flush + const fileSize = (await Deno.stat(LOG_FILE)).size; + assertEquals(fileSize, 0); + + fileHandler.handle(new LogRecord("AAA", [], LogLevels.CRITICAL)); - assertEquals(fileSzie, msgByteLength + 1); - assertNotEquals(fileSzie, msgLength); - assertNotEquals(fileSzie, msgLength + 1); + // CRITICAL will trigger immediate flush + const fileSize2 = (await Deno.stat(LOG_FILE)).size; + // ERROR record is 10 bytes, CRITICAL is 13 bytes + assertEquals(fileSize2, 23); await fileHandler.destroy(); Deno.removeSync(LOG_FILE); |