| OLD | NEW |
| 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dartino 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
| 4 | 4 |
| 5 /// Test suite for running tests in a shared Dart VM. Take a look at | 5 /// Test suite for running tests in a shared Dart VM. Take a look at |
| 6 /// ../../../tests/dartino_tests/all_tests.dart for more information. | 6 /// ../../../tests/dartino_tests/all_tests.dart for more information. |
| 7 library test.dartino_test_suite; | 7 library test.dartino_test_suite; |
| 8 | 8 |
| 9 import 'dart:io' as io; | 9 import 'dart:io' as io; |
| 10 | 10 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 100 |
| 101 // Define a path for temporary output generated during tests. | 101 // Define a path for temporary output generated during tests. |
| 102 String tempDirPath = '$buildDir/temporary_test_output'; | 102 String tempDirPath = '$buildDir/temporary_test_output'; |
| 103 io.Directory tempDir = new io.Directory(tempDirPath); | 103 io.Directory tempDir = new io.Directory(tempDirPath); |
| 104 try { | 104 try { |
| 105 tempDir.deleteSync(recursive: true); | 105 tempDir.deleteSync(recursive: true); |
| 106 } on io.FileSystemException catch (e) { | 106 } on io.FileSystemException catch (e) { |
| 107 // Ignored, we assume the file did not exist. | 107 // Ignored, we assume the file did not exist. |
| 108 } | 108 } |
| 109 | 109 |
| 110 String javaHome = _guessJavaHome(configuration["arch"]); | |
| 111 if (javaHome == null) { | |
| 112 String arch = configuration["arch"]; | |
| 113 print("Notice: Java tests are disabled"); | |
| 114 print("Unable to find a JDK installation for architecture $arch"); | |
| 115 print("Install a JDK or set JAVA_PATH to an existing installation."); | |
| 116 // TODO(zerny): Throw an error if no-java is not supplied. | |
| 117 } else { | |
| 118 print("Notice: Enabled Java tests using JDK at $javaHome"); | |
| 119 } | |
| 120 | |
| 121 bool helperProgramExited = false; | 110 bool helperProgramExited = false; |
| 122 io.Process vmProcess; | 111 io.Process vmProcess; |
| 123 ReadTestExpectationsInto( | 112 ReadTestExpectationsInto( |
| 124 expectations, '$testSuiteDir/dartino_tests.status', | 113 expectations, '$testSuiteDir/dartino_tests.status', |
| 125 configuration).then((_) { | 114 configuration).then((_) { |
| 126 return new io.File('$buildDir/gen/version.cc').readAsLines(); | 115 return new io.File('$buildDir/gen/version.cc').readAsLines(); |
| 127 }).then((List<String> versionFileLines) { | 116 }).then((List<String> versionFileLines) { |
| 128 // Search for the 'return "version_string";' line. | 117 // Search for the 'return "version_string";' line. |
| 129 for (String line in versionFileLines) { | 118 for (String line in versionFileLines) { |
| 130 if (line.contains('return')) { | 119 if (line.contains('return')) { |
| 131 version = line.substring( | 120 version = line.substring( |
| 132 line.indexOf('"') + 1, line.lastIndexOf('"')); | 121 line.indexOf('"') + 1, line.lastIndexOf('"')); |
| 133 } | 122 } |
| 134 } | 123 } |
| 135 assert(version != null); | 124 assert(version != null); |
| 136 }).then((_) { | 125 }).then((_) { |
| 137 return io.ServerSocket.bind(io.InternetAddress.LOOPBACK_IP_V4, 0); | 126 return io.ServerSocket.bind(io.InternetAddress.LOOPBACK_IP_V4, 0); |
| 138 }).then((io.ServerSocket server) { | 127 }).then((io.ServerSocket server) { |
| 139 return io.Process.start( | 128 return io.Process.start( |
| 140 runtimeConfiguration.dartBinary, | 129 runtimeConfiguration.dartBinary, |
| 141 ['-Ddartino-vm=$buildDir/dartino-vm', | 130 ['-Ddartino-vm=$buildDir/dartino-vm', |
| 142 '-Ddartino.version=$version', | 131 '-Ddartino.version=$version', |
| 143 '-Ddart-sdk=third_party/dart/sdk/', | 132 '-Ddart-sdk=third_party/dart/sdk/', |
| 144 '-Dtests-dir=tests/', | 133 '-Dtests-dir=tests/', |
| 145 '-Djava-home=$javaHome', | |
| 146 '-Dtest.dart.build-dir=$buildDir', | 134 '-Dtest.dart.build-dir=$buildDir', |
| 147 '-Dtest.dart.build-arch=${configuration["arch"]}', | 135 '-Dtest.dart.build-arch=${configuration["arch"]}', |
| 148 '-Dtest.dart.build-system=${configuration["system"]}', | 136 '-Dtest.dart.build-system=${configuration["system"]}', |
| 149 '-Dtest.dart.build-clang=${configuration["clang"]}', | 137 '-Dtest.dart.build-clang=${configuration["clang"]}', |
| 150 '-Dtest.dart.build-asan=${configuration["asan"]}', | 138 '-Dtest.dart.build-asan=${configuration["asan"]}', |
| 151 '-Dtest.dart.analytics-disable=true', | 139 '-Dtest.dart.analytics-disable=true', |
| 152 '-Dtest.dart.temp-dir=$tempDirPath', | 140 '-Dtest.dart.temp-dir=$tempDirPath', |
| 153 '-Dtest.dart.servicec-dir=tools/servicec/', | |
| 154 '-c', | 141 '-c', |
| 155 '--packages=.packages', | 142 '--packages=.packages', |
| 156 '-Dtest.dartino_test_suite.port=${server.port}', | 143 '-Dtest.dartino_test_suite.port=${server.port}', |
| 157 '$testSuiteDir/dartino_test_suite.dart']).then((io.Process process) { | 144 '$testSuiteDir/dartino_test_suite.dart']).then((io.Process process) { |
| 158 process.exitCode.then((_) { | 145 process.exitCode.then((_) { |
| 159 helperProgramExited = true; | 146 helperProgramExited = true; |
| 160 server.close(); | 147 server.close(); |
| 161 }); | 148 }); |
| 162 vmProcess = process; | 149 vmProcess = process; |
| 163 return process.stdin.close(); | 150 return process.stdin.close(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 190 enqueueNewTestCase(testCase); | 177 enqueueNewTestCase(testCase); |
| 191 } | 178 } |
| 192 }).then((_) { | 179 }).then((_) { |
| 193 onDone(); | 180 onDone(); |
| 194 }); | 181 }); |
| 195 } | 182 } |
| 196 | 183 |
| 197 void cleanup() { | 184 void cleanup() { |
| 198 completer.allDone(); | 185 completer.allDone(); |
| 199 } | 186 } |
| 200 | |
| 201 String _guessJavaHome(String buildArchitecture) { | |
| 202 String arch = buildArchitecture == 'ia32' ? '32' : '64'; | |
| 203 | |
| 204 // Try to locate a valid installation based on JAVA_HOME. | |
| 205 String javaHome = | |
| 206 _guessJavaHomeArch(io.Platform.environment['JAVA_HOME'], arch); | |
| 207 if (javaHome != null) return javaHome; | |
| 208 | |
| 209 // Try to locate a valid installation using the java_home utility. | |
| 210 String javaHomeUtil = '/usr/libexec/java_home'; | |
| 211 if (new io.File(javaHomeUtil).existsSync()) { | |
| 212 List<String> args = <String>['-v', '1.6+', '-d', arch]; | |
| 213 io.ProcessResult result = | |
| 214 io.Process.runSync(javaHomeUtil, args); | |
| 215 if (result.exitCode == 0) { | |
| 216 String javaHome = result.stdout.trim(); | |
| 217 if (_isValidJDK(javaHome)) return javaHome; | |
| 218 } | |
| 219 } | |
| 220 | |
| 221 // Try to locate a valid installation using the path to javac. | |
| 222 io.ProcessResult result = | |
| 223 io.Process.runSync('command', ['-v', 'javac'], runInShell: true); | |
| 224 if (result.exitCode == 0) { | |
| 225 String javac = result.stdout.trim(); | |
| 226 while (io.FileSystemEntity.isLinkSync(javac)) { | |
| 227 javac = new io.Link(javac).resolveSymbolicLinksSync(); | |
| 228 } | |
| 229 // TODO(zerny): Take into account Mac javac paths can be of the form: | |
| 230 // .../Versions/X/Commands/javac | |
| 231 String javaHome = | |
| 232 _guessJavaHomeArch(javac.replaceAll('/bin/javac', ''), arch); | |
| 233 if (javaHome != null) return javaHome; | |
| 234 } | |
| 235 | |
| 236 return null; | |
| 237 } | |
| 238 | |
| 239 String _guessJavaHomeArch(String javaHome, String arch) { | |
| 240 if (javaHome == null) return null; | |
| 241 | |
| 242 // Check if the java installation supports the requested architecture. | |
| 243 if (new io.File('$javaHome/bin/java').existsSync()) { | |
| 244 int supportsVersion = io.Process.runSync( | |
| 245 '$javaHome/bin/java', ['-d$arch', '-version']).exitCode; | |
| 246 if (supportsVersion == 0 && _isValidJDK(javaHome)) return javaHome; | |
| 247 } | |
| 248 | |
| 249 // Check for architecture specific installation by post-fixing arch. | |
| 250 String archPostfix = '${javaHome}-$arch'; | |
| 251 if (_isValidJDK(archPostfix)) return archPostfix; | |
| 252 | |
| 253 // Check for architecture specific installation by replacing amd64 and i386. | |
| 254 String archReplace; | |
| 255 if (arch == '32' && javaHome.contains('amd64')) { | |
| 256 archReplace = javaHome.replaceAll('amd64', 'i386'); | |
| 257 } else if (arch == '64' && javaHome.contains('i386')) { | |
| 258 archReplace = javaHome.replaceAll('i386', 'amd64'); | |
| 259 } | |
| 260 if (_isValidJDK(archReplace)) return archReplace; | |
| 261 | |
| 262 return null; | |
| 263 } | |
| 264 | |
| 265 bool _isValidJDK(String javaHome) { | |
| 266 if (javaHome == null) return false; | |
| 267 return new io.File('$javaHome/include/jni.h').existsSync(); | |
| 268 } | |
| 269 } | 187 } |
| 270 | 188 |
| 271 /// Pattern that matches warnings (from dart2js) that contain a comment saying | 189 /// Pattern that matches warnings (from dart2js) that contain a comment saying |
| 272 /// "NO_LINT". | 190 /// "NO_LINT". |
| 273 final RegExp noLintFilter = | 191 final RegExp noLintFilter = |
| 274 new RegExp(r"[^\n]*\n[^\n]*\n[^\n]* // NO_LINT\n *\^+\n"); | 192 new RegExp(r"[^\n]*\n[^\n]*\n[^\n]* // NO_LINT\n *\^+\n"); |
| 275 | 193 |
| 276 class DartinoTestOutputCommand implements CommandOutput { | 194 class DartinoTestOutputCommand implements CommandOutput { |
| 277 final Command command; | 195 final Command command; |
| 278 final Duration time; | 196 final Duration time; |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 process(messages); | 446 process(messages); |
| 529 } | 447 } |
| 530 }); | 448 }); |
| 531 } | 449 } |
| 532 | 450 |
| 533 void allDone() { | 451 void allDone() { |
| 534 // This should cause the vmProcess to exit. | 452 // This should cause the vmProcess to exit. |
| 535 socket.close(); | 453 socket.close(); |
| 536 } | 454 } |
| 537 } | 455 } |
| OLD | NEW |