def test_parallel_generation(self): cache = Cache(self.__dir, 20) def gen(): yield from [b"0", b"12", b"345", b"6789"] g1 = cache.set_generated("key", gen) g2 = cache.set_generated("key", gen) next(g1) files = os.listdir(self.__dir) self.assertEqual(len(files), 1) for x in files: self.assertTrue(x.endswith(".part")) next(g2) files = os.listdir(self.__dir) self.assertEqual(len(files), 2) for x in files: self.assertTrue(x.endswith(".part")) self.assertEqual(cache.size, 0) for x in g1: pass self.assertEqual(cache.size, 10) self.assertTrue(cache.has("key")) # Replace the file - size should stay the same for x in g2: pass self.assertEqual(cache.size, 10) self.assertTrue(cache.has("key")) # Only a single file self.assertEqual(len(os.listdir(self.__dir)), 1)
def test_cleanup_on_error(self): cache = Cache(self.__dir, 10) def gen(): # Cause a TypeError halfway through yield from [b"0", b"12", object(), b"345", b"6789"] with self.assertRaises(TypeError): for x in cache.set_generated("key", gen): pass # Make sure no partial files are left after the error self.assertEqual(list(os.listdir(self.__dir)), list())
def test_store_generated(self): cache = Cache(self.__dir, 10) val = [b"0", b"12", b"345", b"6789"] def gen(): yield from val t = [] for x in cache.set_generated("key", gen): t.append(x) self.assertEqual(cache.size, 0) self.assertFalse(cache.has("key")) self.assertEqual(t, val) self.assertEqual(cache.size, 10) self.assertEqual(cache.get_value("key"), b"".join(val))