def test_overflow_cache_size(self): settings = OrmucoCacheClientSettings() repository = MemoryRepository(settings) factory = CacheItemFactory(settings) for i in range(0, settings.cache_max_size + 2): key = str(i + 1) data = [1, 2, 3] cache_item = factory.build_cache_item(key, data) repository.store(cache_item) retrieve_result = repository.retrieve(str(5)) self.assertIsInstance(retrieve_result, CacheItem)
def test_store_to_invalid_server(self): settings = OrmucoCacheClientSettings() settings.server.port = 12424 repository = ClientNetworkRepository(settings) factory = CacheItemFactory(settings) key = 'some-key' data = [1, 2, 3] cache_item = factory.build_cache_item(key, data) store_result = repository.store(cache_item) self.assertEqual(store_result, False)
def test_lru_cache_updating(self): settings = OrmucoCacheClientSettings() repository = MemoryRepository(settings) factory = CacheItemFactory(settings) for i in range(0, 3): key = str(i + 1) data = [1, 2, 3] cache_item = factory.build_cache_item(key, data) repository.store(cache_item) retrieve_result = repository.retrieve(str(1)) self.assertIsInstance(retrieve_result, CacheItem)
def test_set_key_returns_same_data(self): settings = OrmucoCacheClientSettings() repository = MemoryRepository(settings) factory = CacheItemFactory(settings) key = 'some-key' data = [1, 2, 3] cache_item = factory.build_cache_item(key, data) store_result = repository.store(cache_item) self.assertEqual(store_result, True) retrieve_result = repository.retrieve(key) self.assertEqual(retrieve_result, cache_item)
def test_cache_item_expiration(self): settings = OrmucoCacheClientSettings() settings.cache_expiration = 0.0001 repository = MemoryRepository(settings) factory = CacheItemFactory(settings) key = 'some-key' data = [1, 2, 3] cache_item = factory.build_cache_item(key, data) store_result = repository.store(cache_item) self.assertEqual(store_result, True) time.sleep(settings.cache_expiration) retrieve_result = repository.retrieve(key) self.assertEqual(retrieve_result, None)
class ClientNetworkRepository(BaseRepository): delimiter = b'\r\n' def __init__(self, settings): super().__init__(settings) self.cache_item_factory = CacheItemFactory(self.settings) def send_command_to_server(self, command): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect( (self.settings.server.host, self.settings.server.port)) sock.sendall(command.encode() + self.delimiter) response = b'' while self.delimiter not in response: response += sock.recv(1024) response_as_string = response.decode('utf-8').strip() except: return None finally: sock.close() return response_as_string def retrieve(self, key): command = "RTRV " + key thread = ThreadWithReturnValue(target=self.send_command_to_server, args=(command, )) thread.setDaemon(True) thread.start() json_data = thread.join(timeout=self.settings.timeout) if json_data == None or json_data == 'MISS' or thread.isAlive(): return None else: return self.cache_item_factory.restore_cache_item(key, json_data) def store(self, cache_item): command = "STR " + cache_item.key + " " + json.dumps(cache_item.data) thread = ThreadWithReturnValue(target=self.send_command_to_server, args=(command, )) thread.setDaemon(True) thread.start() json_data = thread.join(timeout=self.settings.timeout) if json_data == 'ACK': return True else: return False
def test_retrieve_from_invalid_server(self): settings = OrmucoCacheClientSettings() settings.server.port = 12424 repository = ClientNetworkRepository(settings) factory = CacheItemFactory(settings) key = 'some-key' retrieve_result = repository.retrieve(key) self.assertEqual(retrieve_result, None)
class StoreCommand: COMMAND_PREFIX = 'STR' def __init__(self, settings): self.settings = settings self.repository = RepositoryFactory.build_repository(settings) self.cache_item_factory = CacheItemFactory(self.settings) def execute(self, key, data): cache_item = self.cache_item_factory.build_cache_item(key, data) return self.repository.store(cache_item)
def __init__(self, settings): self.settings = settings self.repository = RepositoryFactory.build_repository(settings) self.cache_item_factory = CacheItemFactory(self.settings)
def __init__(self, settings): super().__init__(settings) self.cache_item_factory = CacheItemFactory(self.settings)