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 <[email protected]>
depressing, infuriating, sickening and Acked-by: John Johansen <[email protected]> > --- > 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''' > > > -- AppArmor mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
