| #!/usr/bin/env python |
| # |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| import os |
| import re |
| import datetime |
| |
| from optparse import OptionParser |
| |
| BASE_CMD = "mvn -Dskip.python.test=true %s test" |
| |
| def main(): |
| parser = OptionParser() |
| parser.add_option("-t", "--test", dest="test", |
| action="store", type="string", |
| help="run specific tests") |
| parser.add_option("-c", "--continuous", dest="continuous", |
| action="store_true", default=False, |
| help="run tests after failures, don't stop") |
| |
| |
| (options, args) = parser.parse_args() |
| |
| # determine command to run |
| if (options.test != None): |
| cmd = (BASE_CMD % ("-Dtest="+options.test)) |
| else: |
| cmd = (BASE_CMD % ("")) |
| |
| run_forever = options.continuous |
| |
| |
| failed_runs = [] |
| iteration = 0 |
| fail_match = re.compile("BUILD SUCCESSFUL") |
| done = False |
| |
| while (run_forever or not (len(failed_runs) > 0)): |
| iteration = iteration + 1 |
| if (run_forever): |
| extra_text = (", %d failures so far: %s:" % (len(failed_runs), failed_runs)) |
| else: |
| extra_text = "" |
| print ("%s Test run %d%s" % (datetime.datetime.today().isoformat(), iteration, extra_text)) |
| (child_stdin, child_stdout_and_stderr) = os.popen4(cmd) |
| output = child_stdout_and_stderr.read() |
| child_stdin.close() |
| child_stdout_and_stderr.close() |
| matches = fail_match.search(output) |
| if (matches == None): |
| failed_runs.append(iteration) |
| output_name = ("test-run-%d.out" % (iteration)) |
| #write testouput |
| test_output = file(output_name, "w") |
| test_output.write(output) |
| test_output.close() |
| #tar test-output and surefire reports together |
| find_stdout = os.popen("find . -type d -name surefire-reports") |
| surefire_dirs = find_stdout.read().replace('\n', ' ') |
| find_stdout.close() |
| tarcmd = ("tar -zcf test-failures-%d.tar.gz %s %s" % (iteration, output_name, surefire_dirs)) |
| tar_stdout = os.popen(tarcmd) |
| tar_output = tar_stdout.read() |
| tar_exitstatus = tar_stdout.close() |
| print ("Something failed! Check %s" % (output_name)) |
| if (tar_exitstatus != None): |
| print ("tar exited abornmally, aborting\n %s" % (tar_output)) |
| run_forever = False |
| |
| if __name__ == "__main__": |
| main() |