-### TESTING ###
-from random import randrange
-import threading, thread, sys, time
-from sha import sha
-from hash import newID
-
-
-def test_net(host='127.0.0.1', peers=24, startport=2001, dbprefix='/tmp/test'):
- import thread
- l = []
- for i in xrange(peers):
- a = Khashmir(host, startport + i, db = dbprefix+`i`)
- l.append(a)
- thread.start_new_thread(l[0].app.run, ())
- for peer in l[1:]:
- peer.app.run(installSignalHandlers=0)
- return l
-
-def test_build_net(quiet=0, peers=24, host='127.0.0.1', pause=0, startport=2001, dbprefix='/tmp/test'):
- from whrandom import randrange
- import threading
- import thread
- import sys
- port = startport
- l = []
- if not quiet:
- print "Building %s peer table." % peers
-
- for i in xrange(peers):
- a = Khashmir(host, port + i, db = dbprefix +`i`)
- l.append(a)
-
-
- thread.start_new_thread(l[0].app.run, ())
- time.sleep(1)
- for peer in l[1:]:
- peer.app.run(installSignalHandlers=0)
- #time.sleep(3)
-
- def spewer(frame, s, ignored):
- from twisted.python import reflect
- if frame.f_locals.has_key('self'):
- se = frame.f_locals['self']
- print 'method %s of %s at %s' % (
- frame.f_code.co_name, reflect.qual(se.__class__), id(se)
- )
- #sys.settrace(spewer)
-
- print "adding contacts...."
- def makecb(flag):
- def cb(f=flag):
- f.set()
- return cb
-
- for peer in l:
- p = l[randrange(0, len(l))]
- if p != peer:
- n = p.node
- flag = threading.Event()
- peer.addContact(host, n.port, makecb(flag))
- flag.wait()
- p = l[randrange(0, len(l))]
- if p != peer:
- n = p.node
- flag = threading.Event()
- peer.addContact(host, n.port, makecb(flag))
- flag.wait()
- p = l[randrange(0, len(l))]
- if p != peer:
- n = p.node
- flag = threading.Event()
- peer.addContact(host, n.port, makecb(flag))
- flag.wait()
-
- print "finding close nodes...."
-
- for peer in l:
- flag = threading.Event()
- def cb(nodes, f=flag):
- f.set()
- peer.findCloseNodes(cb)
- flag.wait()
- # for peer in l:
- # peer.refreshTable()
- return l
-
-def test_find_nodes(l, quiet=0):
- flag = threading.Event()
-
- n = len(l)
-
- a = l[randrange(0,n)]
- b = l[randrange(0,n)]
-
- def callback(nodes, flag=flag, id = b.node.id):
- if (len(nodes) >0) and (nodes[0].id == id):
- print "test_find_nodes PASSED"
- else:
- print "test_find_nodes FAILED"
- flag.set()
- a.findNode(b.node.id, callback)
- flag.wait()
-
-def test_find_value(l, quiet=0):
- ff = threading.Event()
- fa = threading.Event()
- fb = threading.Event()
- fc = threading.Event()
-
- n = len(l)
- a = l[randrange(0,n)]
- b = l[randrange(0,n)]
- c = l[randrange(0,n)]
- d = l[randrange(0,n)]
-
- key = newID()
- value = newID()
- if not quiet: print "inserting value..."
- def acb(p, f=ff):
- f.set()
- a.storeValueForKey(key, value, acb)
- ff.wait()
-
- if not quiet:
- print "finding..."
-
- class cb:
- def __init__(self, flag, value=value, port=None):
- self.flag = flag
- self.val = value
- self.found = 0
- self.port = port
- def callback(self, values):
- if(len(values) == 0):
- if not self.found:
- print "find %s NOT FOUND" % self.port
- else:
- print "find %s FOUND" % self.port
- self.flag.set()
- else:
- if self.val in values:
- self.found = 1
-
- b.valueForKey(key, cb(fa, port=b.port).callback, searchlocal=0)
- fa.wait()
- c.valueForKey(key, cb(fb, port=c.port).callback, searchlocal=0)
- fb.wait()
- d.valueForKey(key, cb(fc, port=d.port).callback, searchlocal=0)
- fc.wait()
-
-def test_one(host, port, db='/tmp/test'):
- import thread
- k = Khashmir(host, port, db)
- thread.start_new_thread(reactor.run, ())
- return k
-
-if __name__ == "__main__":
- import sys
- n = 8
- if len(sys.argv) > 1: n = int(sys.argv[1])
- l = test_build_net(peers=n)
- time.sleep(3)
- print "finding nodes..."
- for i in range(n):
- test_find_nodes(l)
- print "inserting and fetching values..."
- for i in range(10):
- test_find_value(l)