Add entitlement checks to codesigning test (#52919)

diff --git a/dev/bots/codesign.dart b/dev/bots/codesign.dart
index 0a90b62..1bf0455 100644
--- a/dev/bots/codesign.dart
+++ b/dev/bots/codesign.dart
@@ -61,9 +61,74 @@
   }
 }
 
-void main() {
-  final List<String> failures = <String>[];
+List<String> get binariesWithEntitlements => List<String>.unmodifiable(<String>[
+  'idevice_id',
+  'ideviceinfo',
+  'idevicename',
+  'idevicescreenshot',
+  'idevicesyslog',
+  'libimobiledevice.6.dylib',
+  'ideviceinstaller',
+  'libplist.3.dylib',
+  'iproxy',
+  'libusbmuxd.4.dylib',
+  'libssl.1.0.0.dylib',
+  'libcrypto.1.0.0.dylib',
+  'libzip.5.0.dylib',
+  'libzip.5.dylib',
+  'gen_snapshot',
+  'dart',
+  'flutter_tester',
+  'gen_snapshot_arm64',
+  'gen_snapshot_armv7',
+]);
 
+List<String> get expectedEntitlements => List<String>.unmodifiable(<String>[
+  'com.apple.security.cs.allow-jit',
+  'com.apple.security.cs.allow-unsigned-executable-memory',
+  'com.apple.security.cs.allow-dyld-environment-variables',
+  'com.apple.security.network.client',
+  'com.apple.security.network.server',
+  'com.apple.security.cs.disable-library-validation',
+]);
+
+
+/// Check if the binary has the expected entitlements.
+bool hasExpectedEntitlements(String binaryPath) {
+  try {
+    final ProcessResult entitlementResult = Process.runSync(
+      'codesign',
+      <String>[
+        '--display',
+        '--entitlements',
+        ':-',
+        binaryPath,
+      ],
+    );
+
+    if (entitlementResult.exitCode != 0) {
+      print('The `codesign --entitlements` command failed with exit code ${entitlementResult.exitCode}:\n'
+        '${entitlementResult.stderr}\n');
+      return false;
+    }
+
+    bool passes = true;
+    final String output = entitlementResult.stdout as String;
+    for (final String entitlement in expectedEntitlements) {
+      final bool entitlementExpected = binariesWithEntitlements.contains(path.basename(binaryPath));
+      if (output.contains(entitlement) != entitlementExpected) {
+        print('File "$binaryPath" ${entitlementExpected ? 'does not have expected' : 'has unexpected'} entitlement $entitlement.');
+        passes = false;
+      }
+    }
+    return passes;
+  } catch (e) {
+    print(e);
+    return false;
+  }
+}
+
+void main() {
   if (!Platform.isMacOS) {
     print('Error! Expected operating system "macos", actual operating system '
       'is: "${Platform.operatingSystem}"');
@@ -78,28 +143,45 @@
     exit(1);
   }
 
+  final List<String> unsignedBinaries = <String>[];
+  final List<String> wrongEntitlementBinaries = <String>[];
   for (final String binaryPath in findBinaryPaths(cacheDirectory)) {
     print('Verifying the code signature of $binaryPath');
-    final ProcessResult result = Process.runSync(
+    final ProcessResult codeSignResult = Process.runSync(
       'codesign',
       <String>[
         '-vvv',
         binaryPath,
       ],
     );
-    if (result.exitCode != 0) {
-      failures.add(binaryPath);
+    if (codeSignResult.exitCode != 0) {
+      unsignedBinaries.add(binaryPath);
       print('File "$binaryPath" does not appear to be codesigned.\n'
-            'The `codesign` command failed with exit code ${result.exitCode}:\n'
-            '${result.stderr}\n');
+            'The `codesign` command failed with exit code ${codeSignResult.exitCode}:\n'
+            '${codeSignResult.stderr}\n');
+      continue;
+    } else {
+      print('Verifying entitlements of $binaryPath');
+      if (!hasExpectedEntitlements(binaryPath)) {
+        wrongEntitlementBinaries.add(binaryPath);
+      }
     }
   }
 
-  if (failures.isNotEmpty) {
-    print('Found ${failures.length} unsigned binaries.');
-    failures.forEach(print);
+  if (unsignedBinaries.isNotEmpty) {
+    print('Found ${unsignedBinaries.length} unsigned binaries:');
+    unsignedBinaries.forEach(print);
+  }
+
+  if (wrongEntitlementBinaries.isNotEmpty) {
+    print('Found ${wrongEntitlementBinaries.length} binaries with unexpected entitlements:');
+    wrongEntitlementBinaries.forEach(print);
+  }
+
+  if (unsignedBinaries.isNotEmpty) {
+    // TODO(jmagman): Also exit if `wrongEntitlementBinaries.isNotEmpty` after https://github.com/flutter/flutter/issues/46704 is done.
     exit(1);
   }
 
-  print('Verified that binaries are codesigned.');
+  print('Verified that binaries are codesigned and have expected entitlements.');
 }