class SimpleTests(TestCase): def setUp(self): d = dict([(x[0], x[1]) for x in common_options + rare_options]) self.r = RawServer(d) self.a = self.r.create_udpsocket(8051, '127.0.0.1') self.b = self.r.create_udpsocket(8052, '127.0.0.1') def tearDown(self): self.a.close() self.b.close() def Handler(self, expected): class h(object): def __init__(self, expected, a=self.assertEqual): self.expected = expected self.a = a def data_came_in(self, connection, data): self.a(self.expected, data) return h(expected) def testFoo(self): self.r.start_listening_udp(self.a, self.Handler('')) self.r.start_listening_udp(self.b, self.Handler('foo')) self.a.sendto("foo", 0, ('127.0.0.1', 8052)) self.r.listen_once() def testBackForth(self): self.r.start_listening_udp(self.a, self.Handler('bar')) self.r.start_listening_udp(self.b, self.Handler('foo')) self.a.sendto("foo", 0, ('127.0.0.1', 8052)) self.r.listen_once() self.b.sendto("bar", 0, ('127.0.0.1', 8051)) self.r.listen_once()
class SimpleTests(TestCase): def setUp(self): d = dict([(x[0],x[1]) for x in common_options + rare_options]) self.r = RawServer(d) self.a = self.r.create_udpsocket(8051, '127.0.0.1') self.b = self.r.create_udpsocket(8052, '127.0.0.1') def tearDown(self): self.a.close() self.b.close() def Handler(self, expected): class h(object): def __init__(self, expected, a=self.assertEqual): self.expected = expected self.a = a def data_came_in(self, connection, data): self.a(self.expected, data) return h(expected) def testFoo(self): self.r.start_listening_udp(self.a, self.Handler('')) self.r.start_listening_udp(self.b, self.Handler('foo')) self.a.sendto("foo", 0, ('127.0.0.1', 8052)) self.r.listen_once() def testBackForth(self): self.r.start_listening_udp(self.a, self.Handler('bar')) self.r.start_listening_udp(self.b, self.Handler('foo')) self.a.sendto("foo", 0, ('127.0.0.1', 8052)) self.r.listen_once() self.b.sendto("bar", 0, ('127.0.0.1', 8051)) self.r.listen_once()
class KhashmirBase: _Node = KNodeBase def __init__(self, host, port, data_dir, rawserver=None, max_ul_rate=1024, checkpoint=True, errfunc=None, rlcount=foo, config={ 'pause': False, 'max_rate_period': 20 }): if rawserver: self.rawserver = rawserver else: self.flag = Event() d = dict([(x[0], x[1]) for x in common_options + rare_options]) self.rawserver = RawServer(self.flag, d) self.max_ul_rate = max_ul_rate self.socket = None self.config = config self.setup(host, port, data_dir, rlcount, checkpoint) def setup(self, host, port, data_dir, rlcount, checkpoint=True): self.host = host self.port = port self.ddir = data_dir self.store = KStore() self.pingcache = {} self.socket = self.rawserver.create_udpsocket(self.port, self.host) self.udp = krpc.hostbroker(self, (self.host, self.port), self.socket, self.rawserver.add_task, self.max_ul_rate, self.config, rlcount) self._load() self.rawserver.start_listening_udp(self.socket, self.udp) self.last = time() KeyExpirer(self.store, self.rawserver.add_task) self.refreshTable(force=1) if checkpoint: self.rawserver.add_task(30, self.findCloseNodes, lambda a: a, True) self.rawserver.add_task(60, self.checkpoint, 1) def Node(self): n = self._Node(self.udp.connectionForAddr) n.table = self return n def __del__(self): if self.socket is not None: self.rawserver.stop_listening_udp(self.socket) self.socket.close() def _load(self): do_load = False try: s = open(os.path.join(self.ddir, "routing_table"), 'r').read() dict = bdecode(s) except: id = newID() else: id = dict['id'] do_load = True self.node = self._Node(self.udp.connectionForAddr).init( id, self.host, self.port) self.table = KTable(self.node) if do_load: self._loadRoutingTable(dict['rt']) def checkpoint(self, auto=0): d = {} d['id'] = self.node.id d['rt'] = self._dumpRoutingTable() try: f = open(os.path.join(self.ddir, "routing_table"), 'wb') f.write(bencode(d)) f.close() except Exception, e: #XXX real error here print ">>> unable to dump routing table!", str(e) pass if auto: self.rawserver.add_task( randrange(int(const.CHECKPOINT_INTERVAL * .9), int(const.CHECKPOINT_INTERVAL * 1.1)), self.checkpoint, 1)
class KRPCTests(TestCase): def setUp(self): self.noisy = 0 d = dict([(x[0],x[1]) for x in common_options + rare_options]) self.r = RawServer(d) addr = ('127.0.0.1', 1180) self.as = self.r.create_udpsocket(addr[1], addr[0], True) self.af = Receiver(addr) self.a = hostbroker(self.af, addr, self.as, self.r.add_task) self.r.start_listening_udp(self.as, self.a) addr = ('127.0.0.1', 1181) self.bs = self.r.create_udpsocket(addr[1], addr[0], True) self.bf = Receiver(addr) self.b = hostbroker(self.bf, addr, self.bs, self.r.add_task) self.r.start_listening_udp(self.bs, self.b) def tearDown(self): self.as.close() self.bs.close() def testSimpleMessage(self): self.noisy = 0 self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('store', {'msg' : "This is a test."}) self.r.listen_once(0.01) self.assertEqual(self.bf.buf, ["This is a test."]) def testMessageBlast(self): self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('store', {'msg' : "This is a test."}) self.r.listen_once(0.01) self.assertEqual(self.bf.buf, ["This is a test."]) self.bf.buf = [] for i in range(100): self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('store', {'msg' : "This is a test."}) self.r.listen_once(0.01) #self.bf.buf = [] self.assertEqual(self.bf.buf, ["This is a test."] * 100) def testEcho(self): df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is a test.") def gotMsg(self, dict): _krpc_sender = dict['_krpc_sender'] msg = dict['rsp'] self.msg = msg def testManyEcho(self): df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is a test.") for i in xrange(100): self.msg = None df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is a test.") def testMultiEcho(self): self.noisy = 0 df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is a test.") df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is another test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is another test.") df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is yet another test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is yet another test.") def testEchoReset(self): self.noisy = 0 df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is a test.") df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is another test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is another test.") del(self.a.connections[('127.0.0.1', 1181)]) df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is yet another test."}) df.addCallback(self.gotMsg) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.msg, "This is yet another test.") def testLotsofEchoReset(self): for i in range(100): self.testEchoReset() def testUnknownMeth(self): self.noisy = 0 df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('blahblah', {'msg' : "This is a test."}) df.addErrback(self.gotErr) self.r.listen_once(0.01) self.r.listen_once(0.01) self.assertEqual(self.err, KRPC_ERROR_METHOD_UNKNOWN) def gotErr(self, err): self.err = err
class KhashmirBase: _Node = KNodeBase def __init__(self, host, port, data_dir, rawserver=None, max_ul_rate=1024, checkpoint=True, errfunc=None, rlcount=foo, config={'pause':False, 'max_rate_period':20}): if rawserver: self.rawserver = rawserver else: self.flag = Event() d = dict([(x[0],x[1]) for x in common_options + rare_options]) self.rawserver = RawServer(self.flag, d) self.max_ul_rate = max_ul_rate self.socket = None self.config = config self.setup(host, port, data_dir, rlcount, checkpoint) def setup(self, host, port, data_dir, rlcount, checkpoint=True): self.host = host self.port = port self.ddir = data_dir self.store = KStore() self.pingcache = {} self.socket = self.rawserver.create_udpsocket(self.port, self.host, False) self.udp = krpc.hostbroker(self, (self.host, self.port), self.socket, self.rawserver.add_task, self.max_ul_rate, self.config, rlcount) self._load() self.rawserver.start_listening_udp(self.socket, self.udp) self.last = time() KeyExpirer(self.store, self.rawserver.add_task) self.refreshTable(force=1) if checkpoint: self.rawserver.add_task(30, self.findCloseNodes, lambda a: a, True) self.rawserver.add_task(60, self.checkpoint, 1) def Node(self): n = self._Node(self.udp.connectionForAddr) n.table = self return n def __del__(self): if self.socket is not None: self.rawserver.stop_listening_udp(self.socket) self.socket.close() def _load(self): do_load = False try: s = open(os.path.join(self.ddir, "routing_table"), 'r').read() dict = bdecode(s) except: id = newID() else: id = dict['id'] do_load = True self.node = self._Node(self.udp.connectionForAddr).init(id, self.host, self.port) self.table = KTable(self.node) if do_load: self._loadRoutingTable(dict['rt']) def checkpoint(self, auto=0): d = {} d['id'] = self.node.id d['rt'] = self._dumpRoutingTable() try: f = open(os.path.join(self.ddir, "routing_table"), 'wb') f.write(bencode(d)) f.close() except Exception, e: #XXX real error here print ">>> unable to dump routing table!", str(e) pass if auto: self.rawserver.add_task(randrange(int(const.CHECKPOINT_INTERVAL * .9), int(const.CHECKPOINT_INTERVAL * 1.1)), self.checkpoint, 1)