| // 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. |
| |
| import 'dart:async'; |
| import 'dart:isolate'; |
| import 'dart:ui'; |
| |
| 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 'Hello'; |
| } |
| |
| @pragma('vm:entry-point') |
| void canRegisterNativeCallback() async { |
| print('In function canRegisterNativeCallback'); |
| notifyNative(); |
| print('Called native method from canRegisterNativeCallback'); |
| } |
| |
| Future<void>? splitLoadFuture = null; |
| |
| @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') |
| void testIsolateStartupFailure() async { |
| Future mainTest(dynamic _) async { |
| Future 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 'Failed to receive message'; |
| } |
| if (messages.current != 'good') { |
| throw 'Failed to receive correct message'; |
| } |
| if (!await exits.moveNext()) { |
| throw 'Failed to receive onExit'; |
| } |
| messages.cancel(); |
| exits.cancel(); |
| } |
| |
| Future testUnsuccessfullIsolateLaunch() async { |
| IsolateSpawnException? error; |
| try { |
| await Isolate.spawn((_) {}, null); |
| } on IsolateSpawnException catch (e) { |
| error = e; |
| } |
| if (error == null) { |
| throw '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.length == 0); |
| } |
| |
| @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 '_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'); |
| } |
| } |