summaryrefslogtreecommitdiffstats
path: root/comm/third_party/botan/src/scripts/test_all_configs.py
diff options
context:
space:
mode:
Diffstat (limited to 'comm/third_party/botan/src/scripts/test_all_configs.py')
-rwxr-xr-xcomm/third_party/botan/src/scripts/test_all_configs.py136
1 files changed, 136 insertions, 0 deletions
diff --git a/comm/third_party/botan/src/scripts/test_all_configs.py b/comm/third_party/botan/src/scripts/test_all_configs.py
new file mode 100755
index 0000000000..227abd952f
--- /dev/null
+++ b/comm/third_party/botan/src/scripts/test_all_configs.py
@@ -0,0 +1,136 @@
+#!/usr/bin/python
+
+"""
+This configures and builds with many different sub-configurations
+in an attempt to flush out missing feature macro checks, etc.
+
+There is probably no reason for you to run this. Unless you want to.
+
+(C) 2017 Jack Lloyd
+
+Botan is released under the Simplified BSD License (see license.txt)
+"""
+
+import optparse # pylint: disable=deprecated-module
+import sys
+import subprocess
+
+def get_module_list(configure_py):
+ configure = subprocess.Popen([configure_py, '--list-modules'], stdout=subprocess.PIPE)
+
+ (stdout, _) = configure.communicate()
+
+ if configure.returncode != 0:
+ raise Exception("Running configure.py --list-modules failed")
+
+ modules = [s.decode('ascii') for s in stdout.split()]
+ modules.remove('tpm') # can't test
+ modules.remove('base') # can't remove
+ return modules
+
+def get_concurrency():
+ def_concurrency = 2
+
+ try:
+ import multiprocessing
+ return max(def_concurrency, multiprocessing.cpu_count())
+ except ImportError:
+ return def_concurrency
+
+def try_to_run(cmdline):
+ print("Running %s ... " % (' '.join(cmdline)))
+ sys.stdout.flush()
+
+ cmd = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (stdout, stderr) = cmd.communicate()
+
+ failed = (cmd.returncode != 0)
+
+ if failed:
+ print("FAILURE")
+ print(stdout)
+ print(stderr)
+ sys.stdout.flush()
+
+ return not failed
+
+def run_test_build(configure_py, modules, include, jobs, run_tests):
+ config = [configure_py, '--without-documentation']
+
+ if include:
+ config.append('--minimized')
+ if modules:
+ config.append('--enable-modules=' + ','.join(modules))
+ else:
+ config.append('--disable-modules=' + ','.join(modules))
+
+ if try_to_run(config) is False:
+ return False
+
+ if try_to_run(['make', '-j', str(jobs)]) is False:
+ return False
+
+ if run_tests is False:
+ return True
+
+ # Flaky test causing errors when running tests
+ tests_to_skip = []
+
+ cmdline = ['./botan-test', '--test-threads=%d' % (jobs)]
+
+ if len(tests_to_skip) > 0:
+ cmdline.append('--skip-tests=%s' % (','.join(tests_to_skip)))
+
+ return try_to_run(cmdline)
+
+def main(args):
+
+ # TODO take configure.py and botan-test paths via options
+
+ parser = optparse.OptionParser()
+
+ parser.add_option('--run-tests', default=False, action='store_true')
+ parser.add_option('--jobs', default=get_concurrency(),
+ help="jobs to run (default %default)")
+
+ (options, args) = parser.parse_args(args)
+
+ run_tests = options.run_tests
+ jobs = int(options.jobs)
+
+ configure_py = './configure.py'
+ modules = get_module_list(configure_py)
+
+ cant_disable = ['block', 'hash', 'hex', 'mac', 'modes', 'rng', 'stream', 'utils', 'cpuid', 'entropy']
+ always_include = ['thread_utils', 'sha2_64']#, 'sha2_64', 'aes']
+
+ fails = 0
+ failed = []
+
+ for module in sorted(modules):
+ if (module in always_include) or (module in cant_disable):
+ continue # already testing it
+
+ extra = []
+ if module == 'auto_rng':
+ extra.append('dev_random')
+ if run_test_build(configure_py, [module] + always_include + extra, True, jobs, run_tests) is False:
+ failed.append(module)
+ fails += 1
+
+ for module in sorted(modules):
+ if module in cant_disable or module in always_include:
+ continue
+ if run_test_build(configure_py, [module], False, jobs, run_tests) is False:
+ failed.append(module)
+ fails += 1
+
+ if len(failed) > 0:
+ print("Failed building with %s" % (' '.join(failed)))
+ else:
+ print("All configurations ok")
+
+ return fails
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))