2019-01-21 14:03:30 -05:00
|
|
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
2019-03-06 20:48:46 -05:00
|
|
|
import { testPerm, assert, assertEquals } from "./test_util.ts";
|
2018-10-03 23:58:29 -04:00
|
|
|
|
2019-04-21 16:40:10 -04:00
|
|
|
testPerm({ net: true }, function netListenClose(): void {
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", "127.0.0.1:4500");
|
2018-10-03 23:58:29 -04:00
|
|
|
listener.close();
|
|
|
|
});
|
|
|
|
|
2019-04-21 16:40:10 -04:00
|
|
|
testPerm({ net: true }, async function netCloseWhileAccept(): Promise<void> {
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", ":4501");
|
2019-01-15 20:36:51 -05:00
|
|
|
const p = listener.accept();
|
|
|
|
listener.close();
|
|
|
|
let err;
|
|
|
|
try {
|
|
|
|
await p;
|
|
|
|
} catch (e) {
|
|
|
|
err = e;
|
|
|
|
}
|
|
|
|
assert(!!err);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(err.kind, Deno.ErrorKind.Other);
|
|
|
|
assertEquals(err.message, "Listener has been closed");
|
2019-01-15 20:36:51 -05:00
|
|
|
});
|
|
|
|
|
2019-05-02 17:08:02 -04:00
|
|
|
/* TODO(ry) Re-enable this test.
|
2019-04-21 16:40:10 -04:00
|
|
|
testPerm({ net: true }, async function netConcurrentAccept(): Promise<void> {
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", ":4502");
|
2019-01-17 18:10:34 -05:00
|
|
|
let acceptErrCount = 0;
|
2019-03-09 12:30:38 -05:00
|
|
|
const checkErr = (e): void => {
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(e.kind, Deno.ErrorKind.Other);
|
2019-01-17 18:10:34 -05:00
|
|
|
if (e.message === "Listener has been closed") {
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(acceptErrCount, 1);
|
2019-01-17 18:10:34 -05:00
|
|
|
} 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]);
|
2019-01-15 20:36:51 -05:00
|
|
|
listener.close();
|
2019-01-17 18:10:34 -05:00
|
|
|
await [p, p1];
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(acceptErrCount, 1);
|
2019-01-15 20:36:51 -05:00
|
|
|
});
|
2019-05-02 17:08:02 -04:00
|
|
|
*/
|
2019-01-15 20:36:51 -05:00
|
|
|
|
2019-04-21 16:40:10 -04:00
|
|
|
testPerm({ net: true }, async function netDialListen(): Promise<void> {
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", ":4500");
|
2019-04-21 16:40:10 -04:00
|
|
|
listener.accept().then(
|
|
|
|
async (conn): Promise<void> => {
|
|
|
|
await conn.write(new Uint8Array([1, 2, 3]));
|
|
|
|
conn.close();
|
|
|
|
}
|
|
|
|
);
|
2019-02-12 10:08:56 -05:00
|
|
|
const conn = await Deno.dial("tcp", "127.0.0.1:4500");
|
2018-10-03 23:58:29 -04:00
|
|
|
const buf = new Uint8Array(1024);
|
|
|
|
const readResult = await conn.read(buf);
|
2019-05-01 16:58:09 -04:00
|
|
|
assertEquals(3, readResult.nread);
|
|
|
|
assertEquals(1, buf[0]);
|
|
|
|
assertEquals(2, buf[1]);
|
|
|
|
assertEquals(3, buf[2]);
|
|
|
|
assert(conn.rid > 0);
|
|
|
|
|
|
|
|
// TODO Currently ReadResult does not properly transmit EOF in the same call.
|
|
|
|
// it requires a second call to get the EOF. Either ReadResult to be an
|
|
|
|
// integer in which 0 signifies EOF or the handler should be modified so that
|
|
|
|
// EOF is properly transmitted.
|
|
|
|
assertEquals(false, readResult.eof);
|
|
|
|
|
|
|
|
const readResult2 = await conn.read(buf);
|
|
|
|
assertEquals(true, readResult2.eof);
|
|
|
|
|
|
|
|
listener.close();
|
|
|
|
conn.close();
|
|
|
|
});
|
|
|
|
|
2019-05-02 17:08:02 -04:00
|
|
|
/* TODO(ry) Re-enable this test.
|
2019-05-01 16:58:09 -04:00
|
|
|
testPerm({ net: true }, async function netListenAsyncIterator(): Promise<void> {
|
|
|
|
const listener = Deno.listen("tcp", ":4500");
|
|
|
|
const runAsyncIterator = async (): Promise<void> => {
|
|
|
|
for await (let conn of listener) {
|
|
|
|
await conn.write(new Uint8Array([1, 2, 3]));
|
|
|
|
conn.close();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
runAsyncIterator();
|
|
|
|
const conn = await Deno.dial("tcp", "127.0.0.1:4500");
|
|
|
|
const buf = new Uint8Array(1024);
|
|
|
|
const readResult = await conn.read(buf);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(3, readResult.nread);
|
|
|
|
assertEquals(1, buf[0]);
|
|
|
|
assertEquals(2, buf[1]);
|
|
|
|
assertEquals(3, buf[2]);
|
2019-01-13 19:54:30 -05:00
|
|
|
assert(conn.rid > 0);
|
2018-10-03 23:58:29 -04:00
|
|
|
|
|
|
|
// TODO Currently ReadResult does not properly transmit EOF in the same call.
|
|
|
|
// it requires a second call to get the EOF. Either ReadResult to be an
|
|
|
|
// integer in which 0 signifies EOF or the handler should be modified so that
|
|
|
|
// EOF is properly transmitted.
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(false, readResult.eof);
|
2018-10-03 23:58:29 -04:00
|
|
|
|
|
|
|
const readResult2 = await conn.read(buf);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(true, readResult2.eof);
|
2018-10-03 23:58:29 -04:00
|
|
|
|
|
|
|
listener.close();
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-05-02 17:08:02 -04:00
|
|
|
*/
|
2018-10-05 12:16:24 -04:00
|
|
|
|
2019-04-28 17:15:15 -04:00
|
|
|
/* TODO Fix broken test.
|
|
|
|
testPerm({ net: true }, async function netCloseReadSuccess() {
|
2018-10-05 12:16:24 -04:00
|
|
|
const addr = "127.0.0.1:4500";
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
const closeDeferred = deferred();
|
2018-10-05 20:09:46 -04:00
|
|
|
const closeReadDeferred = deferred();
|
2019-04-28 17:15:15 -04:00
|
|
|
listener.accept().then(async conn => {
|
|
|
|
await closeReadDeferred.promise;
|
|
|
|
await conn.write(new Uint8Array([1, 2, 3]));
|
|
|
|
const buf = new Uint8Array(1024);
|
|
|
|
const readResult = await conn.read(buf);
|
|
|
|
assertEquals(3, readResult.nread);
|
|
|
|
assertEquals(4, buf[0]);
|
|
|
|
assertEquals(5, buf[1]);
|
|
|
|
assertEquals(6, buf[2]);
|
|
|
|
conn.close();
|
|
|
|
closeDeferred.resolve();
|
|
|
|
});
|
2019-02-12 10:08:56 -05:00
|
|
|
const conn = await Deno.dial("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
conn.closeRead(); // closing read
|
2018-10-05 20:09:46 -04:00
|
|
|
closeReadDeferred.resolve();
|
2018-10-05 12:16:24 -04:00
|
|
|
const buf = new Uint8Array(1024);
|
|
|
|
const readResult = await conn.read(buf);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(0, readResult.nread); // No error, read nothing
|
|
|
|
assertEquals(true, readResult.eof); // with immediate EOF
|
2018-10-05 12:16:24 -04:00
|
|
|
// Ensure closeRead does not impact write
|
|
|
|
await conn.write(new Uint8Array([4, 5, 6]));
|
|
|
|
await closeDeferred.promise;
|
|
|
|
listener.close();
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-04-28 17:15:15 -04:00
|
|
|
*/
|
2018-10-05 12:16:24 -04:00
|
|
|
|
2019-04-28 17:15:15 -04:00
|
|
|
/* TODO Fix broken test.
|
|
|
|
testPerm({ net: true }, async function netDoubleCloseRead() {
|
2018-10-05 12:16:24 -04:00
|
|
|
const addr = "127.0.0.1:4500";
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
const closeDeferred = deferred();
|
2019-04-28 17:15:15 -04:00
|
|
|
listener.accept().then(async conn => {
|
|
|
|
await conn.write(new Uint8Array([1, 2, 3]));
|
|
|
|
await closeDeferred.promise;
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-02-12 10:08:56 -05:00
|
|
|
const conn = await Deno.dial("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
conn.closeRead(); // closing read
|
|
|
|
let err;
|
|
|
|
try {
|
|
|
|
// Duplicated close should throw error
|
|
|
|
conn.closeRead();
|
|
|
|
} catch (e) {
|
|
|
|
err = e;
|
|
|
|
}
|
|
|
|
assert(!!err);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(err.kind, Deno.ErrorKind.NotConnected);
|
|
|
|
assertEquals(err.name, "NotConnected");
|
2018-10-05 12:16:24 -04:00
|
|
|
closeDeferred.resolve();
|
|
|
|
listener.close();
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-04-28 17:15:15 -04:00
|
|
|
*/
|
2018-10-05 12:16:24 -04:00
|
|
|
|
2019-04-28 17:15:15 -04:00
|
|
|
/* TODO Fix broken test.
|
|
|
|
testPerm({ net: true }, async function netCloseWriteSuccess() {
|
2018-10-05 12:16:24 -04:00
|
|
|
const addr = "127.0.0.1:4500";
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
const closeDeferred = deferred();
|
2019-04-28 17:15:15 -04:00
|
|
|
listener.accept().then(async conn => {
|
|
|
|
await conn.write(new Uint8Array([1, 2, 3]));
|
|
|
|
await closeDeferred.promise;
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-02-12 10:08:56 -05:00
|
|
|
const conn = await Deno.dial("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
conn.closeWrite(); // closing write
|
|
|
|
const buf = new Uint8Array(1024);
|
|
|
|
// Check read not impacted
|
|
|
|
const readResult = await conn.read(buf);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(3, readResult.nread);
|
|
|
|
assertEquals(1, buf[0]);
|
|
|
|
assertEquals(2, buf[1]);
|
|
|
|
assertEquals(3, buf[2]);
|
2018-10-05 12:16:24 -04:00
|
|
|
// Check write should be closed
|
|
|
|
let err;
|
|
|
|
try {
|
|
|
|
await conn.write(new Uint8Array([1, 2, 3]));
|
|
|
|
} catch (e) {
|
|
|
|
err = e;
|
|
|
|
}
|
|
|
|
assert(!!err);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(err.kind, Deno.ErrorKind.BrokenPipe);
|
|
|
|
assertEquals(err.name, "BrokenPipe");
|
2018-10-05 12:16:24 -04:00
|
|
|
closeDeferred.resolve();
|
|
|
|
listener.close();
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-04-28 17:15:15 -04:00
|
|
|
*/
|
2018-10-05 12:16:24 -04:00
|
|
|
|
2019-04-28 17:15:15 -04:00
|
|
|
/* TODO Fix broken test.
|
|
|
|
testPerm({ net: true }, async function netDoubleCloseWrite() {
|
2018-10-05 12:16:24 -04:00
|
|
|
const addr = "127.0.0.1:4500";
|
2019-02-12 10:08:56 -05:00
|
|
|
const listener = Deno.listen("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
const closeDeferred = deferred();
|
2019-04-28 17:15:15 -04:00
|
|
|
listener.accept().then(async conn => {
|
|
|
|
await closeDeferred.promise;
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-02-12 10:08:56 -05:00
|
|
|
const conn = await Deno.dial("tcp", addr);
|
2018-10-05 12:16:24 -04:00
|
|
|
conn.closeWrite(); // closing write
|
|
|
|
let err;
|
|
|
|
try {
|
|
|
|
// Duplicated close should throw error
|
|
|
|
conn.closeWrite();
|
|
|
|
} catch (e) {
|
|
|
|
err = e;
|
|
|
|
}
|
|
|
|
assert(!!err);
|
2019-03-06 20:48:46 -05:00
|
|
|
assertEquals(err.kind, Deno.ErrorKind.NotConnected);
|
|
|
|
assertEquals(err.name, "NotConnected");
|
2018-10-05 12:16:24 -04:00
|
|
|
closeDeferred.resolve();
|
|
|
|
listener.close();
|
|
|
|
conn.close();
|
|
|
|
});
|
2019-04-28 17:15:15 -04:00
|
|
|
*/
|