diff options
Diffstat (limited to 'js/net_test.ts')
-rw-r--r-- | js/net_test.ts | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/js/net_test.ts b/js/net_test.ts index 93ad6ee00..c7c8dbb59 100644 --- a/js/net_test.ts +++ b/js/net_test.ts @@ -2,6 +2,7 @@ import * as deno from "deno"; import { testPerm, assert, assertEqual } from "./test_util.ts"; +import { deferred } from "./util.ts"; testPerm({ net: true }, function netListenClose() { const listener = deno.listen("tcp", "127.0.0.1:4500"); @@ -35,3 +36,115 @@ testPerm({ net: true }, async function netDialListen() { listener.close(); conn.close(); }); + +testPerm({ net: true }, async function netCloseReadSuccess() { + const addr = "127.0.0.1:4500"; + const listener = deno.listen("tcp", addr); + const closeDeferred = deferred(); + listener.accept().then(async conn => { + await conn.write(new Uint8Array([1, 2, 3])); + const buf = new Uint8Array(1024); + const readResult = await conn.read(buf); + assertEqual(3, readResult.nread); + assertEqual(4, buf[0]); + assertEqual(5, buf[1]); + assertEqual(6, buf[2]); + conn.close(); + closeDeferred.resolve(); + }); + const conn = await deno.dial("tcp", addr); + conn.closeRead(); // closing read + const buf = new Uint8Array(1024); + const readResult = await conn.read(buf); + assertEqual(0, readResult.nread); // No error, read nothing + assertEqual(true, readResult.eof); // with immediate EOF + // Ensure closeRead does not impact write + await conn.write(new Uint8Array([4, 5, 6])); + await closeDeferred.promise; + listener.close(); + conn.close(); +}); + +testPerm({ net: true }, async function netDoubleCloseRead() { + const addr = "127.0.0.1:4500"; + const listener = deno.listen("tcp", addr); + const closeDeferred = deferred(); + listener.accept().then(async conn => { + await conn.write(new Uint8Array([1, 2, 3])); + await closeDeferred.promise; + conn.close(); + }); + const conn = await deno.dial("tcp", addr); + conn.closeRead(); // closing read + let err; + try { + // Duplicated close should throw error + conn.closeRead(); + } catch (e) { + err = e; + } + assert(!!err); + assertEqual(err.kind, deno.ErrorKind.NotConnected); + assertEqual(err.name, "NotConnected"); + closeDeferred.resolve(); + listener.close(); + conn.close(); +}); + +testPerm({ net: true }, async function netCloseWriteSuccess() { + const addr = "127.0.0.1:4500"; + const listener = deno.listen("tcp", addr); + const closeDeferred = deferred(); + listener.accept().then(async conn => { + await conn.write(new Uint8Array([1, 2, 3])); + await closeDeferred.promise; + conn.close(); + }); + const conn = await deno.dial("tcp", addr); + conn.closeWrite(); // closing write + const buf = new Uint8Array(1024); + // Check read not impacted + const readResult = await conn.read(buf); + assertEqual(3, readResult.nread); + assertEqual(1, buf[0]); + assertEqual(2, buf[1]); + assertEqual(3, buf[2]); + // Check write should be closed + let err; + try { + await conn.write(new Uint8Array([1, 2, 3])); + } catch (e) { + err = e; + } + assert(!!err); + assertEqual(err.kind, deno.ErrorKind.BrokenPipe); + assertEqual(err.name, "BrokenPipe"); + closeDeferred.resolve(); + listener.close(); + conn.close(); +}); + +testPerm({ net: true }, async function netDoubleCloseWrite() { + const addr = "127.0.0.1:4500"; + const listener = deno.listen("tcp", addr); + const closeDeferred = deferred(); + listener.accept().then(async conn => { + await closeDeferred.promise; + conn.close(); + }); + const conn = await deno.dial("tcp", addr); + conn.closeWrite(); // closing write + let err; + try { + // Duplicated close should throw error + conn.closeWrite(); + } catch (e) { + err = e; + } + assert(!!err); + assertEqual(err.kind, deno.ErrorKind.NotConnected); + assertEqual(err.name, "NotConnected"); + closeDeferred.resolve(); + listener.close(); + conn.close(); +}); |