Skip to content

Commit ed50c64

Browse files
committed
Move and refactor net tests
1 parent e6f8786 commit ed50c64

2 files changed

Lines changed: 138 additions & 5 deletions

File tree

packages/ide/src/fill/net.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ class Server extends CallbackEmitter implements net.Server {
9797
const { maybeCallback, bindSocket, createUniqueEval } = __non_webpack_require__("@coder/ide/src/fill/evaluation") as typeof import("@coder/ide/src/fill/evaluation");
9898

9999
let connectionId = 0;
100-
let server = new net.Server(options, maybeCallback(ae, callbackId));
101100
const sockets = new Map<number, net.Socket>();
102-
103101
const storeSocket = (socket: net.Socket): number => {
104102
const socketId = connectionId++;
105103
sockets.set(socketId, socket);
@@ -112,13 +110,18 @@ class Server extends CallbackEmitter implements net.Server {
112110
return socketId;
113111
};
114112

113+
const callback = maybeCallback(ae, callbackId);
114+
let server = new net.Server(options, typeof callback !== "undefined" ? (socket): void => {
115+
callback(storeSocket(socket));
116+
} : undefined);
117+
115118
server.on("close", () => ae.emit("close"));
116119
server.on("connection", (socket) => ae.emit("connection", storeSocket(socket)));
117120
server.on("error", (error) => ae.emit("error", error));
118121
server.on("listening", () => ae.emit("listening"));
119122

120-
ae.on("close", (callbackId) => server.close(maybeCallback(ae, callbackId)));
121-
ae.on("listen", (handle) => server.listen(handle));
123+
ae.on("close", (callbackId: number) => server.close(maybeCallback(ae, callbackId)));
124+
ae.on("listen", (handle?: net.ListenOptions | number | string) => server.listen(handle));
122125
ae.on("ref", () => server.ref());
123126
ae.on("unref", () => server.unref());
124127

@@ -136,7 +139,7 @@ class Server extends CallbackEmitter implements net.Server {
136139
sockets.clear();
137140
},
138141
};
139-
}, options, this.storeCallback(connectionListener));
142+
}, options || {}, this.storeCallback(connectionListener));
140143

141144
this.ae.on("close", () => {
142145
this._listening = false;

packages/ide/test/net.test.ts

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import * as fs from "fs";
2+
import * as nativeNet from "net";
3+
import * as os from "os";
4+
import * as path from "path";
5+
import * as util from "util";
6+
import * as rimraf from "rimraf";
7+
import { createClient } from "@coder/protocol/test";
8+
9+
const client = createClient();
10+
jest.mock("../src/fill/client", () => ({ client }));
11+
const net = require("../src/fill/net") as typeof import("net");
12+
13+
describe("net", () => {
14+
let i = 0;
15+
const coderDir = path.join(os.tmpdir(), "coder");
16+
const tmpFile = (): string => path.join(coderDir, `socket.${i++}`);
17+
18+
beforeAll(async () => {
19+
await util.promisify(rimraf)(coderDir);
20+
await util.promisify(fs.mkdir)(coderDir);
21+
});
22+
23+
describe("Socket", () => {
24+
const socketPath = tmpFile();
25+
let server: nativeNet.Server;
26+
27+
beforeAll(async () => {
28+
await new Promise((r): void => {
29+
server = nativeNet.createServer().listen(socketPath, r);
30+
});
31+
});
32+
33+
afterAll(() => {
34+
server.close();
35+
});
36+
37+
it("should connect", async () => {
38+
await new Promise((resolve): void => {
39+
const socket = net.createConnection(socketPath, () => {
40+
socket.end();
41+
socket.addListener("close", () => {
42+
resolve();
43+
});
44+
});
45+
});
46+
47+
await new Promise((resolve): void => {
48+
const socket = new net.Socket();
49+
socket.connect(socketPath, () => {
50+
socket.end();
51+
socket.addListener("close", () => {
52+
resolve();
53+
});
54+
});
55+
});
56+
});
57+
58+
it("should get data", (done) => {
59+
server.once("connection", (socket: nativeNet.Socket) => {
60+
socket.write("hi how r u");
61+
});
62+
63+
const socket = net.createConnection(socketPath);
64+
65+
socket.addListener("data", (data) => {
66+
expect(data.toString()).toEqual("hi how r u");
67+
socket.end();
68+
socket.addListener("close", () => {
69+
done();
70+
});
71+
});
72+
});
73+
74+
it("should send data", (done) => {
75+
const clientSocket = net.createConnection(socketPath);
76+
clientSocket.write(Buffer.from("bananas"));
77+
server.once("connection", (socket: nativeNet.Socket) => {
78+
socket.addListener("data", (data) => {
79+
expect(data.toString()).toEqual("bananas");
80+
socket.end();
81+
clientSocket.addListener("end", () => {
82+
done();
83+
});
84+
});
85+
});
86+
});
87+
});
88+
89+
describe("Server", () => {
90+
it("should listen", (done) => {
91+
const s = net.createServer();
92+
s.on("listening", () => s.close());
93+
s.on("close", () => done());
94+
s.listen(tmpFile());
95+
});
96+
97+
it("should get connection", async () => {
98+
let constructorListener: (() => void) | undefined;
99+
const s = net.createServer(() => {
100+
if (constructorListener) {
101+
constructorListener();
102+
}
103+
});
104+
105+
const socketPath = tmpFile();
106+
s.listen(socketPath);
107+
108+
const makeConnection = async (): Promise<void> => {
109+
net.createConnection(socketPath);
110+
await Promise.all([
111+
new Promise((resolve): void => {
112+
constructorListener = resolve;
113+
}),
114+
new Promise((resolve): void => {
115+
s.once("connection", (socket) => {
116+
socket.destroy();
117+
resolve();
118+
});
119+
}),
120+
]);
121+
};
122+
123+
await makeConnection();
124+
await makeConnection();
125+
126+
s.close();
127+
await new Promise((r): nativeNet.Server => s.on("close", r));
128+
});
129+
});
130+
});

0 commit comments

Comments
 (0)