import 'dart:isolate';
import 'dart:ui';
import 'package:test/test.dart';
const String kPortName = 'foobar';
const int kErrorCode = -1;
const int kStartCode = 0;
const int kCloseCode = 1;
const int kDeletedCode = 2;
void isolateSpawnEntrypoint(SendPort port) {
void sendHelper(int code, [String message = '']) {
port.send(<dynamic>[code, message]);
}
final SendPort shared = IsolateNameServer.lookupPortByName(kPortName);
if (shared == null) {
sendHelper(kErrorCode, 'Could not find port: $kPortName');
return;
}
sendHelper(kStartCode);
shared.send(kPortName);
sendHelper(kCloseCode);
shared.send('garbage');
final bool result = IsolateNameServer.removePortNameMapping(kPortName);
if (result) {
sendHelper(kDeletedCode);
} else {
sendHelper(kErrorCode, 'Was unable to remove mapping for $kPortName');
}
}
void main() {
tearDown(() {
IsolateNameServer.removePortNameMapping(kPortName);
});
test('simple isolate name server', () {
expect(IsolateNameServer.lookupPortByName(kPortName), isNull);
expect(IsolateNameServer.removePortNameMapping(kPortName), isFalse);
final ReceivePort receivePort = ReceivePort();
final SendPort sendPort = receivePort.sendPort;
expect(IsolateNameServer.registerPortWithName(sendPort, kPortName), isTrue);
expect(IsolateNameServer.lookupPortByName(kPortName), sendPort);
final ReceivePort receivePort2 = ReceivePort();
final SendPort sendPort2 = receivePort2.sendPort;
expect(
IsolateNameServer.registerPortWithName(sendPort2, kPortName), isFalse);
expect(IsolateNameServer.lookupPortByName(kPortName), sendPort);
expect(IsolateNameServer.removePortNameMapping(kPortName), isTrue);
expect(IsolateNameServer.lookupPortByName(kPortName), isNull);
expect(
IsolateNameServer.registerPortWithName(sendPort2, kPortName), isTrue);
expect(IsolateNameServer.lookupPortByName(kPortName), sendPort2);
receivePort.close();
receivePort2.close();
});
test('isolate name server multi-isolate', () async {
final ReceivePort receivePort = ReceivePort();
final SendPort sendPort = receivePort.sendPort;
expect(IsolateNameServer.registerPortWithName(sendPort, kPortName), isTrue);
final ReceivePort testReceivePort = ReceivePort();
testReceivePort.listen(expectAsync1<void, dynamic>((dynamic response) {
final int code = response[0];
final String message = response[1];
switch (code) {
case kStartCode:
break;
case kCloseCode:
receivePort.close();
break;
case kDeletedCode:
expect(IsolateNameServer.lookupPortByName(kPortName), isNull);
testReceivePort.close();
break;
case kErrorCode:
throw message;
default:
throw 'UNREACHABLE';
}
}, count: 3));
receivePort.listen(expectAsync1<void, dynamic>((dynamic message) {
expect(message, kPortName);
}));
await Isolate.spawn(isolateSpawnEntrypoint, testReceivePort.sendPort);
});
}