diff options
author | Josh Marshall <catchjosh@gmail.com> | 2021-03-30 11:05:45 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-30 11:05:45 +0900 |
commit | 73f252aaceab9bb28a62d1d5ba2967cc455c4068 (patch) | |
tree | 3f9e37883b2e683aa46237494b346e94732acf59 | |
parent | 9f1cb474c7e0f7e5ff87d5fa3acd5cb6adab2ae1 (diff) | |
parent | 749c262c9864247617f2240921fb5efc25e52cda (diff) | |
download | jsonrpclib-73f252aaceab9bb28a62d1d5ba2967cc455c4068.tar.gz |
Merge pull request #48 from joshmarshall/truncate-history
Adding history configuration.
-rw-r--r-- | jsonrpclib/history.py | 9 | ||||
-rw-r--r-- | tests.py | 64 |
2 files changed, 73 insertions, 0 deletions
diff --git a/jsonrpclib/history.py b/jsonrpclib/history.py index f052baa..090f996 100644 --- a/jsonrpclib/history.py +++ b/jsonrpclib/history.py @@ -5,6 +5,7 @@ class History(object): each request cycle in order to keep it from clogging memory. """ + size = 20 requests = [] responses = [] _instance = None @@ -16,10 +17,18 @@ class History(object): return cls._instance def add_response(self, response_obj): + if self.size == 0: + return self.responses.append(response_obj) + if self.size > 0: + self.responses = self.responses[0 - self.size:] def add_request(self, request_obj): + if self.size == 0: + return self.requests.append(request_obj) + if self.size > 0: + self.requests = self.requests[0 - self.size:] @property def request(self): @@ -36,6 +36,9 @@ from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCRequestHandler +ORIGINAL_HISTORY_SIZE = history.size + + def get_port(family=socket.AF_INET): sock = socket.socket(family, socket.SOCK_STREAM) sock.bind(("localhost", 0)) @@ -281,6 +284,11 @@ class InternalTests(unittest.TestCase): def setUp(self): self.port = get_port() self.server = server_set_up(addr=('', self.port)) + self.addCleanup(self.cleanup) + + def cleanup(self): + history.size = ORIGINAL_HISTORY_SIZE + history.clear() def get_client(self): return Server('http://localhost:%d' % self.port) @@ -331,6 +339,62 @@ class InternalTests(unittest.TestCase): self.assertTrue(verify_request == request) self.assertTrue(verify_response == response) + def test_history_defaults_to_20(self): + client = self.get_client() + self.assertEqual(20, history.size) + + for i in range(30): + client.namespace.sum(i, i) + + self.assertEqual(20, len(history.requests)) + self.assertEqual(20, len(history.responses)) + + verify_request = { + "jsonrpc": "2.0", "params": [29, 29], + "method": "namespace.sum" + } + verify_response = {"jsonrpc": "2.0", "result": 58} + + # it should truncate to the *last* 20 + request = json.loads(history.request) + response = json.loads(history.response) + + verify_request["id"] = request["id"] + self.assertEqual(request, verify_request) + + verify_response["id"] = request["id"] + self.assertEqual(response, verify_response) + + def test_history_allows_configurable_size(self): + client = self.get_client() + history.size = 10 + + for i in range(30): + client.namespace.sum(i, i) + + self.assertEqual(10, len(history.requests)) + self.assertEqual(10, len(history.responses)) + + def test_history_allows_unlimited_size(self): + client = self.get_client() + history.size = -1 + + for i in range(40): + client.namespace.sum(i, i) + + self.assertEqual(40, len(history.requests)) + self.assertEqual(40, len(history.responses)) + + def test_history_can_be_disabled(self): + client = self.get_client() + history.size = 0 + + for i in range(40): + client.namespace.sum(i, i) + + self.assertEqual(0, len(history.requests)) + self.assertEqual(0, len(history.responses)) + def test_multicall_success(self): multicall = self.get_multicall_client() multicall.ping() |