| #!/usr/bin/env python | |
| """Run Integ Tests based on the changed files | |
| """ | |
| from subprocess import call, check_call, Popen, PIPE | |
| # Minimal modules to tests when core changes are detected. | |
| # s3 - xml, dynamodb - json, sqs - query | |
| core_modules_to_test = ["s3", "dynamodb", "sqs"] | |
| # Minimal modules to tests when http client changes are detected. | |
| # s3 - streaming/non streaming, kinesis - h2 | |
| http_modules_to_test = { | |
| "apache-client": ["s3", "apache-client"], | |
| "netty-nio-client": ["kinesis", "s3", "netty-nio-client"], | |
| "url-connection-client": ["url-connection-client"] | |
| } | |
| def check_diffs(): | |
| """ | |
| Retrieve the changed files | |
| """ | |
| process = Popen(["git", "diff", "HEAD^", "--name-only"], stdout=PIPE) | |
| diff, stderr = process.communicate() | |
| if process.returncode !=0: | |
| raise Exception("Unable to do git diff") | |
| return diff.splitlines(False) | |
| def get_modules(file_path): | |
| """ | |
| Parse the changed file path and get the respective module names | |
| """ | |
| path = file_path.split('/') | |
| # filter out non-java file | |
| if not path[-1].endswith(".java"): | |
| return | |
| top_directory = path[0] | |
| if top_directory in ["core", "codegen"]: | |
| return core_modules_to_test | |
| if top_directory in ["http-clients"]: | |
| return http_modules_to_test.get(path[1]) | |
| elif top_directory== "services": | |
| return path[1] | |
| def run_tests(modules): | |
| """ | |
| Run integration tests for the given modules | |
| """ | |
| print("Running integ tests in the following modules: " + ', '.join(modules)) | |
| modules_to_include = "" | |
| for m in modules: | |
| modules_to_include += ":" + m + "," | |
| # remove last comma | |
| modules_to_include = modules_to_include[:-1] | |
| # build necessary dependencies first | |
| check_call(["mvn", "clean", "install", "-pl", modules_to_include, "-P", "quick", "--am"]) | |
| check_call(["mvn", "verify", "-pl", modules_to_include, "-P", "integration-tests", "-Dfailsafe.rerunFailingTestsCount=1"]) | |
| if __name__ == "__main__": | |
| diffs = check_diffs() | |
| modules = set() | |
| for d in diffs: | |
| module = get_modules(d) | |
| if isinstance(module, list): | |
| modules.update(module) | |
| elif module: | |
| modules.add(module) | |
| if modules: | |
| run_tests(modules) | |
| else: | |
| print("No modules configured to run. Skipping integ tests") |