Update osx_sdk module to add cache cleanup support.

Using xcode runtimes pollutes the cache causing the next builds to
fail finding the simulators. This CL ensures that after every build
using runtimes deletes the xcode cache.

Bug: https://github.com/flutter/flutter/issues/113539
Change-Id: Id42c365fe0d3b7cd5be06b4f4e83f93d7ef18d88
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/34860
Reviewed-by: Nehal Patel <nehalvpatel@google.com>
Commit-Queue: Godofredo Contreras <godofredoc@google.com>
diff --git a/recipe_modules/osx_sdk/__init__.py b/recipe_modules/osx_sdk/__init__.py
index f0bf2f3..cabf17b 100644
--- a/recipe_modules/osx_sdk/__init__.py
+++ b/recipe_modules/osx_sdk/__init__.py
@@ -34,6 +34,8 @@
       # The CIPD toolchain tool package and version
       toolchain_pkg=Single(str),
       toolchain_ver=Single(str),
+      # Cleanup caches
+      cleanup_cache=Single(bool),
     ), default={},
     )
 }
diff --git a/recipe_modules/osx_sdk/api.py b/recipe_modules/osx_sdk/api.py
index 2f0f18d..2125f0e 100644
--- a/recipe_modules/osx_sdk/api.py
+++ b/recipe_modules/osx_sdk/api.py
@@ -46,6 +46,11 @@
     self._runtime_versions = None
     self._tool_pkg = 'infra/tools/mac_toolchain/${platform}'
     self._tool_ver = 'latest'
+    self._cleanup_cache = False
+
+  def _clean_cache(self):
+    if self._cleanup_cache or self._runtime_versions:
+      self.m.file.rmtree('Cleaning up Xcode cache', self.m.path['cache'].join('osx_sdk'))
 
   def initialize(self):
     """Initializes xcode, and ios versions.
@@ -56,6 +61,9 @@
     if not self.m.platform.is_mac:
       return
 
+    if 'cleanup_cache' in self._sdk_properties:
+      self._cleanup_cache = self._sdk_properties['cleanup_cache']
+
     if 'toolchain_ver' in self._sdk_properties:
       self._tool_ver = self._sdk_properties['toolchain_ver'].lower()
 
@@ -157,6 +165,7 @@
 
     try:
       with self.m.context(infra_steps=True):
+        self._clean_cache()
         app = self._ensure_sdk(kind)
         self.m.os_utils.kill_simulators()
         self.m.step('select XCode', ['sudo', 'xcode-select', '--switch', app])
@@ -165,6 +174,7 @@
     finally:
       with self.m.context(infra_steps=True):
         self.m.step('reset XCode', ['sudo', 'xcode-select', '--reset'])
+        self._clean_cache()
 
   def _ensure_sdk(self, kind):
     """Ensures the mac_toolchain tool and OS X SDK packages are installed.
diff --git a/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version.json b/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version.json
index daee234..edd3a8b 100644
--- a/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version.json
+++ b/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version.json
@@ -1,6 +1,19 @@
 [
   {
     "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CACHE]/osx_sdk"
+    ],
+    "infra_step": true,
+    "name": "Cleaning up Xcode cache"
+  },
+  {
+    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -211,6 +224,19 @@
     "name": "reset XCode"
   },
   {
+    "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CACHE]/osx_sdk"
+    ],
+    "infra_step": true,
+    "name": "Cleaning up Xcode cache (2)"
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version_nosymlink.json b/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version_nosymlink.json
index 1af5484..e470be6 100644
--- a/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version_nosymlink.json
+++ b/recipe_modules/osx_sdk/examples/full.expected/explicit_runtime_version_nosymlink.json
@@ -1,6 +1,19 @@
 [
   {
     "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CACHE]/osx_sdk"
+    ],
+    "infra_step": true,
+    "name": "Cleaning up Xcode cache"
+  },
+  {
+    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -211,6 +224,19 @@
     "name": "reset XCode"
   },
   {
+    "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CACHE]/osx_sdk"
+    ],
+    "infra_step": true,
+    "name": "Cleaning up Xcode cache (2)"
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json b/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json
index 585b62f..4885716 100644
--- a/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json
+++ b/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json
@@ -1,6 +1,19 @@
 [
   {
     "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CACHE]/osx_sdk"
+    ],
+    "infra_step": true,
+    "name": "Cleaning up Xcode cache"
+  },
+  {
+    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -99,6 +112,19 @@
     "name": "reset XCode"
   },
   {
+    "cmd": [
+      "vpython3",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "rmtree",
+      "[CACHE]/osx_sdk"
+    ],
+    "infra_step": true,
+    "name": "Cleaning up Xcode cache (2)"
+  },
+  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/osx_sdk/examples/full.py b/recipe_modules/osx_sdk/examples/full.py
index 31b7799..daa4ebb 100644
--- a/recipe_modules/osx_sdk/examples/full.py
+++ b/recipe_modules/osx_sdk/examples/full.py
@@ -28,7 +28,8 @@
       'explicit_version',
       api.platform.name('mac'),
       api.properties(**{'$flutter/osx_sdk': {
-          'sdk_version': 'deadbeef', 'toolchain_ver': '123abc'
+          'sdk_version': 'deadbeef', 'toolchain_ver': '123abc',
+          'cleanup_cache': True
       }})
   )