1*795d594fSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2016 The Android Open Source Project 4*795d594fSAndroid Build Coastguard Worker# 5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*795d594fSAndroid Build Coastguard Worker# 11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*795d594fSAndroid Build Coastguard Worker# limitations under the License. 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Workerimport argparse 18*795d594fSAndroid Build Coastguard Workerimport os 19*795d594fSAndroid Build Coastguard Workerimport re 20*795d594fSAndroid Build Coastguard Workerimport shutil 21*795d594fSAndroid Build Coastguard Workerimport subprocess 22*795d594fSAndroid Build Coastguard Workerimport sys 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Workerfrom glob import glob 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Workerfrom tempfile import mkdtemp 27*795d594fSAndroid Build Coastguard Workerfrom tempfile import TemporaryFile 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker# run_jfuzz_test.py success/failure strings. 30*795d594fSAndroid Build Coastguard WorkerSUCCESS_STRING = 'success (no divergences)' 31*795d594fSAndroid Build Coastguard WorkerFAILURE_STRING = 'FAILURE (divergences)' 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker# Constant returned by string find() method when search fails. 34*795d594fSAndroid Build Coastguard WorkerNOT_FOUND = -1 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Workerdef main(argv): 37*795d594fSAndroid Build Coastguard Worker # Set up. 38*795d594fSAndroid Build Coastguard Worker cwd = os.path.dirname(os.path.realpath(__file__)) 39*795d594fSAndroid Build Coastguard Worker cmd = [cwd + '/run_jfuzz_test.py'] 40*795d594fSAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 41*795d594fSAndroid Build Coastguard Worker parser.add_argument('--num_proc', default=8, 42*795d594fSAndroid Build Coastguard Worker type=int, help='number of processes to run') 43*795d594fSAndroid Build Coastguard Worker # Unknown arguments are passed to run_jfuzz_test.py. 44*795d594fSAndroid Build Coastguard Worker (args, unknown_args) = parser.parse_known_args() 45*795d594fSAndroid Build Coastguard Worker # Run processes. 46*795d594fSAndroid Build Coastguard Worker cmd = cmd + unknown_args 47*795d594fSAndroid Build Coastguard Worker print() 48*795d594fSAndroid Build Coastguard Worker print('**\n**** Nightly JFuzz Testing\n**') 49*795d594fSAndroid Build Coastguard Worker print() 50*795d594fSAndroid Build Coastguard Worker print('**** Running ****\n\n', cmd, '\n') 51*795d594fSAndroid Build Coastguard Worker output_files = [TemporaryFile('wb+') for _ in range(args.num_proc)] 52*795d594fSAndroid Build Coastguard Worker processes = [] 53*795d594fSAndroid Build Coastguard Worker for i, output_file in enumerate(output_files): 54*795d594fSAndroid Build Coastguard Worker print('Tester', i) 55*795d594fSAndroid Build Coastguard Worker processes.append(subprocess.Popen(cmd, stdout=output_file, 56*795d594fSAndroid Build Coastguard Worker stderr=subprocess.STDOUT)) 57*795d594fSAndroid Build Coastguard Worker try: 58*795d594fSAndroid Build Coastguard Worker # Wait for processes to terminate. 59*795d594fSAndroid Build Coastguard Worker for proc in processes: 60*795d594fSAndroid Build Coastguard Worker proc.wait() 61*795d594fSAndroid Build Coastguard Worker except KeyboardInterrupt: 62*795d594fSAndroid Build Coastguard Worker for proc in processes: 63*795d594fSAndroid Build Coastguard Worker proc.kill() 64*795d594fSAndroid Build Coastguard Worker # Output results. 65*795d594fSAndroid Build Coastguard Worker print('\n**** Results ****\n') 66*795d594fSAndroid Build Coastguard Worker output_dirs = [] 67*795d594fSAndroid Build Coastguard Worker for i, output_file in enumerate(output_files): 68*795d594fSAndroid Build Coastguard Worker output_file.seek(0) 69*795d594fSAndroid Build Coastguard Worker output_str = output_file.read().decode('ascii') 70*795d594fSAndroid Build Coastguard Worker output_file.close() 71*795d594fSAndroid Build Coastguard Worker # Extract output directory. Example match: 'Directory : /tmp/tmp8ltpfjng'. 72*795d594fSAndroid Build Coastguard Worker directory_match = re.search(r'Directory[^:]*: ([^\n]+)\n', output_str) 73*795d594fSAndroid Build Coastguard Worker if directory_match: 74*795d594fSAndroid Build Coastguard Worker output_dirs.append(directory_match.group(1)) 75*795d594fSAndroid Build Coastguard Worker if output_str.find(SUCCESS_STRING) == NOT_FOUND: 76*795d594fSAndroid Build Coastguard Worker print('Tester', i, FAILURE_STRING) 77*795d594fSAndroid Build Coastguard Worker else: 78*795d594fSAndroid Build Coastguard Worker print('Tester', i, SUCCESS_STRING) 79*795d594fSAndroid Build Coastguard Worker # Gather divergences. 80*795d594fSAndroid Build Coastguard Worker global_out_dir = mkdtemp('jfuzz_nightly') 81*795d594fSAndroid Build Coastguard Worker divergence_nr = 0 82*795d594fSAndroid Build Coastguard Worker for out_dir in output_dirs: 83*795d594fSAndroid Build Coastguard Worker for divergence_dir in glob(out_dir + '/divergence*/'): 84*795d594fSAndroid Build Coastguard Worker divergence_nr += 1 85*795d594fSAndroid Build Coastguard Worker shutil.copytree(divergence_dir, 86*795d594fSAndroid Build Coastguard Worker global_out_dir + '/divergence' + str(divergence_nr)) 87*795d594fSAndroid Build Coastguard Worker if divergence_nr > 0: 88*795d594fSAndroid Build Coastguard Worker print('\n!!!! Divergences !!!!', divergence_nr) 89*795d594fSAndroid Build Coastguard Worker else: 90*795d594fSAndroid Build Coastguard Worker print ('\nSuccess') 91*795d594fSAndroid Build Coastguard Worker print('\nGlobal output directory:', global_out_dir) 92*795d594fSAndroid Build Coastguard Worker print() 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Workerif __name__ == '__main__': 95*795d594fSAndroid Build Coastguard Worker main(sys.argv) 96