summaryrefslogtreecommitdiff
path: root/js/net_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/net_test.ts')
-rw-r--r--js/net_test.ts113
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();
+});