72bf4547d4
* Clean up workbench and integrate initialization data * Uncomment Electron fill * Run server & client together * Clean up Electron fill & patch * Bind fs methods This makes them usable with the promise form: `promisify(access)(...)`. * Add space between tag and title to browser logger * Add typescript dep to server and default __dirname for path * Serve web files from server * Adjust some dev options * Rework workbench a bit to use a class and catch unexpected errors * No mkdirs for now, fix util fill, use bash with exec * More fills, make general client abstract * More fills * Fix cp.exec * Fix require calls in fs fill being aliased * Create data and storage dir * Implement fs.watch Using exec for now. * Implement storage database fill * Fix os export and homedir * Add comment to use navigator.sendBeacon * Fix fs callbacks (some args are optional) * Make sure data directory exists when passing it back * Update patch * Target es5 * More fills * Add APIs required for bootstrap-fork to function (#15) * Add bootstrap-fork execution * Add createConnection * Bundle bootstrap-fork into cli * Remove .node directory created from spdlog * Fix npm start * Remove unnecessary comment * Add webpack-hot-middleware if CLI env is not set * Add restarting to shared process * Fix starting with yarn
190 lines
4.0 KiB
TypeScript
190 lines
4.0 KiB
TypeScript
import * as net from "net";
|
|
import * as os from "os";
|
|
import * as path from "path";
|
|
import { TextEncoder, TextDecoder } from "text-encoding";
|
|
import { createClient } from "./helpers";
|
|
|
|
(<any>global).TextDecoder = TextDecoder;
|
|
(<any>global).TextEncoder = TextEncoder;
|
|
|
|
describe("spawn", () => {
|
|
const client = createClient();
|
|
|
|
it("should execute command and return output", (done) => {
|
|
const proc = client.spawn("echo", ["test"]);
|
|
proc.stdout.on("data", (data) => {
|
|
expect(data).toEqual("test\n");
|
|
});
|
|
proc.on("exit", (code) => {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should create shell", (done) => {
|
|
const proc = client.spawn("/bin/bash", [], {
|
|
tty: {
|
|
columns: 100,
|
|
rows: 10,
|
|
},
|
|
});
|
|
let first = true;
|
|
proc.stdout.on("data", (data) => {
|
|
if (first) {
|
|
// First piece of data is a welcome msg. Second is the prompt
|
|
first = false;
|
|
return;
|
|
}
|
|
expect(data.toString().endsWith("$ ")).toBeTruthy();
|
|
proc.kill();
|
|
});
|
|
proc.on("exit", () => done());
|
|
});
|
|
|
|
it("should cat", (done) => {
|
|
const proc = client.spawn("cat", []);
|
|
expect(proc.pid).toBeUndefined();
|
|
proc.stdout.on("data", (data) => {
|
|
expect(data).toEqual("banana");
|
|
expect(proc.pid).toBeDefined();
|
|
proc.kill();
|
|
});
|
|
proc.on("exit", () => done());
|
|
proc.send("banana");
|
|
proc.stdin.end();
|
|
});
|
|
|
|
it("should print env variable", (done) => {
|
|
const proc = client.spawn("env", [], {
|
|
env: { hi: "donkey" },
|
|
});
|
|
proc.stdout.on("data", (data) => {
|
|
expect(data).toEqual("hi=donkey\n");
|
|
done();
|
|
});
|
|
});
|
|
|
|
it("should resize", (done) => {
|
|
// Requires the `tput lines` cmd to be available
|
|
|
|
const proc = client.spawn("/bin/bash", [], {
|
|
tty: {
|
|
columns: 10,
|
|
rows: 10,
|
|
},
|
|
});
|
|
let output: number = 0; // Number of outputs parsed
|
|
proc.stdout.on("data", (data) => {
|
|
output++;
|
|
|
|
if (output === 1) {
|
|
// First is welcome msg
|
|
return;
|
|
}
|
|
|
|
if (output === 2) {
|
|
proc.send("tput lines\n");
|
|
return;
|
|
}
|
|
|
|
if (output === 3) {
|
|
// Echo of tput lines
|
|
return;
|
|
}
|
|
|
|
if (output === 4) {
|
|
expect(data.toString().trim()).toEqual("10");
|
|
proc.resize!({
|
|
columns: 10,
|
|
rows: 50,
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (output === 5) {
|
|
// Primpt
|
|
return;
|
|
}
|
|
|
|
if (output === 6) {
|
|
proc.send("tput lines\n");
|
|
return;
|
|
}
|
|
|
|
if (output === 7) {
|
|
// Echo of tput lines
|
|
return;
|
|
}
|
|
|
|
if (output === 8) {
|
|
expect(data.toString().trim()).toEqual("50");
|
|
proc.kill();
|
|
expect(proc.killed).toBeTruthy();
|
|
}
|
|
});
|
|
proc.on("exit", () => done());
|
|
});
|
|
|
|
it("should fork", (done) => {
|
|
const proc = client.fork(path.join(__dirname, "forker.js"));
|
|
proc.stdout.on("data", (data) => {
|
|
expect(data).toEqual("test");
|
|
});
|
|
proc.on("exit", () => done());
|
|
});
|
|
});
|
|
|
|
describe("createConnection", () => {
|
|
const client = createClient();
|
|
const tmpPath = path.join(os.tmpdir(), Math.random().toString());
|
|
let server: net.Server;
|
|
beforeAll(async () => {
|
|
await new Promise((r) => {
|
|
server = net.createServer().listen(tmpPath, () => {
|
|
r();
|
|
});
|
|
});
|
|
});
|
|
|
|
afterAll(() => {
|
|
server.close();
|
|
});
|
|
|
|
it("should connect to socket", (done) => {
|
|
const socket = client.createConnection(tmpPath, () => {
|
|
socket.end();
|
|
socket.addListener("close", () => {
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("should get data from server", (done) => {
|
|
server.once("connection", (socket: net.Socket) => {
|
|
socket.write("hi how r u");
|
|
});
|
|
|
|
const socket = client.createConnection(tmpPath);
|
|
|
|
socket.addListener("data", (data) => {
|
|
expect(data.toString()).toEqual("hi how r u");
|
|
socket.end();
|
|
socket.addListener("close", () => {
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("should send data to server", (done) => {
|
|
const clientSocket = client.createConnection(tmpPath);
|
|
clientSocket.write(Buffer.from("bananas"));
|
|
server.once("connection", (socket: net.Socket) => {
|
|
socket.addListener("data", (data) => {
|
|
expect(data.toString()).toEqual("bananas");
|
|
socket.end();
|
|
clientSocket.addListener("end", () => {
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}); |