blob: 3cd4723cb3ff24aeb28457deea0372bc3f0763b2 [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:stream_channel/stream_channel.dart';
/// A class that connects incoming and outgoing channels with the same names.
class SuiteChannelManager {
/// Connections from the test runner that have yet to connect to corresponding
/// calls to [connectOut].
final _incomingConnections = <String, StreamChannel<Object?>>{};
/// Connections from calls to [connectOut] that have yet to connect to
/// corresponding connections from the test runner.
final _outgoingConnections = <String, StreamChannelCompleter<Object?>>{};
/// The channel names that have already been used.
final _names = <String>{};
/// Creates a connection to the test runnner's channel with the given [name].
StreamChannel<Object?> connectOut(String name) {
if (_incomingConnections.containsKey(name)) {
return (_incomingConnections[name])!;
} else if (_names.contains(name)) {
throw StateError('Duplicate suiteChannel() connection "$name".');
} else {
_names.add(name);
var completer = StreamChannelCompleter<Object?>();
_outgoingConnections[name] = completer;
return completer.channel;
}
}
/// Connects [channel] to this worker's channel with the given [name].
void connectIn(String name, StreamChannel<Object?> channel) {
if (_outgoingConnections.containsKey(name)) {
_outgoingConnections.remove(name)!.setChannel(channel);
} else if (_incomingConnections.containsKey(name)) {
throw StateError('Duplicate RunnerSuite.channel() connection "$name".');
} else {
_incomingConnections[name] = channel;
}
}
}