blob: ca4bd6a98a717ba5c22eaf47b396cdc82b364191 [file] [log] [blame]
// Copyright (c) 2022, 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.
// @dart = 2.9
import "dart:io";
import 'package:expect/expect.dart';
import 'package:path/path.dart' as path;
import 'use_flag_test_helper.dart';
main(List<String> args) async {
if (!isAOTRuntime) {
return; // Running in JIT: AOT binaries not available.
}
if (Platform.isAndroid) {
return; // SDK tree and gen_snapshot not available on the test device.
}
// These are the tools we need to be available to run on a given platform:
if (!await testExecutable(genSnapshot)) {
throw "Cannot run test as $genSnapshot not available";
}
if (!await testExecutable(aotRuntime)) {
throw "Cannot run test as $aotRuntime not available";
}
if (!File(platformDill).existsSync()) {
throw "Cannot run test as $platformDill does not exist";
}
await withTempDir('dwarf-flag-test', (String dir) async {
File(path.join(dir, 'main.dart')).writeAsStringSync('''
import 'dart:isolate';
main(List<String> args) async {
final rp = ReceivePort();
try {
await Isolate.spawnUri(Uri.parse(args.single), <String>[], rp.sendPort);
final result = await rp.first;
if (result != 'hello from spawnee') throw 'failed';
print('got spawnee message');
print('success');
} finally {
rp.close();
}
}
''');
for (final basename in ['spawnee', 'spawnee_checked']) {
File(path.join(dir, '$basename.dart')).writeAsStringSync('''
import 'dart:isolate';
main(List<String> args, dynamic sendPort) {
print('spawnee started');
(sendPort as SendPort).send('hello from spawnee');
}
''');
}
// '--enable-asserts' is not available in product mode, so we skip the
// negative test.
final isProductMode = const bool.fromEnvironment('dart.vm.product');
for (final basename in ['main', 'spawnee', 'spawnee_checked']) {
final script = path.join(dir, '$basename.dart');
final scriptDill = path.join(dir, '$basename.dart.dill');
final bool checked = basename.endsWith('_checked');
if (isProductMode && checked) continue;
await run(genKernel, <String>[
if (checked) '--enable-asserts',
'--aot',
'--platform=$platformDill',
'-o',
scriptDill,
script,
]);
final scriptAot = path.join(dir, '$basename.dart.dill.so');
await run(genSnapshot, <String>[
if (checked) '--enable-asserts',
'--snapshot-kind=app-aot-elf',
'--elf=$scriptAot',
scriptDill,
]);
}
// Successful run
final result1 = await runOutput(aotRuntime, <String>[
path.join(dir, 'main.dart.dill.so'),
path.join(dir, 'spawnee.dart.dill.so'),
]);
Expect.deepEquals([
'spawnee started',
'got spawnee message',
'success',
], result1);
if (!isProductMode) {
// File exists and is AOT snapshot but was compiled with different flags
// (namely --enable-asserts)
final result2 = await runHelper(aotRuntime, [
path.join(dir, 'main.dart.dill.so'),
path.join(dir, 'spawnee_checked.dart.dill.so'),
]);
Expect.notEquals(0, result2.exitCode);
Expect.contains(
'Snapshot not compatible with the current VM configuration',
result2.stderr);
}
// File does not exist.
final result3 = await runHelper(aotRuntime, [
path.join(dir, 'main.dart.dill.so'),
path.join(dir, 'does_not_exist.dart.dill.so'),
]);
Expect.notEquals(0, result3.exitCode);
Expect.contains(
'The uri provided to `Isolate.spawnUri()` does not contain a valid AOT '
'snapshot',
result3.stderr);
});
}