Run non-perf sensitive tests on Cirrus (#27971)

* Run non-perf sensisitive tests on Cirrus
diff --git a/dev/bots/download_android_sdk.sh b/dev/bots/download_android_sdk.sh
new file mode 100755
index 0000000..cafa3f4
--- /dev/null
+++ b/dev/bots/download_android_sdk.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+set -e
+
+if [[ -z $ANDROID_SDK_TOOLS_URL || -z $ANDROID_HOME || -z $ANDROID_SDK_ROOT ]]; then
+  exit 0
+fi
+
+curl -L $ANDROID_SDK_TOOLS_URL --output android_sdk_tools.zip
+
+mkdir -p $ANDROID_SDK_ROOT
+unzip android_sdk_tools.zip -d $ANDROID_SDK_ROOT
+rm android_sdk_tools.zip
+
+yes | $ANDROID_SDK_ROOT/tools/bin/sdkmanager --licenses
+$ANDROID_SDK_ROOT/tools/bin/sdkmanager tools
+$ANDROID_SDK_ROOT/tools/bin/sdkmanager platform-tools
+# this is large and we don't need it just yet
+# $ANDROID_SDK_ROOT/tools/bin/sdkmanager emulator
+$ANDROID_SDK_ROOT/tools/bin/sdkmanager  "platforms;android-28" \
+    "build-tools;28.0.3" \
+    "platforms;android-27" \
+    "build-tools;27.0.3" \
+    "extras;google;m2repository" \
+    "extras;android;m2repository"
+
+
diff --git a/dev/bots/download_open_jdk.sh b/dev/bots/download_open_jdk.sh
new file mode 100755
index 0000000..313ce05
--- /dev/null
+++ b/dev/bots/download_open_jdk.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+set -e
+
+if [[ -z $OPEN_JDK_URL ]]; then
+  exit 0
+fi
+
+mkdir -p $HOME/Java
+pushd $HOME/Java
+curl -L $OPEN_JDK_URL --output open_jdk.tar.gz
+tar -xvf open_jdk.tar.gz
+rm open_jdk.tar.gz
+popd
diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index 45666f6..1a8284b 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -27,6 +27,7 @@
   'tool_tests': _runToolTests,
   'build_tests': _runBuildTests,
   'coverage': _runCoverage,
+  'integration_tests': _runIntegrationTests,
   'add2app_test': _runAdd2AppTest,
 };
 
@@ -615,3 +616,51 @@
     exit(1);
   }
 }
+
+Future<void> _runIntegrationTests() async {
+  print('Platform env vars:');
+
+  await _runDevicelabTest('dartdocs');
+
+  if (Platform.isLinux) {
+    await _runDevicelabTest('flutter_create_offline_test_linux');
+  } else if (Platform.isWindows) {
+    await _runDevicelabTest('flutter_create_offline_test_windows');
+  } else if (Platform.isMacOS) {
+    await _runDevicelabTest('flutter_create_offline_test_mac');
+    await _runDevicelabTest('module_test_ios');
+  }
+  await _integrationTestsAndroidSdk();
+}
+
+Future<void> _runDevicelabTest(String testName, {Map<String, String> env}) async {
+  await runCommand(
+    dart,
+    <String>['bin/run.dart', '-t', testName],
+    workingDirectory: path.join(flutterRoot, 'dev', 'devicelab'),
+    environment: env,
+  );
+}
+
+Future<void> _integrationTestsAndroidSdk() async {
+  final String androidSdkRoot = (Platform.environment['ANDROID_HOME']?.isEmpty ?? true)
+      ? Platform.environment['ANDROID_SDK_ROOT']
+      : Platform.environment['ANDROID_HOME'];
+  if (androidSdkRoot == null || androidSdkRoot.isEmpty) {
+    print('No Android SDK detected, skipping Android Integration Tests');
+    return;
+  }
+
+  final Map<String, String> env = <String, String> {
+    'ANDROID_HOME': androidSdkRoot,
+    'ANDROID_SDK_ROOT': androidSdkRoot,
+  };
+
+  // TODO(dnfield): gradlew is crashing on the cirrus image and it's not clear why.
+  if (!Platform.isWindows) {
+    await _runDevicelabTest('gradle_plugin_test', env: env);
+    await _runDevicelabTest('module_test', env: env);
+  }
+  // note: this also covers plugin_test_win as long as Windows has an Android SDK available.
+  await _runDevicelabTest('plugin_test', env: env);
+}
\ No newline at end of file