[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