Files
sousa-gecko/widget/windows/tests/unit/test_windowsTestDebug.js
T
David P. dd648ea6d0 Bug 1990634: Part 3 - Add WindowsTestDebug component to find open file handles r=win-reviewers,gstoll
The component is (only) useful for debugging when Windows tells us a process
has an open file handle and forbids operations on that file.  The utility
will return a list of applications with a handle to the file.  This was written
to debug this bug, but this bug was worse than it could handle -- file handles
can be cloned for memory mapping and it seems that the Restart Manager (the
Win32 tool we use to implement this) does not catch those file handles.

Process Explorer can do this as well.  (Pro tip: it even shows the memory
mapping handles... in the DLLs tab!).  This component is most useful for
fast, transient issues (such as Windows Defender grabbing a handle at an
inopporitune time), or for times when interactivity isn't available (such
as failures in automation, like this bug).

Differential Revision: https://phabricator.services.mozilla.com/D267710
2025-10-30 00:45:25 +00:00

44 lines
1.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/*
* Test nsIWindowsTestDebug.
*/
const { BasePromiseWorker } = ChromeUtils.importESModule(
"resource://gre/modules/PromiseWorker.sys.mjs"
);
add_task(async () => {
const path = await IOUtils.createUniqueFile(PathUtils.tempDir, "openedFile");
await IOUtils.writeUTF8(path, "");
Assert.ok(await IOUtils.exists(path), path + " should have been created");
registerCleanupFunction(async () => {
await IOUtils.remove(path);
});
// Use a worker to keep the testFile open.
const worker = new BasePromiseWorker(
"resource://test/test_keep_file_open.worker.js"
);
await worker.post("open", [path]);
// Check that nsIWindowsTestDebug tells us that we have the file open.
const WindowsTestDebug = Cc["@mozilla.org/win-test-debug;1"].getService(
Ci.nsIWindowsTestDebug
);
let procs = WindowsTestDebug.processesThatOpenedFile(path);
info(JSON.stringify(procs));
Assert.equal(procs.length, 1, "Process list contains one process");
const ProcessTools = Cc["@mozilla.org/processtools-service;1"].getService(
Ci.nsIProcessToolsService
);
Assert.equal(
procs[0].pid,
ProcessTools.pid,
"Process list contains this process"
);
await worker.post("close", []);
await IOUtils.remove(path);
});