mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 15:04:52 +09:00
Spawn master, slave, and clusterctl in separate processes in the clusterio integration tests and leave the test master and slave process available for the whole test duration to allow plugins to use them as well. This removes the need for reimplementing the startup logic in the test code and makes the existing startup code covered by tests.
176 lines
5.6 KiB
JavaScript
176 lines
5.6 KiB
JavaScript
const assert = require('assert').strict;
|
|
const path = require('path');
|
|
const fs = require('fs-extra');
|
|
|
|
const link = require("lib/link");
|
|
const config = require("lib/config");
|
|
const client = require("../client");
|
|
|
|
describe("Client testing", function() {
|
|
before(function() {
|
|
config.InstanceConfig.finalize();
|
|
});
|
|
|
|
describe("class Instance", function() {
|
|
let instance;
|
|
before(async function() {
|
|
let instanceConfig = new config.InstanceConfig();
|
|
await instanceConfig.init();
|
|
instanceConfig.set("instance.name", "foo");
|
|
instance = new client._Instance(new link.VirtualConnector(), "dir", "factorioDir", instanceConfig);
|
|
});
|
|
|
|
describe(".name", function() {
|
|
it("should give the name of the instance", function() {
|
|
assert.equal(instance.name, "foo");
|
|
})
|
|
});
|
|
|
|
describe(".path()", function() {
|
|
it("should give the path when called without arguments", function() {
|
|
assert.equal(instance.path(), "dir");
|
|
})
|
|
it("should join path with arguments", function() {
|
|
assert.equal(instance.path("bar"), path.join("dir", "bar"));
|
|
})
|
|
});
|
|
});
|
|
|
|
describe("checkFilename()", function() {
|
|
it("should allow a basic name", function() {
|
|
client._checkFilename("file");
|
|
});
|
|
|
|
function check(item, msg) {
|
|
assert.throws(() => client._checkFilename(item), new Error(msg));
|
|
}
|
|
|
|
it("should throw on non-string", function() {
|
|
check(undefined, "must be a string");
|
|
check(null, "must be a string");
|
|
check({}, "must be a string");
|
|
check([], "must be a string");
|
|
check(0, "must be a string");
|
|
check(false, "must be a string");
|
|
});
|
|
|
|
it("should throw on empty name", function() {
|
|
check("", "cannot be empty");
|
|
});
|
|
|
|
it("should throw on <>:\"\\/|?* \\x00\\r\\n\\t", function() {
|
|
for (let char of '<>:"\\/|?*\x00\r\n\t') {
|
|
check(char, 'cannot contain <>:"\\/|=* or control characters');
|
|
}
|
|
});
|
|
|
|
it("should throw on CON, PRN, AUX, NUL, COM1, LPT1", function() {
|
|
for (let bad of ['CON', 'PRN', 'AUX', 'NUL', 'COM1', 'LPT1']) {
|
|
check(
|
|
bad, 'cannot be named any of . ..'
|
|
+' CON PRN AUX NUL COM1-9 and LPT1-9'
|
|
);
|
|
}
|
|
});
|
|
|
|
it("should throw on . and ..", function() {
|
|
for (let bad of ['.', '..']) {
|
|
check(
|
|
bad, 'cannot be named any of . ..'
|
|
+' CON PRN AUX NUL COM1-9 and LPT1-9'
|
|
);
|
|
}
|
|
});
|
|
|
|
it("should throw on names ending with . or space", function() {
|
|
check("a ", "cannot end with . or space");
|
|
check("a.", "cannot end with . or space");
|
|
});
|
|
});
|
|
|
|
describe("symlinkMods()", function() {
|
|
let testDir = path.join("test", "temp", "symlink");
|
|
let discardingLogger = {
|
|
warning: function() { },
|
|
log: function() { },
|
|
}
|
|
|
|
let instance;
|
|
before(async function() {
|
|
// Remove previous test output
|
|
await fs.remove(testDir);
|
|
|
|
// Add some test mods
|
|
await fs.outputFile(path.join(testDir, "shared", "mod_a.zip"), "a");
|
|
await fs.outputFile(path.join(testDir, "shared", "mod_b.zip"), "b");
|
|
await fs.outputFile(path.join(testDir, "shared", "mod.dat"), "c");
|
|
|
|
let instanceConfig = new config.InstanceConfig();
|
|
await instanceConfig.init();
|
|
instanceConfig.set("instance.name", "test");
|
|
instance = new client._Instance(
|
|
new link.VirtualConnector(), path.join(testDir, "instance"), "factorioDir", instanceConfig
|
|
);
|
|
await fs.outputFile(instance.path("mods", "mod_i.zip"), "i");
|
|
});
|
|
|
|
it("should link mods and data files", async function() {
|
|
await client._symlinkMods(instance, path.join(testDir, "shared"), discardingLogger);
|
|
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod_a.zip"), "utf-8"), "a");
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod_b.zip"), "utf-8"), "b");
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod.dat"), "utf-8"), "c");
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod_i.zip"), "utf-8"), "i");
|
|
});
|
|
|
|
it("should ignore directories", async function() {
|
|
await fs.ensureDir(path.join(testDir, "shared", "dir"));
|
|
await client._symlinkMods(instance, path.join(testDir, "shared"), discardingLogger);
|
|
|
|
assert(!await fs.exists(instance.path("mods", "dir"), "utf-8"), "dir was unxpectedly linked");
|
|
});
|
|
|
|
it("should ignore files", async function() {
|
|
await fs.outputFile(path.join(testDir, "shared", "file"), "f");
|
|
await client._symlinkMods(instance, path.join(testDir, "shared"), discardingLogger);
|
|
|
|
assert(!await fs.exists(instance.path("mods", "file"), "utf-8"), "dir was unxpectedly linked");
|
|
});
|
|
|
|
it("should unlink removed mods", async function() {
|
|
// This does not work on Windows
|
|
if (process.platform == "win32") {
|
|
this.skip();
|
|
}
|
|
|
|
await fs.unlink(path.join(testDir, "shared", "mod_a.zip"));
|
|
await client._symlinkMods(instance, path.join(testDir, "shared"), discardingLogger);
|
|
|
|
await assert.rejects(fs.lstat(instance.path("mods", "mod_a.zip")), { code: "ENOENT" });
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod_b.zip"), "utf-8"), "b");
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod.dat"), "utf-8"), "c");
|
|
assert.equal(await fs.readFile(instance.path("mods", "mod_i.zip"), "utf-8"), "i");
|
|
});
|
|
});
|
|
|
|
describe("discoverInstances()", function() {
|
|
it("should discover test instance", async function() {
|
|
let logger = { log: () => {}, error: () => {} };
|
|
let instancePath = path.join("test", "file", "instances");
|
|
let instanceInfos = await client._discoverInstances(instancePath, logger);
|
|
|
|
let referenceConfig = new config.InstanceConfig();
|
|
await referenceConfig.init();
|
|
referenceConfig.set("instance.id", 1);
|
|
referenceConfig.set("instance.name", "test");
|
|
|
|
assert.deepEqual(instanceInfos, new Map([
|
|
[1, {
|
|
config: referenceConfig,
|
|
path: path.join(instancePath, "test"),
|
|
}],
|
|
]));
|
|
});
|
|
});
|
|
});
|