Index: tests/standalone/io/platform_executable_test.dart |
diff --git a/tests/standalone/io/platform_executable_test.dart b/tests/standalone/io/platform_executable_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c9825060c896b14c5e97c56ca012bbbb1d88a67a |
--- /dev/null |
+++ b/tests/standalone/io/platform_executable_test.dart |
@@ -0,0 +1,147 @@ |
+// Copyright (c) 2012, 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. |
+// |
+// Process test program to test process communication. |
+ |
+library PlatformExecutableTest; |
+ |
+import "dart:io"; |
+ |
+void expectEquals(a, b) { |
+ if (a != b) { |
+ throw 'Expected: $a\n' |
+ ' Actual: $b'; |
+ } |
+} |
+ |
+void verify(String exePath, {String altPath}) { |
+ var env = {'SCRIPT': 'yes'}; |
+ if (altPath != null) { |
+ env['PATH'] = altPath; |
+ } |
+ |
+ var processResult = Process.runSync(exePath, [scriptPath], |
+ includeParentEnvironment: false, runInShell: true, environment: env); |
+ |
+ if (processResult.exitCode != 0) { |
+ throw 'Error with process\n' |
+ '$scriptPath' |
+ 'Exit code: ${processResult.exitCode}\n' |
+ ' STDOUT: ${processResult.stdout}\n' |
+ ' STDERR: ${processResult.stderr}\n'; |
+ } |
+ |
+ var result = processResult.stdout.trim(); |
+ expectEquals(Platform.executable, result); |
+} |
+ |
+void testDartExecShouldNotBeInCurrentDir() { |
+ var type = FileSystemEntity.typeSync(platformExeName); |
+ expectEquals(FileSystemEntityType.NOT_FOUND, type); |
+} |
+ |
+void testShouldFailOutsidePath() { |
+ var threw = false; |
+ try { |
+ Process.runSync(platformExeName, [scriptPath], |
+ includeParentEnvironment: false, environment: {'SCRIPT': 'yes'}); |
+ } catch (_) { |
+ threw = true; |
+ } |
+ |
+ expectEquals(true, threw); |
+} |
+ |
+void testShouldSucceedWithSourcePlatformExecutable() { |
+ //print('*** Running normally'); |
+ verify(Platform.executable); |
+} |
+ |
+void testExeSymLinked(Directory dir) { |
+ var dirUri = new Uri.directory(dir.path); |
+ var link = new Link.fromUri(dirUri.resolve('dart_exe_link')); |
+ link.createSync(Platform.executable); |
+ //print('*** Creating a sym-link to the executable'); |
+ verify(link.path); |
+} |
+ |
+void testPathToDirWithExeSymLinked(Directory dir) { |
+ var dirUri = new Uri.directory(dir.path); |
+ var link = new Link.fromUri(dirUri.resolve('dart_exe_link')); |
+ link.createSync(Platform.executable); |
+ //print('*** Path to a directory that contains a sym-link to dart bin'); |
+ verify('dart_exe_link', altPath: dir.path); |
+} |
+ |
+/// Create a sym-link to the SDK directory and run 'dart' from that path |
+void testExeDirSymLinked(Directory dir) { |
+ var dirUri = new Uri.directory(dir.path); |
+ |
+ var linkDirUri = dirUri.resolve('dart_bin_dir_link'); |
+ var link = new Link.fromUri(linkDirUri); |
+ |
+ var exeFile = new File(Platform.executable); |
+ |
+ link.createSync(exeFile.parent.path); |
+ |
+ var linkedBin = |
+ new Uri.directory(linkDirUri.toFilePath()).resolve(platformExeName); |
+ |
+ //print('*** Running in a sym-linked directory'); |
+ verify(linkedBin.toFilePath()); |
+} |
+ |
+void testPathPointsToSymLinkedSDKPath(Directory dir) { |
+ var dirUri = new Uri.directory(dir.path); |
+ |
+ var linkDirUri = dirUri.resolve('dart_bin_dir_link'); |
+ var link = new Link.fromUri(linkDirUri); |
+ |
+ var exeFile = new File(Platform.executable); |
+ |
+ link.createSync(exeFile.parent.path); |
+ |
+ //print('*** Path points to a sym-linked SDK dir'); |
+ verify(platformExeName, altPath: link.path); |
+} |
+ |
+void testPathToSDKDir() { |
+ var exeFile = new File(Platform.executable); |
+ var binDirPath = exeFile.parent.path; |
+ |
+ //print('*** Running with PATH env set to environment - fixed in 16994 - thanks!'); |
+ verify(platformExeName, altPath: binDirPath); |
+} |
+ |
+void withTempDir(void test(Directory dir)) { |
+ var tempDir = Directory.systemTemp.createTempSync('dart.sdk.test.'); |
+ try { |
+ test(tempDir); |
+ } finally { |
+ tempDir.deleteSync(recursive: true); |
+ } |
+} |
+ |
+String get platformExeName { |
+ var raw = new Uri.file(Platform.executable); |
+ return raw.pathSegments.last; |
+} |
+ |
+String get scriptPath => Platform.script.toString(); |
+ |
+void main() { |
+ if (Platform.environment.containsKey('SCRIPT')) { |
+ print(Platform.executable); |
+ return; |
+ } |
+ |
+ testDartExecShouldNotBeInCurrentDir(); |
+ testShouldFailOutsidePath(); |
+ testShouldSucceedWithSourcePlatformExecutable(); /// 00: ok |
+ withTempDir(testExeSymLinked); /// 01: ok |
+ withTempDir(testExeDirSymLinked); /// 02: ok |
+ testPathToSDKDir(); /// 03: ok |
+ withTempDir(testPathPointsToSymLinkedSDKPath); /// 04: ok |
+ withTempDir(testPathToDirWithExeSymLinked); /// 05: ok |
+} |