From 4f9528293f54037993a6b2eb8f1df5604a3da954 Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Fri, 15 Jul 2022 17:54:05 -0700 Subject: [PATCH] [flutter_tools] Remove shuffle from doctor test (#107744) --- packages/flutter_tools/lib/src/doctor.dart | 43 ++++++++++++++----- .../commands.shard/hermetic/doctor_test.dart | 42 ++++++++++++------ 2 files changed, 61 insertions(+), 24 deletions(-) diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index ef6c0a7797..314377ed22 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -44,31 +44,52 @@ import 'windows/visual_studio_validator.dart'; import 'windows/windows_workflow.dart'; abstract class DoctorValidatorsProvider { + // Allow tests to construct a [_DefaultDoctorValidatorsProvider] with explicit + // [FeatureFlags]. + factory DoctorValidatorsProvider.test({ + Platform? platform, + required FeatureFlags featureFlags, + }) { + return _DefaultDoctorValidatorsProvider( + featureFlags: featureFlags, + platform: platform ?? FakePlatform(), + ); + } /// The singleton instance, pulled from the [AppContext]. static DoctorValidatorsProvider get _instance => context.get()!; - static final DoctorValidatorsProvider defaultInstance = _DefaultDoctorValidatorsProvider(); + static final DoctorValidatorsProvider defaultInstance = _DefaultDoctorValidatorsProvider( + platform: globals.platform, + featureFlags: featureFlags, + ); List get validators; List get workflows; } class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider { + _DefaultDoctorValidatorsProvider({ + required this.platform, + required this.featureFlags, + }); + List? _validators; List? _workflows; + final Platform platform; + final FeatureFlags featureFlags; - final LinuxWorkflow linuxWorkflow = LinuxWorkflow( - platform: globals.platform, + late final LinuxWorkflow linuxWorkflow = LinuxWorkflow( + platform: platform, featureFlags: featureFlags, ); - final WebWorkflow webWorkflow = WebWorkflow( - platform: globals.platform, + late final WebWorkflow webWorkflow = WebWorkflow( + platform: platform, featureFlags: featureFlags, ); - final MacOSWorkflow macOSWorkflow = MacOSWorkflow( - platform: globals.platform, + late final MacOSWorkflow macOSWorkflow = MacOSWorkflow( + platform: platform, featureFlags: featureFlags, ); @@ -80,17 +101,17 @@ class _DefaultDoctorValidatorsProvider implements DoctorValidatorsProvider { final List ideValidators = [ if (androidWorkflow!.appliesToHostPlatform) - ...AndroidStudioValidator.allValidators(globals.config, globals.platform, globals.fs, globals.userMessages), + ...AndroidStudioValidator.allValidators(globals.config, platform, globals.fs, globals.userMessages), ...IntelliJValidator.installedValidators( fileSystem: globals.fs, - platform: globals.platform, + platform: platform, userMessages: userMessages, plistParser: globals.plistParser, processManager: globals.processManager, ), - ...VsCodeValidator.installedValidators(globals.fs, globals.platform, globals.processManager), + ...VsCodeValidator.installedValidators(globals.fs, platform, globals.processManager), ]; - final ProxyValidator proxyValidator = ProxyValidator(platform: globals.platform); + final ProxyValidator proxyValidator = ProxyValidator(platform: platform); _validators = [ FlutterValidator( fileSystem: globals.fs, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart index 33ee5d9891..6a8a9321da 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart @@ -2,12 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// TODO(gspencergoog): Remove this tag once this test's state leaks/test -// dependencies have been fixed. -// https://github.com/flutter/flutter/issues/85160 -// Fails with "flutter test --test-randomize-ordering-seed=20210723" -@Tags(['no-shuffle']) - import 'dart:async'; import 'package:args/command_runner.dart'; @@ -17,6 +11,7 @@ import 'package:flutter_tools/src/android/android_studio_validator.dart'; import 'package:flutter_tools/src/android/android_workflow.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/build_info.dart'; @@ -25,7 +20,6 @@ import 'package:flutter_tools/src/commands/doctor.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/doctor.dart'; import 'package:flutter_tools/src/doctor_validator.dart'; -import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/version.dart'; @@ -743,10 +737,15 @@ void main() { }); testUsingContext('WebWorkflow is a part of validator workflows if enabled', () async { - expect(DoctorValidatorsProvider.defaultInstance.workflows, - contains(isA())); + final List workflows = DoctorValidatorsProvider.test( + featureFlags: TestFeatureFlags(isWebEnabled: true), + platform: FakePlatform(), + ).workflows; + expect( + workflows, + contains(isA()), + ); }, overrides: { - FeatureFlags: () => TestFeatureFlags(isWebEnabled: true), FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => fakeProcessManager, }); @@ -769,13 +768,30 @@ void main() { }, initializeFlutterRoot: false); testUsingContext('If android workflow is disabled, AndroidStudio validator is not included', () { - expect(DoctorValidatorsProvider.defaultInstance.validators, isNot(contains(isA()))); - expect(DoctorValidatorsProvider.defaultInstance.validators, isNot(contains(isA()))); + final DoctorValidatorsProvider provider = DoctorValidatorsProvider.test( + featureFlags: TestFeatureFlags(isAndroidEnabled: false), + ); + expect(provider.validators, isNot(contains(isA()))); + expect(provider.validators, isNot(contains(isA()))); }, overrides: { - FeatureFlags: () => TestFeatureFlags(isAndroidEnabled: false), + AndroidWorkflow: () => FakeAndroidWorkflow(appliesToHostPlatform: false), }); } +class FakeAndroidWorkflow extends Fake implements AndroidWorkflow { + FakeAndroidWorkflow({ + this.canListDevices = true, + this.appliesToHostPlatform = true, + }); + + @override + final bool canListDevices; + + @override + final bool appliesToHostPlatform; +} + + class NoOpDoctor implements Doctor { @override bool get canLaunchAnything => true;