[TS] Manually GC on chromium and skip leak checks otherwise
authorMatt Corallo <git@bluematt.me>
Mon, 17 Jan 2022 14:01:50 +0000 (14:01 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 17 Jan 2022 21:04:54 +0000 (21:04 +0000)
ts/test/browser.mjs
ts/test/tests.mts

index 0d9e9dd9ec414854fe42a7189046190c0f830914..5f65191a3bb7df5d221a9d21bdd1eb5d31281620 100644 (file)
@@ -2,7 +2,11 @@ import { chromium, firefox, webkit } from 'playwright';
 import { strict as assert } from 'assert';
 
 for (const browserType of [chromium, firefox]) { // We'd like to test webkit, but playwright doesn't support it on Debian (?!)
 import { strict as assert } from 'assert';
 
 for (const browserType of [chromium, firefox]) { // We'd like to test webkit, but playwright doesn't support it on Debian (?!)
-       const browser = await browserType.launch();
+       var browser;
+       if (browserType == chromium)
+               browser = await browserType.launch(["--js-flags=\"--expose-gc\""]);
+       else
+               browser = await browserType.launch();
        const context = await browser.newContext();
        const page = await context.newPage();
        page.on('console', async msg => {
        const context = await browser.newContext();
        const page = await context.newPage();
        page.on('console', async msg => {
@@ -12,9 +16,13 @@ for (const browserType of [chromium, firefox]) { // We'd like to test webkit, bu
                console.log(...values);
        });
        await page.goto('http://localhost:8000/test/index.html');
                console.log(...values);
        });
        await page.goto('http://localhost:8000/test/index.html');
-       const ret = await page.evaluate(() => {
-               return test_runner('../liblightningjs.wasm');
-       });
+       var ret;
+       // On chromium we expose the GC and can run it manually, otherwise we really can't leak-check
+       if (browserType == chromium) {
+               ret = await page.evaluate(() => { return test_runner('../liblightningjs.wasm', true); });
+       } else {
+               ret = await page.evaluate(() => { return test_runner('../liblightningjs.wasm', false); });
+       }
        assert(ret);
 
        await browser.close();
        assert(ret);
 
        await browser.close();
index 751d7ddf98094c3a5f40fcadf36b79e5f14bc5c2..4299f3b83636f756618a33500fe285a0f13d96c2 100644 (file)
@@ -197,7 +197,7 @@ tests.push(async () => {
        return true;
 });
 
        return true;
 });
 
-export async function run_tests(wasm_path: string) {
+export async function run_tests(wasm_path: string, check_leaks: boolean = true) {
        await rawldk.initializeWasm(wasm_path);
 
        var test_runs = [];
        await rawldk.initializeWasm(wasm_path);
 
        var test_runs = [];
@@ -208,7 +208,7 @@ export async function run_tests(wasm_path: string) {
        console.log("test results: " + results);
        const result = results.every((v) => { return v === true });
        console.log("all tests passed: " + result);
        console.log("test results: " + results);
        const result = results.every((v) => { return v === true });
        console.log("all tests passed: " + result);
-       if (result !== true) { return result; }
+       if (result !== true || !check_leaks) { return result; }
 
        const allocs_finished = new Promise((resolve, reject) => {
                var loop_count = 0;
 
        const allocs_finished = new Promise((resolve, reject) => {
                var loop_count = 0;
@@ -216,10 +216,15 @@ export async function run_tests(wasm_path: string) {
                        const alloc_count = rawldk.getRemainingAllocationCount();
                        if (loop_count % 20 == 0)
                                console.log("Remaining LDK allocation count: " + alloc_count);
                        const alloc_count = rawldk.getRemainingAllocationCount();
                        if (loop_count % 20 == 0)
                                console.log("Remaining LDK allocation count: " + alloc_count);
+
+                       // chromium with --js-flags="--expose-gc" exposes a `window.gc()` which we call if we can
+                       // @ts-ignore window.gc is considered a type error in TS
+                       if (typeof window !== "undefined" && typeof window.gc !== "undefined") window.gc();
+
                        // Note that there are currently 9 leaks in the above tests. At least some are known - look for XXX in bindings.c
                        // Note that there are currently 9 leaks in the above tests. At least some are known - look for XXX in bindings.c
-                       if (alloc_count <= 10) { resolve(true); clearInterval(interval_id); }
+                       if (alloc_count <= 10) { clearInterval(interval_id); rawldk.debugPrintRemainingAllocs(); resolve(true); }
                        loop_count += 1;
                        loop_count += 1;
-                       if (loop_count > 30*2) { resolve(false); clearInterval(interval_id); rawldk.debugPrintRemainingAllocs(); }
+                       if (loop_count > 30*2) { clearInterval(interval_id); rawldk.debugPrintRemainingAllocs(); resolve(false); }
                }, 500);
        });
        return allocs_finished;
                }, 500);
        });
        return allocs_finished;