| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.util.io; | 5 library test.util.io; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 import 'dart:mirrors'; | 10 import 'dart:mirrors'; |
| 11 | 11 |
| 12 import 'package:path/path.dart' as p; | 12 import 'package:path/path.dart' as p; |
| 13 import 'package:pub_semver/pub_semver.dart'; | 13 import 'package:pub_semver/pub_semver.dart'; |
| 14 | 14 |
| 15 import '../backend/operating_system.dart'; | 15 import '../backend/operating_system.dart'; |
| 16 import '../runner/application_exception.dart'; | 16 import '../runner/application_exception.dart'; |
| 17 import '../util/stream_queue.dart'; | 17 import '../util/stream_queue.dart'; |
| 18 import '../utils.dart'; | 18 import '../utils.dart'; |
| 19 | 19 |
| 20 /// The ASCII code for a newline character. | 20 /// The ASCII code for a newline character. |
| 21 const _newline = 0xA; | 21 const _newline = 0xA; |
| 22 | 22 |
| 23 /// The ASCII code for a carriage return character. | 23 /// The ASCII code for a carriage return character. |
| 24 const _carriageReturn = 0xD; | 24 const _carriageReturn = 0xD; |
| 25 | 25 |
| 26 /// The root directory of the Dart SDK. | 26 /// The root directory of the Dart SDK. |
| 27 final String sdkDir = (() { | 27 final String sdkDir = p.dirname(p.dirname(Platform.resolvedExecutable)); |
| 28 // TODO(kevmoo): work-around for accessing the SDK root dartbug.com/16994 | |
| 29 // | |
| 30 // Don't resolve symlinks on Windows because of issue 133. Once the TODO above | |
| 31 // is resolved, we won't have to do explicit symlink resolution anyway. | |
| 32 var path = Platform.isWindows | |
| 33 ? Platform.executable | |
| 34 : new File(Platform.executable).resolveSymbolicLinksSync(); | |
| 35 return p.dirname(p.dirname(path)); | |
| 36 })(); | |
| 37 | 28 |
| 38 /// The version of the Dart SDK currently in use. | 29 /// The version of the Dart SDK currently in use. |
| 39 final Version _sdkVersion = new Version.parse( | 30 final Version _sdkVersion = new Version.parse( |
| 40 new File(p.join(sdkDir, 'version')) | 31 new File(p.join(sdkDir, 'version')) |
| 41 .readAsStringSync().trim()); | 32 .readAsStringSync().trim()); |
| 42 | 33 |
| 43 /// Returns the current operating system. | 34 /// Returns the current operating system. |
| 44 final OperatingSystem currentOS = (() { | 35 final OperatingSystem currentOS = (() { |
| 45 var name = Platform.operatingSystem; | 36 var name = Platform.operatingSystem; |
| 46 var os = OperatingSystem.findByIoName(name); | 37 var os = OperatingSystem.findByIoName(name); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 61 final _tempDir = Platform.environment.containsKey("_UNITTEST_TEMP_DIR") | 52 final _tempDir = Platform.environment.containsKey("_UNITTEST_TEMP_DIR") |
| 62 ? Platform.environment["_UNITTEST_TEMP_DIR"] | 53 ? Platform.environment["_UNITTEST_TEMP_DIR"] |
| 63 : Directory.systemTemp.path; | 54 : Directory.systemTemp.path; |
| 64 | 55 |
| 65 /// The path to the `lib` directory of the `test` package. | 56 /// The path to the `lib` directory of the `test` package. |
| 66 String libDir({String packageRoot}) { | 57 String libDir({String packageRoot}) { |
| 67 var pathToIo = libraryPath(#test.util.io, packageRoot: packageRoot); | 58 var pathToIo = libraryPath(#test.util.io, packageRoot: packageRoot); |
| 68 return p.dirname(p.dirname(p.dirname(pathToIo))); | 59 return p.dirname(p.dirname(p.dirname(pathToIo))); |
| 69 } | 60 } |
| 70 | 61 |
| 71 /// Returns whether the current Dart version has a fix for issue 23084. | |
| 72 final bool supportsPubServe = ((){ | |
| 73 // This isn't 100% accurate, since issue 23084 wasn't fixed in early 1.10 dev | |
| 74 // releases, but it's unlikely anyone will be using them. | |
| 75 // TODO(nweiz): remove this when we no longer support older Dart versions. | |
| 76 return new VersionConstraint.parse('>=1.9.2 <2.0.0').allows(_sdkVersion); | |
| 77 })(); | |
| 78 | |
| 79 /// Returns whether the current Dart version supports running isolates in | |
| 80 /// checked mode. | |
| 81 final bool supportsIsolateCheckedMode = (() { | |
| 82 // TODO(nweiz): remove this when we no longer support older Dart versions. | |
| 83 return new VersionConstraint.parse('>=1.11.0-dev.5.0 <2.0.0') | |
| 84 .allows(_sdkVersion); | |
| 85 })(); | |
| 86 | |
| 87 // TODO(nweiz): Make this check [stdioType] once that works within "pub run". | 62 // TODO(nweiz): Make this check [stdioType] once that works within "pub run". |
| 88 /// Whether "special" strings such as Unicode characters or color escapes are | 63 /// Whether "special" strings such as Unicode characters or color escapes are |
| 89 /// safe to use. | 64 /// safe to use. |
| 90 /// | 65 /// |
| 91 /// On Windows or when not printing to a terminal, only printable ASCII | 66 /// On Windows or when not printing to a terminal, only printable ASCII |
| 92 /// characters should be used. | 67 /// characters should be used. |
| 93 bool get canUseSpecialChars => | 68 bool get canUseSpecialChars => |
| 94 Platform.operatingSystem != 'windows' && | 69 Platform.operatingSystem != 'windows' && |
| 95 Platform.environment["_UNITTEST_USE_COLOR"] != "false"; | 70 Platform.environment["_UNITTEST_USE_COLOR"] != "false"; |
| 96 | 71 |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 /// | 192 /// |
| 218 /// This has a built-in race condition: another process may bind this port at | 193 /// This has a built-in race condition: another process may bind this port at |
| 219 /// any time after this call has returned. If at all possible, callers should | 194 /// any time after this call has returned. If at all possible, callers should |
| 220 /// use [getUnusedPort] instead. | 195 /// use [getUnusedPort] instead. |
| 221 Future<int> getUnsafeUnusedPort() async { | 196 Future<int> getUnsafeUnusedPort() async { |
| 222 var socket = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0); | 197 var socket = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0); |
| 223 var port = socket.port; | 198 var port = socket.port; |
| 224 await socket.close(); | 199 await socket.close(); |
| 225 return port; | 200 return port; |
| 226 } | 201 } |
| OLD | NEW |