feat: expose per-group refresh plans and cache storage daily
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import sys,tempfile,unittest
|
||||
from pathlib import Path
|
||||
from types import SimpleNamespace
|
||||
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'app'))
|
||||
from storage_cache import StorageCache
|
||||
|
||||
|
||||
class StorageTests(unittest.TestCase):
|
||||
def test_daily_reads_and_restart_cache(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
now=[1000];reads=[]
|
||||
def reader(path):
|
||||
reads.append(path);return SimpleNamespace(total=1000,used=200,free=800)
|
||||
p=Path(directory)/'cache.json'
|
||||
cache=StorageCache(p,reader,lambda:now[0])
|
||||
self.assertEqual(cache.sample()['used'],200)
|
||||
for i in range(20):now[0]+=1;cache.sample()
|
||||
self.assertEqual(len(reads),1)
|
||||
restored=StorageCache(p,reader,lambda:now[0]);restored.sample()
|
||||
self.assertEqual(len(reads),1)
|
||||
now[0]=87400;restored.sample()
|
||||
self.assertEqual(len(reads),2)
|
||||
|
||||
def test_failure_does_not_fabricate_zero_or_retry_each_second(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
now=[1000];reads=[]
|
||||
def fail(path):reads.append(path);raise OSError('unavailable')
|
||||
cache=StorageCache(Path(directory)/'cache.json',fail,lambda:now[0])
|
||||
self.assertIsNone(cache.sample());self.assertTrue(cache.error)
|
||||
now[0]+=5;self.assertIsNone(cache.sample())
|
||||
self.assertEqual(len(reads),1)
|
||||
|
||||
def test_failed_read_cooldown_survives_restart(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
reads=[]
|
||||
def fail(path):reads.append(path);raise OSError('unavailable')
|
||||
p=Path(directory)/'cache.json'
|
||||
StorageCache(p,fail,lambda:1000).sample()
|
||||
restored=StorageCache(p,fail,lambda:1005)
|
||||
self.assertTrue(restored.error);self.assertIsNone(restored.sample())
|
||||
self.assertEqual(len(reads),1)
|
||||
Reference in New Issue
Block a user