From 13867ab7b47fb3ad8af3faa9f268987d6d9c99c5 Mon Sep 17 00:00:00 2001 From: Thom Wiggers Date: Mon, 4 Mar 2019 16:56:05 +0100 Subject: [PATCH] Fix tests on Windows --- test/pqclean.py | 13 +++++++ test/test_makefile_dependencies.py | 61 ++++++++++++++++++++---------- test/test_testvectors.py | 12 ++++-- 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/test/pqclean.py b/test/pqclean.py index df909fd7..f3384dbe 100644 --- a/test/pqclean.py +++ b/test/pqclean.py @@ -1,4 +1,5 @@ import os +import glob import yaml @@ -73,8 +74,20 @@ class Implementation: return os.path.join(self.scheme.path(), self.name) def libname(self) -> str: + if os.name == 'nt': + return "lib{}_{}.lib".format(self.scheme.name, self.name) return "lib{}_{}.a".format(self.scheme.name, self.name) + def cfiles(self) -> [str]: + return glob.glob(os.path.join(self.path(), '*.c')) + + def hfiles(self) -> [str]: + return glob.glob(os.path.join(self.path(), '*.h')) + + def ofiles(self) -> [str]: + return glob.glob(os.path.join(self.path(), + '*.o' if os.name != 'nt' else '*.obj')) + @staticmethod def by_name(scheme_name, implementation_name): scheme = Scheme.by_name(scheme_name) diff --git a/test/test_makefile_dependencies.py b/test/test_makefile_dependencies.py index b416f94f..9045cb3f 100644 --- a/test/test_makefile_dependencies.py +++ b/test/test_makefile_dependencies.py @@ -19,41 +19,62 @@ def test_makefile_dependencies(): # 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: + for file in (cfiles + hfiles): yield (check_makefile_dependencies, implementation, file) +def touch(time, *files): + if not files: + raise Exception("Please specify the files to update") + if os.name == 'nt': + formatstring = "Get-Date -year %Y -month %m -day %d -hour %H -minute %M -second %S" + time = time.strftime(formatstring) + commands = [] + for file in files: + commands.append('(ls {}).LastWriteTime = {}'.format(file, time)) + + helpers.run_subprocess(['powershell', '; '.join(commands)]) + else: + formatstring = "%Y%m%d%H%M.%S" + time = time.strftime(formatstring) + helpers.run_subprocess(['touch', '-t', time, *files]) + + +def make_check(path, expect_error=False): + makeflag = '-q' if os.name != 'nt' else '/Q' + expected_returncode = 0 + if expect_error: + expected_returncode = 1 if os.name != 'nt' else 255 + helpers.make(makeflag, working_dir=path, + expected_returncode=expected_returncode) + + 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')) + cfiles = implementation.cfiles() + hfiles = implementation.hfiles() + ofiles = implementation.ofiles() 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]) + now = datetime.datetime.now() - datetime.timedelta(seconds=10) + ago15 = now - datetime.timedelta(minutes=15) + ago10 = now - datetime.timedelta(minutes=10) + ago5 = now - datetime.timedelta(minutes=5) + + touch(ago15, *cfiles, *hfiles) + touch(ago10, *ofiles) + touch(ago5, libfile) # Sanity check: the scheme is up to date - helpers.run_subprocess(['make', '-q'], implementation.path(), - expected_returncode=0) + make_check(implementation.path()) # touch the candidate .c / .h file - helpers.run_subprocess(['touch', '-t', now.strftime(formatstring), file]) + touch(now, file) # check if it needs to be rebuilt using make -q - helpers.run_subprocess(['make', '-q'], implementation.path(), - expected_returncode=1) + make_check(implementation.path(), expect_error=True) if __name__ == '__main__': diff --git a/test/test_testvectors.py b/test/test_testvectors.py index 4f17c2aa..14afb92f 100644 --- a/test/test_testvectors.py +++ b/test/test_testvectors.py @@ -16,15 +16,19 @@ def test_testvectors(): def check_vectors(implementation): - helpers.make(TYPE=implementation.scheme.type, + helpers.make('testvectors', + TYPE=implementation.scheme.type, SCHEME=implementation.scheme.name, IMPLEMENTATION=implementation.name, working_dir=os.path.join('..', 'test')) out = helpers.run_subprocess( - ['./testvectors_{}_{}'.format(implementation.scheme.name, - implementation.name)], + [os.path.join('..', 'bin', 'testvectors_{}_{}{}'.format( + implementation.scheme.name, + implementation.name, + '.exe' if os.name == 'nt' else '' + ))], os.path.join('..', 'bin'), - ) + ).replace('\r', '') assert(implementation.scheme.metadata()['testvectors-sha256'].lower() == hashlib.sha256(out.encode('utf-8')).hexdigest().lower())