diff options
Diffstat (limited to 'cli/js/tests/net_test.ts')
-rw-r--r-- | cli/js/tests/net_test.ts | 181 |
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, |