| // 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<String> 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 = <List<String>>[]; |
| for (var unit in manifest['loadingUnits']) { |
| var uris = <String>[]; |
| 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, <String>[ |
| "--aot", |
| "--platform=$platformDill", |
| "-o", |
| dill, |
| source, |
| ]); |
| |
| // Compile kernel to ELF. |
| await run(genSnapshot, <String>[ |
| "--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!")); |
| }); |
| } |