mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-16 06:18:42 +02:00
1352 lines
54 KiB
TypeScript
1352 lines
54 KiB
TypeScript
import { AugmentationName, CompletedProgramName } from "@enums";
|
|
import { Player } from "@player";
|
|
import type { DarknetResult } from "@nsdefs";
|
|
import { PlayerOwnedAugmentation } from "../../../src/Augmentation/PlayerOwnedAugmentation";
|
|
import { addCacheToServer } from "../../../src/DarkNet/effects/cacheFiles";
|
|
import { getDarkscapeNavigator } from "../../../src/DarkNet/effects/effects";
|
|
import { connectServers, GetServerOrThrow } from "../../../src/Server/AllServers";
|
|
import { SpecialServers } from "../../../src/Server/data/SpecialServers";
|
|
import { initStockMarket } from "../../../src/StockMarket/StockMarket";
|
|
import {
|
|
fixDoImportIssue,
|
|
getMockedNetscriptContext,
|
|
getNS,
|
|
getWorkerScriptAndNS,
|
|
initGameEnvironment,
|
|
setupBasicTestingEnvironment,
|
|
} from "../Utilities";
|
|
import type { ScriptFilePath } from "../../../src/Paths/ScriptFilePath";
|
|
import { DarknetState, getServerState, triggerNextUpdate } from "../../../src/DarkNet/models/DarknetState";
|
|
import { getDarknetServer, getDarknetServerOrThrow } from "../../../src/DarkNet/utils/darknetServerUtils";
|
|
import { ModelIds, ResponseCodeEnum } from "../../../src/DarkNet/Enums";
|
|
import { getAllMovableDarknetServers } from "../../../src/DarkNet/utils/darknetNetworkUtils";
|
|
import { expectRunningOnDarknetServer } from "../../../src/DarkNet/effects/offlineServerHandling";
|
|
import { sleep } from "../../../src/utils/Utility";
|
|
import { addLowLevelServersIfNeeded } from "../../../src/DarkNet/controllers/NetworkMovement";
|
|
import { isIPAddress } from "../../../src/Types/strings";
|
|
import { clearDarknet, populateDarknet } from "../../../src/DarkNet/controllers/NetworkGenerator";
|
|
import {
|
|
getLabMaze,
|
|
getLabyrinthDetails,
|
|
isLocationStatus,
|
|
LocationStatus,
|
|
} from "../../../src/DarkNet/effects/labyrinth";
|
|
import { getMostRecentAuthLog } from "../../../src/DarkNet/models/packetSniffing";
|
|
import type { Result } from "@nsdefs";
|
|
import { assertNonNullish } from "../../../src/utils/TypeAssertion";
|
|
|
|
const hostnameOfNonExistentServer = "fake-server";
|
|
const errorMessageForNonExistentServer = `Invalid host: '${hostnameOfNonExistentServer}'`;
|
|
const hostnameForOfflineServer = "darknet-offline-server";
|
|
const ipForOfflineServer = "0.0.0.0";
|
|
|
|
fixDoImportIssue();
|
|
|
|
beforeAll(() => {
|
|
initGameEnvironment();
|
|
initStockMarket();
|
|
});
|
|
beforeEach(() => {
|
|
DarknetState.offlineServers = new Set();
|
|
setupBasicTestingEnvironment({ purchasePServer: true, purchaseHacknetServer: true });
|
|
Player.sourceFiles.set(15, 1);
|
|
getDarkscapeNavigator();
|
|
Player.getHomeComputer().programs.push(CompletedProgramName.formulas);
|
|
Player.mults.charisma = 1e10;
|
|
Player.gainCharismaExp(1e100);
|
|
getNsOnServerNearLabyrinth();
|
|
});
|
|
|
|
function getNsOnHome() {
|
|
return getNS(SpecialServers.Home);
|
|
}
|
|
|
|
function getNsOnDarkWeb() {
|
|
return getNS(SpecialServers.DarkWeb);
|
|
}
|
|
|
|
function getNsOnServerNearLabyrinth() {
|
|
let server = null;
|
|
while (!server) {
|
|
const labyrinth = getLabyrinthDetails().lab;
|
|
server = labyrinth?.serversOnNetwork.find(
|
|
(hostname) => hostname !== SpecialServers.Home && hostname !== SpecialServers.DarkWeb,
|
|
);
|
|
if (!server) {
|
|
clearDarknet();
|
|
populateDarknet();
|
|
}
|
|
}
|
|
return getNS(server);
|
|
}
|
|
|
|
function getFirstDarknetServerAdjacentToDarkWeb() {
|
|
addLowLevelServersIfNeeded();
|
|
const darkweb = getDarknetServerOrThrow(SpecialServers.DarkWeb);
|
|
const result = darkweb.serversOnNetwork.filter((hostname) => hostname !== SpecialServers.Home)[0];
|
|
if (!result) {
|
|
throw new Error("No darknet server adjacent to darkweb found");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function getNsOnNonDarkwebDarknetServer() {
|
|
const hostname = getFirstDarknetServerAdjacentToDarkWeb();
|
|
return getNS(hostname);
|
|
}
|
|
|
|
function getRandomDarknetServer(excludedHostnames: string[] = []) {
|
|
const result = DarknetState.Network.flat().find((server) => server && !excludedHostnames.includes(server.hostname));
|
|
if (!result) {
|
|
throw new Error("No darknet server found");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
describe("Common APIs", () => {
|
|
test("getDarknetInstability", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(ns.dnet.getStasisLinkLimit()).toStrictEqual(1);
|
|
Player.augmentations.push(new PlayerOwnedAugmentation(AugmentationName.TheBrokenWings));
|
|
expect(ns.dnet.getStasisLinkLimit()).toStrictEqual(2);
|
|
Player.augmentations.push(new PlayerOwnedAugmentation(AugmentationName.TheHammer));
|
|
expect(ns.dnet.getStasisLinkLimit()).toStrictEqual(3);
|
|
});
|
|
test("unleashStormSeed", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result1 = ns.dnet.unleashStormSeed();
|
|
expect(result1.success).toStrictEqual(false);
|
|
expect(DarknetState.mutationLock).toBeNull();
|
|
getDarknetServerOrThrow(ns.getHostname()).programs.push(CompletedProgramName.stormSeed);
|
|
const result2 = ns.dnet.unleashStormSeed();
|
|
expect(result2.success).toStrictEqual(true);
|
|
expect(DarknetState.mutationLock).toBeTruthy();
|
|
});
|
|
test("getDarknetInstability", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const initialResult = ns.dnet.getDarknetInstability();
|
|
|
|
expect(initialResult.authenticationTimeoutChance).toStrictEqual(0);
|
|
expect(initialResult.authenticationDurationMultiplier).toStrictEqual(1);
|
|
|
|
const darknetServers = getAllMovableDarknetServers();
|
|
|
|
// The first two backdoors do not increase instability
|
|
darknetServers.slice(0, 2).forEach((server) => (server.backdoorInstalled = true));
|
|
|
|
const resultAfterTwoBackdoors = ns.dnet.getDarknetInstability();
|
|
expect(resultAfterTwoBackdoors.authenticationTimeoutChance).toStrictEqual(0);
|
|
expect(resultAfterTwoBackdoors.authenticationDurationMultiplier).toStrictEqual(1);
|
|
|
|
// Stasis linked servers do not increase instability
|
|
darknetServers.slice(2, 5).forEach((server) => (server.backdoorInstalled = true));
|
|
darknetServers.slice(2, 5).forEach((server) => (server.hasStasisLink = true));
|
|
|
|
const resultAfterFiveBackdoorsAndThreeStasisLinks = ns.dnet.getDarknetInstability();
|
|
expect(resultAfterFiveBackdoorsAndThreeStasisLinks.authenticationTimeoutChance).toStrictEqual(0);
|
|
expect(resultAfterFiveBackdoorsAndThreeStasisLinks.authenticationDurationMultiplier).toStrictEqual(1);
|
|
|
|
// The rest of backdoors each increase instability
|
|
darknetServers.slice(5, 8).forEach((server) => (server.backdoorInstalled = true));
|
|
const resultAfterEightBackdoors = ns.dnet.getDarknetInstability();
|
|
expect(resultAfterEightBackdoors.authenticationTimeoutChance).toBeGreaterThan(0);
|
|
expect(resultAfterEightBackdoors.authenticationDurationMultiplier).toBeGreaterThan(1);
|
|
|
|
darknetServers.slice(8, 12).forEach((server) => (server.backdoorInstalled = true));
|
|
const resultAfterAllBackdoors = ns.dnet.getDarknetInstability();
|
|
expect(resultAfterAllBackdoors.authenticationTimeoutChance).toBeGreaterThan(
|
|
resultAfterEightBackdoors.authenticationTimeoutChance,
|
|
);
|
|
expect(resultAfterAllBackdoors.authenticationDurationMultiplier).toBeGreaterThan(
|
|
resultAfterEightBackdoors.authenticationDurationMultiplier,
|
|
);
|
|
});
|
|
test("nextMutation", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let resolved = false;
|
|
void ns.dnet.nextMutation().then(() => {
|
|
resolved = true;
|
|
});
|
|
expect(resolved).toStrictEqual(false);
|
|
triggerNextUpdate();
|
|
await sleep(10);
|
|
expect(resolved).toStrictEqual(true);
|
|
});
|
|
});
|
|
|
|
describe("home", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await expect(async () => {
|
|
await ns.dnet.authenticate(SpecialServers.Home, "");
|
|
}).rejects.toContain("home is not a darknet server");
|
|
});
|
|
test("connectToSession", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => {
|
|
ns.dnet.connectToSession(SpecialServers.Home, "");
|
|
}).toThrow("home is not a darknet server");
|
|
});
|
|
test("heartbleed from darkweb", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.heartbleed(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("openCache", () => {
|
|
// Intentionally empty. Caches cannot be spawned on non-darknet servers.
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNsOnHome();
|
|
const hostnames = ns.dnet.probe();
|
|
expect(hostnames.length).toStrictEqual(1);
|
|
expect(hostnames[0]).toStrictEqual(SpecialServers.DarkWeb);
|
|
});
|
|
test("setStasisLink", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.setStasisLink(true)).toThrow("home is not a darknet server.");
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNsOnHome();
|
|
expect(ns.getServer().hostname).toStrictEqual(SpecialServers.Home);
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.getServerAuthDetails()).toThrow("home is not a darknet server");
|
|
});
|
|
test("packetCapture", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.packetCapture(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.induceServerMigration("home")).toThrow("home is not a darknet server");
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnHome();
|
|
const result = ns.dnet.isDarknetServer();
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("memoryReallocation", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.memoryReallocation()).toThrow("home is not a darknet server");
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.getBlockedRam()).toThrow("home is not a darknet server");
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => ns.dnet.getDepth()).toThrow("home is not a darknet server");
|
|
});
|
|
test("promoteStock", async () => {
|
|
const ns = getNsOnHome();
|
|
await expect(async () => {
|
|
await ns.dnet.promoteStock("ECP");
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("phishingAttack", async () => {
|
|
const ns = getNsOnHome();
|
|
await expect(async () => {
|
|
await ns.dnet.phishingAttack();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("scp to darkweb and exec on darkweb", () => {
|
|
const ns = getNsOnHome();
|
|
const darkweb = GetServerOrThrow(SpecialServers.DarkWeb);
|
|
const scriptPath = "a.js" as ScriptFilePath;
|
|
const scriptContent = "export async function main(ns) {}";
|
|
ns.write(scriptPath, scriptContent);
|
|
|
|
expect(darkweb.scripts.has(scriptPath)).toStrictEqual(false);
|
|
ns.scp(scriptPath, SpecialServers.DarkWeb, SpecialServers.Home);
|
|
expect(darkweb.scripts.has(scriptPath)).toStrictEqual(true);
|
|
|
|
expect(ns.exec(scriptPath, SpecialServers.DarkWeb)).toBeGreaterThan(0);
|
|
});
|
|
test("scp to dnet server and exec on dnet server", async () => {
|
|
const ns = getNsOnHome();
|
|
const scriptPath = "a.js" as ScriptFilePath;
|
|
const scriptContent = "export async function main(ns) {}";
|
|
const darkweb = GetServerOrThrow(SpecialServers.DarkWeb);
|
|
|
|
// Get a dnet server connected to darkweb
|
|
const dnetServerHostname = darkweb.serversOnNetwork.find(
|
|
(hostname) => GetServerOrThrow(hostname).hostname !== SpecialServers.Home,
|
|
);
|
|
if (!dnetServerHostname) {
|
|
throw new Error("Cannot find any darknet server connected to darkweb");
|
|
}
|
|
const dnetServer = getDarknetServerOrThrow(dnetServerHostname);
|
|
|
|
// Cannot scp before authenticating
|
|
expect(dnetServer.hasAdminRights).toStrictEqual(false);
|
|
expect(ns.scp(scriptPath, dnetServerHostname, SpecialServers.Home)).toStrictEqual(false);
|
|
expect(dnetServer.scripts.size).toStrictEqual(0);
|
|
// Cannot exec from home because there is no direct connection
|
|
expect(ns.exec(scriptPath, dnetServerHostname)).toStrictEqual(0);
|
|
|
|
const { ws: wsDarkWeb, ns: nsDarkWeb } = getWorkerScriptAndNS(SpecialServers.DarkWeb);
|
|
// Authenticate from darkweb
|
|
expect((await nsDarkWeb.dnet.authenticate(dnetServerHostname, dnetServer.password)).success).toStrictEqual(true);
|
|
expect(dnetServer.hasAdminRights).toStrictEqual(true);
|
|
// Check session created after successfully calling authenticate API
|
|
expect(getServerState(dnetServerHostname).authenticatedPIDs.includes(wsDarkWeb.pid)).toStrictEqual(true);
|
|
// Write the test script to darkweb
|
|
nsDarkWeb.write(scriptPath, scriptContent);
|
|
// scp from darkweb
|
|
expect(nsDarkWeb.scp(scriptPath, dnetServerHostname, SpecialServers.DarkWeb)).toStrictEqual(true);
|
|
expect(dnetServer.scripts.has(scriptPath)).toStrictEqual(true);
|
|
// exec from darkweb
|
|
expect(nsDarkWeb.exec(scriptPath, dnetServerHostname)).toBeGreaterThan(0);
|
|
|
|
// Clear scripts on dnet server
|
|
dnetServer.scripts.clear();
|
|
|
|
// Cannot scp from home without a session
|
|
expect(ns.scp(scriptPath, dnetServerHostname, SpecialServers.Home)).toStrictEqual(false);
|
|
expect(dnetServer.scripts.size).toStrictEqual(0);
|
|
// Cannot exec from home because there is no direct connection
|
|
expect(ns.exec(scriptPath, dnetServerHostname)).toStrictEqual(0);
|
|
|
|
// Create a session from home to dnet server
|
|
expect(ns.dnet.connectToSession(dnetServerHostname, dnetServer.password).success).toStrictEqual(true);
|
|
// Write the test script to home
|
|
ns.write(scriptPath, scriptContent);
|
|
// scp from home
|
|
expect(ns.scp(scriptPath, dnetServerHostname, SpecialServers.Home)).toStrictEqual(true);
|
|
expect(dnetServer.scripts.has(scriptPath)).toStrictEqual(true);
|
|
// Cannot exec from home because there is no direct connection
|
|
expect(ns.exec(scriptPath, dnetServerHostname)).toStrictEqual(0);
|
|
// Install backdoor on dnet server
|
|
ns.singularity.connect(SpecialServers.DarkWeb);
|
|
ns.singularity.connect(dnetServerHostname);
|
|
await ns.singularity.installBackdoor();
|
|
// Can exec from home
|
|
expect(ns.exec(scriptPath, dnetServerHostname)).toBeGreaterThan(0);
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNS(SpecialServers.Home);
|
|
const server = GetServerOrThrow(SpecialServers.Home);
|
|
expect(() => {
|
|
ns.dnet.getServerRequiredCharismaLevel(server.hostname);
|
|
}).toThrow("home is not a darknet server");
|
|
});
|
|
test("labreport", async () => {
|
|
const ns = getNsOnHome();
|
|
await expect(async () => {
|
|
await ns.dnet.labreport();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("labradar", async () => {
|
|
const ns = getNsOnHome();
|
|
await expect(async () => {
|
|
await ns.dnet.labradar();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
});
|
|
|
|
describe("Normal NPC server", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await expect(async () => {
|
|
await ns.dnet.authenticate(SpecialServers.CyberSecServer, "");
|
|
}).rejects.toContain("CSEC is not a darknet server");
|
|
});
|
|
test("connectToSession", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => {
|
|
ns.dnet.connectToSession(SpecialServers.CyberSecServer, "");
|
|
}).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("heartbleed from darkweb", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.heartbleed(SpecialServers.CyberSecServer)).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("openCache", () => {
|
|
// Intentionally empty. Caches cannot be spawned on non-darknet servers.
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(ns.dnet.probe().length).toStrictEqual(0);
|
|
});
|
|
test("setStasisLink", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.setStasisLink(true)).toThrow("CSEC is not a darknet server.");
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(ns.getServer().hostname).toStrictEqual(SpecialServers.CyberSecServer);
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.getServerAuthDetails()).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("packetCapture", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.packetCapture(SpecialServers.CyberSecServer)).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.induceServerMigration("CSEC")).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
const result = ns.dnet.isDarknetServer();
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("memoryReallocation", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.memoryReallocation()).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.getBlockedRam()).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
expect(() => ns.dnet.getDepth()).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("promoteStock", async () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
await expect(async () => {
|
|
await ns.dnet.promoteStock("ECP");
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("phishingAttack", async () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
await expect(async () => {
|
|
await ns.dnet.phishingAttack();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
const server = GetServerOrThrow(SpecialServers.CyberSecServer);
|
|
expect(() => {
|
|
ns.dnet.getServerRequiredCharismaLevel(server.hostname);
|
|
}).toThrow("CSEC is not a darknet server");
|
|
});
|
|
test("labreport", async () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
await expect(async () => {
|
|
await ns.dnet.labreport();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("labradar", async () => {
|
|
const ns = getNS(SpecialServers.CyberSecServer);
|
|
await expect(async () => {
|
|
await ns.dnet.labradar();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
});
|
|
|
|
describe("Private server", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await expect(async () => {
|
|
await ns.dnet.authenticate("test-server-1", "");
|
|
}).rejects.toContain("test-server-1 is not a darknet server");
|
|
});
|
|
test("connectToSession", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => {
|
|
ns.dnet.connectToSession("test-server-1", "");
|
|
}).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("heartbleed from darkweb", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.heartbleed("test-server-1")).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("openCache", () => {
|
|
// Intentionally empty. Caches cannot be spawned on non-darknet servers.
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(ns.dnet.probe().length).toStrictEqual(0);
|
|
});
|
|
test("setStasisLink", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.setStasisLink(true)).toThrow("test-server-1 is not a darknet server.");
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(ns.getServer().hostname).toStrictEqual("test-server-1");
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.getServerAuthDetails()).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("packetCapture", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.packetCapture("test-server-1")).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.induceServerMigration("test-server-1")).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNS("test-server-1");
|
|
const result = ns.dnet.isDarknetServer();
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("memoryReallocation", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.memoryReallocation()).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.getBlockedRam()).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNS("test-server-1");
|
|
expect(() => ns.dnet.getDepth()).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("promoteStock", async () => {
|
|
const ns = getNS("test-server-1");
|
|
await expect(async () => {
|
|
await ns.dnet.promoteStock("ECP");
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("phishingAttack", async () => {
|
|
const ns = getNS("test-server-1");
|
|
await expect(async () => {
|
|
await ns.dnet.phishingAttack();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNS("test-server-1");
|
|
const server = GetServerOrThrow("test-server-1");
|
|
expect(() => {
|
|
ns.dnet.getServerRequiredCharismaLevel(server.hostname);
|
|
}).toThrow("test-server-1 is not a darknet server");
|
|
});
|
|
test("labreport", async () => {
|
|
const ns = getNS("test-server-1");
|
|
await expect(async () => {
|
|
await ns.dnet.labreport();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("labradar", async () => {
|
|
const ns = getNS("test-server-1");
|
|
await expect(async () => {
|
|
await ns.dnet.labradar();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
});
|
|
|
|
describe("Hashnet server", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await expect(async () => {
|
|
await ns.dnet.authenticate("hacknet-server-0", "");
|
|
}).rejects.toContain("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("connectToSession", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => {
|
|
ns.dnet.connectToSession("hacknet-server-0", "");
|
|
}).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("heartbleed from darkweb", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.heartbleed("hacknet-server-0")).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("openCache", () => {
|
|
// Intentionally empty. Caches cannot be spawned on non-darknet servers.
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(ns.dnet.probe().length).toStrictEqual(0);
|
|
});
|
|
test("setStasisLink", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.setStasisLink(true)).toThrow("hacknet-server-0 is not a darknet server.");
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(ns.getServer().hostname).toStrictEqual("hacknet-server-0");
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.getServerAuthDetails()).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("packetCapture", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.packetCapture("hacknet-server-0")).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.induceServerMigration("hacknet-server-0")).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
const result = ns.dnet.isDarknetServer();
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("memoryReallocation", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.memoryReallocation()).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.getBlockedRam()).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
expect(() => ns.dnet.getDepth()).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("promoteStock", async () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
await expect(async () => {
|
|
await ns.dnet.promoteStock("ECP");
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("phishingAttack", async () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
await expect(async () => {
|
|
await ns.dnet.phishingAttack();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
const server = GetServerOrThrow("hacknet-server-0");
|
|
expect(() => {
|
|
ns.dnet.getServerRequiredCharismaLevel(server.hostname);
|
|
}).toThrow("hacknet-server-0 is not a darknet server");
|
|
});
|
|
test("labreport", async () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
await expect(async () => {
|
|
await ns.dnet.labreport();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
test("labradar", async () => {
|
|
const ns = getNS("hacknet-server-0");
|
|
await expect(async () => {
|
|
await ns.dnet.labradar();
|
|
}).rejects.toContain("This API can only be used on a darknet server");
|
|
});
|
|
});
|
|
|
|
describe("Non-existent server", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await expect(async () => {
|
|
await ns.dnet.authenticate(hostnameOfNonExistentServer, "");
|
|
}).rejects.toContain(errorMessageForNonExistentServer);
|
|
});
|
|
test("connectToSession", () => {
|
|
const ns = getNsOnHome();
|
|
expect(() => {
|
|
ns.dnet.connectToSession(hostnameOfNonExistentServer, "");
|
|
}).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("heartbleed from darkweb", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.heartbleed(hostnameOfNonExistentServer)).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("openCache", () => {
|
|
// Intentionally empty. Caches cannot be spawned on non-darknet servers.
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => {
|
|
ns.getServer(hostnameOfNonExistentServer);
|
|
}).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.getServerAuthDetails(hostnameOfNonExistentServer)).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("packetCapture", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.packetCapture(hostnameOfNonExistentServer)).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.induceServerMigration(hostnameOfNonExistentServer)).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = ns.dnet.isDarknetServer(hostnameOfNonExistentServer);
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.getBlockedRam(hostnameOfNonExistentServer)).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => {
|
|
ns.dnet.getServerRequiredCharismaLevel(hostnameOfNonExistentServer);
|
|
}).toThrow(errorMessageForNonExistentServer);
|
|
});
|
|
});
|
|
|
|
describe("darkweb targets home", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await expect(async () => {
|
|
await ns.dnet.authenticate(SpecialServers.Home, "");
|
|
}).rejects.toContain("home is not a darknet server");
|
|
});
|
|
test("connectToSession", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => {
|
|
ns.dnet.connectToSession(SpecialServers.Home, "");
|
|
}).toThrow("home is not a darknet server");
|
|
});
|
|
test("heartbleed from darkweb", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.heartbleed(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("packetCapture", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.packetCapture(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.induceServerMigration(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = ns.dnet.isDarknetServer(SpecialServers.Home);
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("memoryReallocation", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.memoryReallocation(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.getBlockedRam(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.getDepth(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.getServerRequiredCharismaLevel(SpecialServers.Home)).toThrow("home is not a darknet server");
|
|
});
|
|
});
|
|
|
|
describe("expectRunningOnDarknetServer", () => {
|
|
test("throws when called on non-darknet server", () => {
|
|
const logger = jest.fn();
|
|
const ctx = getMockedNetscriptContext(logger);
|
|
ctx.workerScript.hostname = SpecialServers.Home;
|
|
expect(() => expectRunningOnDarknetServer(ctx)).toThrow("This API can only be used on a darknet server");
|
|
});
|
|
test("does not throw when called on darknet server", () => {
|
|
const logger = jest.fn();
|
|
const ctx = getMockedNetscriptContext(logger);
|
|
ctx.workerScript.hostname = SpecialServers.DarkWeb;
|
|
expect(() => expectRunningOnDarknetServer(ctx)).not.toThrow();
|
|
});
|
|
});
|
|
|
|
describe("darkweb", () => {
|
|
test("authenticate from home", async () => {
|
|
const ns = getNsOnHome();
|
|
const result = await ns.dnet.authenticate(SpecialServers.DarkWeb, "");
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("authenticate itself", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.authenticate(SpecialServers.DarkWeb, "");
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("connectToSession from home", () => {
|
|
const ns = getNsOnHome();
|
|
// Special behavior: darkweb's "hasAdminRights" is always true, so "connectToSession" can be called without calling
|
|
// the "authenticate" API.
|
|
const result = ns.dnet.connectToSession(SpecialServers.DarkWeb, "");
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("heartbleed from home", async () => {
|
|
const ns = getNsOnHome();
|
|
const result = await ns.dnet.heartbleed(SpecialServers.DarkWeb);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("openCache", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const darkweb = getDarknetServerOrThrow(SpecialServers.DarkWeb);
|
|
const result = addCacheToServer(darkweb, false, "test");
|
|
if (!result.success) {
|
|
throw new Error("Cannot add cache");
|
|
}
|
|
expect(darkweb.caches.length).toBe(1);
|
|
expect(darkweb.caches[0]).toMatch(/test_[0-9]+\.cache/);
|
|
ns.dnet.openCache(result.cacheFilename);
|
|
expect(darkweb.caches.length).toBe(0);
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const servers = ns.dnet.probe();
|
|
expect(servers.length).toBeGreaterThanOrEqual(1);
|
|
});
|
|
test("setStasisLink", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.setStasisLink(true);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const server = ns.getServer();
|
|
if (!("isOnline" in server)) {
|
|
throw new Error("getServer does not return DarknetServerData");
|
|
}
|
|
expect(server.isOnline).toStrictEqual(true);
|
|
expect(server.ip).toStrictEqual(getDarknetServerOrThrow(SpecialServers.DarkWeb).ip);
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const authDetails = ns.dnet.getServerAuthDetails();
|
|
expect(authDetails.isOnline).toStrictEqual(true);
|
|
expect(authDetails.modelId).toStrictEqual(ModelIds.NoPassword);
|
|
});
|
|
test("packetCapture from home", async () => {
|
|
const ns = getNsOnHome();
|
|
const result = await ns.dnet.packetCapture(SpecialServers.DarkWeb);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("induceServerMigration", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(() => ns.dnet.induceServerMigration(SpecialServers.DarkWeb)).toThrow(
|
|
"darkweb is not a valid target: it is a stationary server.",
|
|
);
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = ns.dnet.isDarknetServer();
|
|
expect(result).toStrictEqual(true);
|
|
});
|
|
test("memoryReallocation", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.memoryReallocation();
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.NoBlockRAM);
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = ns.dnet.getBlockedRam();
|
|
expect(result).toStrictEqual(0);
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = ns.dnet.getDepth();
|
|
expect(result).toStrictEqual(-1);
|
|
});
|
|
test("promoteStock", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.promoteStock("ECP");
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("phishingAttack", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.phishingAttack();
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
expect(ns.dnet.getServerRequiredCharismaLevel(SpecialServers.DarkWeb)).toStrictEqual(
|
|
getDarknetServerOrThrow(SpecialServers.DarkWeb).requiredCharismaSkill,
|
|
);
|
|
});
|
|
test("labreport", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const details = (await ns.dnet.labreport()) as Result;
|
|
// darkweb is not connected to lab, so scripts on it cannot navigate the lab
|
|
expect(details.message).toEqual("You feel disconnected...");
|
|
});
|
|
test("labradar", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const details: Result = (await ns.dnet.labradar()) as Result;
|
|
// darkweb is not connected to lab, so scripts on it cannot navigate the lab
|
|
expect(details.message).toEqual("You feel disconnected...");
|
|
});
|
|
});
|
|
|
|
describe("Non-darkweb darknet server", () => {
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
const server = getDarknetServerOrThrow(target);
|
|
const result = await ns.dnet.authenticate(target, server.password);
|
|
// Logging details for debugging flaky test
|
|
if (!result.success) {
|
|
console.log("Server details grabbed before auth:");
|
|
console.log(server);
|
|
console.log("result:");
|
|
console.log(result);
|
|
console.log("currentServerDetails:");
|
|
console.log(getDarknetServer(target));
|
|
}
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
expect(result.success).toStrictEqual(true);
|
|
});
|
|
test("authenticate itself", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = await ns.dnet.authenticate(ns.getHostname(), getDarknetServerOrThrow(ns.getHostname()).password);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("connectToSession from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
const password = getDarknetServerOrThrow(target).password;
|
|
const result1 = await ns.dnet.authenticate(target, password);
|
|
expect(result1.success).toStrictEqual(true);
|
|
expect(result1.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
const result2 = ns.dnet.connectToSession(target, password);
|
|
expect(result2.success).toStrictEqual(true);
|
|
expect(result2.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("heartbleed from home", async () => {
|
|
const ns = getNsOnHome();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
const result = await ns.dnet.heartbleed(target);
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.DirectConnectionRequired);
|
|
});
|
|
test("heartbleed from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
const result = await ns.dnet.heartbleed(target);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("openCache", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = addCacheToServer(getDarknetServerOrThrow(ns.getHostname()), "test.cache");
|
|
if (!result.success) {
|
|
throw new Error(result.message);
|
|
}
|
|
ns.dnet.openCache(result.cacheFilename);
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const servers = ns.dnet.probe();
|
|
const expectedServers = getDarknetServerOrThrow(ns.getHostname()).serversOnNetwork;
|
|
expect(servers.sort()).toStrictEqual(expectedServers.sort());
|
|
});
|
|
test("setStasisLink+getStasisLinkedServers", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
|
|
// Apply stasis link
|
|
const result1 = await ns.dnet.setStasisLink(true);
|
|
expect(result1.success).toStrictEqual(true);
|
|
expect(result1.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
|
|
// Verify stasis link
|
|
const stasisLinkServers = ns.dnet.getStasisLinkedServers();
|
|
expect(stasisLinkServers.length).toStrictEqual(1);
|
|
expect(stasisLinkServers[0]).toStrictEqual(ns.getHostname());
|
|
expect(getDarknetServerOrThrow(ns.getHostname()).hasStasisLink).toStrictEqual(true);
|
|
|
|
// Remove stasis link
|
|
const result2 = await ns.dnet.setStasisLink(false);
|
|
expect(result2.success).toStrictEqual(true);
|
|
expect(result2.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
expect(getDarknetServerOrThrow(ns.getHostname()).hasStasisLink).toStrictEqual(false);
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const server = ns.getServer();
|
|
expect(server.hostname).toStrictEqual(ns.getHostname());
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const authDetails = ns.dnet.getServerAuthDetails();
|
|
expect(authDetails.modelId).toStrictEqual(getDarknetServerOrThrow(ns.getHostname()).modelId);
|
|
});
|
|
test("packetCapture from home", async () => {
|
|
const ns = getNsOnHome();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
const result = await ns.dnet.packetCapture(target);
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.DirectConnectionRequired);
|
|
});
|
|
test("packetCapture from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
const result = await ns.dnet.packetCapture(target);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("induceServerMigration targeting connected server", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const targetServer = getRandomDarknetServer([SpecialServers.DarkWeb, ns.getHostname()]);
|
|
const hostServer = GetServerOrThrow(ns.getHostname());
|
|
connectServers(hostServer, targetServer);
|
|
|
|
const result = await ns.dnet.induceServerMigration(targetServer.hostname);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("induceServerMigration targeting non-connected server", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const targetServer = getRandomDarknetServer([SpecialServers.DarkWeb, ns.getHostname(), ...ns.dnet.probe()]);
|
|
|
|
const result = await ns.dnet.induceServerMigration(targetServer.hostname);
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.DirectConnectionRequired);
|
|
});
|
|
test("induceServerMigration itself", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = await ns.dnet.induceServerMigration(ns.getHostname());
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.DirectConnectionRequired);
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = ns.dnet.isDarknetServer();
|
|
expect(result).toStrictEqual(true);
|
|
});
|
|
test("memoryReallocation from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const target = getFirstDarknetServerAdjacentToDarkWeb();
|
|
|
|
const result1 = await ns.dnet.memoryReallocation(target);
|
|
expect(result1.success).toStrictEqual(false);
|
|
expect(result1.code).toStrictEqual(ResponseCodeEnum.AuthFailure);
|
|
|
|
const server = getDarknetServerOrThrow(target);
|
|
server.ramUsed = server.blockedRam = 1;
|
|
const password = server.password;
|
|
|
|
const result2 = await ns.dnet.authenticate(target, password);
|
|
expect(result2.success).toStrictEqual(true);
|
|
expect(result2.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
|
|
const result3 = await ns.dnet.memoryReallocation(target);
|
|
expect(result3.success).toStrictEqual(true);
|
|
expect(result3.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("memoryReallocation itself", async () => {
|
|
const server = getDarknetServerOrThrow(getFirstDarknetServerAdjacentToDarkWeb());
|
|
server.hasAdminRights = true;
|
|
server.ramUsed = server.blockedRam = 1;
|
|
|
|
const ns = getNS(server.hostname);
|
|
const result3 = await ns.dnet.memoryReallocation(ns.getHostname());
|
|
expect(result3.success).toStrictEqual(true);
|
|
expect(result3.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = ns.dnet.getBlockedRam();
|
|
expect(result).toStrictEqual(getDarknetServerOrThrow(ns.getHostname()).blockedRam);
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = ns.dnet.getDepth();
|
|
expect(result).toStrictEqual(getDarknetServerOrThrow(ns.getHostname()).depth);
|
|
});
|
|
test("promoteStock", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = await ns.dnet.promoteStock("ECP");
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("phishingAttack", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = await ns.dnet.phishingAttack();
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
expect(ns.dnet.getServerRequiredCharismaLevel(ns.getHostname())).toStrictEqual(
|
|
getDarknetServerOrThrow(ns.getHostname()).requiredCharismaSkill,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("Offline darknet server", () => {
|
|
beforeEach(() => {
|
|
DarknetState.offlineServers.add(hostnameForOfflineServer);
|
|
DarknetState.offlineServers.add(ipForOfflineServer);
|
|
});
|
|
async function testIpAndHostname(func: (host: string) => Promise<DarknetResult>) {
|
|
let result = await func(hostnameForOfflineServer);
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.ServiceUnavailable);
|
|
|
|
result = await func(ipForOfflineServer);
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.ServiceUnavailable);
|
|
}
|
|
test("authenticate from home", async () => {
|
|
const ns = getNsOnHome();
|
|
await testIpAndHostname((host) => ns.dnet.authenticate(host, ""));
|
|
});
|
|
test("authenticate itself", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await testIpAndHostname((host) => ns.dnet.authenticate(host, ""));
|
|
});
|
|
test("connectToSession from home", async () => {
|
|
const ns = getNsOnHome();
|
|
await testIpAndHostname((host) => Promise.resolve(ns.dnet.connectToSession(host, "")));
|
|
});
|
|
test("heartbleed from home", async () => {
|
|
const ns = getNsOnHome();
|
|
await testIpAndHostname((host) => ns.dnet.heartbleed(host));
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let server = ns.getServer(hostnameForOfflineServer);
|
|
expect(server).toHaveProperty("isOnline", false);
|
|
expect(server.hostname).toBe(hostnameForOfflineServer);
|
|
expect(server.ip).toBe("");
|
|
|
|
server = ns.getServer(ipForOfflineServer);
|
|
expect(server).toHaveProperty("isOnline", false);
|
|
expect(server.hostname).toBe("");
|
|
expect(server.ip).toBe(ipForOfflineServer);
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let authDetails = ns.dnet.getServerAuthDetails(hostnameForOfflineServer);
|
|
expect(authDetails.isOnline).toStrictEqual(false);
|
|
|
|
authDetails = ns.dnet.getServerAuthDetails(ipForOfflineServer);
|
|
expect(authDetails.isOnline).toStrictEqual(false);
|
|
});
|
|
test("packetCapture from home", async () => {
|
|
const ns = getNsOnHome();
|
|
await testIpAndHostname((host) => ns.dnet.packetCapture(host));
|
|
});
|
|
test("induceServerMigration", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await testIpAndHostname((host) => ns.dnet.induceServerMigration(host));
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let result = ns.dnet.isDarknetServer(hostnameForOfflineServer);
|
|
expect(result).toStrictEqual(false);
|
|
|
|
result = ns.dnet.isDarknetServer(ipForOfflineServer);
|
|
expect(result).toStrictEqual(false);
|
|
});
|
|
test("memoryReallocation", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
await testIpAndHostname((host) => ns.dnet.memoryReallocation(host));
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let result = ns.dnet.getBlockedRam(hostnameForOfflineServer);
|
|
expect(result).toStrictEqual(0);
|
|
|
|
result = ns.dnet.getBlockedRam(ipForOfflineServer);
|
|
expect(result).toStrictEqual(0);
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let result = ns.dnet.getDepth(hostnameForOfflineServer);
|
|
expect(result).toStrictEqual(-1);
|
|
|
|
result = ns.dnet.getDepth(ipForOfflineServer);
|
|
expect(result).toStrictEqual(-1);
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNsOnDarkWeb();
|
|
let result = ns.dnet.getServerRequiredCharismaLevel(hostnameForOfflineServer);
|
|
expect(result).toStrictEqual(-1);
|
|
|
|
result = ns.dnet.getServerRequiredCharismaLevel(ipForOfflineServer);
|
|
expect(result).toStrictEqual(-1);
|
|
});
|
|
});
|
|
|
|
describe("Use IP instead of hostname", () => {
|
|
let ip: string;
|
|
beforeEach(() => {
|
|
ip = getDarknetServerOrThrow(getFirstDarknetServerAdjacentToDarkWeb()).ip;
|
|
});
|
|
test("authenticate from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.authenticate(ip, getDarknetServerOrThrow(ip).password);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("connectToSession from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const password = getDarknetServerOrThrow(ip).password;
|
|
const result1 = await ns.dnet.authenticate(ip, password);
|
|
expect(result1.success).toStrictEqual(true);
|
|
expect(result1.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
const result2 = ns.dnet.connectToSession(ip, password);
|
|
expect(result2.success).toStrictEqual(true);
|
|
expect(result2.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("heartbleed from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.heartbleed(ip);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("probe", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const servers = ns.dnet.probe(true);
|
|
expect(servers.length).toBeGreaterThanOrEqual(1);
|
|
for (const ip of servers) {
|
|
expect(isIPAddress(ip)).toStrictEqual(true);
|
|
}
|
|
});
|
|
test("getStasisLinkedServers", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = await ns.dnet.setStasisLink(true);
|
|
expect(result.success).toStrictEqual(true);
|
|
const servers = ns.dnet.getStasisLinkedServers(true);
|
|
expect(servers.length).toStrictEqual(1);
|
|
for (const ip of servers) {
|
|
expect(isIPAddress(ip)).toStrictEqual(true);
|
|
}
|
|
});
|
|
test("getServer", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const server = ns.getServer(ip);
|
|
if (!("isOnline" in server)) {
|
|
throw new Error("getServer does not return DarknetServerData");
|
|
}
|
|
expect(server.ip).toStrictEqual(ip);
|
|
});
|
|
test("getServerAuthDetails", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const authDetails = ns.dnet.getServerAuthDetails(ip);
|
|
expect(authDetails.isOnline).toStrictEqual(true);
|
|
expect(authDetails.modelId).toStrictEqual(getDarknetServerOrThrow(ip).modelId);
|
|
});
|
|
test("packetCapture from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
const result = await ns.dnet.packetCapture(ip);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("induceServerMigration targeting connected server", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const targetServer = getRandomDarknetServer([SpecialServers.DarkWeb, ns.getHostname()]);
|
|
const hostServer = GetServerOrThrow(ns.getHostname());
|
|
connectServers(hostServer, targetServer);
|
|
|
|
const result = await ns.dnet.induceServerMigration(targetServer.ip);
|
|
expect(result.success).toStrictEqual(true);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("induceServerMigration itself", async () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = await ns.dnet.induceServerMigration(ns.getIP());
|
|
expect(result.success).toStrictEqual(false);
|
|
expect(result.code).toStrictEqual(ResponseCodeEnum.DirectConnectionRequired);
|
|
});
|
|
test("isDarknetServer", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = ns.dnet.isDarknetServer(ip);
|
|
expect(result).toStrictEqual(true);
|
|
});
|
|
test("memoryReallocation from darkweb", async () => {
|
|
const ns = getNsOnDarkWeb();
|
|
|
|
const result1 = await ns.dnet.memoryReallocation(ip);
|
|
expect(result1.success).toStrictEqual(false);
|
|
expect(result1.code).toStrictEqual(ResponseCodeEnum.AuthFailure);
|
|
|
|
const server = getDarknetServerOrThrow(ip);
|
|
server.ramUsed = server.blockedRam = 1;
|
|
const password = server.password;
|
|
|
|
const result2 = await ns.dnet.authenticate(ip, password);
|
|
expect(result2.success).toStrictEqual(true);
|
|
expect(result2.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
|
|
const result3 = await ns.dnet.memoryReallocation(ip);
|
|
expect(result3.success).toStrictEqual(true);
|
|
expect(result3.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("memoryReallocation itself", async () => {
|
|
const server = getDarknetServerOrThrow(getFirstDarknetServerAdjacentToDarkWeb());
|
|
server.hasAdminRights = true;
|
|
server.ramUsed = server.blockedRam = 1;
|
|
|
|
const ns = getNS(server.hostname);
|
|
const result3 = await ns.dnet.memoryReallocation(ns.getIP());
|
|
expect(result3.success).toStrictEqual(true);
|
|
expect(result3.code).toStrictEqual(ResponseCodeEnum.Success);
|
|
});
|
|
test("getBlockedRam", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = ns.dnet.getBlockedRam(ip);
|
|
expect(result).toStrictEqual(getDarknetServerOrThrow(ip).blockedRam);
|
|
});
|
|
test("getDepth", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
const result = ns.dnet.getDepth(ip);
|
|
expect(result).toStrictEqual(getDarknetServerOrThrow(ip).depth);
|
|
});
|
|
test("getServerRequiredCharismaLevel", () => {
|
|
const ns = getNsOnNonDarkwebDarknetServer();
|
|
expect(ns.dnet.getServerRequiredCharismaLevel(ip)).toStrictEqual(getDarknetServerOrThrow(ip).requiredCharismaSkill);
|
|
});
|
|
});
|
|
|
|
describe("lab location methods", () => {
|
|
test("dnet.labreport", async () => {
|
|
const ns = getNsOnServerNearLabyrinth();
|
|
const labName = getLabyrinthDetails().name;
|
|
|
|
const details = (await ns.dnet.labreport()) as LocationStatus;
|
|
expect(isLocationStatus(details)).toBe(true);
|
|
|
|
const maze = getLabMaze();
|
|
expect(details).toMatchObject({
|
|
coords: [1, 1],
|
|
north: false,
|
|
east: maze[1][3] === " ",
|
|
south: maze[3][1] === " ",
|
|
west: false,
|
|
});
|
|
|
|
const directionToMove = details.east ? "east" : "south";
|
|
await ns.dnet.authenticate(labName, directionToMove);
|
|
const logs = getMostRecentAuthLog(labName);
|
|
assertNonNullish(logs);
|
|
expect(logs.message).toContain("You have moved to");
|
|
const newDetails = (await ns.dnet.labreport()) as LocationStatus;
|
|
expect(isLocationStatus(newDetails)).toBe(true);
|
|
expect(newDetails.coords).toEqual(directionToMove === "east" ? [3, 1] : [1, 3]);
|
|
});
|
|
test("dnet.labradar()", async () => {
|
|
const ns = getNsOnServerNearLabyrinth();
|
|
|
|
// Make sure we are at the starting point.
|
|
const locationStatus = (await ns.dnet.labreport()) as LocationStatus;
|
|
expect(isLocationStatus(locationStatus)).toBe(true);
|
|
expect(locationStatus.coords).toStrictEqual([1, 1]);
|
|
|
|
const response = (await ns.dnet.labradar()) as Result;
|
|
assertNonNullish(response.message);
|
|
const surroundingsString = response.message.split("\n");
|
|
const maze = getLabMaze();
|
|
for (let x = 0; x < 3; x++) {
|
|
for (let y = 0; y < 3; y++) {
|
|
if (x === 1 && y === 1) {
|
|
//The player icon is shown in the surroundings view
|
|
expect(surroundingsString[x + 2][y + 2]).toEqual("@");
|
|
} else {
|
|
// labradar gives a snapshot of the maze centered on the current script's location
|
|
// We have to offset it by its range to line it up with the maze data
|
|
expect(surroundingsString[x + 2][y + 2]).toBe(maze[x][y]);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|