diff --git a/CHANGELOG.md b/CHANGELOG.md index d754ceb9251..f8dcde13d2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,6 +77,11 @@ main() { foo(() {}); } * Default values of parameters of abstract methods are no longer available via `dart:mirrors`. +#### `dart:io` + +* **Breaking change**: Added `IOOverrides.serverSocketBind` to aid in writing + tests that wish to mock `ServerSocket.bind`. + #### `dart:developer` * Added optional `parent` parameter to `TimelineTask` constructor to allow for diff --git a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart index 61d031a86f8..fcdaa651698 100644 --- a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart +++ b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart @@ -448,7 +448,7 @@ class RawServerSocket { @patch class ServerSocket { @patch - static Future bind(address, int port, + static Future _bind(address, int port, {int backlog = 0, bool v6Only = false, bool shared = false}) { throw UnsupportedError("ServerSocket.bind"); } diff --git a/sdk/lib/_internal/js_runtime/lib/io_patch.dart b/sdk/lib/_internal/js_runtime/lib/io_patch.dart index 4f3894d28f1..ee1eb4d3999 100644 --- a/sdk/lib/_internal/js_runtime/lib/io_patch.dart +++ b/sdk/lib/_internal/js_runtime/lib/io_patch.dart @@ -448,7 +448,7 @@ class RawServerSocket { @patch class ServerSocket { @patch - static Future bind(address, int port, + static Future _bind(address, int port, {int backlog: 0, bool v6Only: false, bool shared: false}) { throw new UnsupportedError("ServerSocket.bind"); } diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart index c1336e3c2bf..b0ce8e678f9 100644 --- a/sdk/lib/_internal/vm/bin/socket_patch.dart +++ b/sdk/lib/_internal/vm/bin/socket_patch.dart @@ -1506,7 +1506,7 @@ class _RawSocket extends Stream implements RawSocket { @patch class ServerSocket { @patch - static Future bind(address, int port, + static Future _bind(address, int port, {int backlog: 0, bool v6Only: false, bool shared: false}) { return _ServerSocket.bind(address, port, backlog, v6Only, shared); } diff --git a/sdk/lib/io/overrides.dart b/sdk/lib/io/overrides.dart index 1a71881fb83..aa1c8a46656 100644 --- a/sdk/lib/io/overrides.dart +++ b/sdk/lib/io/overrides.dart @@ -87,6 +87,11 @@ abstract class IOOverrides { {dynamic sourceAddress}) socketStartConnect, + // ServerSocket + Future Function(dynamic, int, + {int backlog, bool v6Only, bool shared}) + serverSocketBind, + // Optional Zone parameters ZoneSpecification zoneSpecification, Function onError}) { @@ -120,6 +125,9 @@ abstract class IOOverrides { // Socket socketConnect, socketStartConnect, + + // ServerSocket + serverSocketBind, ); return _asyncRunZoned(body, zoneValues: {_ioOverridesToken: overrides}, @@ -274,6 +282,19 @@ abstract class IOOverrides { {sourceAddress}) { return Socket._startConnect(host, port, sourceAddress: sourceAddress); } + + // ServerSocket + + /// Asynchronously returns a [ServerSocket] that connects to the given address + /// and port when successful. + /// + /// When this override is installed, this functions overrides the behavior of + /// `ServerSocket.bind(...)`. + Future serverSocketBind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + return ServerSocket._bind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } } class _IOOverridesScope extends IOOverrides { @@ -311,6 +332,10 @@ class _IOOverridesScope extends IOOverrides { Future> Function(dynamic, int, {dynamic sourceAddress}) _socketStartConnect; + // ServerSocket + Future Function(dynamic, int, + {int backlog, bool v6Only, bool shared}) _serverSocketBind; + _IOOverridesScope( // Directory this._createDirectory, @@ -341,6 +366,9 @@ class _IOOverridesScope extends IOOverrides { // Socket this._socketConnect, this._socketStartConnect, + + // ServerSocket + this._serverSocketBind, ); // Directory @@ -478,4 +506,20 @@ class _IOOverridesScope extends IOOverrides { } return super.socketStartConnect(host, port, sourceAddress: sourceAddress); } + + // ServerSocket + @override + Future serverSocketBind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + if (_serverSocketBind != null) { + return _serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + if (_previous != null) { + return _previous.serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + return super.serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } } diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart index b3d9dda1911..5d9c239e4bb 100644 --- a/sdk/lib/io/socket.dart +++ b/sdk/lib/io/socket.dart @@ -327,7 +327,18 @@ abstract class ServerSocket implements Stream { * distributed among all the bound `ServerSocket`s. Connections can be * distributed over multiple isolates this way. */ - external static Future bind(address, int port, + static Future bind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + final IOOverrides overrides = IOOverrides.current; + if (overrides == null) { + return ServerSocket._bind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + return overrides.serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + + external static Future _bind(address, int port, {int backlog: 0, bool v6Only: false, bool shared: false}); /** diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart index 595f4c2521e..8c28b562637 100644 --- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart +++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart @@ -450,7 +450,7 @@ class RawServerSocket { @patch class ServerSocket { @patch - static Future bind(address, int port, + static Future _bind(address, int port, {int backlog = 0, bool v6Only = false, bool shared = false}) { throw UnsupportedError("ServerSocket.bind"); } diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart index 8460b21bb0f..48946c30f0e 100644 --- a/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart +++ b/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart @@ -450,7 +450,7 @@ class RawServerSocket { @patch class ServerSocket { @patch - static Future bind(address, int port, + static Future _bind(address, int port, {int backlog: 0, bool v6Only: false, bool shared: false}) { throw new UnsupportedError("ServerSocket.bind"); } diff --git a/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart index f4136a0e406..750aca8c1c2 100644 --- a/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart +++ b/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart @@ -1508,7 +1508,7 @@ class _RawSocket extends Stream implements RawSocket { @patch class ServerSocket { @patch - static Future bind(address, int port, + static Future _bind(address, int port, {int backlog: 0, bool v6Only: false, bool shared: false}) { return _ServerSocket.bind(address, port, backlog, v6Only, shared); } diff --git a/sdk_nnbd/lib/io/overrides.dart b/sdk_nnbd/lib/io/overrides.dart index 6786ae4f3cb..b46af8a9b48 100644 --- a/sdk_nnbd/lib/io/overrides.dart +++ b/sdk_nnbd/lib/io/overrides.dart @@ -89,6 +89,11 @@ abstract class IOOverrides { {dynamic sourceAddress}) socketStartConnect, + // ServerSocket + Future Function(dynamic, int, + {int backlog, bool v6Only, bool shared}) + serverSocketBind, + // Optional Zone parameters ZoneSpecification zoneSpecification, Function onError}) { @@ -122,6 +127,9 @@ abstract class IOOverrides { // Socket socketConnect, socketStartConnect, + + // ServerSocket + serverSocketBind, ); return _asyncRunZoned(body, zoneValues: {_ioOverridesToken: overrides}, @@ -276,6 +284,19 @@ abstract class IOOverrides { {sourceAddress}) { return Socket._startConnect(host, port, sourceAddress: sourceAddress); } + + // ServerSocket + + /// Asynchronously returns a [ServerSocket] that connects to the given address + /// and port when successful. + /// + /// When this override is installed, this functions overrides the behavior of + /// `ServerSocket.bind(...)`. + Future serverSocketBind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + return ServerSocket._bind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } } class _IOOverridesScope extends IOOverrides { @@ -313,6 +334,10 @@ class _IOOverridesScope extends IOOverrides { Future> Function(dynamic, int, {dynamic sourceAddress}) _socketStartConnect; + // ServerSocket + Future Function(dynamic, int, + {int backlog, bool v6Only, bool shared}) _serverSocketBind; + _IOOverridesScope( // Directory this._createDirectory, @@ -343,6 +368,9 @@ class _IOOverridesScope extends IOOverrides { // Socket this._socketConnect, this._socketStartConnect, + + // ServerSocket + this._serverSocketBind, ); // Directory @@ -480,4 +508,20 @@ class _IOOverridesScope extends IOOverrides { } return super.socketStartConnect(host, port, sourceAddress: sourceAddress); } + + // ServerSocket + @override + Future serverSocketBind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + if (_serverSocketBind != null) { + return _serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + if (_previous != null) { + return _previous.serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + return super.serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } } diff --git a/sdk_nnbd/lib/io/socket.dart b/sdk_nnbd/lib/io/socket.dart index c3583de52fd..6f457416077 100644 --- a/sdk_nnbd/lib/io/socket.dart +++ b/sdk_nnbd/lib/io/socket.dart @@ -329,9 +329,19 @@ abstract class ServerSocket implements Stream { * distributed among all the bound `ServerSocket`s. Connections can be * distributed over multiple isolates this way. */ - external static Future bind(address, int port, - {int backlog: 0, bool v6Only: false, bool shared: false}); + static Future bind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + final IOOverrides overrides = IOOverrides.current; + if (overrides == null) { + return ServerSocket._bind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + return overrides.serverSocketBind(address, port, + backlog: backlog, v6Only: v6Only, shared: shared); + } + external static Future _bind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}); /** * Returns the port used by this socket. */ diff --git a/tests/standalone_2/io/io_override_test.dart b/tests/standalone_2/io/io_override_test.dart index 2d562021bed..3ddb73d8abc 100644 --- a/tests/standalone_2/io/io_override_test.dart +++ b/tests/standalone_2/io/io_override_test.dart @@ -168,6 +168,11 @@ Future> socketStartConnect(host, int port, return null; } +Future serverSocketBind(address, int port, + {int backlog: 0, bool v6Only: false, bool shared: false}) { + return null; +} + Future ioOverridesRunTest() async { Future f = IOOverrides.runZoned( () async { @@ -188,6 +193,7 @@ Future ioOverridesRunTest() async { Expect.isTrue(new Link("link") is LinkMock); Expect.isNull(Socket.connect(null, 0)); Expect.isNull(Socket.startConnect(null, 0)); + Expect.isNull(ServerSocket.bind(null, 0)); }, createDirectory: DirectoryMock.createDirectory, getCurrentDirectory: DirectoryMock.getCurrent, @@ -205,6 +211,7 @@ Future ioOverridesRunTest() async { createLink: LinkMock.createLink, socketConnect: socketConnect, socketStartConnect: socketStartConnect, + serverSocketBind: serverSocketBind, ); Expect.isFalse(new Directory("directory") is DirectoryMock); Expect.isTrue(new Directory("directory") is Directory);