diff options
author | Joshua Marshall <catchjosh@gmail.com> | 2015-12-14 17:40:41 -0600 |
---|---|---|
committer | Joshua Marshall <catchjosh@gmail.com> | 2015-12-14 17:40:41 -0600 |
commit | 749c262c9864247617f2240921fb5efc25e52cda (patch) | |
tree | 8b174943711d385aa032f1072d70fc9d2326ad25 | |
parent | e7cb8ba791bd89109022ff7b516787f16922a39b (diff) | |
download | jsonrpclib-749c262c9864247617f2240921fb5efc25e52cda.tar.gz |
Adding history configuration.truncate-history
Truncating request and response history to 20 entries by default,
allowing history.size to specify a discrete number of entries (positive),
unlimited entries (less than 0), or no history (zero).
-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() |