blob: 435c00430a1afed5669a514c5860883955a4444e [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ignore_for_file: avoid_print
import 'dart:async';
import 'dart:isolate';
import 'split_lib_test.dart' deferred as splitlib;
void main() {}
@pragma('vm:entry-point')
void sayHi() {
print('Hi');
}
@pragma('vm:entry-point')
void throwExceptionNow() {
throw AssertionError('Hello');
}
@pragma('vm:entry-point')
Future<void> canRegisterNativeCallback() async {
print('In function canRegisterNativeCallback');
notifyNative();
print('Called native method from canRegisterNativeCallback');
}
Future<void>? splitLoadFuture;
@pragma('vm:entry-point')
void canCallDeferredLibrary() {
print('In function canCallDeferredLibrary');
splitLoadFuture = splitlib.loadLibrary().then((_) {
print('Deferred load complete');
notifySuccess(splitlib.splitAdd(10, 23) == 33);
}).catchError((_) {
print('Deferred load error');
notifySuccess(false);
});
notifyNative();
}
@pragma('vm:external-name', 'NotifyNative')
external void notifyNative();
@pragma('vm:entry-point')
void testIsolateShutdown() {}
@pragma('vm:external-name', 'NotifyNative')
external void notifyResult(bool success);
@pragma('vm:external-name', 'PassMessage')
external void passMessage(String message);
void secondaryIsolateMain(String message) {
print('Secondary isolate got message: $message');
passMessage('Hello from code is secondary isolate.');
notifyNative();
}
@pragma('vm:entry-point')
void testCanLaunchSecondaryIsolate() {
final onExit = RawReceivePort((_) {
notifyNative();
});
Isolate.spawn(secondaryIsolateMain, 'Hello from root isolate.',
onExit: onExit.sendPort);
}
@pragma('vm:entry-point')
Future<void> testIsolateStartupFailure() async {
Future<void> mainTest(void _) async {
Future<void> testSuccessfullIsolateLaunch() async {
final onMessage = ReceivePort();
final onExit = ReceivePort();
final messages = StreamIterator<dynamic>(onMessage);
final exits = StreamIterator<dynamic>(onExit);
await Isolate.spawn(
(SendPort port) => port.send('good'), onMessage.sendPort,
onExit: onExit.sendPort);
if (!await messages.moveNext()) {
throw AssertionError('Failed to receive message');
}
if (messages.current != 'good') {
throw AssertionError('Failed to receive correct message');
}
if (!await exits.moveNext()) {
throw AssertionError('Failed to receive onExit');
}
messages.cancel();
exits.cancel();
}
Future<void> testUnsuccessfullIsolateLaunch() async {
IsolateSpawnException? error;
try {
await Isolate.spawn((_) {}, null);
} on IsolateSpawnException catch (e) {
error = e;
}
if (error == null) {
throw AssertionError('Expected isolate spawn to fail.');
}
}
await testSuccessfullIsolateLaunch();
makeNextIsolateSpawnFail();
await testUnsuccessfullIsolateLaunch();
notifyNative();
}
// The root isolate will not run an eventloop, so we have to run the actual
// test in an isolate.
Isolate.spawn(mainTest, null);
}
@pragma('vm:external-name', 'MakeNextIsolateSpawnFail')
external void makeNextIsolateSpawnFail();
@pragma('vm:entry-point')
void testCanReceiveArguments(List<String> args) {
notifyResult(args.length == 1 && args[0] == 'arg1');
}
@pragma('vm:entry-point')
void trampoline() {
notifyNative();
}
@pragma('vm:external-name', 'NotifySuccess')
external void notifySuccess(bool success);
@pragma('vm:entry-point')
void testCanConvertEmptyList(List<int> args) {
notifySuccess(args.isEmpty);
}
@pragma('vm:entry-point')
void testCanConvertListOfStrings(List<String> args) {
notifySuccess(args.length == 4 &&
args[0] == 'tinker' &&
args[1] == 'tailor' &&
args[2] == 'soldier' &&
args[3] == 'sailor');
}
@pragma('vm:entry-point')
void testCanConvertListOfDoubles(List<double> args) {
notifySuccess(args.length == 4 &&
args[0] == 1.0 &&
args[1] == 2.0 &&
args[2] == 3.0 &&
args[3] == 4.0);
}
@pragma('vm:entry-point')
void testCanConvertListOfInts(List<int> args) {
notifySuccess(args.length == 4 &&
args[0] == 1 &&
args[1] == 2 &&
args[2] == 3 &&
args[3] == 4);
}
bool didCallRegistrantBeforeEntrypoint = false;
// Test the Dart plugin registrant.
@pragma('vm:entry-point')
class _PluginRegistrant {
@pragma('vm:entry-point')
static void register() {
if (didCallRegistrantBeforeEntrypoint) {
throw AssertionError('_registerPlugins is being called twice');
}
didCallRegistrantBeforeEntrypoint = true;
}
}
@pragma('vm:entry-point')
void mainForPluginRegistrantTest() {
if (didCallRegistrantBeforeEntrypoint) {
passMessage('_PluginRegistrant.register() was called');
} else {
passMessage('_PluginRegistrant.register() was not called');
}
}
@pragma('vm:entry-point')
void mainForPlatformIsolates() {
passMessage('Platform isolate is ready');
}
@pragma('vm:entry-point')
void emptyMain(List<Object?> args) {}
@pragma('vm:entry-point')
Function createEntryPointForPlatIsoSendAndRecvTest() {
final port = RawReceivePort();
port.handler = (Object? message) {
port.close();
(message! as SendPort).send('Hello from root isolate!');
};
final SendPort sendPort = port.sendPort;
return () {
final replyPort = RawReceivePort();
replyPort.handler = (Object? message) {
replyPort.close();
passMessage('Platform isolate received: $message');
};
sendPort.send(replyPort.sendPort);
};
}
@pragma('vm:entry-point')
void mainForPlatformIsolatesThrowError() {
throw AssertionError('Error from platform isolate');
}