GlandVergil's picture
Upload 686 files
3cdaa7d verified
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# :noTabs=true:
# (c) Copyright Rosetta Commons Member Institutions.
# (c) This file is part of the Rosetta software suite and is made available under license.
# (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
# (c) For more information, see http://www.rosettacommons.org. Questions about this can be
# (c) addressed to University of Washington CoMotion, email: license@uw.edu.
## @file dummy.py
## @brief self-test and debug-aids tests
## @author Sergey Lyskov
import os, os.path, shutil, re, string
import json
import random
import imp
imp.load_source(__name__, '/'.join(__file__.split('/')[:-1]) + '/__init__.py') # A bit of Python magic here, what we trying to say is this: from __init__ import *, but init is calculated from file location
_api_version_ = '1.0'
def run_state_test(repository_root, working_dir, platform, config):
revision_id = config['revision']
states = (_S_passed_, _S_failed_, _S_build_failed_, _S_script_failed_)
state = states[revision_id % len(states)]
return {_StateKey_ : state, _ResultsKey_ : {}, _LogKey_ : f'run_state_test: setting test state to {state!r}...' }
sub_test_description_template = '''\
# subtests_test test suite
These sub-test description is generated for 3/4 of sub-tests
-----
### {name}
The warm time, had already disappeared like dust. Broken rain, fragment of light shadow, bring more pain to my heart...
-----
'''
def run_subtests_test(repository_root, working_dir, platform, config):
tests = {}
for i in range(16):
name = f's-{i:02}'
log = ('x'*63 + '\n') * 16 * 256 * i
s = i % 3
if s == 0: state = _S_passed_
elif s == 1: state = _S_failed_
else: state = _S_script_failed_
if i % 4:
os.mkdir( f'{working_dir}/{name}' )
with open(f'{working_dir}/{name}/description.md', 'w') as f: f.write( sub_test_description_template.format(**vars()) )
with open( f'{working_dir}/{name}/fantome.txt', 'w') as f: f.write('No one wants to hear the sequel to a fairytale\n')
tests[name] = { _StateKey_ : state, _LogKey_ : log, }
test_log = ('*'*63 + '\n') * 16 * 1024 * 16
return {_StateKey_ : _S_failed_, _ResultsKey_ : {_TestsKey_: tests}, _LogKey_ : test_log }
def run_regression_test(repository_root, working_dir, platform, config):
const = 'const'
volatile = 'volatile'
new = ''.join( random.sample( string.ascii_letters + string.digits, 8) )
oversized = 'oversized'
sub_tests = [const, volatile, new]
const_dir = working_dir + '/' + const
os.mkdir(const_dir)
with open(const_dir + '/const_data', 'w') as f: f.write( '\n'.join( (str(i) for i in range(32) ) ) )
volatile_dir = working_dir + '/' + volatile
os.mkdir(volatile_dir)
with open(volatile_dir + '/const_data', 'w') as f: f.write( '\n'.join( (str(i) for i in range(32, 64) ) ) )
with open(volatile_dir + '/volatile_data', 'w') as f: f.write( '\n'.join( ( ''.join(random.sample( string.ascii_letters + string.digits, 8) ) for i in range(32) ) ) )
new_dir = working_dir + '/' + new
os.mkdir(new_dir)
with open(new_dir + '/data', 'w') as f: f.write( '\n'.join( (str(i) for i in range(64)) ) )
new_dir = working_dir + '/' + oversized
os.mkdir(new_dir)
with open(new_dir + '/large', 'w') as f: f.write( ('x'*63 + '\n')*16*1024*256 +'extra')
return {_StateKey_ : _S_queued_for_comparison_, _ResultsKey_ : {}, _LogKey_ : f'sub-tests: {sub_tests!r}' }
def run_release_test(repository_root, working_dir, platform, config):
release_root = config['mounts'].get('release_root')
branch = config['branch']
revision = config['revision']
assert release_root, "config['release_root'] must be set!"
release_path = f'{release_root}/dummy'
if not os.path.isdir(release_path): os.makedirs(release_path)
with open(f'{release_path}/{branch}-{revision}.txt', 'w') as f: f.write('dummy release file\n')
return {_StateKey_ : _S_passed_, _ResultsKey_ : {}, _LogKey_ : f'Config release root set to: {release_root}'}
def run_python_test(repository_root, working_dir, platform, config):
import zlib, ssl
python_environment = local_python_install(platform, config)
if platform['python'][0] == '2': pass
else:
if platform['os'] == 'mac' and int( platform['python'].split('.')[1] ) > 6 :
# SSL certificate test
import urllib.request; urllib.request.urlopen('https://benchmark.graylab.jhu.edu')
ves = [
setup_persistent_python_virtual_environment(python_environment, packages='colr dice xdice pdp11games'),
setup_python_virtual_environment(working_dir, python_environment, packages='colr dice xdice pdp11games'),
]
for ve in ves:
commands = [
'import colr, dice, xdice, pdp11games',
]
if platform['os'] == 'mac' and int( platform['python'].split('.')[1] ) > 6 :
# SSL certificate test
commands.append('import urllib.request; urllib.request.urlopen("https://benchmark.graylab.jhu.edu/queue")')
for command in commands:
execute('Testing local Python virtual enviroment...', f"{ve.activate} && {ve.python} -c '{command}'")
execute('Testing local Python virtual enviroment...', f"{ve.activate} && python -c '{command}'")
return {_StateKey_ : _S_passed_, _ResultsKey_ : {}, _LogKey_ : f'Done!'}
def compare(test, results, files_path, previous_results, previous_files_path):
"""
Compare the results of two tests run (new vs. previous) for regression test
Take two dict and two paths
Must return standard dict with results
:param test: str
:param results: dict
:param files_path: str
:param previous_results: dict
:param previous_files_path: str
:rtype: dict
"""
ignore_files = []
results = dict(tests={}, summary=dict(total=0, failed=0, failed_tests=[])) # , config={}
if previous_files_path:
for test in os.listdir(files_path):
if os.path.isdir(files_path + '/' + test):
exclude = ''.join([' --exclude="{}"'.format(f) for f in ignore_files] ) + ' --exclude="*.ignore"'
res, brief_diff = execute('Comparing {}...'.format(test), 'diff -rq {exclude} {0}/{test} {1}/{test}'.format(previous_files_path, files_path, test=test, exclude=exclude), return_='tuple')
res, full_diff = execute('Comparing {}...'.format(test), 'diff -r {exclude} {0}/{test} {1}/{test}'.format(previous_files_path, files_path, test=test, exclude=exclude), return_='tuple')
diff = 'Brief Diff:\n' + brief_diff + ( ('\n\nFull Diff:\n' + full_diff[:1024*1024*1]) if full_diff != brief_diff else '' )
state = _S_failed_ if res else _S_passed_
results['tests'][test] = {_StateKey_: state, _LogKey_: diff if state != _S_passed_ else ''}
results['summary']['total'] += 1
if res: results['summary']['failed'] += 1; results['summary']['failed_tests'].append(test)
else: # no previous tests case, returning 'passed' for all sub_tests
for test in os.listdir(files_path):
if os.path.isdir(files_path + '/' + test):
results['tests'][test] = {_StateKey_: _S_passed_, _LogKey_: 'First run, no previous results available. Skipping comparison...\n'}
results['summary']['total'] += 1
for test in os.listdir(files_path):
if os.path.isdir(files_path + '/' + test):
if os.path.isfile(files_path+'/'+test+'/.test_did_not_run.log') or os.path.isfile(files_path+'/'+test+'/.test_got_timeout_kill.log'):
results['tests'][test][_StateKey_] = _S_script_failed_
results['tests'][test][_LogKey_] += '\nCompare(...): Marking as "Script failed" due to presense of .test_did_not_run.log or .test_got_timeout_kill.log file!\n'
if test not in results['summary']['failed_tests']:
results['summary']['failed'] += 1
results['summary']['failed_tests'].append(test)
state = _S_failed_ if results['summary']['failed'] else _S_passed_
return {_StateKey_: state, _LogKey_: 'Comparison dummy log...', _ResultsKey_: results}
def run(test, repository_root, working_dir, platform, config, hpc_driver=None, verbose=False, debug=False):
if test == 'state': return run_state_test (repository_root, working_dir, platform, config)
elif test == 'regression': return run_regression_test (repository_root, working_dir, platform, config)
elif test == 'subtests': return run_subtests_test (repository_root, working_dir, platform, config)
elif test == 'release': return run_release_test (repository_root, working_dir, platform, config)
elif test == 'python': return run_python_test (repository_root, working_dir, platform, config)
else: raise BenchmarkError(f'Dummy test script does not support run with test={test!r}!')