// 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 "dart:convert"; import "dart:io"; import "package:expect/expect.dart"; import "package:path/path.dart" as path; import "use_flag_test_helper.dart"; main(List args) async { if (!isAOTRuntime) { return; // Running in JIT: AOT binaries not available. } if (Platform.isAndroid) { return; // SDK tree not available on the test device. } // These are the tools we need to be available to run on a given platform: if (!File(platformDill).existsSync()) { throw "Cannot run test as $platformDill does not exist"; } if (!await testExecutable(genSnapshot)) { throw "Cannot run test as $genSnapshot not available"; } sanitizedPartitioning(manifest) { // Filter core libraries, relativize URIs, and sort to make the results less // sensitive to compiler or test harness changes. print(manifest); var units = >[]; for (var unit in manifest['loadingUnits']) { var uris = []; for (var uri in unit['libraries']) { if (uri.startsWith("dart:")) continue; uris.add(Uri.parse(uri).pathSegments.last); } uris.sort(); units.add(uris); } units.sort((a, b) => a.first.compareTo(b.first)); print(units); return units; } await withTempDir("split-literals-test", (String tempDir) async { final source = path.join(sdkDir, "runtime/tests/vm/dart_2/split_literals.dart"); final dill = path.join(tempDir, "split_literals.dart.dill"); final snapshot = path.join(tempDir, "split_literals.so"); final manifest = path.join(tempDir, "split_literals.txt"); final deferredSnapshot = snapshot + "-2.part.so"; // Compile source to kernel. await run(genKernel, [ "--aot", "--platform=$platformDill", "-o", dill, source, ]); // Compile kernel to ELF. await run(genSnapshot, [ "--use_bare_instructions=false", //# object: ok "--use_bare_instructions=true", //# bare: ok "--snapshot-kind=app-aot-elf", "--elf=$snapshot", "--loading-unit-manifest=$manifest", dill, ]); var manifestContent = jsonDecode(await new File(manifest).readAsString()); Expect.equals(2, manifestContent["loadingUnits"].length); // Note package:expect doesn't do deep equals on collections. Expect.equals( "[[split_literals.dart]," " [split_literals_deferred.dart]]", sanitizedPartitioning(manifestContent).toString()); Expect.isTrue(await new File(deferredSnapshot).exists()); bool containsSubsequence(haystack, needle) { outer: for (var i = 0, n = haystack.length - needle.length; i < n; i++) { for (var j = 0; j < needle.length; j++) { if (haystack[i + j] != needle.codeUnitAt(j)) continue outer; } return true; } return false; } var unit_1 = await new File(snapshot).readAsBytes(); Expect.isTrue(containsSubsequence(unit_1, "Root literal!")); Expect.isTrue(containsSubsequence(unit_1, "Root literal in a list!")); Expect.isTrue(containsSubsequence(unit_1, "Root literal in a map!")); Expect.isTrue(containsSubsequence(unit_1, "Root literal in a box!")); Expect.isTrue(!containsSubsequence(unit_1, "Deferred literal!")); Expect.isTrue(!containsSubsequence(unit_1, "Deferred literal in a list!")); Expect.isTrue(!containsSubsequence(unit_1, "Deferred literal in a map!")); Expect.isTrue(!containsSubsequence(unit_1, "Deferred literal in a box!")); var unit_2 = await new File(deferredSnapshot).readAsBytes(); Expect.isTrue(!containsSubsequence(unit_2, "Root literal!")); Expect.isTrue(!containsSubsequence(unit_2, "Root literal in a list!")); Expect.isTrue(!containsSubsequence(unit_2, "Root literal in a map!")); Expect.isTrue(!containsSubsequence(unit_2, "Root literal in a box!")); Expect.isTrue(containsSubsequence(unit_2, "Deferred literal!")); Expect.isTrue(containsSubsequence(unit_2, "Deferred literal in a list!")); Expect.isTrue(containsSubsequence(unit_2, "Deferred literal in a map!")); Expect.isTrue(containsSubsequence(unit_2, "Deferred literal in a box!")); }); }