| #!/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") |