CODEBASE: Remove redundant check in getServer utility function and serverExists API (#2357)

This commit is contained in:
catloversg
2025-10-20 01:45:30 +07:00
committed by GitHub
parent b495deb458
commit 6837f334fd
4 changed files with 160 additions and 180 deletions
+80 -96
View File
@@ -1,10 +1,8 @@
import type { Script } from "../../../src/Script/Script";
import type { ScriptFilePath } from "../../../src/Paths/ScriptFilePath";
import { runScriptFromScript, startWorkerScript } from "../../../src/NetscriptWorker";
import { workerScripts } from "../../../src/Netscript/WorkerScripts";
import { Server } from "../../../src/Server/Server";
import { RunningScript } from "../../../src/Script/RunningScript";
import { AddToAllServers, DeleteServer, GetServerOrThrow } from "../../../src/Server/AllServers";
import { GetServerOrThrow } from "../../../src/Server/AllServers";
import { AlertEvents } from "../../../src/ui/React/AlertManager";
import { fixDoImportIssue, initGameEnvironment, setupBasicTestingEnvironment } from "../Utilities";
import { Terminal } from "../../../src/Terminal";
@@ -21,74 +19,6 @@ fixDoImportIssue();
initGameEnvironment();
test.each([
{
name: "NS2 test /w import",
expected: ["false home 8", "Script finished running"],
scripts: [
{
name: "import.js",
code: `
export function getInfo(ns) {
return ns.stock.has4SData();
}
`,
},
{
name: "simple_test.js",
code: `
import { getInfo } from "./import.js";
export async function main(ns) {
var access = getInfo(ns);
var server = ns.getServer();
ns.printf("%s %s %d", access, server.hostname, server.maxRam);
}
`,
},
],
},
])("Netscript execution: $name", async function ({ expected: expectedLog, scripts }) {
let server = {} as Server;
const eventDelete = () => {};
let alertDelete = () => {};
try {
const alerted = new Promise((resolve) => {
alertDelete = AlertEvents.subscribe((x) => resolve(x));
});
server = new Server({ hostname: "home", adminRights: true, maxRam: 8 });
AddToAllServers(server);
for (const s of scripts) {
expect(server.writeToScriptFile(s.name as ScriptFilePath, s.code)).toEqual({ overwritten: false });
}
const script = server.scripts.get(scripts[scripts.length - 1].name as ScriptFilePath) as Script;
expect(script.filename).toEqual(scripts[scripts.length - 1].name);
const ramUsage = script.getRamUsage(server.scripts);
if (!ramUsage) throw new Error(`ramUsage calculated to be ${ramUsage}`);
const runningScript = new RunningScript(script, ramUsage);
const pid = startWorkerScript(runningScript, server);
expect(pid).toBeGreaterThan(0);
// Manually attach an atExit to the now-created WorkerScript, so we can
// await script death.
const ws = workerScripts.get(pid);
expect(ws).toBeDefined();
const result = await Promise.race([
alerted,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- ws was asserted above
new Promise<void>((resolve) => (ws!.atExit = new Map([["default", resolve]]))),
]);
// If an error alert was thrown, we catch it here.
expect(result).not.toBeDefined();
expect(runningScript.logs).toEqual(expectedLog);
} finally {
eventDelete();
if (server) DeleteServer(server.hostname);
alertDelete();
}
});
const testScriptPath = "test.js" as ScriptFilePath;
const parentTestScriptPath = "parent_script.js" as ScriptFilePath;
const runOptions = {
@@ -125,32 +55,86 @@ async function expectErrorWhenRunningScript(
expect(workerScript.scriptRef.logs[0]).toContain(errorMessage);
}
let alertEventCleanUpFunction: () => void;
let alerted: Promise<unknown>;
let errorPopUpEventCleanUpFunction: () => void;
let errorShown: Promise<unknown>;
beforeEach(() => {
setupBasicTestingEnvironment();
Terminal.clear();
resetPidCounter();
alerted = new Promise((resolve) => {
alertEventCleanUpFunction = AlertEvents.subscribe((x) => resolve(x));
});
errorShown = new Promise((resolve) => {
errorPopUpEventCleanUpFunction = ErrorState.ErrorUpdate.subscribe((x) => resolve(x));
});
});
afterEach(() => {
alertEventCleanUpFunction();
errorPopUpEventCleanUpFunction();
ErrorState.ActiveError = null;
ErrorState.Errors.length = 0;
ErrorState.UnreadErrors = 0;
});
test("Netscript execution", async () => {
const scripts = [
{
name: "import.js",
code: `
export function getInfo(ns) {
return ns.stock.has4SData();
}
`,
},
{
name: "simple_test.js",
code: `
import { getInfo } from "./import.js";
export async function main(ns) {
var access = getInfo(ns);
var server = ns.getServer();
ns.printf("%s %s %d", access, server.hostname, server.maxRam);
}
`,
},
];
const server = Player.getHomeComputer();
for (const script of scripts) {
expect(server.writeToScriptFile(script.name as ScriptFilePath, script.code)).toEqual({ overwritten: false });
}
const script = server.scripts.get(scripts[scripts.length - 1].name as ScriptFilePath);
if (!script) {
throw new Error("Invalid script");
}
expect(script.filename).toEqual(scripts[scripts.length - 1].name);
const ramUsage = script.getRamUsage(server.scripts);
if (!ramUsage) {
throw new Error(`ramUsage calculated to be ${ramUsage}`);
}
const runningScript = new RunningScript(script, ramUsage);
const pid = startWorkerScript(runningScript, server);
expect(pid).toBeGreaterThan(0);
const workerScript = workerScripts.get(pid);
if (!workerScript) {
throw new Error(`Invalid worker script`);
}
const result = await Promise.race([
alerted,
new Promise<void>((resolve) => (workerScript.atExit = new Map([["default", resolve]]))),
]);
expect(result).not.toBeDefined();
expect(runningScript.logs).toStrictEqual(["false home 8", "Script finished running"]);
});
describe("runScript and runScriptFromScript", () => {
let alertEventCleanUpFunction: () => void;
let alerted: Promise<unknown>;
let errorPopUpEventCleanUpFunction: () => void;
let errorShown: Promise<unknown>;
beforeEach(() => {
setupBasicTestingEnvironment();
Terminal.clear();
resetPidCounter();
alerted = new Promise((resolve) => {
alertEventCleanUpFunction = AlertEvents.subscribe((x) => resolve(x));
});
errorShown = new Promise((resolve) => {
errorPopUpEventCleanUpFunction = ErrorState.ErrorUpdate.subscribe((x) => resolve(x));
});
});
afterEach(() => {
alertEventCleanUpFunction();
errorPopUpEventCleanUpFunction();
ErrorState.ActiveError = null;
ErrorState.Errors.length = 0;
ErrorState.UnreadErrors = 0;
});
describe("runScript", () => {
describe("Success", () => {
test("Normal", async () => {