| #!/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") | 
 | # Temporarily running full module testing for atest due to b/248507158. | 
 | ATEST_CMD = "atest atest_unittests --host" | 
 | 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 '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) |