| // Copyright (c) 2021, 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'; | 
 |  | 
 | import 'package:expect/expect.dart'; | 
 | import 'package:path/path.dart' as p; | 
 |  | 
 | import 'utils.dart'; | 
 |  | 
 | // Copied from package:io | 
 | Future<void> copyPath(String from, String to) async { | 
 |   await Directory(to).create(recursive: true); | 
 |   await for (final file in Directory(from).list(recursive: true)) { | 
 |     final copyTo = p.join(to, p.relative(file.path, from: from)); | 
 |     if (file is Directory) { | 
 |       await Directory(copyTo).create(recursive: true); | 
 |     } else if (file is File) { | 
 |       await File(file.path).copy(copyTo); | 
 |     } else if (file is Link) { | 
 |       await Link(copyTo).create(await file.target(), recursive: true); | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | Future<void> main() async { | 
 |   ensureRunFromSdkBinDart(); | 
 |  | 
 |   final exePath = Platform.resolvedExecutable; | 
 |   final sdkDir = p.dirname(p.dirname(exePath)); | 
 |   // Try to run the VM located on a path with % encoded characters. The VM | 
 |   // should not try and resolve the path as a URI for SDK artifacts (e.g., | 
 |   // dartdev.dart.snapshot). | 
 |   final d = Directory.systemTemp.createTempSync('dart_symlink%3A'); | 
 |   try { | 
 |     await copyPath(sdkDir, d.path); | 
 |     final path = '${d.path}/bin/dart'; | 
 |     final result = await Process.run(path, ['help']); | 
 |     Expect.equals(result.exitCode, 0); | 
 |   } finally { | 
 |     await d.delete(recursive: true); | 
 |   } | 
 | } |