diff --git a/src/cachetools/__init__.py b/src/cachetools/__init__.py index 1b299c5..350122c 100644 --- a/src/cachetools/__init__.py +++ b/src/cachetools/__init__.py @@ -75,6 +75,8 @@ def __getitem__(self, key): def __setitem__(self, key, value): maxsize = self.__maxsize size = self.getsizeof(value) + if size < 0: + raise ValueError("value size must be non-negative") if size > maxsize: raise ValueError("value too large") if key not in self.__data or self.__size[key] < size: diff --git a/tests/__init__.py b/tests/__init__.py index 5856e71..a84f19e 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -284,6 +284,15 @@ def _test_getsizeof(self, cache): def test_getsizeof_param(self): self._test_getsizeof(self.Cache(maxsize=3, getsizeof=lambda x: x)) + def test_getsizeof_negative(self): + cache = self.Cache(maxsize=3, getsizeof=lambda x: -1) + + with self.assertRaises(ValueError): + cache[1] = 1 + + self.assertEqual(0, len(cache)) + self.assertEqual(0, cache.currsize) + def test_getsizeof_subclass(self): class Cache(self.Cache): @staticmethod