• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2# Copyright 2019, The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#     http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16"""asuite_run_unittests
17
18This is a unit test wrapper to run tests of aidegen, atest or both.
19"""
20
21
22from __future__ import print_function
23
24import argparse
25import os
26import shlex
27import subprocess
28import sys
29
30ASUITE_HOME = os.path.dirname(os.path.realpath(__file__))
31ASUITE_PLUGIN_PATH = os.path.join(ASUITE_HOME, "asuite_plugin")
32ATEST_CMD = os.path.join(ASUITE_HOME, "atest", "atest_run_unittests.py")
33ATEST2_CMD = os.path.join(ASUITE_HOME, "atest-py2", "atest_run_unittests.py")
34AIDEGEN_CMD = "atest aidegen_unittests --host"
35PLUGIN_LIB_CMD = "atest plugin_lib_unittests --host"
36GRADLE_TEST = "/gradlew test"
37# Definition of exit codes.
38EXIT_ALL_CLEAN = 0
39EXIT_TEST_FAIL = 1
40
41def run_unittests(files):
42    """Parse modified files and tell if they belong to aidegen, atest or both.
43
44    Args:
45        files: a list of files.
46
47    Returns:
48        True if subprocess.check_call() returns 0.
49    """
50    cmd_dict = {}
51    for f in files:
52        if 'atest' in f:
53            cmd_dict.update({ATEST_CMD: None})
54        if 'atest-py2' in f:
55            cmd_dict.update({ATEST2_CMD: None})
56        if 'aidegen' in f:
57            cmd_dict.update({AIDEGEN_CMD: None})
58        if 'plugin_lib' in f:
59            cmd_dict.update({PLUGIN_LIB_CMD: None})
60        if 'asuite_plugin' in f:
61            cmd = ASUITE_PLUGIN_PATH + GRADLE_TEST
62            cmd_dict.update({cmd : ASUITE_PLUGIN_PATH})
63    try:
64        for cmd, path in cmd_dict.items():
65            subprocess.check_call(shlex.split(cmd), cwd=path)
66    except subprocess.CalledProcessError as error:
67        print('Unit test failed at:\n\n{}'.format(error.output))
68        raise
69    return True
70
71
72def get_files_to_upload():
73    """Parse args or modified files and return them as a list.
74
75    Returns:
76        A list of files to upload.
77    """
78    parser = argparse.ArgumentParser()
79    parser.add_argument('preupload_files', nargs='*', help='Files to upload.')
80    args = parser.parse_args()
81    files_to_upload = args.preupload_files
82    if not files_to_upload:
83        # When running by users directly, only consider:
84        # added(A), renamed(R) and modified(M) files
85        # and store them in files_to_upload.
86        cmd = "git status --short | egrep ^[ARM] | awk '{print $NF}'"
87        preupload_files = subprocess.check_output(cmd, shell=True,
88                                                  encoding='utf-8').splitlines()
89        if preupload_files:
90            print('Files to upload: %s' % preupload_files)
91            files_to_upload = preupload_files
92        else:
93            sys.exit(EXIT_ALL_CLEAN)
94    return files_to_upload
95
96if __name__ == '__main__':
97    if not run_unittests(get_files_to_upload()):
98        sys.exit(EXIT_TEST_FAIL)
99