| // Copyright (c) 2018, 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:io"; |
| |
| void main(List<String> args) { |
| if (args.contains("--child")) { |
| print("Hello, sharing world!"); |
| return; |
| } |
| |
| if (!Platform.executable.endsWith("dart_precompiled_runtime")) { |
| return; // Running in JIT or Windows: AOT binaries not available. |
| } |
| |
| if (Platform.isAndroid) { |
| return; // SDK tree and dart_bootstrap not available on the test device. |
| } |
| |
| var buildDir = |
| Platform.executable.substring(0, Platform.executable.lastIndexOf('/')); |
| var tempDir = Directory.systemTemp.createTempSync("app-shared"); |
| var snapshot1Path = tempDir.uri.resolve("hello1.snapshot").toFilePath(); |
| var snapshot2Path = tempDir.uri.resolve("hello2.snapshot").toFilePath(); |
| var scriptPath = new Directory(buildDir) |
| .uri |
| .resolve("../../tests/standalone_2/app_snapshot_share_test.dart") |
| .toFilePath(); |
| final scriptPathDill = tempDir.uri.resolve('app.dill').toFilePath(); |
| |
| try { |
| args = <String>[ |
| '--aot', |
| '--platform=$buildDir/vm_platform_strong.dill', |
| '-o', |
| scriptPathDill, |
| scriptPath, |
| ]; |
| runSync("pkg/vm/tool/gen_kernel${Platform.isWindows ? '.bat' : ''}", args); |
| |
| args = <String>[ |
| "--deterministic", |
| "--snapshot-kind=app-aot-blobs", |
| "--blobs_container_filename=$snapshot1Path", |
| scriptPathDill, |
| ]; |
| runSync("$buildDir/gen_snapshot", args); |
| |
| args = <String>[ |
| "--deterministic", |
| "--snapshot-kind=app-aot-blobs", |
| "--blobs_container_filename=$snapshot2Path", |
| "--shared-blobs=$snapshot1Path", |
| scriptPathDill, |
| ]; |
| runSync("$buildDir/gen_snapshot", args); |
| |
| var sizeWithoutSharing = new File(snapshot1Path).statSync().size; |
| var deltaWhenSharing = new File(snapshot2Path).statSync().size; |
| print("sizeWithoutSharing: ${sizeWithoutSharing.toString().padLeft(8)}"); |
| print("deltaWhenSharing: ${deltaWhenSharing.toString().padLeft(8)}"); |
| if (deltaWhenSharing >= sizeWithoutSharing) { |
| throw "Sharing did not shrink size"; |
| } |
| |
| args = <String>[ |
| "--shared-blobs=$snapshot1Path", |
| snapshot2Path, |
| "--child", |
| ]; |
| final result = runSync("$buildDir/dart_precompiled_runtime", args); |
| if (!result.stdout.contains("Hello, sharing world!")) { |
| throw "Missing output"; |
| } |
| } finally { |
| tempDir.deleteSync(recursive: true); |
| } |
| } |
| |
| ProcessResult runSync(String executable, List<String> args) { |
| print("+ $executable ${args.join(' ')}"); |
| |
| final result = Process.runSync(executable, args); |
| print("Exit code: ${result.exitCode}"); |
| print("stdout:"); |
| print(result.stdout); |
| print("stderr:"); |
| print(result.stderr); |
| |
| if (result.exitCode != 0) { |
| throw "Bad exit code"; |
| } |
| return result; |
| } |