From 8b60bd6a91854a41ca2d0e955c1f97a0b0c48d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 9 May 2020 23:55:14 +0200 Subject: [PATCH] mock 'time()' in cache tests instead of calling 'sleep()' to let time advance. This shortens the time needed to run those tests, and ensures consistent results. (Tests would randomly fail when using 'sleep()') --- gallery_dl/cache.py | 2 +- test/test_cache.py | 54 ++++++++++++++++++++++++++++++--------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/gallery_dl/cache.py b/gallery_dl/cache.py index 6cde65dc..5efa0eb3 100644 --- a/gallery_dl/cache.py +++ b/gallery_dl/cache.py @@ -57,7 +57,7 @@ class MemoryCacheDecorator(CacheDecorator): value, expires = self.cache[key] except KeyError: expires = 0 - if expires < timestamp: + if expires <= timestamp: value = self.func(*args, **kwargs) expires = timestamp + self.maxage self.cache[key] = value, expires diff --git a/test/test_cache.py b/test/test_cache.py index e19896e9..753bda77 100644 --- a/test/test_cache.py +++ b/test/test_cache.py @@ -10,8 +10,8 @@ import os import sys import unittest +from unittest.mock import patch -import time import tempfile sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -86,32 +86,50 @@ class TestCache(unittest.TestCase): self.assertEqual(ka(9, 9, 2), 6) def test_expires_mem(self): - @cache.memcache(maxage=1) + @cache.memcache(maxage=2) def ex(a, b, c): return a+b+c - self.assertEqual(ex(1, 1, 1), 3) - self.assertEqual(ex(2, 2, 2), 3) - self.assertEqual(ex(3, 3, 3), 3) + with patch("time.time") as tmock: + tmock.return_value = 0.001 + self.assertEqual(ex(1, 1, 1), 3) + self.assertEqual(ex(2, 2, 2), 3) + self.assertEqual(ex(3, 3, 3), 3) - time.sleep(2) - self.assertEqual(ex(3, 3, 3), 9) - self.assertEqual(ex(2, 2, 2), 9) - self.assertEqual(ex(1, 1, 1), 9) + # value is still cached after 1 second + tmock.return_value += 1.0 + self.assertEqual(ex(3, 3, 3), 3) + self.assertEqual(ex(2, 2, 2), 3) + self.assertEqual(ex(1, 1, 1), 3) + + # new value after 'maxage' seconds + tmock.return_value += 1.0 + self.assertEqual(ex(3, 3, 3), 9) + self.assertEqual(ex(2, 2, 2), 9) + self.assertEqual(ex(1, 1, 1), 9) def test_expires_db(self): - @cache.cache(maxage=1) + @cache.cache(maxage=2) def ex(a, b, c): return a+b+c - self.assertEqual(ex(1, 1, 1), 3) - self.assertEqual(ex(2, 2, 2), 3) - self.assertEqual(ex(3, 3, 3), 3) - - time.sleep(2) - self.assertEqual(ex(3, 3, 3), 9) - self.assertEqual(ex(2, 2, 2), 9) - self.assertEqual(ex(1, 1, 1), 9) + with patch("time.time") as tmock: + tmock.return_value = 0.999 + self.assertEqual(ex(1, 1, 1), 3) + self.assertEqual(ex(2, 2, 2), 3) + self.assertEqual(ex(3, 3, 3), 3) + + # value is still cached after 1 second + tmock.return_value += 1.0 + self.assertEqual(ex(3, 3, 3), 3) + self.assertEqual(ex(2, 2, 2), 3) + self.assertEqual(ex(1, 1, 1), 3) + + # new value after 'maxage' seconds + tmock.return_value += 1.0 + self.assertEqual(ex(3, 3, 3), 9) + self.assertEqual(ex(2, 2, 2), 9) + self.assertEqual(ex(1, 1, 1), 9) def test_update_mem_simple(self): @cache.memcache(keyarg=0)