blob: d629db586c97cfe843abb53e5032ae02edc0ecac [file] [log] [blame]
// Copyright (c) 2020, 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.
import 'package:kernel/binary/ast_from_binary.dart';
import 'utils.dart';
void main() {
void setCompileMode(Component c, NonNullableByDefaultCompiledMode mode) {
c.setMainMethodAndMode(null, true, mode);
}
void verifyMode(Component c, NonNullableByDefaultCompiledMode mode) {
if (c.mode != mode) {
throw "Serialized and re-read component had change in mode: "
"Expected $mode got ${c.mode}.";
}
}
const List<NonNullableByDefaultCompiledMode> modes = const [
NonNullableByDefaultCompiledMode.Weak,
NonNullableByDefaultCompiledMode.Strong,
NonNullableByDefaultCompiledMode.Agnostic,
];
int combination = 0;
for (NonNullableByDefaultCompiledMode c1Mode in modes) {
for (NonNullableByDefaultCompiledMode c2Mode in modes) {
combination++;
print("Checking combination #$combination ("
"c1Mode: $c1Mode; "
"c2Mode: $c2Mode; "
")");
// Try individually.
List<int> c1Serialized;
{
Uri uri = Uri.parse("foo://bar.dart");
Library lib1 = new Library(uri, fileUri: uri)
..nonNullableByDefaultCompiledMode = c1Mode;
Component c1 = new Component(libraries: [lib1]);
setCompileMode(c1, c1Mode);
c1Serialized = serializeComponent(c1);
Component c1RoundTrip = loadComponentFromBytes(c1Serialized);
verifyMode(c1RoundTrip, c1Mode);
}
List<int> c2Serialized;
{
Uri uri = Uri.parse("foo://baz.dart");
Library lib2 = new Library(uri, fileUri: uri)
..nonNullableByDefaultCompiledMode = c2Mode;
Component c2 = new Component(libraries: [lib2]);
setCompileMode(c2, c2Mode);
c2Serialized = serializeComponent(c2);
Component c2RoundTrip = loadComponentFromBytes(c2Serialized);
verifyMode(c2RoundTrip, c2Mode);
}
// Try with combined binary.
try {
List<int> combined = [];
combined.addAll(c1Serialized);
combined.addAll(c2Serialized);
Component combinedRoundTrip = loadComponentFromBytes(combined);
verifyMode(combinedRoundTrip, verifyOK(c1Mode, c2Mode));
print(" -> OK with $c1Mode and $c2Mode");
} on CompilationModeError catch (e) {
print(" -> Got $e with $c1Mode and $c2Mode");
verifyError(c1Mode, c2Mode);
}
// Try other order.
try {
List<int> combined = [];
combined.addAll(c2Serialized);
combined.addAll(c1Serialized);
Component combinedRoundTrip = loadComponentFromBytes(combined);
verifyMode(combinedRoundTrip, verifyOK(c1Mode, c2Mode));
print(" -> OK with $c1Mode and $c2Mode");
} on CompilationModeError catch (e) {
print(" -> Got $e with $c1Mode and $c2Mode");
verifyError(c1Mode, c2Mode);
}
// Try with individual binary, but loaded into same component.
try {
Component combinedRoundTrip = loadComponentFromBytes(c1Serialized);
combinedRoundTrip =
loadComponentFromBytes(c2Serialized, combinedRoundTrip);
verifyMode(combinedRoundTrip, verifyOK(c1Mode, c2Mode));
print(" -> OK with $c1Mode and $c2Mode");
} on CompilationModeError catch (e) {
print(" -> Got $e with $c1Mode and $c2Mode");
verifyError(c1Mode, c2Mode);
}
// Try other order.
try {
Component combinedRoundTrip = loadComponentFromBytes(c2Serialized);
combinedRoundTrip =
loadComponentFromBytes(c1Serialized, combinedRoundTrip);
verifyMode(combinedRoundTrip, verifyOK(c1Mode, c2Mode));
print(" -> OK with $c1Mode and $c2Mode");
} on CompilationModeError catch (e) {
print(" -> Got $e with $c1Mode and $c2Mode");
verifyError(c1Mode, c2Mode);
}
// Try with individual binary, but loaded into same component where
// component initially does not have a mode.
try {
Component combinedRoundTrip = new Component();
combinedRoundTrip =
loadComponentFromBytes(c1Serialized, combinedRoundTrip);
combinedRoundTrip =
loadComponentFromBytes(c2Serialized, combinedRoundTrip);
verifyMode(combinedRoundTrip, verifyOK(c1Mode, c2Mode));
print(" -> OK with $c1Mode and $c2Mode");
} on CompilationModeError catch (e) {
print(" -> Got $e with $c1Mode and $c2Mode");
verifyError(c1Mode, c2Mode);
}
}
}
print("Done: Everything looks good.");
}
bool isOK(NonNullableByDefaultCompiledMode c1Mode,
NonNullableByDefaultCompiledMode c2Mode) {
if (c1Mode == c2Mode) return true;
if (c1Mode == NonNullableByDefaultCompiledMode.Agnostic) return true;
if (c2Mode == NonNullableByDefaultCompiledMode.Agnostic) return true;
return false;
}
NonNullableByDefaultCompiledMode verifyOK(
NonNullableByDefaultCompiledMode c1Mode,
NonNullableByDefaultCompiledMode c2Mode) {
if (isOK(c1Mode, c2Mode)) {
if (c1Mode == NonNullableByDefaultCompiledMode.Agnostic) return c2Mode;
if (c2Mode == NonNullableByDefaultCompiledMode.Agnostic) return c1Mode;
return c1Mode;
}
throw "Not OK combination: $c1Mode and $c2Mode";
}
void verifyError(NonNullableByDefaultCompiledMode c1Mode,
NonNullableByDefaultCompiledMode c2Mode) {
if (isOK(c1Mode, c2Mode)) {
throw "Unexpected error for $c1Mode and $c2Mode";
}
}