Skip to content

Commit

Permalink
Remove reliance on WebSocketChannel.new (#3687)
Browse files Browse the repository at this point in the history
* Create a Fake

* Update serve_handler_test.dart

* Make this a release.
  • Loading branch information
brianquinlan committed May 15, 2024
1 parent 47d9063 commit 43bd3f5
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 38 deletions.
4 changes: 3 additions & 1 deletion build_daemon/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## 4.0.2-wip
## 4.0.2

- Support version `1.x` and `2.x` of `shelf_web_socket` and `2.x` and `3.x`
of `web_socket_channel`.
- Bump the min sdk to 3.4.0.

## 4.0.1
Expand Down
8 changes: 4 additions & 4 deletions build_daemon/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: build_daemon
version: 4.0.2-wip
version: 4.0.2
description: A daemon for running Dart builds.
repository: https://github.com/dart-lang/build/tree/master/build_daemon

Expand All @@ -15,10 +15,10 @@ dependencies:
path: ^1.8.0
pool: ^1.5.0
shelf: ^1.0.0
shelf_web_socket: ^1.0.0
shelf_web_socket: ">=1.0.0 <3.0.0"
stream_transform: ^2.0.0
watcher: ^1.0.0
web_socket_channel: ^2.0.0
web_socket_channel: ">=2.0.0 <4.0.0"

dev_dependencies:
analyzer: '>=3.4.0 <7.0.0'
Expand All @@ -27,7 +27,7 @@ dev_dependencies:
built_value_generator: ^8.1.0
dart_flutter_team_lints: ^2.0.0
mockito: ^5.0.0
test: ^1.16.0
test: ^1.25.5
test_descriptor: ^2.0.0
uuid: ^3.0.0

Expand Down
4 changes: 3 additions & 1 deletion build_runner/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## 2.4.10-wip
## 2.4.10

- Support version `1.x` and `2.x` of `shelf_web_socket` and `2.x` and `3.x`
- of `web_socket_channel`.
- Bump the min sdk to 3.4.0.

## 2.4.9
Expand Down
8 changes: 4 additions & 4 deletions build_runner/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: build_runner
version: 2.4.10-wip
version: 2.4.10
description: A build system for Dart code generation and modular compilation.
repository: https://github.com/dart-lang/build/tree/master/build_runner

Expand Down Expand Up @@ -39,12 +39,12 @@ dependencies:
pub_semver: ^2.0.0
pubspec_parse: ^1.0.0
shelf: ^1.0.0
shelf_web_socket: ^1.0.0
shelf_web_socket: ">=1.0.0 <3.0.0"
stack_trace: ^1.10.0
stream_transform: ^2.0.0
timing: ^1.0.0
watcher: ^1.0.0
web_socket_channel: ^2.0.0
web_socket_channel: ">=2.0.0 <4.0.0"
yaml: ^3.0.0

dev_dependencies:
Expand All @@ -54,7 +54,7 @@ dev_dependencies:
build_web_compilers: ^4.0.0
dart_flutter_team_lints: ^3.1.0
stream_channel: ^2.0.0
test: ^1.16.0
test: ^1.25.5
test_descriptor: ^2.0.0
test_process: ^2.0.0

Expand Down
105 changes: 77 additions & 28 deletions build_runner/test/server/serve_handler_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'dart:convert';
import 'dart:io';

import 'package:_test_common/common.dart';
import 'package:async/async.dart';
import 'package:build/build.dart';
import 'package:build_runner/src/entrypoint/options.dart';
import 'package:build_runner/src/generate/watch_impl.dart';
Expand All @@ -24,6 +25,76 @@ import 'package:test/fake.dart';
import 'package:test/test.dart';
import 'package:web_socket_channel/web_socket_channel.dart';

class FakeSink extends DelegatingStreamSink implements WebSocketSink {
final FakeWebSocketChannel _channel;

FakeSink(this._channel) : super(_channel._controller.sink);

@override
Future close([int? closeCode, String? closeReason]) async {
await super.close();
_channel._isClosed = true;
_channel._closeCode = closeCode;
_channel._closeReason = closeReason;
await _channel._closed(closeCode, closeReason);
}
}

class FakeWebSocketChannel extends StreamChannelMixin
implements WebSocketChannel {
final StreamChannel _controller;
final Future Function(int? closeCode, String? closeReason) _closed;

bool _isClosed = false;
int? _closeCode;
String? _closeReason;

FakeWebSocketChannel(this._controller, this._closed);

@override
int? get closeCode => _closeCode;

@override
String? get closeReason => _closeReason;

@override
String? get protocol => throw UnimplementedError();

@override
Future<void> get ready => Future.value();

@override
WebSocketSink get sink => FakeSink(this);

@override
Stream get stream => _controller.stream;

Future _remoteClosed(int closeCode, String? closeReason) async {
if (!_isClosed) {
await sink.close(closeCode, closeReason);
}
}
}

(WebSocketChannel, WebSocketChannel) createFakes() {
final peer1Write = StreamController<dynamic>();
final peer2Write = StreamController<dynamic>();

late FakeWebSocketChannel foreign;
late FakeWebSocketChannel local;

foreign = FakeWebSocketChannel(
StreamChannel(peer2Write.stream, peer1Write.sink),
(closeCode, closeReason) =>
local._remoteClosed(closeCode ?? 1005, closeReason));
local = FakeWebSocketChannel(
StreamChannel(peer1Write.stream, peer2Write.sink),
(closeCode, closeReason) =>
foreign._remoteClosed(closeCode ?? 1005, closeReason));

return (foreign, local);
}

void main() {
late ServeHandler serveHandler;
late InMemoryRunnerAssetReader reader;
Expand Down Expand Up @@ -283,13 +354,6 @@ void main() {
late BuildUpdatesWebSocketHandler handler;
late Future<void> Function(WebSocketChannel, String) createMockConnection;

// client to server stream controlllers
late StreamController<List<int>> c2sController1;
late StreamController<List<int>> c2sController2;
// server to client stream controlllers
late StreamController<List<int>> s2cController1;
late StreamController<List<int>> s2cController2;

late WebSocketChannel clientChannel1;
late WebSocketChannel clientChannel2;
late WebSocketChannel serverChannel1;
Expand All @@ -312,30 +376,15 @@ void main() {

handler = BuildUpdatesWebSocketHandler(watchImpl, mockHandlerFactory);

c2sController1 = StreamController<List<int>>();
s2cController1 = StreamController<List<int>>();
serverChannel1 = WebSocketChannel(
StreamChannel(c2sController1.stream, s2cController1.sink),
serverSide: true);
clientChannel1 = WebSocketChannel(
StreamChannel(s2cController1.stream, c2sController1.sink),
serverSide: false);

c2sController2 = StreamController<List<int>>();
s2cController2 = StreamController<List<int>>();
serverChannel2 = WebSocketChannel(
StreamChannel(c2sController2.stream, s2cController2.sink),
serverSide: true);
clientChannel2 = WebSocketChannel(
StreamChannel(s2cController2.stream, c2sController2.sink),
serverSide: false);
(serverChannel1, clientChannel1) = createFakes();
(serverChannel2, clientChannel2) = createFakes();
});

tearDown(() {
c2sController1.close();
s2cController1.close();
c2sController2.close();
s2cController2.close();
serverChannel1.sink.close();
clientChannel1.sink.close();
serverChannel2.sink.close();
clientChannel2.sink.close();
});

test('emmits a message to all listners', () async {
Expand Down

0 comments on commit 43bd3f5

Please sign in to comment.