[flutter_tools] remove globals from device manager, flutter tester (#61139)

Remove global variables from device manager, flutter tester devices and update tests
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index 29381e9..bbb3e2b 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -4,7 +4,9 @@
 
 import 'package:meta/meta.dart';
 
+import 'base/config.dart';
 import 'base/context.dart';
+import 'base/file_system.dart';
 import 'base/logger.dart';
 import 'base/utils.dart';
 import 'build_system/targets/icon_tree_shaker.dart';
@@ -612,15 +614,20 @@
 }
 
 /// Returns the top-level build output directory.
-String getBuildDirectory() {
+String getBuildDirectory([Config config, FileSystem fileSystem]) {
   // TODO(johnmccutchan): Stop calling this function as part of setting
   // up command line argument processing.
-  if (context == null || globals.config == null) {
+  if (context == null) {
+    return 'build';
+  }
+  final Config localConfig = config ?? globals.config;
+  final FileSystem localFilesystem = fileSystem ?? globals.fs;
+  if (localConfig == null) {
     return 'build';
   }
 
-  final String buildDir = globals.config.getValue('build-dir') as String ?? 'build';
-  if (globals.fs.path.isAbsolute(buildDir)) {
+  final String buildDir = localConfig.getValue('build-dir') as String ?? 'build';
+  if (localFilesystem.path.isAbsolute(buildDir)) {
     throw Exception(
         'build-dir config setting in ${globals.config.configPath} must be relative');
   }
diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart
index 43a3748..53f355e 100644
--- a/packages/flutter_tools/lib/src/context_runner.dart
+++ b/packages/flutter_tools/lib/src/context_runner.dart
@@ -30,7 +30,7 @@
 import 'features.dart';
 import 'fuchsia/fuchsia_device.dart' show FuchsiaDeviceTools;
 import 'fuchsia/fuchsia_sdk.dart' show FuchsiaSdk, FuchsiaArtifacts;
-import 'fuchsia/fuchsia_workflow.dart' show FuchsiaWorkflow;
+import 'fuchsia/fuchsia_workflow.dart' show FuchsiaWorkflow, fuchsiaWorkflow;
 import 'globals.dart' as globals;
 import 'ios/ios_workflow.dart';
 import 'ios/simulators.dart';
@@ -124,7 +124,22 @@
         client: globals.httpClientFactory?.call() ?? HttpClient(),
       ),
       DevFSConfig: () => DevFSConfig(),
-      DeviceManager: () => FlutterDeviceManager(),
+      DeviceManager: () => FlutterDeviceManager(
+        logger: globals.logger,
+        processManager: globals.processManager,
+        platform: globals.platform,
+        androidSdk: globals.androidSdk,
+        iosSimulatorUtils: globals.iosSimulatorUtils,
+        featureFlags: featureFlags,
+        fileSystem: globals.fs,
+        iosWorkflow: globals.iosWorkflow,
+        artifacts: globals.artifacts,
+        flutterVersion: globals.flutterVersion,
+        androidWorkflow: androidWorkflow,
+        config: globals.config,
+        fuchsiaWorkflow: fuchsiaWorkflow,
+        xcDevice: globals.xcdevice,
+      ),
       Doctor: () => Doctor(logger: globals.logger),
       DoctorValidatorsProvider: () => DoctorValidatorsProvider.defaultInstance,
       EmulatorManager: () => EmulatorManager(
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 2b9912a..2e1d158 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -6,15 +6,20 @@
 import 'dart:math' as math;
 
 import 'package:meta/meta.dart';
+import 'package:process/process.dart';
 import 'package:vm_service/vm_service.dart' as vm_service;
 
 import 'android/android_device_discovery.dart';
+import 'android/android_sdk.dart';
 import 'android/android_workflow.dart';
 import 'application_package.dart';
 import 'artifacts.dart';
+import 'base/config.dart';
 import 'base/context.dart';
 import 'base/file_system.dart';
 import 'base/io.dart';
+import 'base/logger.dart';
+import 'base/platform.dart';
 import 'base/user_messages.dart';
 import 'base/utils.dart';
 import 'build_info.dart';
@@ -24,11 +29,14 @@
 import 'fuchsia/fuchsia_workflow.dart';
 import 'globals.dart' as globals;
 import 'ios/devices.dart';
+import 'ios/ios_workflow.dart';
 import 'ios/simulators.dart';
 import 'linux/linux_device.dart';
 import 'macos/macos_device.dart';
+import 'macos/xcode.dart';
 import 'project.dart';
 import 'tester/flutter_tester.dart';
+import 'version.dart';
 import 'web/web_device.dart';
 import 'windows/windows_device.dart';
 
@@ -269,42 +277,68 @@
 }
 
 class FlutterDeviceManager extends DeviceManager {
-  @override
-  final List<DeviceDiscovery> deviceDiscoverers = <DeviceDiscovery>[
+  FlutterDeviceManager({
+    @required Logger logger,
+    @required Platform platform,
+    @required ProcessManager processManager,
+    @required FileSystem fileSystem,
+    @required AndroidSdk androidSdk,
+    @required FeatureFlags featureFlags,
+    @required IOSSimulatorUtils iosSimulatorUtils,
+    @required XCDevice xcDevice,
+    @required AndroidWorkflow androidWorkflow,
+    @required IOSWorkflow iosWorkflow,
+    @required FuchsiaWorkflow fuchsiaWorkflow,
+    @required FlutterVersion flutterVersion,
+    @required Config config,
+    @required Artifacts artifacts,
+  }) : deviceDiscoverers =  <DeviceDiscovery>[
     AndroidDevices(
-      logger: globals.logger,
-      androidSdk: globals.androidSdk,
+      logger: logger,
+      androidSdk: androidSdk,
       androidWorkflow: androidWorkflow,
-      processManager: globals.processManager,
+      processManager: processManager,
     ),
     IOSDevices(
-      platform: globals.platform,
-      xcdevice: globals.xcdevice,
-      iosWorkflow: globals.iosWorkflow,
-      logger: globals.logger,
+      platform: platform,
+      xcdevice: xcDevice,
+      iosWorkflow: iosWorkflow,
+      logger: logger,
     ),
-    IOSSimulators(iosSimulatorUtils: globals.iosSimulatorUtils),
+    IOSSimulators(
+      iosSimulatorUtils: iosSimulatorUtils,
+    ),
     FuchsiaDevices(
       fuchsiaSdk: fuchsiaSdk,
-      logger: globals.logger,
+      logger: logger,
       fuchsiaWorkflow: fuchsiaWorkflow,
-      platform: globals.platform,
+      platform: platform,
     ),
-    FlutterTesterDevices(),
+    FlutterTesterDevices(
+      fileSystem: fileSystem,
+      flutterVersion: flutterVersion,
+      processManager: processManager,
+      config: config,
+      logger: logger,
+      artifacts: artifacts,
+    ),
     MacOSDevices(),
     LinuxDevices(
-      platform: globals.platform,
+      platform: platform,
       featureFlags: featureFlags,
     ),
     WindowsDevices(),
     WebDevices(
       featureFlags: featureFlags,
-      fileSystem: globals.fs,
-      platform: globals.platform,
-      processManager: globals.processManager,
-      logger: globals.logger,
+      fileSystem: fileSystem,
+      platform: platform,
+      processManager: processManager,
+      logger: logger,
     ),
   ];
+
+  @override
+  final List<DeviceDiscovery> deviceDiscoverers;
 }
 
 /// An abstract class to discover and enumerate a specific type of devices.
diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
index 2057c25..896f3e0 100644
--- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart
+++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
@@ -9,6 +9,7 @@
 
 import '../application_package.dart';
 import '../artifacts.dart';
+import '../base/config.dart';
 import '../base/file_system.dart';
 import '../base/io.dart';
 import '../base/logger.dart';
@@ -47,18 +48,18 @@
 // TODO(scheglov): This device does not currently work with full restarts.
 class FlutterTesterDevice extends Device {
   FlutterTesterDevice(String deviceId, {
-    @required ProcessManager processManager,
-    @required FlutterVersion flutterVersion,
-    @required Logger logger,
-    @required String buildDirectory,
-    @required FileSystem fileSystem,
-    @required Artifacts artifacts,
-  }) : _processManager = processManager,
-       _flutterVersion = flutterVersion,
-       _logger = logger,
-       _buildDirectory = buildDirectory,
-       _fileSystem = fileSystem,
-       _artifacts = artifacts,
+    ProcessManager processManager,
+    FlutterVersion flutterVersion,
+    Logger logger,
+    String buildDirectory,
+    FileSystem fileSystem,
+    Artifacts artifacts,
+  }) : _processManager = processManager ?? globals.processManager, // TODO(jonahwilliams): remove after google3 roll.
+       _flutterVersion = flutterVersion ?? globals.flutterVersion,
+       _logger = logger ?? globals.logger,
+       _buildDirectory = buildDirectory ?? getBuildDirectory(),
+       _fileSystem = fileSystem ?? globals.fs,
+       _artifacts = artifacts ?? globals.artifacts,
        super(
         deviceId,
         platformType: null,
@@ -253,21 +254,29 @@
 }
 
 class FlutterTesterDevices extends PollingDeviceDiscovery {
-  FlutterTesterDevices() : super('Flutter tester');
+  FlutterTesterDevices({
+    FileSystem fileSystem,
+    Artifacts artifacts,
+    ProcessManager processManager,
+    Logger logger,
+    FlutterVersion flutterVersion,
+    Config config,
+  }) : _testerDevice = FlutterTesterDevice( // TODO(jonahwilliams): remove after google3 roll.
+        kTesterDeviceId,
+        fileSystem: fileSystem ?? globals.fs,
+        artifacts: artifacts ?? globals.artifacts,
+        processManager: processManager ?? globals.processManager,
+        buildDirectory: getBuildDirectory(config ?? globals.config, fileSystem ?? globals.fs),
+        logger: logger ?? globals.logger,
+        flutterVersion: flutterVersion ?? globals.flutterVersion,
+      ),
+       super('Flutter tester');
 
   static const String kTesterDeviceId = 'flutter-tester';
 
   static bool showFlutterTesterDevice = false;
 
-  final FlutterTesterDevice _testerDevice = FlutterTesterDevice(
-    kTesterDeviceId,
-    fileSystem: globals.fs,
-    artifacts: globals.artifacts,
-    processManager: globals.processManager,
-    buildDirectory: getBuildDirectory(),
-    logger: globals.logger,
-    flutterVersion: globals.flutterVersion,
-  );
+  final FlutterTesterDevice _testerDevice;
 
   @override
   bool get canListAnything => true;