diff --git a/packages/flutter_tools/lib/src/platform_plugins.dart b/packages/flutter_tools/lib/src/platform_plugins.dart
index 3827718..68f7931 100644
--- a/packages/flutter_tools/lib/src/platform_plugins.dart
+++ b/packages/flutter_tools/lib/src/platform_plugins.dart
@@ -7,7 +7,6 @@
 
 import 'base/common.dart';
 import 'base/file_system.dart';
-import 'globals.dart' as globals;
 
 /// Constant for 'pluginClass' key in plugin maps.
 const String kPluginClass = 'pluginClass';
@@ -38,18 +37,22 @@
     @required this.package,
     @required this.pluginClass,
     @required this.pluginPath,
-  });
+    @required FileSystem fileSystem,
+  }) : _fileSystem = fileSystem;
 
-  factory AndroidPlugin.fromYaml(String name, YamlMap yaml, String pluginPath) {
+  factory AndroidPlugin.fromYaml(String name, YamlMap yaml, String pluginPath, FileSystem fileSystem) {
     assert(validate(yaml));
     return AndroidPlugin(
       name: name,
       package: yaml['package'] as String,
       pluginClass: yaml['pluginClass'] as String,
       pluginPath: pluginPath,
+      fileSystem: fileSystem,
     );
   }
 
+  final FileSystem _fileSystem;
+
   static bool validate(YamlMap yaml) {
     if (yaml == null) {
       return false;
@@ -91,7 +94,7 @@
   Set<String> _getSupportedEmbeddings() {
     assert(pluginPath != null);
     final Set<String> supportedEmbeddings = <String>{};
-    final String baseMainPath = globals.fs.path.join(
+    final String baseMainPath = _fileSystem.path.join(
       pluginPath,
       'android',
       'src',
@@ -99,16 +102,16 @@
     );
 
     final List<String> mainClassCandidates = <String>[
-      globals.fs.path.join(
+      _fileSystem.path.join(
         baseMainPath,
         'java',
-        package.replaceAll('.', globals.fs.path.separator),
+        package.replaceAll('.', _fileSystem.path.separator),
         '$pluginClass.java',
       ),
-      globals.fs.path.join(
+      _fileSystem.path.join(
         baseMainPath,
         'kotlin',
-        package.replaceAll('.', globals.fs.path.separator),
+        package.replaceAll('.', _fileSystem.path.separator),
         '$pluginClass.kt',
       )
     ];
@@ -116,7 +119,7 @@
     File mainPluginClass;
     bool mainClassFound = false;
     for (final String mainClassCandidate in mainClassCandidates) {
-      mainPluginClass = globals.fs.file(mainClassCandidate);
+      mainPluginClass = _fileSystem.file(mainClassCandidate);
       if (mainPluginClass.existsSync()) {
         mainClassFound = true;
         break;
@@ -132,15 +135,7 @@
       );
     }
 
-    String mainClassContent;
-    try {
-      mainClassContent = mainPluginClass.readAsStringSync();
-    } on FileSystemException {
-      throwToolExit(
-        "Couldn't read file ${mainPluginClass.path} even though it exists. "
-        'Please verify that this file has read permission and try again.'
-      );
-    }
+    final String mainClassContent = mainPluginClass.readAsStringSync();
     if (mainClassContent
         .contains('io.flutter.embedding.engine.plugins.FlutterPlugin')) {
       supportedEmbeddings.add('2');
@@ -167,7 +162,7 @@
   });
 
   factory IOSPlugin.fromYaml(String name, YamlMap yaml) {
-    assert(validate(yaml));
+    assert(validate(yaml)); // TODO(jonahwilliams): https://github.com/flutter/flutter/issues/67241
     return IOSPlugin(
       name: name,
       classPrefix: '',
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index 6f801df..fc12f99 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -68,16 +68,17 @@
     String name,
     String path,
     YamlMap pluginYaml,
-    List<String> dependencies,
-  ) {
+    List<String> dependencies, {
+    @required FileSystem fileSystem,
+  }) {
     final List<String> errors = validatePluginYaml(pluginYaml);
     if (errors.isNotEmpty) {
       throwToolExit('Invalid plugin specification $name.\n${errors.join('\n')}');
     }
     if (pluginYaml != null && pluginYaml['platforms'] != null) {
-      return Plugin._fromMultiPlatformYaml(name, path, pluginYaml, dependencies);
+      return Plugin._fromMultiPlatformYaml(name, path, pluginYaml, dependencies, fileSystem);
     }
-    return Plugin._fromLegacyYaml(name, path, pluginYaml, dependencies);
+    return Plugin._fromLegacyYaml(name, path, pluginYaml, dependencies, fileSystem);
   }
 
   factory Plugin._fromMultiPlatformYaml(
@@ -85,6 +86,7 @@
     String path,
     dynamic pluginYaml,
     List<String> dependencies,
+    FileSystem fileSystem,
   ) {
     assert (pluginYaml != null && pluginYaml['platforms'] != null,
             'Invalid multi-platform plugin specification $name.');
@@ -100,6 +102,7 @@
         name,
         platformsYaml[AndroidPlugin.kConfigKey] as YamlMap,
         path,
+        fileSystem,
       );
     }
 
@@ -141,6 +144,7 @@
     String path,
     dynamic pluginYaml,
     List<String> dependencies,
+    FileSystem fileSystem,
   ) {
     final Map<String, PluginPlatform> platforms = <String, PluginPlatform>{};
     final String pluginClass = pluginYaml['pluginClass'] as String;
@@ -152,6 +156,7 @@
           package: pluginYaml['androidPackage'] as String,
           pluginClass: pluginClass,
           pluginPath: path,
+          fileSystem: fileSystem,
         );
       }
 
@@ -332,6 +337,7 @@
     packageRootPath,
     flutterConfig['plugin'] as YamlMap,
     dependencies == null ? <String>[] : <String>[...dependencies.keys.cast<String>()],
+    fileSystem: globals.fs,
   );
 }
 
diff --git a/packages/flutter_tools/test/general.shard/android_plugin_test.dart b/packages/flutter_tools/test/general.shard/android_plugin_test.dart
new file mode 100644
index 0000000..e411cac
--- /dev/null
+++ b/packages/flutter_tools/test/general.shard/android_plugin_test.dart
@@ -0,0 +1,121 @@
+// 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/file.dart';
+import 'package:file/memory.dart';
+import 'package:flutter_tools/src/platform_plugins.dart';
+
+
+import '../src/common.dart';
+
+void main() {
+  testWithoutContext('AndroidPlugin throws tool exit if the plugin main class can not be found', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    final AndroidPlugin androidPlugin = AndroidPlugin(
+      name: 'pluginA',
+      package: 'com.company',
+      pluginClass: 'PluginA',
+      pluginPath: '.pub_cache/plugin_a',
+      fileSystem: fileSystem,
+    );
+
+    expect(() => androidPlugin.toMap(), throwsToolExit(
+      message: "The plugin `pluginA` doesn't have a main class defined in "
+      '.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java '
+      'or .pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt'
+    ));
+  });
+
+  testWithoutContext('AndroidPlugin parses embedding version 2 from the Java search path', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    final AndroidPlugin androidPlugin = AndroidPlugin(
+      name: 'pluginA',
+      package: 'com.company',
+      pluginClass: 'PluginA',
+      pluginPath: '.pub_cache/plugin_a',
+      fileSystem: fileSystem,
+    );
+
+    fileSystem.file('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java')
+      ..createSync(recursive: true)
+      ..writeAsStringSync('io.flutter.embedding.engine.plugins.FlutterPlugin');
+
+    expect(androidPlugin.toMap(), <String, Object>{
+      'name': 'pluginA',
+      'package': 'com.company',
+      'class': 'PluginA',
+      'supportsEmbeddingV1': false,
+      'supportsEmbeddingV2': true,
+    });
+  });
+
+  testWithoutContext('AndroidPlugin parses embedding version 1 from the Java search path', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    final AndroidPlugin androidPlugin = AndroidPlugin(
+      name: 'pluginA',
+      package: 'com.company',
+      pluginClass: 'PluginA',
+      pluginPath: '.pub_cache/plugin_a',
+      fileSystem: fileSystem,
+    );
+
+    fileSystem.file('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java')
+      ..createSync(recursive: true)
+      ..writeAsStringSync('some.other.string');
+
+    expect(androidPlugin.toMap(), <String, Object>{
+      'name': 'pluginA',
+      'package': 'com.company',
+      'class': 'PluginA',
+      'supportsEmbeddingV1': true,
+      'supportsEmbeddingV2': false,
+    });
+  });
+
+  testWithoutContext('AndroidPlugin parses embedding version 2 from the Kotlin search path', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    final AndroidPlugin androidPlugin = AndroidPlugin(
+      name: 'pluginA',
+      package: 'com.company',
+      pluginClass: 'PluginA',
+      pluginPath: '.pub_cache/plugin_a',
+      fileSystem: fileSystem,
+    );
+
+    fileSystem.file('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt')
+      ..createSync(recursive: true)
+      ..writeAsStringSync('io.flutter.embedding.engine.plugins.FlutterPlugin');
+
+    expect(androidPlugin.toMap(), <String, Object>{
+      'name': 'pluginA',
+      'package': 'com.company',
+      'class': 'PluginA',
+      'supportsEmbeddingV1': false,
+      'supportsEmbeddingV2': true,
+    });
+  });
+
+  testWithoutContext('AndroidPlugin parses embedding version 1 from the Kotlin search path', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    final AndroidPlugin androidPlugin = AndroidPlugin(
+      name: 'pluginA',
+      package: 'com.company',
+      pluginClass: 'PluginA',
+      pluginPath: '.pub_cache/plugin_a',
+      fileSystem: fileSystem,
+    );
+
+    fileSystem.file('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt')
+      ..createSync(recursive: true)
+      ..writeAsStringSync('some.other.string');
+
+    expect(androidPlugin.toMap(), <String, Object>{
+      'name': 'pluginA',
+      'package': 'com.company',
+      'class': 'PluginA',
+      'supportsEmbeddingV1': true,
+      'supportsEmbeddingV2': false,
+    });
+  });
+}
diff --git a/packages/flutter_tools/test/general.shard/platform_plugins_test.dart b/packages/flutter_tools/test/general.shard/platform_plugins_test.dart
deleted file mode 100644
index 09cac88..0000000
--- a/packages/flutter_tools/test/general.shard/platform_plugins_test.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-// 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/file.dart';
-import 'package:flutter_tools/src/platform_plugins.dart';
-import 'package:mockito/mockito.dart';
-import 'package:path/path.dart' as p;
-
-import '../src/common.dart';
-import '../src/context.dart';
-
-void main() {
-  group('AndroidPlugin', () {
-    MockFileSystem mockFileSystem;
-    MockPathContext pathContext;
-
-    setUp(() {
-      pathContext = MockPathContext();
-      when(pathContext.separator).thenReturn('/');
-
-      mockFileSystem = MockFileSystem();
-      when(mockFileSystem.path).thenReturn(pathContext);
-    });
-
-    testUsingContext("throws tool exit if the plugin main class can't be read", () {
-      when(pathContext.join('.pub_cache/plugin_a', 'android', 'src', 'main'))
-        .thenReturn('.pub_cache/plugin_a/android/src/main');
-
-      when(pathContext.join('.pub_cache/plugin_a/android/src/main', 'java', 'com/company', 'PluginA.java'))
-        .thenReturn('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java');
-
-      when(pathContext.join('.pub_cache/plugin_a/android/src/main', 'kotlin', 'com/company', 'PluginA.kt'))
-        .thenReturn('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt');
-
-      final MockFile pluginJavaMainClass = MockFile();
-      when(pluginJavaMainClass.existsSync()).thenReturn(true);
-      when(pluginJavaMainClass.readAsStringSync(encoding: anyNamed('encoding'))).thenThrow(const FileSystemException());
-      when(mockFileSystem.file('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java'))
-        .thenReturn(pluginJavaMainClass);
-
-      final MockFile pluginKotlinMainClass = MockFile();
-      when(pluginKotlinMainClass.existsSync()).thenReturn(false);
-      when(mockFileSystem.file('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt'))
-        .thenReturn(pluginKotlinMainClass);
-
-      expect(() {
-        AndroidPlugin(
-          name: 'pluginA',
-          package: 'com.company',
-          pluginClass: 'PluginA',
-          pluginPath: '.pub_cache/plugin_a',
-        ).toMap();
-      }, throwsToolExit(
-        message: "Couldn't read file null even though it exists. "
-                 'Please verify that this file has read permission and try again.'
-      ));
-    }, overrides: <Type, Generator>{
-      FileSystem: () => mockFileSystem,
-      ProcessManager: () => FakeProcessManager.any(),
-    });
-  });
-}
-
-class MockFile extends Mock implements File {}
-class MockFileSystem extends Mock implements FileSystem {}
-class MockPathContext extends Mock implements p.Context {}
diff --git a/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart b/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart
index 680b343..96867c6 100644
--- a/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart
+++ b/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart
@@ -2,6 +2,8 @@
 // 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/platform_plugins.dart';
 import 'package:flutter_tools/src/plugins.dart';
 import 'package:yaml/yaml.dart';
@@ -12,209 +14,261 @@
 const String _kTestPluginPath = 'test_plugin_path';
 
 void main() {
-  group('PluginParsing', () {
-    test('Legacy Format', () {
-      const String pluginYamlRaw = 'androidPackage: com.flutter.dev\n'
-          'iosPrefix: FLT\n'
-          'pluginClass: SamplePlugin\n';
+  testWithoutContext('Plugin creation from the legacy format', () {
+    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw = 'androidPackage: com.flutter.dev\n'
+      'iosPrefix: FLT\n'
+      'pluginClass: SamplePlugin\n';
 
-      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
-      final Plugin plugin =
-          Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]);
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
+    final Plugin plugin = Plugin.fromYaml(
+      _kTestPluginName,
+      _kTestPluginPath,
+      pluginYaml,
+      const <String>[],
+      fileSystem: fileSystem,
+    );
 
-      final AndroidPlugin androidPlugin =
-          plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
-      final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
-      final String androidPluginClass = androidPlugin.pluginClass;
-      final String iosPluginClass = iosPlugin.pluginClass;
+    final AndroidPlugin androidPlugin = plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
+    final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
+    final String androidPluginClass = androidPlugin.pluginClass;
+    final String iosPluginClass = iosPlugin.pluginClass;
 
-      expect(iosPluginClass, 'SamplePlugin');
-      expect(androidPluginClass, 'SamplePlugin');
-      expect(iosPlugin.classPrefix, 'FLT');
-      expect(androidPlugin.package, 'com.flutter.dev');
-    });
+    expect(iosPluginClass, 'SamplePlugin');
+    expect(androidPluginClass, 'SamplePlugin');
+    expect(iosPlugin.classPrefix, 'FLT');
+    expect(androidPlugin.package, 'com.flutter.dev');
+  });
 
-    test('Multi-platform Format', () {
-      const String pluginYamlRaw = 'platforms:\n'
-          ' android:\n'
-          '  package: com.flutter.dev\n'
-          '  pluginClass: ASamplePlugin\n'
-          ' ios:\n'
-          '  pluginClass: ISamplePlugin\n'
-          ' linux:\n'
-          '  pluginClass: LSamplePlugin\n'
-          ' macos:\n'
-          '  pluginClass: MSamplePlugin\n'
-          ' web:\n'
-          '  pluginClass: WebSamplePlugin\n'
-          '  fileName: web_plugin.dart\n'
-          ' windows:\n'
-          '  pluginClass: WinSamplePlugin\n';
+  testWithoutContext('Plugin creation from the multi-platform format', () {
+    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw = 'platforms:\n'
+      ' android:\n'
+      '  package: com.flutter.dev\n'
+      '  pluginClass: ASamplePlugin\n'
+      ' ios:\n'
+      '  pluginClass: ISamplePlugin\n'
+      ' linux:\n'
+      '  pluginClass: LSamplePlugin\n'
+      ' macos:\n'
+      '  pluginClass: MSamplePlugin\n'
+      ' web:\n'
+      '  pluginClass: WebSamplePlugin\n'
+      '  fileName: web_plugin.dart\n'
+      ' windows:\n'
+      '  pluginClass: WinSamplePlugin\n';
 
-      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
-      final Plugin plugin =
-          Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]);
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
+    final Plugin plugin = Plugin.fromYaml(
+      _kTestPluginName,
+      _kTestPluginPath,
+      pluginYaml,
+      const <String>[],
+      fileSystem: fileSystem,
+    );
 
-      final AndroidPlugin androidPlugin =
-          plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
-      final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
-      final LinuxPlugin linuxPlugin =
-          plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
-      final MacOSPlugin macOSPlugin =
-          plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
-      final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey] as WebPlugin;
-      final WindowsPlugin windowsPlugin =
-          plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
-      final String androidPluginClass = androidPlugin.pluginClass;
-      final String iosPluginClass = iosPlugin.pluginClass;
+    final AndroidPlugin androidPlugin = plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
+    final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
+    final LinuxPlugin linuxPlugin = plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
+    final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
+    final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey] as WebPlugin;
+    final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
+    final String androidPluginClass = androidPlugin.pluginClass;
+    final String iosPluginClass = iosPlugin.pluginClass;
 
-      expect(iosPluginClass, 'ISamplePlugin');
-      expect(androidPluginClass, 'ASamplePlugin');
-      expect(iosPlugin.classPrefix, '');
-      expect(androidPlugin.package, 'com.flutter.dev');
-      expect(linuxPlugin.pluginClass, 'LSamplePlugin');
-      expect(macOSPlugin.pluginClass, 'MSamplePlugin');
-      expect(webPlugin.pluginClass, 'WebSamplePlugin');
-      expect(webPlugin.fileName, 'web_plugin.dart');
-      expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
-    });
+    expect(iosPluginClass, 'ISamplePlugin');
+    expect(androidPluginClass, 'ASamplePlugin');
+    expect(iosPlugin.classPrefix, '');
+    expect(androidPlugin.package, 'com.flutter.dev');
+    expect(linuxPlugin.pluginClass, 'LSamplePlugin');
+    expect(macOSPlugin.pluginClass, 'MSamplePlugin');
+    expect(webPlugin.pluginClass, 'WebSamplePlugin');
+    expect(webPlugin.fileName, 'web_plugin.dart');
+    expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
+  });
 
-    test('Unknown fields are allowed (allows some future compatibility)', () {
-      const String pluginYamlRaw = 'implements: same_plugin\n' // this should be ignored by the tool
-          'platforms:\n'
-          ' android:\n'
-          '  package: com.flutter.dev\n'
-          '  pluginClass: ASamplePlugin\n'
-          '  anUnknownField: ASamplePlugin\n' // this should be ignored by the tool
-          ' ios:\n'
-          '  pluginClass: ISamplePlugin\n'
-          ' linux:\n'
-          '  pluginClass: LSamplePlugin\n'
-          ' macos:\n'
-          '  pluginClass: MSamplePlugin\n'
-          ' web:\n'
-          '  pluginClass: WebSamplePlugin\n'
-          '  fileName: web_plugin.dart\n'
-          ' windows:\n'
-          '  pluginClass: WinSamplePlugin\n';
+  testWithoutContext('Plugin parsing of unknown fields are allowed (allows some future compatibility)', () {
+    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw = 'implements: same_plugin\n' // this should be ignored by the tool
+      'platforms:\n'
+      ' android:\n'
+      '  package: com.flutter.dev\n'
+      '  pluginClass: ASamplePlugin\n'
+      '  anUnknownField: ASamplePlugin\n' // this should be ignored by the tool
+      ' ios:\n'
+      '  pluginClass: ISamplePlugin\n'
+      ' linux:\n'
+      '  pluginClass: LSamplePlugin\n'
+      ' macos:\n'
+      '  pluginClass: MSamplePlugin\n'
+      ' web:\n'
+      '  pluginClass: WebSamplePlugin\n'
+      '  fileName: web_plugin.dart\n'
+      ' windows:\n'
+        '  pluginClass: WinSamplePlugin\n';
 
-      final dynamic pluginYaml = loadYaml(pluginYamlRaw);
-      final Plugin plugin =
-      Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml as YamlMap, const <String>[]);
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
+    final Plugin plugin = Plugin.fromYaml(
+      _kTestPluginName,
+      _kTestPluginPath,
+      pluginYaml,
+      const <String>[],
+      fileSystem: fileSystem,
+    );
 
-      final AndroidPlugin androidPlugin = plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
-      final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
-      final LinuxPlugin linuxPlugin = plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
-      final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
-      final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey] as WebPlugin;
-      final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
-      final String androidPluginClass = androidPlugin.pluginClass;
-      final String iosPluginClass = iosPlugin.pluginClass;
+    final AndroidPlugin androidPlugin = plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
+    final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
+    final LinuxPlugin linuxPlugin = plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
+    final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
+    final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey] as WebPlugin;
+    final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
+    final String androidPluginClass = androidPlugin.pluginClass;
+    final String iosPluginClass = iosPlugin.pluginClass;
 
-      expect(iosPluginClass, 'ISamplePlugin');
-      expect(androidPluginClass, 'ASamplePlugin');
-      expect(iosPlugin.classPrefix, '');
-      expect(androidPlugin.package, 'com.flutter.dev');
-      expect(linuxPlugin.pluginClass, 'LSamplePlugin');
-      expect(macOSPlugin.pluginClass, 'MSamplePlugin');
-      expect(webPlugin.pluginClass, 'WebSamplePlugin');
-      expect(webPlugin.fileName, 'web_plugin.dart');
-      expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
-    });
+    expect(iosPluginClass, 'ISamplePlugin');
+    expect(androidPluginClass, 'ASamplePlugin');
+    expect(iosPlugin.classPrefix, '');
+    expect(androidPlugin.package, 'com.flutter.dev');
+    expect(linuxPlugin.pluginClass, 'LSamplePlugin');
+    expect(macOSPlugin.pluginClass, 'MSamplePlugin');
+    expect(webPlugin.pluginClass, 'WebSamplePlugin');
+    expect(webPlugin.fileName, 'web_plugin.dart');
+    expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
+  });
 
-    test('Allow for Dart-only plugins without a pluginClass', () {
-      /// This is currently supported only on macOS, linux, Windows.
-      const String pluginYamlRaw = 'implements: same_plugin\n' // this should be ignored by the tool
-          'platforms:\n'
-          ' linux:\n'
-          '  dartPluginClass: LSamplePlugin\n'
-          ' macos:\n'
-          '  dartPluginClass: MSamplePlugin\n'
-          ' windows:\n'
-          '  dartPluginClass: WinSamplePlugin\n';
+  testWithoutContext('Plugin parsing allows for Dart-only plugins without a pluginClass', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    /// This is currently supported only on macOS, linux, Windows.
+    const String pluginYamlRaw = 'implements: same_plugin\n' // this should be ignored by the tool
+      'platforms:\n'
+      ' linux:\n'
+      '  dartPluginClass: LSamplePlugin\n'
+      ' macos:\n'
+      '  dartPluginClass: MSamplePlugin\n'
+      ' windows:\n'
+      '  dartPluginClass: WinSamplePlugin\n';
 
-      final dynamic pluginYaml = loadYaml(pluginYamlRaw);
-      final Plugin plugin =
-      Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml as YamlMap, const <String>[]);
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
+    final Plugin plugin = Plugin.fromYaml(
+      _kTestPluginName,
+      _kTestPluginPath,
+      pluginYaml,
+      const <String>[],
+      fileSystem: fileSystem,
+    );
 
-      final LinuxPlugin linuxPlugin = plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
-      final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
-      final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
+    final LinuxPlugin linuxPlugin = plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
+    final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
+    final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
 
-      expect(linuxPlugin.pluginClass, isNull);
-      expect(macOSPlugin.pluginClass, isNull);
-      expect(windowsPlugin.pluginClass, isNull);
-      expect(linuxPlugin.dartPluginClass, 'LSamplePlugin');
-      expect(macOSPlugin.dartPluginClass, 'MSamplePlugin');
-      expect(windowsPlugin.dartPluginClass, 'WinSamplePlugin');
-    });
+    expect(linuxPlugin.pluginClass, isNull);
+    expect(macOSPlugin.pluginClass, isNull);
+    expect(windowsPlugin.pluginClass, isNull);
+    expect(linuxPlugin.dartPluginClass, 'LSamplePlugin');
+    expect(macOSPlugin.dartPluginClass, 'MSamplePlugin');
+    expect(windowsPlugin.dartPluginClass, 'WinSamplePlugin');
+  });
 
-    test('Legacy Format and Multi-Platform Format together is not allowed and error message contains plugin name', () {
-      const String pluginYamlRaw = 'androidPackage: com.flutter.dev\n'
-          'platforms:\n'
-          ' android:\n'
-          '  package: com.flutter.dev\n';
+  testWithoutContext('Plugin parsing of legacy format and multi-platform format together is not allowed '
+    'and fatal error message contains plugin name', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw = 'androidPackage: com.flutter.dev\n'
+      'platforms:\n'
+      ' android:\n'
+      '  package: com.flutter.dev\n';
 
-      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
-      expect(
-        () => Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]),
-        throwsToolExit(message: _kTestPluginName),
-      );
-    });
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
 
-    test('A default_package field is allowed', () {
-      const String pluginYamlRaw =
-          'platforms:\n'
-          ' android:\n'
-          '  default_package: sample_package_android\n'
-          ' ios:\n'
-          '  default_package: sample_package_ios\n'
-          ' linux:\n'
-          '  default_package: sample_package_linux\n'
-          ' macos:\n'
-          '  default_package: sample_package_macos\n'
-          ' web:\n'
-          '  default_package: sample_package_web\n'
-          ' windows:\n'
-          '  default_package: sample_package_windows\n';
+    expect(
+     () => Plugin.fromYaml(
+        _kTestPluginName,
+        _kTestPluginPath,
+        pluginYaml,
+        const <String>[],
+        fileSystem: fileSystem,
+      ),
+      throwsToolExit(message: _kTestPluginName),
+    );
+  });
 
-      final dynamic pluginYaml = loadYaml(pluginYamlRaw);
-      final Plugin plugin =
-      Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml as YamlMap, const <String>[]);
+  testWithoutContext('Plugin parsing allows a default_package field', () {
+    final FileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw =
+      'platforms:\n'
+      ' android:\n'
+      '  default_package: sample_package_android\n'
+      ' ios:\n'
+      '  default_package: sample_package_ios\n'
+      ' linux:\n'
+      '  default_package: sample_package_linux\n'
+      ' macos:\n'
+      '  default_package: sample_package_macos\n'
+      ' web:\n'
+      '  default_package: sample_package_web\n'
+      ' windows:\n'
+      '  default_package: sample_package_windows\n';
 
-      expect(plugin.platforms, <String, PluginPlatform> {});
-    });
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
+    final Plugin plugin = Plugin.fromYaml(
+      _kTestPluginName,
+      _kTestPluginPath,
+      pluginYaml,
+      const <String>[],
+      fileSystem: fileSystem,
+    );
 
-    test('error on empty plugin', () {
-      const String pluginYamlRaw = '';
+    expect(plugin.platforms, <String, PluginPlatform>{});
+  });
 
-      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
-      expect(
-            () => Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]),
-        throwsToolExit(message: 'Invalid "plugin" specification.'),
-      );
-    });
+  testWithoutContext('Plugin parsing throws a fatal error on an empty plugin', () {
+    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
+    final YamlMap pluginYaml = loadYaml('') as YamlMap;
 
-    test('error on empty platforms', () {
-      const String pluginYamlRaw = 'platforms:\n';
+    expect(
+      () => Plugin.fromYaml(
+        _kTestPluginName,
+        _kTestPluginPath,
+        pluginYaml,
+        const <String>[],
+        fileSystem: fileSystem,
+      ),
+      throwsToolExit(message: 'Invalid "plugin" specification.'),
+    );
+  });
 
-      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
-      expect(
-            () => Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]),
-        throwsToolExit(message: 'Invalid "platforms" specification.'),
-      );
-    });
+  testWithoutContext('Plugin parsing throws a fatal error on empty platforms', () {
+    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw = 'platforms:\n';
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
 
-    test('error on empty platform', () {
-      const String pluginYamlRaw =
-          'platforms:\n'
-          ' android:\n';
+    expect(
+      () => Plugin.fromYaml(
+        _kTestPluginName,
+        _kTestPluginPath,
+        pluginYaml,
+        const <String>[],
+        fileSystem: fileSystem,
+      ),
+      throwsToolExit(message: 'Invalid "platforms" specification.'),
+    );
+  });
 
-      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
-      expect(
-            () => Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]),
-        throwsToolExit(message: 'Invalid "android" plugin specification.'),
-      );
-    });
+  test('Plugin parsing throws a fatal error on an empty platform key', () {
+    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
+    const String pluginYamlRaw =
+      'platforms:\n'
+      ' android:\n';
+
+    final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
+    expect(
+      () => Plugin.fromYaml(
+        _kTestPluginName,
+        _kTestPluginPath,
+        pluginYaml,
+        const <String>[],
+        fileSystem: fileSystem,
+      ),
+      throwsToolExit(message: 'Invalid "android" plugin specification.'),
+    );
   });
 }
