[apparmor] [patch] parser: make caching tests not fail w/python <= 3.2
John Johansen
john.johansen at canonical.com
Wed Aug 26 21:26:40 UTC 2015
On 08/26/2015 01:51 PM, Steve Beattie wrote:
> Hi,
>
> In recent commits, Tyler fixed some problems with the caching behavior
> of the parser, as well as adjusting and improving the caching test
> script to verify these behaviors.
>
> In doing so, the test script adjusts the mtime of various
> files and ensures that the written files have the expected mtime
> timestamp. Unfortunately, the os.utime() function used to adjust mtime
> in python 3.2 (as included in Ubuntu 12.04 LTS) does not update with
> nanosecond precision, even though the timestamps returned by os.stat()
> do have precision to nanoseconds. This causes the tests to fail when
> running under python 3.2 with errors like the following:
>
> ======================================================================
> FAIL: test_abstraction_newer_rewrites_cache (__main__.AAParserCachingTests)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File "/��PKGBUILDDIR��/parser/tst/testlib.py", line 50, in new_unittest_func
> return unittest_func(self)
> File "./caching.py", line 424, in test_abstraction_newer_rewrites_cache
> self._set_mtime(self.abstraction, abstraction_mtime)
> File "./caching.py", line 238, in _set_mtime
> self.assertEquals(os.stat(path).st_mtime, mtime)
> AssertionError: 1440337039.40212 != 1440337039.4021206
>
> The following patch creates a new time stamp equality assertion
> function that detects if it's running on python 3.2 or earlier, and
> loosens the equality bounds when comparing the passed timestamps. On
> python 3.3 and newer, where writing timestamps with nanosecond precision
> is supported, the strict equality assertion is used.
>
> (Note: I did not convert all time stamp comparisons, just ones where
> the timestamp written and checked could be based on a timestamp
> derived from os.stat().)
>
> Reference: https://bugs.python.org/issue12904
>
> Signed-off-by: Steve Beattie <steve at nxnw.org>
depressing, infuriating, sickening and
Acked-by: John Johansen <john.johansen at canonical.com>
> ---
> parser/tst/caching.py | 21 ++++++++++++++++++---
> 1 file changed, 18 insertions(+), 3 deletions(-)
>
> Index: b/parser/tst/caching.py
> ===================================================================
> --- a/parser/tst/caching.py
> +++ b/parser/tst/caching.py
> @@ -17,6 +17,7 @@
>
> from argparse import ArgumentParser
> import os
> +import platform
> import shutil
> import time
> import tempfile
> @@ -232,10 +233,24 @@ class AAParserCachingTests(AAParserCachi
> self.run_cmd_check(cmd)
> self.assert_path_exists(self.cache_file)
>
> + def _assertTimeStampEquals(self, time1, time2):
> + '''Compare two timestamps to ensure equality'''
> +
> + # python 3.2 and earlier don't support writing timestamps with
> + # nanosecond resolution, only microsecond. When comparing
> + # timestamps in such an environment, loosen the equality bounds
> + # to compensate
> + # Reference: https://bugs.python.org/issue12904
> + (major, minor, _) = platform.python_version_tuple()
> + if (int(major) <= 3) and (int(minor) <= 2):
> + self.assertAlmostEquals(time1, time2, places=5)
> + else:
> + self.assertEquals(time1, time2)
> +
> def _set_mtime(self, path, mtime):
> atime = os.stat(path).st_atime
> os.utime(path, (atime, mtime))
> - self.assertEquals(os.stat(path).st_mtime, mtime)
> + self._assertTimeStampEquals(os.stat(path).st_mtime, mtime)
>
> def test_cache_loaded_when_exists(self):
> '''test cache is loaded when it exists, is newer than profile, and features match'''
> @@ -414,7 +429,7 @@ class AAParserCachingTests(AAParserCachi
>
> stat = os.stat(self.cache_file)
> self.assertNotEquals(orig_stat.st_ino, stat.st_ino)
> - self.assertEquals(profile_mtime, stat.st_mtime)
> + self._assertTimeStampEquals(profile_mtime, stat.st_mtime)
>
> def test_abstraction_newer_rewrites_cache(self):
> '''test cache is rewritten if abstraction is newer'''
> @@ -431,7 +446,7 @@ class AAParserCachingTests(AAParserCachi
>
> stat = os.stat(self.cache_file)
> self.assertNotEquals(orig_stat.st_ino, stat.st_ino)
> - self.assertEquals(abstraction_mtime, stat.st_mtime)
> + self._assertTimeStampEquals(abstraction_mtime, stat.st_mtime)
>
> def test_parser_newer_uses_cache(self):
> '''test cache is not skipped if parser is newer'''
>
>
>
More information about the AppArmor
mailing list