69 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
import py
 | 
						|
from py.__.misc.cache import BuildcostAccessCache, AgingCache
 | 
						|
 | 
						|
class BasicCacheAPITest:
 | 
						|
    cache = None
 | 
						|
    def test_getorbuild(self):
 | 
						|
        val = self.cache.getorbuild(-42, lambda: 42)
 | 
						|
        assert val == 42
 | 
						|
        val = self.cache.getorbuild(-42, lambda: 23)
 | 
						|
        assert val == 42
 | 
						|
 | 
						|
    def test_cache_get_key_error(self):
 | 
						|
        assert self.cache.getentry(-23) == None
 | 
						|
 | 
						|
    def test_delentry_non_raising(self):
 | 
						|
        val = self.cache.getorbuild(100, lambda: 100)
 | 
						|
        self.cache.delentry(100)
 | 
						|
        assert self.cache.getentry(100) is None
 | 
						|
 | 
						|
    def test_delentry_raising(self):
 | 
						|
        val = self.cache.getorbuild(100, lambda: 100)
 | 
						|
        self.cache.delentry(100)
 | 
						|
        py.test.raises(KeyError, "self.cache.delentry(100, raising=True)")
 | 
						|
 | 
						|
class TestBuildcostAccess(BasicCacheAPITest):
 | 
						|
    cache = BuildcostAccessCache(maxentries=128)
 | 
						|
 | 
						|
    def test_cache_works_somewhat_simple(self):
 | 
						|
        cache = BuildcostAccessCache()
 | 
						|
        for x in range(cache.maxentries):
 | 
						|
            y = cache.getorbuild(x, lambda: x)
 | 
						|
            assert x == y
 | 
						|
        for x in range(cache.maxentries):
 | 
						|
            assert cache.getorbuild(x, None) == x
 | 
						|
        for x in range(cache.maxentries/2):
 | 
						|
            assert cache.getorbuild(x, None) == x
 | 
						|
            assert cache.getorbuild(x, None) == x
 | 
						|
            assert cache.getorbuild(x, None) == x
 | 
						|
        val = cache.getorbuild(cache.maxentries * 2, lambda: 42)
 | 
						|
        assert val == 42
 | 
						|
        # check that recently used ones are still there
 | 
						|
        # and are not build again
 | 
						|
        for x in range(cache.maxentries/2):
 | 
						|
            assert cache.getorbuild(x, None) == x
 | 
						|
        assert cache.getorbuild(cache.maxentries*2, None) == 42
 | 
						|
 | 
						|
 | 
						|
class TestAging(BasicCacheAPITest):
 | 
						|
    maxsecs = 0.02
 | 
						|
    cache = AgingCache(maxentries=128, maxseconds=maxsecs)
 | 
						|
 | 
						|
    def test_cache_eviction(self):
 | 
						|
        self.cache.getorbuild(17, lambda: 17)
 | 
						|
        endtime = py.std.time.time() + self.maxsecs * 10 
 | 
						|
        while py.std.time.time() < endtime: 
 | 
						|
            if self.cache.getentry(17) is None: 
 | 
						|
                break 
 | 
						|
            py.std.time.sleep(self.maxsecs*0.3) 
 | 
						|
        else: 
 | 
						|
            py.test.fail("waiting for cache eviction failed") 
 | 
						|
 | 
						|
def test_prune_lowestweight(): 
 | 
						|
    maxsecs = 0.05 
 | 
						|
    cache = AgingCache(maxentries=10, maxseconds=maxsecs)
 | 
						|
    for x in range(cache.maxentries): 
 | 
						|
        cache.getorbuild(x, lambda: x) 
 | 
						|
    py.std.time.sleep(maxsecs*1.1) 
 | 
						|
    cache.getorbuild(cache.maxentries+1, lambda: 42) 
 |