[tool] make testUsingContext provide a Stdio (with hasTerminal unset) override by default (#151357)

While exploring https://github.com/flutter/flutter/issues/107607, I noticed that flutter_tools test results change based on whether `dart test` is run from a terminal or from a process (such as a Dart program). I also ran into this while writing tests for https://github.com/flutter/flutter/pull/150667.

This is due to tests that rely on the global `Stdio` instance, on which the `hasTerminal` property depends on whether the tool is being invoked from a terminal.

Ideally, `testUsingContext` would require any tests that depend on `globals.stdio` to define an override for `Stdio`, but this is not the case. Until a solution to this more general problem is figured out, I think we should have `testUsingContext` always provide a `Stdio` override by default.
This commit is contained in:
Andrew Kolos 2024-07-08 16:47:31 -07:00 committed by GitHub
parent f194cd3298
commit c206a47505
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 7 additions and 19 deletions

View File

@ -469,7 +469,7 @@ void main() {
Usage: () => usage,
});
testUsingContext('passes device target platform to usage', () async {
testUsingContext('passes device target platform to analytics', () async {
final RunCommand command = RunCommand();
final FakeDevice mockDevice = FakeDevice(sdkNameAndVersion: 'iOS 13')
..startAppSuccess = false;
@ -485,14 +485,6 @@ void main() {
'--no-hot',
]), isNull);
expect(usage.commands, contains(
TestUsageCommand('run', parameters: CustomDimensions.fromMap(<String, String>{
'cd3': 'false', 'cd4': 'ios', 'cd22': 'iOS 13',
'cd23': 'debug', 'cd18': 'false', 'cd15': 'swift', 'cd31': 'true',
'cd57': 'usb',
'cd58': 'false',
})
)));
expect(
fakeAnalytics.sentEvents,
contains(
@ -522,7 +514,7 @@ void main() {
analytics.Analytics: () => fakeAnalytics,
});
testUsingContext('correctly reports tests to usage', () async {
testUsingContext('correctly reports tests to analytics', () async {
fs.currentDirectory.childDirectory('test').childFile('widget_test.dart').createSync(recursive: true);
fs.currentDirectory.childDirectory('ios').childFile('AppDelegate.swift').createSync(recursive: true);
final RunCommand command = RunCommand();
@ -538,14 +530,6 @@ void main() {
'test/widget_test.dart',
]), isNull);
expect(usage.commands, contains(
TestUsageCommand('run', parameters: CustomDimensions.fromMap(<String, String>{
'cd3': 'false', 'cd4': 'ios', 'cd22': 'iOS 13',
'cd23': 'debug', 'cd18': 'false', 'cd15': 'swift', 'cd31': 'true',
'cd57': 'usb',
'cd58': 'true',
})),
));
expect(
fakeAnalytics.sentEvents,
contains(

View File

@ -126,6 +126,7 @@ void testUsingContext(
TemplateRenderer: () => const MustacheTemplateRenderer(),
BuildTargets: () => const BuildTargetsImpl(),
Analytics: () => const NoOpAnalytics(),
Stdio: () => FakeStdio(),
},
body: () {
// To catch all errors thrown by the test, even uncaught async errors, we use a zone.

View File

@ -254,7 +254,7 @@ class FakeStdio extends Stdio {
}
@override
bool hasTerminal = true;
bool hasTerminal = false;
List<String> get writtenToStdout => _stdout.writes.map<String>(_stdout.encoding.decode).toList();
List<String> get writtenToStderr => _stderr.writes.map<String>(_stderr.encoding.decode).toList();
@ -281,6 +281,9 @@ class FakeStdin extends Fake implements Stdin {
@override
bool lineMode = true;
@override
bool hasTerminal = false;
@override
Stream<S> transform<S>(StreamTransformer<List<int>, S> transformer) {
return controller.stream.transform(transformer);