42 lines
1.9 KiB
Python
42 lines
1.9 KiB
Python
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)
|