|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- """
- 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.run_subprocess(['make', 'clean'], implementation.path())
- helpers.run_subprocess(['make'], 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, scheme.name,
- implementation.name, file)
-
-
- def check_makefile_dependencies(scheme_name, implementation_name, file):
- implementation = pqclean.Implementation.by_name(scheme_name,
- implementation_name)
-
- 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()
|