diff options
| author | Barry Warsaw | 2016-07-16 15:44:07 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2016-07-16 15:44:07 -0400 |
| commit | dbde6231ec897379ed38ed4cd015b8ab20ed5fa1 (patch) | |
| tree | 1226d06a238314262a1d04d0bbf9c4dc0b72c309 /src/mailman/model/tests/test_cache.py | |
| parent | 3387791beb7112dbe07664041f117fdcc20df53d (diff) | |
| download | mailman-dbde6231ec897379ed38ed4cd015b8ab20ed5fa1.tar.gz mailman-dbde6231ec897379ed38ed4cd015b8ab20ed5fa1.tar.zst mailman-dbde6231ec897379ed38ed4cd015b8ab20ed5fa1.zip | |
Diffstat (limited to 'src/mailman/model/tests/test_cache.py')
| -rw-r--r-- | src/mailman/model/tests/test_cache.py | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/mailman/model/tests/test_cache.py b/src/mailman/model/tests/test_cache.py new file mode 100644 index 000000000..2d910e202 --- /dev/null +++ b/src/mailman/model/tests/test_cache.py @@ -0,0 +1,110 @@ +# Copyright (C) 2016 by the Free Software Foundation, Inc. +# +# This file is part of GNU Mailman. +# +# GNU Mailman is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# GNU Mailman. If not, see <http://www.gnu.org/licenses/>. + +"""Test the cache.""" + +import os +import unittest + +from datetime import timedelta +from mailman.config import config +from mailman.interfaces.cache import ICacheManager +from mailman.testing.helpers import configuration +from mailman.testing.layers import ConfigLayer +from mailman.utilities.datetime import factory +from zope.component import getUtility + + +class TestCache(unittest.TestCase): + layer = ConfigLayer + + def setUp(self): + self._cachemgr = getUtility(ICacheManager) + + def test_add_str_contents(self): + file_id = self._cachemgr.add('abc', 'xyz') + self.assertEqual( + file_id, + 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad') + file_path = os.path.join(config.CACHE_DIR, 'ba', '78', file_id) + self.assertTrue(os.path.exists(file_path)) + # The original content was a string. + with open(file_path, 'r', encoding='utf-8') as fp: + self.assertEqual(fp.read(), 'xyz') + + def test_add_bytes_contents(self): + # No name is given so the file is cached by the hash of the contents. + file_id = self._cachemgr.add('abc', b'xyz') + self.assertEqual( + file_id, + 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad') + file_path = os.path.join(config.CACHE_DIR, 'ba', '78', file_id) + self.assertTrue(os.path.exists(file_path)) + # The original content was a string. + with open(file_path, 'br') as fp: + self.assertEqual(fp.read(), b'xyz') + + def test_add_overwrite(self): + # If the file already exists and hasn't expired, a conflict exception + # is raised the second time we try to save it. + self._cachemgr.add('abc', 'xyz') + self.assertEqual(self._cachemgr.get('abc'), 'xyz') + self._cachemgr.add('abc', 'def') + self.assertEqual(self._cachemgr.get('abc'), 'def') + + def test_get_str(self): + # Store a str, get a str. + self._cachemgr.add('abc', 'xyz') + contents = self._cachemgr.get('abc') + self.assertEqual(contents, 'xyz') + + def test_get_bytes(self): + # Store a bytes, get a bytes. + self._cachemgr.add('abc', b'xyz') + contents = self._cachemgr.get('abc') + self.assertEqual(contents, b'xyz') + + def test_get_str_expunge(self): + # When the entry is not expunged, it can be gotten multiple times. + # Once it's expunged, it's gone. + self._cachemgr.add('abc', 'xyz') + self.assertEqual(self._cachemgr.get('abc'), 'xyz') + self.assertEqual(self._cachemgr.get('abc', expunge=True), 'xyz') + self.assertIsNone(self._cachemgr.get('abc')) + + @configuration('mailman', cache_life='1d') + def test_evict(self): + # Evicting all expired cache entries makes them inaccessible. + self._cachemgr.add('abc', 'xyz', lifetime=timedelta(hours=3)) + self._cachemgr.add('def', 'uvw', lifetime=timedelta(days=3)) + self.assertEqual(self._cachemgr.get('abc'), 'xyz') + self.assertEqual(self._cachemgr.get('def'), 'uvw') + factory.fast_forward(days=1) + self._cachemgr.evict() + self.assertIsNone(self._cachemgr.get('abc')) + self.assertEqual(self._cachemgr.get('def'), 'uvw') + + def test_clear(self): + # Clearing the cache gets rid of all entries, regardless of lifetime. + self._cachemgr.add('abc', 'xyz', lifetime=timedelta(hours=3)) + self._cachemgr.add('def', 'uvw') + self.assertEqual(self._cachemgr.get('abc'), 'xyz') + self.assertEqual(self._cachemgr.get('def'), 'uvw') + factory.fast_forward(days=1) + self._cachemgr.clear() + self.assertIsNone(self._cachemgr.get('abc')) + self.assertIsNone(self._cachemgr.get('xyz')) |
