blob: f396b6f325dddd2d734597305c3d4f26350630e0 [file] [log] [blame]
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# TODO(garyq): This Android AVD based test is currently implemented as a separate recipe
# to validate stability of AVD in pre and post submit. Move this into the general recipe
# once validated, stable, and no longer under heavy development.
from PB.recipes.flutter.engine.engine import InputProperties
from PB.recipes.flutter.engine.engine import EnvProperties
DEPS = [
'flutter/android_virtual_device',
'flutter/flutter_deps',
'flutter/os_utils',
'flutter/repo_util',
'flutter/retry',
'recipe_engine/context',
'recipe_engine/file',
'recipe_engine/path',
'recipe_engine/properties',
'recipe_engine/raw_io',
'recipe_engine/step',
]
PROPERTIES = InputProperties
ENV_PROPERTIES = EnvProperties
def RunSteps(api, properties, env_properties):
# Collect memory/cpu/process before task execution.
api.os_utils.collect_os_info()
api.os_utils.print_pub_certs()
cache_root = api.path['cache'].join('builder')
api.file.ensure_directory('Ensure root cache', cache_root)
checkout_path = api.path['start_dir'].join('flutter sdk')
with api.step.nest('checkout source code'):
api.repo_util.checkout(
'flutter',
checkout_path=checkout_path,
url=api.properties.get('git_url'),
ref=api.properties.get('git_ref'),
)
env, env_prefixes = api.repo_util.flutter_environment(checkout_path)
api.flutter_deps.required_deps(
env, env_prefixes, api.properties.get('dependencies', [])
)
deps = api.properties.get('dependencies', [])
dep_list = {d['dependency']: d.get('version') for d in deps}
# If the emulator dependency is present then we assume it is wanted for testing.
if 'android_virtual_device' in dep_list.keys():
env['USE_EMULATOR'] = True
env['EMULATOR_VERSION'] = dep_list.get('android_virtual_device')
with api.android_virtual_device(env=env, env_prefixes=env_prefixes, version=env['EMULATOR_VERSION']):
with api.context(env=env, env_prefixes=env_prefixes, cwd=checkout_path):
views_test_dir = checkout_path.join(
'dev', 'integration_tests', 'android_views'
)
with api.step.nest('prepare environment'), api.step.defer_results():
# This prevents junk analytics from being sent due to testing
api.step(
'flutter config --no-analytics',
['flutter', 'config', '--no-analytics'],
)
api.step(
'flutter doctor',
['flutter', 'doctor'],
)
api.step(
'flutter devices',
['flutter', 'devices', '--device-timeout=40', '--verbose'],
)
api.step(
'download flutter dependencies',
['flutter', 'update-packages', '-v'],
infra_step=True,
)
# Create gradlew file
with api.context(env=env, env_prefixes=env_prefixes, cwd=views_test_dir):
api.step(
'configure android project',
['flutter', 'build', 'apk', '--config-only'],
infra_step=True,
)
# Any gradle command downloads gradle if not already present in the cache.
# ./gradlew dependencies downloads any gradle defined dependencies to the cache.
# https://docs.gradle.org/current/userguide/viewing_debugging_dependencies.html
# Downloading gradle and downloading dependencies are a common source of flakes
# and moving those to an infra step that can be retried shifts the blame
# individual tests to the infra itself.
android_path = views_test_dir.join('android')
with api.context(env=env, env_prefixes=env_prefixes, cwd=android_path):
api.retry.step(
'download android dependencies',
['./gradlew', '-q', 'dependencies'],
max_attempts=2,
infra_step=True,
)
with api.context(env=env, env_prefixes=env_prefixes,
cwd=views_test_dir), api.step.defer_results():
api.step(
'Android Views Integration Tests',
[
'flutter', 'drive', '--browser-name=android-chrome',
'--android-emulator', '--no-start-paused',
'--purge-persistent-cache', '--device-timeout=30'
],
timeout=700,
)
# This is to clean up leaked processes.
api.os_utils.kill_processes()
# Collect memory/cpu/process after task execution.
api.os_utils.collect_os_info()
def GenTests(api):
checkout_path = api.path['start_dir'].join('flutter sdk')
avd_api_version = '31'
yield api.test(
'flutter_drive_clean_exit',
api.properties(
dependencies=[{'dependency': 'android_sdk'}, {
'dependency': 'android_virtual_device', 'version': '31'
}, {'dependency': 'curl'}]
),
api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
api.step_data(
'start avd.Start Android emulator (API level %s)' % avd_api_version,
stdout=api.raw_io.output_text(
'android_' + avd_api_version +
'_google_apis_x86|emulator-5554 started (pid: 17687)'
)
),
)
yield api.test(
'flutter_drive_zombie_process',
api.properties(
dependencies=[{'dependency': 'android_sdk'}, {
'dependency': 'android_virtual_device', 'version': '31'
}, {'dependency': 'curl'}]
),
api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
api.step_data(
'start avd.Start Android emulator (API level %s)' % avd_api_version,
stdout=api.raw_io.output_text(
'android_' + avd_api_version +
'_google_apis_x86|emulator-5554 started (pid: 17687)'
)
),
api.step_data(
'kill and cleanup avd.list processes',
stdout=api.raw_io.output_text('12345 qemu-system blah')
),
)