[flutter_tools] fix windows vscode lookup (#56491)

diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart
index ce08e70..89ba0a1 100644
--- a/packages/flutter_tools/lib/src/vscode/vscode.dart
+++ b/packages/flutter_tools/lib/src/vscode/vscode.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import '../base/file_system.dart';
+import '../base/platform.dart';
 import '../base/utils.dart';
 import '../base/version.dart';
 import '../convert.dart';
@@ -86,15 +87,18 @@
 
   Iterable<ValidationMessage> get validationMessages => _validationMessages;
 
-  static List<VsCode> allInstalled() {
-    if (globals.platform.isMacOS) {
-      return _installedMacOS();
+  static List<VsCode> allInstalled(
+    FileSystem fileSystem,
+    Platform platform,
+  ) {
+    if (platform.isMacOS) {
+      return _installedMacOS(fileSystem);
     }
-    if (globals.platform.isWindows) {
-      return _installedWindows();
+    if (platform.isWindows) {
+      return _installedWindows(fileSystem, platform);
     }
-    if (globals.platform.isLinux) {
-      return _installedLinux();
+    if (platform.isLinux) {
+      return _installedLinux(fileSystem);
     }
     // VS Code isn't supported on the other platforms.
     return <VsCode>[];
@@ -108,14 +112,14 @@
   // macOS Extensions:
   //   $HOME/.vscode/extensions
   //   $HOME/.vscode-insiders/extensions
-  static List<VsCode> _installedMacOS() {
+  static List<VsCode> _installedMacOS(FileSystem fileSystem) {
     return _findInstalled(<_VsCodeInstallLocation>[
       _VsCodeInstallLocation(
-        globals.fs.path.join('/Applications', 'Visual Studio Code.app', 'Contents'),
+        fileSystem.path.join('/Applications', 'Visual Studio Code.app', 'Contents'),
         '.vscode',
       ),
       _VsCodeInstallLocation(
-        globals.fs.path.join(
+        fileSystem.path.join(
           globals.fsUtils.homeDirPath,
           'Applications',
           'Visual Studio Code.app',
@@ -124,12 +128,12 @@
         '.vscode',
       ),
       _VsCodeInstallLocation(
-        globals.fs.path.join('/Applications', 'Visual Studio Code - Insiders.app', 'Contents'),
+        fileSystem.path.join('/Applications', 'Visual Studio Code - Insiders.app', 'Contents'),
         '.vscode-insiders',
         isInsiders: true,
       ),
       _VsCodeInstallLocation(
-        globals.fs.path.join(
+        fileSystem.path.join(
           globals.fsUtils.homeDirPath,
           'Applications',
           'Visual Studio Code - Insiders.app',
@@ -138,7 +142,7 @@
         '.vscode-insiders',
         isInsiders: true,
       ),
-    ]);
+    ], fileSystem);
   }
 
   // Windows:
@@ -153,51 +157,56 @@
   // Windows Extensions:
   //   $HOME/.vscode/extensions
   //   $HOME/.vscode-insiders/extensions
-  static List<VsCode> _installedWindows() {
-    final String progFiles86 = globals.platform.environment['programfiles(x86)'];
-    final String progFiles = globals.platform.environment['programfiles'];
-    final String localAppData = globals.platform.environment['localappdata'];
+  static List<VsCode> _installedWindows(
+    FileSystem fileSystem,
+    Platform platform,
+  ) {
+    final String progFiles86 = platform.environment['programfiles(x86)'];
+    final String progFiles = platform.environment['programfiles'];
+    final String localAppData = platform.environment['localappdata'];
 
-    final List<_VsCodeInstallLocation> searchLocations =
-        <_VsCodeInstallLocation>[];
-
-    if (localAppData != null) {
-      searchLocations.add(_VsCodeInstallLocation(
-        globals.fs.path.join(localAppData, r'Programs\Microsoft VS Code'),
-        '.vscode',
-      ));
-    }
-    searchLocations.add(_VsCodeInstallLocation(
-      globals.fs.path.join(progFiles86, 'Microsoft VS Code'),
-      '.vscode',
-      edition: '32-bit edition',
-    ));
-    searchLocations.add(_VsCodeInstallLocation(
-      globals.fs.path.join(progFiles, 'Microsoft VS Code'),
-      '.vscode',
-      edition: '64-bit edition',
-    ));
-    if (localAppData != null) {
-      searchLocations.add(_VsCodeInstallLocation(
-        globals.fs.path.join(localAppData, r'Programs\Microsoft VS Code Insiders'),
-        '.vscode-insiders',
-        isInsiders: true,
-      ));
-    }
-    searchLocations.add(_VsCodeInstallLocation(
-      globals.fs.path.join(progFiles86, 'Microsoft VS Code Insiders'),
-      '.vscode-insiders',
-      edition: '32-bit edition',
-      isInsiders: true,
-    ));
-    searchLocations.add(_VsCodeInstallLocation(
-      globals.fs.path.join(progFiles, 'Microsoft VS Code Insiders'),
-      '.vscode-insiders',
-      edition: '64-bit edition',
-      isInsiders: true,
-    ));
-
-    return _findInstalled(searchLocations);
+    final List<_VsCodeInstallLocation> searchLocations = <_VsCodeInstallLocation>[
+      if (localAppData != null)
+        _VsCodeInstallLocation(
+          fileSystem.path.join(localAppData, r'Programs\Microsoft VS Code'),
+          '.vscode',
+        ),
+      if (progFiles86 != null)
+        ...<_VsCodeInstallLocation>[
+          _VsCodeInstallLocation(
+            fileSystem.path.join(progFiles86, 'Microsoft VS Code'),
+            '.vscode',
+            edition: '32-bit edition',
+          ),
+          _VsCodeInstallLocation(
+            fileSystem.path.join(progFiles86, 'Microsoft VS Code Insiders'),
+            '.vscode-insiders',
+            edition: '32-bit edition',
+            isInsiders: true,
+          ),
+        ],
+      if (progFiles != null)
+        ...<_VsCodeInstallLocation>[
+          _VsCodeInstallLocation(
+            fileSystem.path.join(progFiles, 'Microsoft VS Code'),
+            '.vscode',
+            edition: '64-bit edition',
+          ),
+          _VsCodeInstallLocation(
+            fileSystem.path.join(progFiles, 'Microsoft VS Code Insiders'),
+            '.vscode-insiders',
+            edition: '64-bit edition',
+            isInsiders: true,
+          ),
+        ],
+      if (localAppData != null)
+        _VsCodeInstallLocation(
+          fileSystem.path.join(localAppData, r'Programs\Microsoft VS Code Insiders'),
+          '.vscode-insiders',
+          isInsiders: true,
+        ),
+    ];
+    return _findInstalled(searchLocations, fileSystem);
   }
 
   // Linux:
@@ -206,7 +215,7 @@
   // Linux Extensions:
   //   $HOME/.vscode/extensions
   //   $HOME/.vscode-insiders/extensions
-  static List<VsCode> _installedLinux() {
+  static List<VsCode> _installedLinux(FileSystem fileSystem) {
     return _findInstalled(<_VsCodeInstallLocation>[
       const _VsCodeInstallLocation('/usr/share/code', '.vscode'),
       const _VsCodeInstallLocation(
@@ -214,10 +223,13 @@
         '.vscode-insiders',
         isInsiders: true,
       ),
-    ]);
+    ], fileSystem);
   }
 
-  static List<VsCode> _findInstalled(List<_VsCodeInstallLocation> allLocations) {
+  static List<VsCode> _findInstalled(
+    List<_VsCodeInstallLocation> allLocations,
+    FileSystem fileSystem,
+  ) {
     final Iterable<_VsCodeInstallLocation> searchLocations =
       _includeInsiders
         ? allLocations
@@ -226,8 +238,8 @@
     final List<VsCode> results = <VsCode>[];
 
     for (final _VsCodeInstallLocation searchLocation in searchLocations) {
-      if (globals.fs.isDirectorySync(searchLocation.installPath)) {
-        final String extensionDirectory = globals.fs.path.join(
+      if (fileSystem.isDirectorySync(searchLocation.installPath)) {
+        final String extensionDirectory = fileSystem.path.join(
           globals.fsUtils.homeDirPath,
           searchLocation.extensionsFolder,
           'extensions',
diff --git a/packages/flutter_tools/lib/src/vscode/vscode_validator.dart b/packages/flutter_tools/lib/src/vscode/vscode_validator.dart
index 6fb8409..aa9736c 100644
--- a/packages/flutter_tools/lib/src/vscode/vscode_validator.dart
+++ b/packages/flutter_tools/lib/src/vscode/vscode_validator.dart
@@ -7,6 +7,7 @@
 import '../base/user_messages.dart';
 import '../base/version.dart';
 import '../doctor.dart';
+import '../globals.dart' as globals;
 import 'vscode.dart';
 
 class VsCodeValidator extends DoctorValidator {
@@ -16,7 +17,7 @@
 
   static Iterable<DoctorValidator> get installedValidators {
     return VsCode
-        .allInstalled()
+        .allInstalled(globals.fs, globals.platform)
         .map<DoctorValidator>((VsCode vsCode) => VsCodeValidator(vsCode));
   }
 
diff --git a/packages/flutter_tools/test/general.shard/vscode_test.dart b/packages/flutter_tools/test/general.shard/vscode/vscode_test.dart
similarity index 94%
rename from packages/flutter_tools/test/general.shard/vscode_test.dart
rename to packages/flutter_tools/test/general.shard/vscode/vscode_test.dart
index 8e58859..25c0e5e 100644
--- a/packages/flutter_tools/test/general.shard/vscode_test.dart
+++ b/packages/flutter_tools/test/general.shard/vscode/vscode_test.dart
@@ -10,8 +10,8 @@
 import 'package:flutter_tools/src/globals.dart' as globals;
 import 'package:flutter_tools/src/vscode/vscode.dart';
 
-import '../src/common.dart';
-import '../src/context.dart';
+import '../../src/common.dart';
+import '../../src/context.dart';
 
 void main() {
   testUsingContext('VsCode.fromDirectory does not crash when packages.json is malformed', () {
diff --git a/packages/flutter_tools/test/general.shard/vscode/vscode_validator_test.dart b/packages/flutter_tools/test/general.shard/vscode/vscode_validator_test.dart
new file mode 100644
index 0000000..78cdcb5
--- /dev/null
+++ b/packages/flutter_tools/test/general.shard/vscode/vscode_validator_test.dart
@@ -0,0 +1,22 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:file/memory.dart';
+import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/base/platform.dart';
+import 'package:flutter_tools/src/vscode/vscode.dart';
+
+import '../../src/common.dart';
+
+void main() {
+  testWithoutContext('VsCode search locations on windows supports an empty environment', () {
+    final FileSystem fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
+    final Platform platform = FakePlatform(
+      operatingSystem: 'windows',
+      environment: <String, String>{},
+    );
+
+    expect(VsCode.allInstalled(fileSystem, platform), isEmpty);
+  });
+}