blob: a60aa2a997ba86f8dc12c23b68132143e3b9d971 [file] [log] [blame]
// 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';
}