summaryrefslogtreecommitdiff
path: root/std/log/handlers_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/log/handlers_test.ts')
-rw-r--r--std/log/handlers_test.ts132
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);