blob: 8e885daa3e0e24b5aa1f71d6cb62feebae92ed3a [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2019, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""asuite_run_unittests
This is a unit test wrapper to run tests of aidegen, atest or both.
"""
from __future__ import print_function
import argparse
import os
import shlex
import subprocess
import sys
EXIT_ALL_CLEAN = 0
EXIT_TEST_FAIL = 1
ASUITE_PLUGIN_PATH = "tools/asuite/asuite_plugin"
# TODO: remove echo when atest migration has done.
ATEST_CMD = "echo {}/tools/asuite/atest/atest_run_unittests.py".format(
os.getenv('ANDROID_BUILD_TOP'))
AIDEGEN_CMD = "atest aidegen_unittests --host"
GRADLE_TEST = "/gradlew test"
def run_unittests(files):
"""Parse modified files and tell if they belong to aidegen, atest or both.
Args:
files: a list of files.
Returns:
True if subprocess.check_call() returns 0.
"""
cmd_dict = {}
for f in files:
if 'atest' in f:
cmd_dict.update({ATEST_CMD : None})
if 'aidegen' in f:
cmd_dict.update({AIDEGEN_CMD : None})
if 'asuite_plugin' in f:
full_path = os.path.join(
os.getenv('ANDROID_BUILD_TOP'), ASUITE_PLUGIN_PATH)
cmd = full_path + GRADLE_TEST
cmd_dict.update({cmd : full_path})
try:
for cmd, path in cmd_dict.items():
subprocess.check_call(shlex.split(cmd), cwd=path)
except subprocess.CalledProcessError as error:
print('Unit test failed at:\n\n{}'.format(error.output))
raise
return True
def get_files_to_upload():
"""Parse args or modified files and return them as a list.
Returns:
A list of files to upload.
"""
parser = argparse.ArgumentParser()
parser.add_argument('preupload_files', nargs='*', help='Files to upload.')
args = parser.parse_args()
files_to_upload = args.preupload_files
if not files_to_upload:
# When running by users directly, only consider:
# added(A), renamed(R) and modified(M) files
# and store them in files_to_upload.
cmd = "git status --short | egrep ^[ARM] | awk '{print $NF}'"
preupload_files = subprocess.check_output(cmd, shell=True,
encoding='utf-8').splitlines()
if preupload_files:
print('Files to upload: %s' % preupload_files)
files_to_upload = preupload_files
else:
sys.exit(EXIT_ALL_CLEAN)
return files_to_upload
if __name__ == '__main__':
if not run_unittests(get_files_to_upload()):
sys.exit(EXIT_TEST_FAIL)