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"""Integration tests for the config module (via PREUPLOAD.cfg).""" 17 18import argparse 19import os 20import re 21import sys 22 23 24REPOTOOLS = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) 25REPO_ROOT = os.path.dirname(os.path.dirname(REPOTOOLS)) 26 27 28def assertEqual(msg, exp, actual): 29 """Assert |exp| equals |actual|.""" 30 assert exp == actual, f'{msg}: expected "{exp}" but got "{actual}"' 31 32 33def assertEnv(var, value): 34 """Assert |var| is set in the environment as |value|.""" 35 assert var in os.environ, f'${var} missing in environment' 36 assertEqual(f'env[{var}]', value, os.environ[var]) 37 38 39def check_commit_id(commit): 40 """Check |commit| looks like a git commit id.""" 41 assert len(commit) == 40, f'commit "{commit}" must be 40 chars' 42 assert re.match(r'^[a-f0-9]+$', commit), \ 43 f'commit "{commit}" must be all hex' 44 45 46def check_commit_msg(msg): 47 """Check the ${PREUPLOAD_COMMIT_MESSAGE} setting.""" 48 assert len(msg) > 1, f'commit message must be at least 2 bytes: {msg}' 49 50 51def check_repo_root(root): 52 """Check the ${REPO_ROOT} setting.""" 53 assertEqual('REPO_ROOT', REPO_ROOT, root) 54 55 56def check_files(files): 57 """Check the ${PREUPLOAD_FILES} setting.""" 58 assert files 59 60 61def check_env(): 62 """Verify all exported env vars look sane.""" 63 assertEnv('REPO_PROJECT', 'platform/tools/repohooks') 64 assertEnv('REPO_PATH', 'tools/repohooks') 65 assertEnv('REPO_REMOTE', 'aosp') 66 check_commit_id(os.environ['REPO_LREV']) 67 print(os.environ['REPO_RREV']) 68 check_commit_id(os.environ['PREUPLOAD_COMMIT']) 69 70 71def get_parser(): 72 """Return a command line parser.""" 73 parser = argparse.ArgumentParser(description=__doc__) 74 parser.add_argument('--check-env', action='store_true', 75 help='Check all exported env vars.') 76 parser.add_argument('--commit-id', 77 help='${PREUPLOAD_COMMIT} setting.') 78 parser.add_argument('--commit-msg', 79 help='${PREUPLOAD_COMMIT_MESSAGE} setting.') 80 parser.add_argument('--repo-root', 81 help='${REPO_ROOT} setting.') 82 parser.add_argument('files', nargs='+', 83 help='${PREUPLOAD_FILES} paths.') 84 return parser 85 86 87def main(argv): 88 """The main entry.""" 89 parser = get_parser() 90 opts = parser.parse_args(argv) 91 92 try: 93 if opts.check_env: 94 check_env() 95 if opts.commit_id is not None: 96 check_commit_id(opts.commit_id) 97 if opts.commit_msg is not None: 98 check_commit_msg(opts.commit_msg) 99 if opts.repo_root is not None: 100 check_repo_root(opts.repo_root) 101 check_files(opts.files) 102 except AssertionError as e: 103 print(f'error: {e}', file=sys.stderr) 104 return 1 105 106 return 0 107 108 109if __name__ == '__main__': 110 sys.exit(main(sys.argv[1:])) 111