| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:convert'; | 6 import 'dart:convert'; |
| 7 import 'dart:io'; | 7 import 'dart:io'; |
| 8 | 8 |
| 9 import 'package:bazel_worker/bazel_worker.dart'; | 9 import 'package:bazel_worker/bazel_worker.dart'; |
| 10 // TODO(jakemac): Remove once this is a part of the testing library. | 10 // TODO(jakemac): Remove once this is a part of the testing library. |
| 11 import 'package:bazel_worker/src/async_message_grouper.dart'; | 11 import 'package:bazel_worker/src/async_message_grouper.dart'; |
| 12 import 'package:bazel_worker/testing.dart'; | 12 import 'package:bazel_worker/testing.dart'; |
| 13 import 'package:path/path.dart' show join, joinAll, toUri; |
| 13 import 'package:test/test.dart'; | 14 import 'package:test/test.dart'; |
| 14 | 15 |
| 16 File file(String path) => new File(joinAll(path.split('/'))).absolute; |
| 17 |
| 15 main() { | 18 main() { |
| 19 var dartdevc = join('bin', 'dartdevc.dart'); |
| 16 group('Hello World', () { | 20 group('Hello World', () { |
| 17 final argsFile = new File('test/worker/hello_world.args').absolute; | 21 final argsFile = file('test/worker/hello_world.args'); |
| 18 final inputDartFile = new File('test/worker/hello_world.dart').absolute; | 22 final inputDartFile = file('test/worker/hello_world.dart'); |
| 19 final outputJsFile = new File('test/worker/out/hello_world.js').absolute; | 23 final outputJsFile = file('test/worker/out/hello_world.js'); |
| 20 final dartSdkSummary = new File('lib/sdk/ddc_sdk.sum').absolute; | 24 final dartSdkSummary = file('lib/sdk/ddc_sdk.sum'); |
| 21 final executableArgs = ['bin/dartdevc.dart']; | 25 final executableArgs = [dartdevc]; |
| 22 final compilerArgs = [ | 26 final compilerArgs = [ |
| 23 '--no-source-map', | 27 '--no-source-map', |
| 24 '--no-summarize', | 28 '--no-summarize', |
| 25 '--dart-sdk-summary', | 29 '--dart-sdk-summary', |
| 26 dartSdkSummary.path, | 30 dartSdkSummary.path, |
| 27 '-o', | 31 '-o', |
| 28 outputJsFile.path, | 32 outputJsFile.path, |
| 29 inputDartFile.path, | 33 inputDartFile.path, |
| 30 ]; | 34 ]; |
| 31 | 35 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 stderr.addStream(process.stderr); | 122 stderr.addStream(process.stderr); |
| 119 var futureProcessOutput = process.stdout.map(UTF8.decode).toList(); | 123 var futureProcessOutput = process.stdout.map(UTF8.decode).toList(); |
| 120 | 124 |
| 121 expect(await process.exitCode, EXIT_CODE_OK); | 125 expect(await process.exitCode, EXIT_CODE_OK); |
| 122 expect((await futureProcessOutput).join(), isEmpty); | 126 expect((await futureProcessOutput).join(), isEmpty); |
| 123 expect(outputJsFile.existsSync(), isTrue); | 127 expect(outputJsFile.existsSync(), isTrue); |
| 124 }); | 128 }); |
| 125 }); | 129 }); |
| 126 | 130 |
| 127 group('Hello World with Summaries', () { | 131 group('Hello World with Summaries', () { |
| 128 final greetingDart = new File('test/worker/greeting.dart').absolute; | 132 final greetingDart = file('test/worker/greeting.dart'); |
| 129 final helloDart = new File('test/worker/hello.dart').absolute; | 133 final helloDart = file('test/worker/hello.dart'); |
| 130 | 134 |
| 131 final greetingJS = new File('test/worker/greeting.js').absolute; | 135 final greetingJS = file('test/worker/greeting.js'); |
| 132 final greetingSummary = new File('test/worker/greeting.api.ds').absolute; | 136 final greetingSummary = file('test/worker/greeting.api.ds'); |
| 133 final helloJS = new File('test/worker/hello_world.js').absolute; | 137 final helloJS = file('test/worker/hello_world.js'); |
| 134 | 138 |
| 135 final greeting2JS = new File('test/worker/greeting2.js').absolute; | 139 final greeting2JS = file('test/worker/greeting2.js'); |
| 136 final greeting2Summary = new File('test/worker/greeting2.api.ds').absolute; | 140 final greeting2Summary = file('test/worker/greeting2.api.ds'); |
| 137 | 141 |
| 138 setUp(() { | 142 setUp(() { |
| 139 greetingDart.writeAsStringSync('String greeting = "hello";'); | 143 greetingDart.writeAsStringSync('String greeting = "hello";'); |
| 140 helloDart.writeAsStringSync('import "greeting.dart";' | 144 helloDart.writeAsStringSync('import "greeting.dart";' |
| 141 'main() => print(greeting);'); | 145 'main() => print(greeting);'); |
| 142 }); | 146 }); |
| 143 | 147 |
| 144 tearDown(() { | 148 tearDown(() { |
| 145 if (greetingDart.existsSync()) greetingDart.deleteSync(); | 149 if (greetingDart.existsSync()) greetingDart.deleteSync(); |
| 146 if (helloDart.existsSync()) helloDart.deleteSync(); | 150 if (helloDart.existsSync()) helloDart.deleteSync(); |
| 147 if (greetingJS.existsSync()) greetingJS.deleteSync(); | 151 if (greetingJS.existsSync()) greetingJS.deleteSync(); |
| 148 if (greetingSummary.existsSync()) greetingSummary.deleteSync(); | 152 if (greetingSummary.existsSync()) greetingSummary.deleteSync(); |
| 149 if (greeting2JS.existsSync()) greeting2JS.deleteSync(); | 153 if (greeting2JS.existsSync()) greeting2JS.deleteSync(); |
| 150 if (greeting2Summary.existsSync()) greeting2Summary.deleteSync(); | 154 if (greeting2Summary.existsSync()) greeting2Summary.deleteSync(); |
| 151 if (helloJS.existsSync()) helloJS.deleteSync(); | 155 if (helloJS.existsSync()) helloJS.deleteSync(); |
| 152 }); | 156 }); |
| 153 | 157 |
| 154 test('can compile in basic mode', () { | 158 test('can compile in basic mode', () { |
| 155 final dartSdkSummary = new File('lib/sdk/ddc_sdk.sum').absolute; | 159 final dartSdkSummary = file('lib/sdk/ddc_sdk.sum'); |
| 156 var result = Process.runSync(Platform.executable, [ | 160 var result = Process.runSync(Platform.executable, [ |
| 157 'bin/dartdevc.dart', | 161 dartdevc, |
| 158 '--summary-extension=api.ds', | 162 '--summary-extension=api.ds', |
| 159 '--no-source-map', | 163 '--no-source-map', |
| 160 '--dart-sdk-summary', | 164 '--dart-sdk-summary', |
| 161 dartSdkSummary.path, | 165 dartSdkSummary.path, |
| 162 '-o', | 166 '-o', |
| 163 greetingJS.path, | 167 greetingJS.path, |
| 164 greetingDart.path, | 168 greetingDart.path, |
| 165 ]); | 169 ]); |
| 166 expect(result.exitCode, EXIT_CODE_OK); | 170 expect(result.exitCode, EXIT_CODE_OK); |
| 167 expect(result.stdout, isEmpty); | 171 expect(result.stdout, isEmpty); |
| 168 expect(result.stderr, isEmpty); | 172 expect(result.stderr, isEmpty); |
| 169 expect(greetingJS.existsSync(), isTrue); | 173 expect(greetingJS.existsSync(), isTrue); |
| 170 expect(greetingSummary.existsSync(), isTrue); | 174 expect(greetingSummary.existsSync(), isTrue); |
| 171 | 175 |
| 172 result = Process.runSync(Platform.executable, [ | 176 result = Process.runSync(Platform.executable, [ |
| 173 'bin/dartdevc.dart', | 177 dartdevc, |
| 174 '--no-source-map', | 178 '--no-source-map', |
| 175 '--no-summarize', | 179 '--no-summarize', |
| 176 '--dart-sdk-summary', | 180 '--dart-sdk-summary', |
| 177 dartSdkSummary.path, | 181 dartSdkSummary.path, |
| 178 '--summary-extension=api.ds', | 182 '--summary-extension=api.ds', |
| 179 '-s', | 183 '-s', |
| 180 greetingSummary.path, | 184 greetingSummary.path, |
| 181 '-o', | 185 '-o', |
| 182 helloJS.path, | 186 helloJS.path, |
| 183 helloDart.path, | 187 helloDart.path, |
| 184 ]); | 188 ]); |
| 185 expect(result.exitCode, EXIT_CODE_OK); | 189 expect(result.exitCode, EXIT_CODE_OK); |
| 186 expect(result.stdout, isEmpty); | 190 expect(result.stdout, isEmpty); |
| 187 expect(result.stderr, isEmpty); | 191 expect(result.stderr, isEmpty); |
| 188 expect(helloJS.existsSync(), isTrue); | 192 expect(helloJS.existsSync(), isTrue); |
| 189 }); | 193 }); |
| 190 | 194 |
| 191 test('reports error on overlapping summaries', () { | 195 test('reports error on overlapping summaries', () { |
| 192 final dartSdkSummary = new File('lib/sdk/ddc_sdk.sum').absolute; | 196 final dartSdkSummary = file('lib/sdk/ddc_sdk.sum'); |
| 193 var result = Process.runSync(Platform.executable, [ | 197 var result = Process.runSync(Platform.executable, [ |
| 194 'bin/dartdevc.dart', | 198 dartdevc, |
| 195 '--summary-extension=api.ds', | 199 '--summary-extension=api.ds', |
| 196 '--no-source-map', | 200 '--no-source-map', |
| 197 '--dart-sdk-summary', | 201 '--dart-sdk-summary', |
| 198 dartSdkSummary.path, | 202 dartSdkSummary.path, |
| 199 '-o', | 203 '-o', |
| 200 greetingJS.path, | 204 greetingJS.path, |
| 201 greetingDart.path, | 205 greetingDart.path, |
| 202 ]); | 206 ]); |
| 203 expect(result.exitCode, EXIT_CODE_OK); | 207 expect(result.exitCode, EXIT_CODE_OK); |
| 204 expect(result.stdout, isEmpty); | 208 expect(result.stdout, isEmpty); |
| 205 expect(result.stderr, isEmpty); | 209 expect(result.stderr, isEmpty); |
| 206 expect(greetingJS.existsSync(), isTrue); | 210 expect(greetingJS.existsSync(), isTrue); |
| 207 expect(greetingSummary.existsSync(), isTrue); | 211 expect(greetingSummary.existsSync(), isTrue); |
| 208 | 212 |
| 209 result = Process.runSync(Platform.executable, [ | 213 result = Process.runSync(Platform.executable, [ |
| 210 'bin/dartdevc.dart', | 214 dartdevc, |
| 211 '--summary-extension=api.ds', | 215 '--summary-extension=api.ds', |
| 212 '--no-source-map', | 216 '--no-source-map', |
| 213 '--dart-sdk-summary', | 217 '--dart-sdk-summary', |
| 214 dartSdkSummary.path, | 218 dartSdkSummary.path, |
| 215 '-o', | 219 '-o', |
| 216 greeting2JS.path, | 220 greeting2JS.path, |
| 217 greetingDart.path, | 221 greetingDart.path, |
| 218 ]); | 222 ]); |
| 219 expect(result.exitCode, EXIT_CODE_OK); | 223 expect(result.exitCode, EXIT_CODE_OK); |
| 220 expect(result.stdout, isEmpty); | 224 expect(result.stdout, isEmpty); |
| 221 expect(result.stderr, isEmpty); | 225 expect(result.stderr, isEmpty); |
| 222 expect(greeting2JS.existsSync(), isTrue); | 226 expect(greeting2JS.existsSync(), isTrue); |
| 223 expect(greeting2Summary.existsSync(), isTrue); | 227 expect(greeting2Summary.existsSync(), isTrue); |
| 224 | 228 |
| 225 result = Process.runSync(Platform.executable, [ | 229 result = Process.runSync(Platform.executable, [ |
| 226 'bin/dartdevc.dart', | 230 dartdevc, |
| 227 '--no-source-map', | 231 '--no-source-map', |
| 228 '--no-summarize', | 232 '--no-summarize', |
| 229 '--dart-sdk-summary', | 233 '--dart-sdk-summary', |
| 230 dartSdkSummary.path, | 234 dartSdkSummary.path, |
| 231 '--summary-extension=api.ds', | 235 '--summary-extension=api.ds', |
| 232 '-s', | 236 '-s', |
| 233 greetingSummary.path, | 237 greetingSummary.path, |
| 234 '-s', | 238 '-s', |
| 235 greeting2Summary.path, | 239 greeting2Summary.path, |
| 236 '-o', | 240 '-o', |
| 237 helloJS.path, | 241 helloJS.path, |
| 238 helloDart.path, | 242 helloDart.path, |
| 239 ]); | 243 ]); |
| 240 expect(result.exitCode, 65); | 244 expect(result.exitCode, 65); |
| 241 expect(result.stdout, contains("conflict")); | 245 expect(result.stdout, contains("conflict")); |
| 242 expect(result.stdout, contains(greetingDart.path)); | 246 expect(result.stdout, contains('${toUri(greetingDart.path)}')); |
| 243 expect(helloJS.existsSync(), isFalse); | 247 expect(helloJS.existsSync(), isFalse); |
| 244 }); | 248 }); |
| 245 }); | 249 }); |
| 246 | 250 |
| 247 group('Error handling', () { | 251 group('Error handling', () { |
| 248 final dartSdkSummary = new File('lib/sdk/ddc_sdk.sum').absolute; | 252 final dartSdkSummary = file('lib/sdk/ddc_sdk.sum'); |
| 249 final badFileDart = new File('test/worker/bad.dart').absolute; | 253 final badFileDart = file('test/worker/bad.dart'); |
| 250 final badFileJs = new File('test/worker/bad.js').absolute; | 254 final badFileJs = file('test/worker/bad.js'); |
| 251 | 255 |
| 252 tearDown(() { | 256 tearDown(() { |
| 253 if (badFileDart.existsSync()) badFileDart.deleteSync(); | 257 if (badFileDart.existsSync()) badFileDart.deleteSync(); |
| 254 if (badFileJs.existsSync()) badFileJs.deleteSync(); | 258 if (badFileJs.existsSync()) badFileJs.deleteSync(); |
| 255 }); | 259 }); |
| 256 | 260 |
| 257 test('incorrect usage', () { | 261 test('incorrect usage', () { |
| 258 var result = Process.runSync(Platform.executable, [ | 262 var result = Process.runSync(Platform.executable, [ |
| 259 'bin/dartdevc.dart', | 263 dartdevc, |
| 260 '--dart-sdk-summary', | 264 '--dart-sdk-summary', |
| 261 dartSdkSummary.path, | 265 dartSdkSummary.path, |
| 262 'oops', | 266 'oops', |
| 263 ]); | 267 ]); |
| 264 expect(result.exitCode, 64); | 268 expect(result.exitCode, 64); |
| 265 expect( | 269 expect( |
| 266 result.stdout, contains('Please include the output file location.')); | 270 result.stdout, contains('Please include the output file location.')); |
| 267 expect(result.stdout, isNot(contains('#0'))); | 271 expect(result.stdout, isNot(contains('#0'))); |
| 268 }); | 272 }); |
| 269 | 273 |
| 270 test('compile errors', () { | 274 test('compile errors', () { |
| 271 badFileDart.writeAsStringSync('main() => "hello world"'); | 275 badFileDart.writeAsStringSync('main() => "hello world"'); |
| 272 var result = Process.runSync(Platform.executable, [ | 276 var result = Process.runSync(Platform.executable, [ |
| 273 'bin/dartdevc.dart', | 277 dartdevc, |
| 274 '--no-source-map', | 278 '--no-source-map', |
| 275 '--dart-sdk-summary', | 279 '--dart-sdk-summary', |
| 276 dartSdkSummary.path, | 280 dartSdkSummary.path, |
| 277 '-o', | 281 '-o', |
| 278 badFileJs.path, | 282 badFileJs.path, |
| 279 badFileDart.path, | 283 badFileDart.path, |
| 280 ]); | 284 ]); |
| 281 expect(result.exitCode, 1); | 285 expect(result.exitCode, 1); |
| 282 expect(result.stdout, contains("[error] Expected to find ';'")); | 286 expect(result.stdout, contains("[error] Expected to find ';'")); |
| 283 }); | 287 }); |
| 284 }); | 288 }); |
| 285 | 289 |
| 286 group('Parts', () { | 290 group('Parts', () { |
| 287 final dartSdkSummary = new File('lib/sdk/ddc_sdk.sum').absolute; | 291 final dartSdkSummary = file('lib/sdk/ddc_sdk.sum'); |
| 288 final partFile = new File('test/worker/greeting.dart').absolute; | 292 final partFile = file('test/worker/greeting.dart'); |
| 289 final libraryFile = new File('test/worker/hello.dart').absolute; | 293 final libraryFile = file('test/worker/hello.dart'); |
| 290 | 294 |
| 291 final outJS = new File('test/worker/output.js').absolute; | 295 final outJS = file('test/worker/output.js'); |
| 292 | 296 |
| 293 setUp(() { | 297 setUp(() { |
| 294 partFile.writeAsStringSync('part of hello;\n' | 298 partFile.writeAsStringSync('part of hello;\n' |
| 295 'String greeting = "hello";'); | 299 'String greeting = "hello";'); |
| 296 libraryFile.writeAsStringSync('library hello;\n' | 300 libraryFile.writeAsStringSync('library hello;\n' |
| 297 'part "greeting.dart";\n' | 301 'part "greeting.dart";\n' |
| 298 'main() => print(greeting);\n'); | 302 'main() => print(greeting);\n'); |
| 299 }); | 303 }); |
| 300 | 304 |
| 301 tearDown(() { | 305 tearDown(() { |
| 302 if (partFile.existsSync()) partFile.deleteSync(); | 306 if (partFile.existsSync()) partFile.deleteSync(); |
| 303 if (libraryFile.existsSync()) libraryFile.deleteSync(); | 307 if (libraryFile.existsSync()) libraryFile.deleteSync(); |
| 304 if (outJS.existsSync()) outJS.deleteSync(); | 308 if (outJS.existsSync()) outJS.deleteSync(); |
| 305 }); | 309 }); |
| 306 | 310 |
| 307 test('works if part and library supplied', () { | 311 test('works if part and library supplied', () { |
| 308 var result = Process.runSync(Platform.executable, [ | 312 var result = Process.runSync(Platform.executable, [ |
| 309 'bin/dartdevc.dart', | 313 dartdevc, |
| 310 '--no-summarize', | 314 '--no-summarize', |
| 311 '--no-source-map', | 315 '--no-source-map', |
| 312 '--dart-sdk-summary', | 316 '--dart-sdk-summary', |
| 313 dartSdkSummary.path, | 317 dartSdkSummary.path, |
| 314 '-o', | 318 '-o', |
| 315 outJS.path, | 319 outJS.path, |
| 316 partFile.path, | 320 partFile.path, |
| 317 libraryFile.path, | 321 libraryFile.path, |
| 318 ]); | 322 ]); |
| 319 expect(result.stdout, isEmpty); | 323 expect(result.stdout, isEmpty); |
| 320 expect(result.stderr, isEmpty); | 324 expect(result.stderr, isEmpty); |
| 321 expect(result.exitCode, 0); | 325 expect(result.exitCode, 0); |
| 322 expect(outJS.existsSync(), isTrue); | 326 expect(outJS.existsSync(), isTrue); |
| 323 }); | 327 }); |
| 324 | 328 |
| 325 test('works if part is not supplied', () { | 329 test('works if part is not supplied', () { |
| 326 var result = Process.runSync(Platform.executable, [ | 330 var result = Process.runSync(Platform.executable, [ |
| 327 'bin/dartdevc.dart', | 331 dartdevc, |
| 328 '--no-summarize', | 332 '--no-summarize', |
| 329 '--no-source-map', | 333 '--no-source-map', |
| 330 '--dart-sdk-summary', | 334 '--dart-sdk-summary', |
| 331 dartSdkSummary.path, | 335 dartSdkSummary.path, |
| 332 '-o', | 336 '-o', |
| 333 outJS.path, | 337 outJS.path, |
| 334 libraryFile.path, | 338 libraryFile.path, |
| 335 ]); | 339 ]); |
| 336 expect(result.stdout, isEmpty); | 340 expect(result.stdout, isEmpty); |
| 337 expect(result.stderr, isEmpty); | 341 expect(result.stderr, isEmpty); |
| 338 expect(result.exitCode, 0); | 342 expect(result.exitCode, 0); |
| 339 expect(outJS.existsSync(), isTrue); | 343 expect(outJS.existsSync(), isTrue); |
| 340 }); | 344 }); |
| 341 | 345 |
| 342 test('part without library is silently ignored', () { | 346 test('part without library is silently ignored', () { |
| 343 var result = Process.runSync(Platform.executable, [ | 347 var result = Process.runSync(Platform.executable, [ |
| 344 'bin/dartdevc.dart', | 348 dartdevc, |
| 345 '--no-summarize', | 349 '--no-summarize', |
| 346 '--no-source-map', | 350 '--no-source-map', |
| 347 '--dart-sdk-summary', | 351 '--dart-sdk-summary', |
| 348 dartSdkSummary.path, | 352 dartSdkSummary.path, |
| 349 '-o', | 353 '-o', |
| 350 outJS.path, | 354 outJS.path, |
| 351 partFile.path, | 355 partFile.path, |
| 352 ]); | 356 ]); |
| 353 expect(result.stdout, isEmpty); | 357 expect(result.stdout, isEmpty); |
| 354 expect(result.stderr, isEmpty); | 358 expect(result.stderr, isEmpty); |
| 355 expect(result.exitCode, 0); | 359 expect(result.exitCode, 0); |
| 356 expect(outJS.existsSync(), isTrue); | 360 expect(outJS.existsSync(), isTrue); |
| 357 }); | 361 }); |
| 358 }); | 362 }); |
| 359 } | 363 } |
| 360 | 364 |
| 361 Future<WorkResponse> _readResponse(MessageGrouper messageGrouper) async { | 365 Future<WorkResponse> _readResponse(MessageGrouper messageGrouper) async { |
| 362 var buffer = (await messageGrouper.next) as List<int>; | 366 var buffer = (await messageGrouper.next) as List<int>; |
| 363 try { | 367 try { |
| 364 return new WorkResponse.fromBuffer(buffer); | 368 return new WorkResponse.fromBuffer(buffer); |
| 365 } catch (_) { | 369 } catch (_) { |
| 366 var bufferAsString = | 370 var bufferAsString = |
| 367 buffer == null ? '' : 'String: ${UTF8.decode(buffer)}\n'; | 371 buffer == null ? '' : 'String: ${UTF8.decode(buffer)}\n'; |
| 368 throw 'Failed to parse response:\nbytes: $buffer\n$bufferAsString'; | 372 throw 'Failed to parse response:\nbytes: $buffer\n$bufferAsString'; |
| 369 } | 373 } |
| 370 } | 374 } |
| OLD | NEW |