1*8a52c783SCole Faust#!/usr/bin/env python 2*8a52c783SCole Faust"""Run Integ Tests based on the changed files 3*8a52c783SCole Faust 4*8a52c783SCole Faust""" 5*8a52c783SCole Faustfrom subprocess import call, check_call, Popen, PIPE 6*8a52c783SCole Faust 7*8a52c783SCole Faust# Minimal modules to tests when core changes are detected. 8*8a52c783SCole Faust# s3 - xml, dynamodb - json, sqs - query 9*8a52c783SCole Faustcore_modules_to_test = ["s3", "dynamodb", "sqs"] 10*8a52c783SCole Faust 11*8a52c783SCole Faust# Minimal modules to tests when http client changes are detected. 12*8a52c783SCole Faust# s3 - streaming/non streaming, kinesis - h2 13*8a52c783SCole Fausthttp_modules_to_test = { 14*8a52c783SCole Faust "apache-client": ["s3", "apache-client"], 15*8a52c783SCole Faust "netty-nio-client": ["kinesis", "s3", "netty-nio-client"], 16*8a52c783SCole Faust "url-connection-client": ["url-connection-client"] 17*8a52c783SCole Faust} 18*8a52c783SCole Faust 19*8a52c783SCole Faustdef check_diffs(): 20*8a52c783SCole Faust """ 21*8a52c783SCole Faust Retrieve the changed files 22*8a52c783SCole Faust """ 23*8a52c783SCole Faust process = Popen(["git", "diff", "HEAD^", "--name-only"], stdout=PIPE) 24*8a52c783SCole Faust 25*8a52c783SCole Faust diff, stderr = process.communicate() 26*8a52c783SCole Faust 27*8a52c783SCole Faust if process.returncode !=0: 28*8a52c783SCole Faust raise Exception("Unable to do git diff") 29*8a52c783SCole Faust return diff.splitlines(False) 30*8a52c783SCole Faust 31*8a52c783SCole Faustdef get_modules(file_path): 32*8a52c783SCole Faust """ 33*8a52c783SCole Faust Parse the changed file path and get the respective module names 34*8a52c783SCole Faust """ 35*8a52c783SCole Faust path = file_path.split('/') 36*8a52c783SCole Faust 37*8a52c783SCole Faust # filter out non-java file 38*8a52c783SCole Faust if not path[-1].endswith(".java"): 39*8a52c783SCole Faust return 40*8a52c783SCole Faust 41*8a52c783SCole Faust top_directory = path[0] 42*8a52c783SCole Faust 43*8a52c783SCole Faust if top_directory in ["core", "codegen"]: 44*8a52c783SCole Faust return core_modules_to_test 45*8a52c783SCole Faust if top_directory in ["http-clients"]: 46*8a52c783SCole Faust return http_modules_to_test.get(path[1]) 47*8a52c783SCole Faust elif top_directory== "services": 48*8a52c783SCole Faust return path[1] 49*8a52c783SCole Faust 50*8a52c783SCole Faustdef run_tests(modules): 51*8a52c783SCole Faust """ 52*8a52c783SCole Faust Run integration tests for the given modules 53*8a52c783SCole Faust """ 54*8a52c783SCole Faust print("Running integ tests in the following modules: " + ', '.join(modules)) 55*8a52c783SCole Faust modules_to_include = "" 56*8a52c783SCole Faust 57*8a52c783SCole Faust for m in modules: 58*8a52c783SCole Faust modules_to_include += ":" + m + "," 59*8a52c783SCole Faust 60*8a52c783SCole Faust # remove last comma 61*8a52c783SCole Faust modules_to_include = modules_to_include[:-1] 62*8a52c783SCole Faust 63*8a52c783SCole Faust # build necessary dependencies first 64*8a52c783SCole Faust check_call(["mvn", "clean", "install", "-pl", modules_to_include, "-P", "quick", "--am"]) 65*8a52c783SCole Faust check_call(["mvn", "verify", "-pl", modules_to_include, "-P", "integration-tests", "-Dfailsafe.rerunFailingTestsCount=1"]) 66*8a52c783SCole Faust 67*8a52c783SCole Faustif __name__ == "__main__": 68*8a52c783SCole Faust diffs = check_diffs() 69*8a52c783SCole Faust modules = set() 70*8a52c783SCole Faust for d in diffs: 71*8a52c783SCole Faust module = get_modules(d) 72*8a52c783SCole Faust if isinstance(module, list): 73*8a52c783SCole Faust modules.update(module) 74*8a52c783SCole Faust elif module: 75*8a52c783SCole Faust modules.add(module) 76*8a52c783SCole Faust 77*8a52c783SCole Faust if modules: 78*8a52c783SCole Faust run_tests(modules) 79*8a52c783SCole Faust else: 80*8a52c783SCole Faust print("No modules configured to run. Skipping integ tests") 81