summaryrefslogtreecommitdiff
path: root/cli/js/tests/net_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js/tests/net_test.ts')
-rw-r--r--cli/js/tests/net_test.ts181
1 files changed, 175 insertions, 6 deletions
diff --git a/cli/js/tests/net_test.ts b/cli/js/tests/net_test.ts
index f62c5c329..788203b5a 100644
--- a/cli/js/tests/net_test.ts
+++ b/cli/js/tests/net_test.ts
@@ -10,7 +10,7 @@ import {
unitTest({ perms: { net: true } }, function netTcpListenClose(): void {
const port = randomPort();
const listener = Deno.listen({ hostname: "127.0.0.1", port });
- assertEquals(listener.addr.transport, "tcp");
+ assert(listener.addr.transport === "tcp");
assertEquals(listener.addr.hostname, "127.0.0.1");
assertEquals(listener.addr.port, port);
listener.close();
@@ -29,7 +29,7 @@ unitTest(
port,
transport: "udp"
});
- assertEquals(socket.addr.transport, "udp");
+ assert(socket.addr.transport === "udp");
assertEquals(socket.addr.hostname, "127.0.0.1");
assertEquals(socket.addr.port, port);
socket.close();
@@ -37,6 +37,34 @@ unitTest(
);
unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ function netUnixListenClose(): void {
+ const filePath = Deno.makeTempFileSync();
+ const socket = Deno.listen({
+ address: filePath,
+ transport: "unix"
+ });
+ assert(socket.addr.transport === "unix");
+ assertEquals(socket.addr.address, filePath);
+ socket.close();
+ }
+);
+
+unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ function netUnixPacketListenClose(): void {
+ const filePath = Deno.makeTempFileSync();
+ const socket = Deno.listen({
+ address: filePath,
+ transport: "unixpacket"
+ });
+ assert(socket.addr.transport === "unixpacket");
+ assertEquals(socket.addr.address, filePath);
+ socket.close();
+ }
+);
+
+unitTest(
{
perms: { net: true }
},
@@ -58,6 +86,28 @@ unitTest(
);
unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ async function netUnixCloseWhileAccept(): Promise<void> {
+ const filePath = await Deno.makeTempFile();
+ const listener = Deno.listen({
+ address: filePath,
+ transport: "unix"
+ });
+ const p = listener.accept();
+ listener.close();
+ let err;
+ try {
+ await p;
+ } catch (e) {
+ err = e;
+ }
+ assert(!!err);
+ assert(err instanceof Error);
+ assertEquals(err.message, "Listener has been closed");
+ }
+);
+
+unitTest(
{ perms: { net: true } },
async function netTcpConcurrentAccept(): Promise<void> {
const port = randomPort();
@@ -81,6 +131,31 @@ unitTest(
}
);
+// TODO(jsouto): Enable when tokio updates mio to v0.7!
+unitTest(
+ { ignore: true, perms: { read: true, write: true } },
+ async function netUnixConcurrentAccept(): Promise<void> {
+ const filePath = await Deno.makeTempFile();
+ const listener = Deno.listen({ transport: "unix", address: filePath });
+ let acceptErrCount = 0;
+ const checkErr = (e: Error): void => {
+ if (e.message === "Listener has been closed") {
+ assertEquals(acceptErrCount, 1);
+ } else if (e.message === "Another accept task is ongoing") {
+ acceptErrCount++;
+ } else {
+ throw new Error("Unexpected error message");
+ }
+ };
+ const p = listener.accept().catch(checkErr);
+ const p1 = listener.accept().catch(checkErr);
+ await Promise.race([p, p1]);
+ listener.close();
+ await [p, p1];
+ assertEquals(acceptErrCount, 1);
+ }
+);
+
unitTest({ perms: { net: true } }, async function netTcpDialListen(): Promise<
void
> {
@@ -89,6 +164,7 @@ unitTest({ perms: { net: true } }, async function netTcpDialListen(): Promise<
listener.accept().then(
async (conn): Promise<void> => {
assert(conn.remoteAddr != null);
+ assert(conn.localAddr.transport === "tcp");
assertEquals(conn.localAddr.hostname, "127.0.0.1");
assertEquals(conn.localAddr.port, port);
await conn.write(new Uint8Array([1, 2, 3]));
@@ -96,6 +172,7 @@ unitTest({ perms: { net: true } }, async function netTcpDialListen(): Promise<
}
);
const conn = await Deno.connect({ hostname: "127.0.0.1", port });
+ assert(conn.remoteAddr.transport === "tcp");
assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
assertEquals(conn.remoteAddr.port, port);
assert(conn.localAddr != null);
@@ -117,24 +194,61 @@ unitTest({ perms: { net: true } }, async function netTcpDialListen(): Promise<
});
unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ async function netUnixDialListen(): Promise<void> {
+ const filePath = await Deno.makeTempFile();
+ const listener = Deno.listen({ address: filePath, transport: "unix" });
+ listener.accept().then(
+ async (conn): Promise<void> => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr.transport === "unix");
+ assertEquals(conn.localAddr.address, filePath);
+ await conn.write(new Uint8Array([1, 2, 3]));
+ conn.close();
+ }
+ );
+ const conn = await Deno.connect({ address: filePath, transport: "unix" });
+ assert(conn.remoteAddr.transport === "unix");
+ assertEquals(conn.remoteAddr.address, filePath);
+ assert(conn.remoteAddr != null);
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ assert(conn.rid > 0);
+
+ assert(readResult !== Deno.EOF);
+
+ const readResult2 = await conn.read(buf);
+ assertEquals(Deno.EOF, readResult2);
+
+ listener.close();
+ conn.close();
+ }
+);
+
+unitTest(
{ ignore: Deno.build.os === "win", perms: { net: true } },
async function netUdpSendReceive(): Promise<void> {
const alicePort = randomPort();
const alice = Deno.listen({ port: alicePort, transport: "udp" });
+ assert(alice.addr.transport === "udp");
assertEquals(alice.addr.port, alicePort);
- assertEquals(alice.addr.hostname, "0.0.0.0");
- assertEquals(alice.addr.transport, "udp");
+ assertEquals(alice.addr.hostname, "127.0.0.1");
const bobPort = randomPort();
const bob = Deno.listen({ port: bobPort, transport: "udp" });
+ assert(bob.addr.transport === "udp");
assertEquals(bob.addr.port, bobPort);
- assertEquals(bob.addr.hostname, "0.0.0.0");
- assertEquals(bob.addr.transport, "udp");
+ assertEquals(bob.addr.hostname, "127.0.0.1");
const sent = new Uint8Array([1, 2, 3]);
await alice.send(sent, bob.addr);
const [recvd, remote] = await bob.receive();
+ assert(remote.transport === "udp");
assertEquals(remote.port, alicePort);
assertEquals(recvd.length, 3);
assertEquals(1, recvd[0]);
@@ -146,6 +260,33 @@ unitTest(
);
unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ async function netUnixPacketSendReceive(): Promise<void> {
+ const filePath = await Deno.makeTempFile();
+ const alice = Deno.listen({ address: filePath, transport: "unixpacket" });
+ assert(alice.addr.transport === "unixpacket");
+ assertEquals(alice.addr.address, filePath);
+
+ const bob = Deno.listen({ address: filePath, transport: "unixpacket" });
+ assert(bob.addr.transport === "unixpacket");
+ assertEquals(bob.addr.address, filePath);
+
+ const sent = new Uint8Array([1, 2, 3]);
+ await alice.send(sent, bob.addr);
+
+ const [recvd, remote] = await bob.receive();
+ assert(remote.transport === "unixpacket");
+ assertEquals(remote.address, filePath);
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+ alice.close();
+ bob.close();
+ }
+);
+
+unitTest(
{ perms: { net: true } },
async function netTcpListenCloseWhileIterating(): Promise<void> {
const port = randomPort();
@@ -174,6 +315,34 @@ unitTest(
);
unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ async function netUnixListenCloseWhileIterating(): Promise<void> {
+ const filePath = Deno.makeTempFileSync();
+ const socket = Deno.listen({ address: filePath, transport: "unix" });
+ const nextWhileClosing = socket[Symbol.asyncIterator]().next();
+ socket.close();
+ assertEquals(await nextWhileClosing, { value: undefined, done: true });
+
+ const nextAfterClosing = socket[Symbol.asyncIterator]().next();
+ assertEquals(await nextAfterClosing, { value: undefined, done: true });
+ }
+);
+
+unitTest(
+ { ignore: Deno.build.os === "win", perms: { read: true, write: true } },
+ async function netUnixPacketListenCloseWhileIterating(): Promise<void> {
+ const filePath = Deno.makeTempFileSync();
+ const socket = Deno.listen({ address: filePath, transport: "unixpacket" });
+ const nextWhileClosing = socket[Symbol.asyncIterator]().next();
+ socket.close();
+ assertEquals(await nextWhileClosing, { value: undefined, done: true });
+
+ const nextAfterClosing = socket[Symbol.asyncIterator]().next();
+ assertEquals(await nextAfterClosing, { value: undefined, done: true });
+ }
+);
+
+unitTest(
{
// FIXME(bartlomieju)
ignore: true,