summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Marshall <catchjosh@gmail.com>2015-12-14 17:40:41 -0600
committerJoshua Marshall <catchjosh@gmail.com>2015-12-14 17:40:41 -0600
commit749c262c9864247617f2240921fb5efc25e52cda (patch)
tree8b174943711d385aa032f1072d70fc9d2326ad25
parente7cb8ba791bd89109022ff7b516787f16922a39b (diff)
downloadjsonrpclib-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.py9
-rw-r--r--tests.py64
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):
diff --git a/tests.py b/tests.py
index e241104..72d846d 100644
--- a/tests.py
+++ b/tests.py
@@ -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()