| // Copyright (c) 2018, 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:async'; | |
| import 'dart:io'; | |
| import 'package:path/path.dart' as p; | |
| import 'package:test/test.dart'; | |
| import 'package:test_descriptor/test_descriptor.dart' as d; | |
| import 'package:test_process/test_process.dart'; | |
| Future<ProcResult> tryPub(String content) async { | |
| await d.file('pubspec.yaml', content).create(); | |
| final proc = await TestProcess.start( | |
| Platform.resolvedExecutable, | |
| ['pub', 'get', '--offline'], | |
| workingDirectory: d.sandbox, | |
| // Don't pass current process VM options to child | |
| environment: Map.from(Platform.environment)..remove('DART_VM_OPTIONS'), | |
| ); | |
| final result = await ProcResult.fromTestProcess(proc); | |
| printOnFailure( | |
| [ | |
| '-----BEGIN pub output-----', | |
| result.toString().trim(), | |
| '-----END pub output-----', | |
| ].join('\n'), | |
| ); | |
| if (result.exitCode == 0) { | |
| final lockContent = File( | |
| p.join(d.sandbox, 'pubspec.lock'), | |
| ).readAsStringSync(); | |
| printOnFailure( | |
| [ | |
| '-----BEGIN pubspec.lock-----', | |
| lockContent.trim(), | |
| '-----END pubspec.lock-----', | |
| ].join('\n'), | |
| ); | |
| } | |
| return result; | |
| } | |
| class ProcResult { | |
| final int exitCode; | |
| final List<ProcLine> lines; | |
| bool get cleanParse => exitCode == 0 || exitCode == 66 || exitCode == 69; | |
| ProcResult(this.exitCode, this.lines); | |
| static Future<ProcResult> fromTestProcess(TestProcess proc) async { | |
| final items = <ProcLine>[]; | |
| final values = await Future.wait([ | |
| proc.exitCode, | |
| proc.stdoutStream().forEach((line) => items.add(ProcLine(false, line))), | |
| proc.stderrStream().forEach((line) => items.add(ProcLine(true, line))), | |
| ]); | |
| return ProcResult(values[0] as int, items); | |
| } | |
| @override | |
| String toString() { | |
| final buffer = StringBuffer('Exit code: $exitCode'); | |
| for (var line in lines) { | |
| buffer.write('\n$line'); | |
| } | |
| return buffer.toString(); | |
| } | |
| } | |
| class ProcLine { | |
| final bool isError; | |
| final String line; | |
| ProcLine(this.isError, this.line); | |
| @override | |
| String toString() => '${isError ? 'err' : 'out'} $line'; | |
| } |