Pin the version of flutter/plugins to test against (#71166)

diff --git a/bin/internal/README.md b/bin/internal/README.md
index c1634b1..94d53ba 100644
--- a/bin/internal/README.md
+++ b/bin/internal/README.md
@@ -1,5 +1,6 @@
-Dart SDK dependency
-===================
+## Flutter SDK dependency versions
+
+The files in this directory specifies pinned versions of various dependencies of the flutter SDK.
 
 The `bin/internal/engine.version` file controls which version of the Flutter engine to use.
 The file contains the commit hash of a commit in the <https://github.com/flutter/engine> repository.
@@ -11,3 +12,7 @@
 that pull request. If it's `rebase`, the number of commits in the framework is
 equal to the number of engine commits in the pull request. The latter method
 makes it easier to detect regressions but costs more test resources.
+
+Ths `bin/internal/flutter_plugins.version` file specifies the version of the `flutter/plugins` repository to be used for testing.
+Note that `flutter/plugins` isn't an upstream dependency of `flutter/flutter` it is only used as part of the test suite for verification,
+the pinned version here makes sure that tests are deterministic at each `flutter/flutter` commit.
diff --git a/bin/internal/flutter_plugins.version b/bin/internal/flutter_plugins.version
new file mode 100644
index 0000000..e8d2a2c
--- /dev/null
+++ b/bin/internal/flutter_plugins.version
@@ -0,0 +1 @@
+592b5b27431689336fa4c721a099eedf787aeb56
diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index c0c732d..61d4383 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -7,6 +7,8 @@
 import 'dart:io';
 import 'dart:math' as math;
 
+import 'package:file/file.dart' as fs;
+import 'package:file/local.dart';
 import 'package:googleapis/bigquery/v2.dart' as bq;
 import 'package:googleapis_auth/auth_io.dart' as auth;
 import 'package:http/http.dart' as http;
@@ -37,6 +39,7 @@
 final String pubCache = path.join(flutterRoot, '.pub-cache');
 final String toolRoot = path.join(flutterRoot, 'packages', 'flutter_tools');
 final String engineVersionFile = path.join(flutterRoot, 'bin', 'internal', 'engine.version');
+final String flutterPluginsVersionFile = path.join(flutterRoot, 'bin', 'internal', 'flutter_plugins.version');
 
 String get platformFolderName {
   if (Platform.isWindows)
@@ -861,6 +864,25 @@
   await _stopChromeDriver();
 }
 
+/// Returns the commit hash of the flutter/plugins repository that's rolled in.
+///
+/// The flutter/plugins repository is a downstream dependency, it is only used
+/// by flutter/flutter for testing purposes, to assure stable tests for a given
+/// flutter commit the flutter/plugins commit hash to test against is coded in
+/// the bin/internal/flutter_plugins.version file.
+///
+/// The `filesystem` parameter specified filesystem to read the plugins version file from.
+/// The `pluginsVersionFile` parameter allows specifying an alternative path for the
+/// plugins version file, when null [flutterPluginsVersionFile] is used.
+Future<String> getFlutterPluginsVersion({
+  fs.FileSystem fileSystem = const LocalFileSystem(),
+  String pluginsVersionFile,
+}) async {
+  final File versionFile = fileSystem.file(pluginsVersionFile ?? flutterPluginsVersionFile);
+  final String versionFileContents = await versionFile.readAsString();
+  return versionFileContents.trim();
+}
+
 /// Executes the test suite for the flutter/plugins repo.
 Future<void> _runFlutterPluginsTests() async {
   Future<void> runAnalyze() async {
@@ -877,6 +899,17 @@
       ],
       workingDirectory: checkout.path,
     );
+    final String pluginsCommit = await getFlutterPluginsVersion();
+    await runCommand(
+      'git',
+      <String>[
+        '-c',
+        'core.longPaths=true',
+        'checkout',
+        pluginsCommit,
+      ],
+      workingDirectory: checkout.path,
+    );
     await runCommand(
       pub,
       <String>[
diff --git a/dev/bots/test/test_test.dart b/dev/bots/test/test_test.dart
index 8992c93..fb65219 100644
--- a/dev/bots/test/test_test.dart
+++ b/dev/bots/test/test_test.dart
@@ -4,7 +4,10 @@
 
 import 'dart:io' hide Platform;
 
+import 'package:file/file.dart' as fs;
+import 'package:file/memory.dart';
 import 'package:mockito/mockito.dart';
+import 'package:path/path.dart' as path;
 
 import '../test.dart';
 import 'common.dart';
@@ -56,4 +59,25 @@
       }
     });
   });
+
+  group('flutter/plugins version', () {
+    final MemoryFileSystem memoryFileSystem = MemoryFileSystem();
+    final fs.File pluginsVersionFile = memoryFileSystem.file(path.join('bin','internal','flutter_plugins.version'));
+    const String kSampleHash = '592b5b27431689336fa4c721a099eedf787aeb56';
+    setUpAll(() {
+      pluginsVersionFile.createSync(recursive: true);
+    });
+
+    test('commit hash', () async {
+      pluginsVersionFile.writeAsStringSync(kSampleHash);
+      final String actualHash = await getFlutterPluginsVersion(fileSystem: memoryFileSystem, pluginsVersionFile: pluginsVersionFile.path);
+      expect(actualHash, kSampleHash);
+    });
+
+    test('commit hash with newlines', () async {
+      pluginsVersionFile.writeAsStringSync('\n$kSampleHash\n');
+      final String actualHash = await getFlutterPluginsVersion(fileSystem: memoryFileSystem, pluginsVersionFile: pluginsVersionFile.path);
+      expect(actualHash, kSampleHash);
+    });
+  });
 }