pqc/test/test_makefile_dependencies.py
Thom Wiggers 75be658074
Clean up tests
Modify the tests to no longer construct the classes multiple times and
to have them make use of the new helpers.make() function.
2019-03-04 17:02:46 +01:00

66 lines
2.4 KiB
Python

"""
Checks that every .c and .h file in an implementation is present as a
dependency of that scheme's Makefile.
"""
import os
import pqclean
import helpers
import glob
import datetime
def test_makefile_dependencies():
for scheme in pqclean.Scheme.all_schemes():
for implementation in scheme.implementations:
# initial build - want to have *all* files in place at beginning
helpers.make('clean', working_dir=implementation.path())
helpers.make(working_dir=implementation.path())
# test case for each candidate file
cfiles = glob.glob(os.path.join(implementation.path(), '*.c'))
hfiles = glob.glob(os.path.join(implementation.path(), '*.h'))
for file in cfiles + hfiles:
yield (check_makefile_dependencies, implementation, file)
def check_makefile_dependencies(implementation, file):
cfiles = glob.glob(os.path.join(implementation.path(), '*.c'))
hfiles = glob.glob(os.path.join(implementation.path(), '*.h'))
ofiles = glob.glob(os.path.join(implementation.path(), '*.o'))
libfile = os.path.join(implementation.path(), implementation.libname())
# modification time-based calculations is tricky on a sub-second basis
# so we reset all the modification times to a known and "sensible" order
now = datetime.datetime.now()
ago15 = now - datetime.timedelta(seconds=15)
ago10 = now - datetime.timedelta(seconds=10)
ago5 = now - datetime.timedelta(seconds=5)
formatstring = "%Y%m%d%H%M.%S"
helpers.run_subprocess(
['touch', '-t', ago15.strftime(formatstring)] + cfiles + hfiles)
helpers.run_subprocess(
['touch', '-t', ago10.strftime(formatstring)] + ofiles)
helpers.run_subprocess(
['touch', '-t', ago5.strftime(formatstring), libfile])
# Sanity check: the scheme is up to date
helpers.run_subprocess(['make', '-q'], implementation.path(),
expected_returncode=0)
# touch the candidate .c / .h file
helpers.run_subprocess(['touch', '-t', now.strftime(formatstring), file])
# check if it needs to be rebuilt using make -q
helpers.run_subprocess(['make', '-q'], implementation.path(),
expected_returncode=1)
if __name__ == '__main__':
try:
import nose2
nose2.main()
except ImportError:
import nose
nose.runmodule()