You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.0 KiB
96 lines
3.0 KiB
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (C) 2016 The Android Open Source Project
|
|
#
|
|
# Licensed 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 argparse
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
|
|
from glob import glob
|
|
|
|
from tempfile import mkdtemp
|
|
from tempfile import TemporaryFile
|
|
|
|
# run_jfuzz_test.py success/failure strings.
|
|
SUCCESS_STRING = 'success (no divergences)'
|
|
FAILURE_STRING = 'FAILURE (divergences)'
|
|
|
|
# Constant returned by string find() method when search fails.
|
|
NOT_FOUND = -1
|
|
|
|
def main(argv):
|
|
# Set up.
|
|
cwd = os.path.dirname(os.path.realpath(__file__))
|
|
cmd = [cwd + '/run_jfuzz_test.py']
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--num_proc', default=8,
|
|
type=int, help='number of processes to run')
|
|
# Unknown arguments are passed to run_jfuzz_test.py.
|
|
(args, unknown_args) = parser.parse_known_args()
|
|
# Run processes.
|
|
cmd = cmd + unknown_args
|
|
print()
|
|
print('**\n**** Nightly JFuzz Testing\n**')
|
|
print()
|
|
print('**** Running ****\n\n', cmd, '\n')
|
|
output_files = [TemporaryFile('wb+') for _ in range(args.num_proc)]
|
|
processes = []
|
|
for i, output_file in enumerate(output_files):
|
|
print('Tester', i)
|
|
processes.append(subprocess.Popen(cmd, stdout=output_file,
|
|
stderr=subprocess.STDOUT))
|
|
try:
|
|
# Wait for processes to terminate.
|
|
for proc in processes:
|
|
proc.wait()
|
|
except KeyboardInterrupt:
|
|
for proc in processes:
|
|
proc.kill()
|
|
# Output results.
|
|
print('\n**** Results ****\n')
|
|
output_dirs = []
|
|
for i, output_file in enumerate(output_files):
|
|
output_file.seek(0)
|
|
output_str = output_file.read().decode('ascii')
|
|
output_file.close()
|
|
# Extract output directory. Example match: 'Directory : /tmp/tmp8ltpfjng'.
|
|
directory_match = re.search(r'Directory[^:]*: ([^\n]+)\n', output_str)
|
|
if directory_match:
|
|
output_dirs.append(directory_match.group(1))
|
|
if output_str.find(SUCCESS_STRING) == NOT_FOUND:
|
|
print('Tester', i, FAILURE_STRING)
|
|
else:
|
|
print('Tester', i, SUCCESS_STRING)
|
|
# Gather divergences.
|
|
global_out_dir = mkdtemp('jfuzz_nightly')
|
|
divergence_nr = 0
|
|
for out_dir in output_dirs:
|
|
for divergence_dir in glob(out_dir + '/divergence*/'):
|
|
divergence_nr += 1
|
|
shutil.copytree(divergence_dir,
|
|
global_out_dir + '/divergence' + str(divergence_nr))
|
|
if divergence_nr > 0:
|
|
print('\n!!!! Divergences !!!!', divergence_nr)
|
|
else:
|
|
print ('\nSuccess')
|
|
print('\nGlobal output directory:', global_out_dir)
|
|
print()
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv)
|