blob: 6fc1dca716ba969e4912caab6f289cdf55a54a0d [file] [log] [blame]
// Copyright (c) 2024, 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.
//
// This checks that use of 'vm:shared' pragma crashes VM if no flag is passed.
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:expect/config.dart';
import 'package:expect/expect.dart';
import 'package:path/path.dart' as path;
import 'package:expect/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
void main(List<String> args) async {
if (isVmAotConfiguration) return; // Skip testing on AOT
asyncStart();
final dartExecutable = Platform.executable;
final Directory tempDir = Directory.systemTemp.createTempSync();
try {
final sharedUseTest = path.join(tempDir.path, 'shared_use_test.dart');
File(sharedUseTest).writeAsStringSync(r'''
@pragma('vm:shared') int foo = 1;
void main() {}
''');
{
final process = await Process.start(dartExecutable, <String>[
...Platform.executableArguments,
sharedUseTest,
]);
process.stdout
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
stdout.writeln('stdout:>$line');
stdout.writeln(line);
});
final sb = StringBuffer();
process.stderr
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
stderr.writeln('stderr:>$line');
sb.writeln(line);
});
Expect.notEquals(0, await process.exitCode);
Expect.contains(
"Encountered vm:shared when functionality is disabled. "
"Pass --experimental-shared-data",
sb.toString(),
);
}
{
final process = await Process.start(dartExecutable, <String>[
...Platform.executableArguments,
'--experimental_shared_data',
sharedUseTest,
]);
process.stdout
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
stdout.writeln('stdout:>$line');
stdout.writeln(line);
});
final sb = StringBuffer();
process.stderr
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
stderr.writeln('stderr:>$line');
sb.writeln(line);
});
final exitCode = await process.exitCode;
if (Platform.version.contains('(main)') ||
Platform.version.contains('(dev)')) {
Expect.equals(0, exitCode);
} else {
Expect.notEquals(0, exitCode);
Expect.contains(
"Shared memory multithreading in only available for "
"experimentation in dev or main",
sb.toString(),
);
}
}
} finally {
tempDir.deleteSync(recursive: true);
}
asyncEnd();
}