blob: 9480015515adec5b7aee168bc4ceb69cb458ffee [file] [log] [blame] [edit]
// Copyright (c) 2025, 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 test was generated by Gemini.
import "dart:io";
import "package:expect/expect.dart";
// The simple script to be run in a child process.
// It prints both executable paths to standard output.
const String _testScriptContent = """
import "dart:io";
void main() {
print(Platform.executable);
print(Platform.resolvedExecutable);
}
""";
void main() {
if (!Platform.isLinux && !Platform.isMacOS) return;
// 1. Get the absolute path to the current Dart executable.
final dartExecutablePath = Platform.resolvedExecutable;
// 2. Create a temporary directory and the necessary files.
final tempDir = Directory.systemTemp.createTempSync("dart_symlink_test_");
final symlinkPath = "${tempDir.path}${Platform.pathSeparator}dart_symlink";
final childScriptPath =
"${tempDir.path}${Platform.pathSeparator}child_script.dart";
try {
// Create the symbolic link.
Link(symlinkPath).createSync(dartExecutablePath, recursive: true);
// Write the child script to a file.
File(childScriptPath).writeAsStringSync(_testScriptContent);
// 3. Execute the child script using the symlink.
final result = Process.runSync(
symlinkPath, // This is the key: use the symlink path
[childScriptPath],
runInShell: true,
);
// Verify the child process exited successfully.
print("stdout:");
print(result.stdout);
print("stderr:");
print(result.stderr);
Expect.equals(0, result.exitCode);
// 4. Parse the output.
final output = result.stdout.toString().trim().split("\n");
final executablePath = output[0];
final resolvedExecutablePath = output[1];
// 5. Assert the paths are different.
print("Executable: $executablePath");
print("Resolved Executable: $resolvedExecutablePath");
Expect.notEquals(executablePath, resolvedExecutablePath);
} finally {
// Clean up the temporary directory.
if (tempDir.existsSync()) {
tempDir.deleteSync(recursive: true);
}
}
}