99 lines
3.2 KiB
Python
Executable File
99 lines
3.2 KiB
Python
Executable File
#!/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
|
|
|
|
ASUITE_HOME = os.path.dirname(os.path.realpath(__file__))
|
|
ASUITE_PLUGIN_PATH = os.path.join(ASUITE_HOME, "asuite_plugin")
|
|
ATEST_CMD = os.path.join(ASUITE_HOME, "atest", "atest_run_unittests.py")
|
|
ATEST2_CMD = os.path.join(ASUITE_HOME, "atest-py2", "atest_run_unittests.py")
|
|
AIDEGEN_CMD = "atest aidegen_unittests --host"
|
|
PLUGIN_LIB_CMD = "atest plugin_lib_unittests --host"
|
|
GRADLE_TEST = "/gradlew test"
|
|
# Definition of exit codes.
|
|
EXIT_ALL_CLEAN = 0
|
|
EXIT_TEST_FAIL = 1
|
|
|
|
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 'atest-py2' in f:
|
|
cmd_dict.update({ATEST2_CMD: None})
|
|
if 'aidegen' in f:
|
|
cmd_dict.update({AIDEGEN_CMD: None})
|
|
if 'plugin_lib' in f:
|
|
cmd_dict.update({PLUGIN_LIB_CMD: None})
|
|
if 'asuite_plugin' in f:
|
|
cmd = ASUITE_PLUGIN_PATH + GRADLE_TEST
|
|
cmd_dict.update({cmd : ASUITE_PLUGIN_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)
|