Add commands (#2)
* Add remote command execution * Add tests for environment variables and resize * Fix tab spacing, add newlines * Remove extra newline * Add fork
This commit is contained in:
132
packages/server/test/command.test.ts
Normal file
132
packages/server/test/command.test.ts
Normal file
@@ -0,0 +1,132 @@
|
||||
import * as path from "path";
|
||||
import { TextEncoder, TextDecoder } from "text-encoding";
|
||||
import { createClient } from "./helpers";
|
||||
|
||||
(<any>global).TextDecoder = TextDecoder;
|
||||
(<any>global).TextEncoder = TextEncoder;
|
||||
|
||||
describe("Command", () => {
|
||||
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());
|
||||
});
|
||||
});
|
||||
1
packages/server/test/forker.js
Executable file
1
packages/server/test/forker.js
Executable file
@@ -0,0 +1 @@
|
||||
console.log("test");
|
||||
Reference in New Issue
Block a user