175 lines
4.3 KiB
Python
175 lines
4.3 KiB
Python
#!/usr/bin/python
|
|
import sys
|
|
|
|
sys.path.append('../build/debug-default/bin')
|
|
|
|
CLIENTS = 100
|
|
MESSAGES = 100
|
|
|
|
import socket, threading, time, random, sys
|
|
|
|
from pyadchpp import ParseException, CID, Core, CID_generate, Encoder_toBase32, Encoder_fromBase32, AdcCommand, AdcCommand_toSID, TigerHash, CID, cvar
|
|
print(cvar.versionString)
|
|
core = Core.create("")
|
|
|
|
class Client(object):
|
|
def __init__(self, n):
|
|
self.sock = socket.socket()
|
|
self.pid = CID_generate()
|
|
tiger = TigerHash()
|
|
tiger.update(self.pid.data())
|
|
self.cid = CID(Encoder_toBase32(tiger.finalize()))
|
|
self.nick = "user_" + str(n) + "_" + self.cid.toBase32()
|
|
self.running = True
|
|
self.line = ""
|
|
self.messages = 0
|
|
self.n = n
|
|
|
|
def connect(self, ipport):
|
|
self.sock.connect(ipport)
|
|
|
|
def command(self, cmd):
|
|
s = cmd.toString()
|
|
print self.nick, "sending", self.messages, len(s), s
|
|
self.sock.send(s)
|
|
|
|
def get_command(self):
|
|
index = self.line.find('\n')
|
|
while index == -1:
|
|
line = self.sock.recv(4096)
|
|
if len(line) == 0:
|
|
return None
|
|
|
|
self.line += line
|
|
index = self.line.find('\n')
|
|
if index==0:
|
|
self.line = self.line[index+1:]
|
|
index = -1
|
|
|
|
self.lastline = self.line[:index + 1]
|
|
self.line = self.line[index+1:]
|
|
return AdcCommand(self.lastline)
|
|
|
|
def expect(self, command):
|
|
cmd = self.get_command()
|
|
if not cmd or cmd.getCommand() != command:
|
|
if not cmd:
|
|
error = "expect: connection closed"
|
|
else:
|
|
error = "expect: " + cmd.getCommandString()
|
|
raise Exception, error
|
|
return cmd
|
|
|
|
def login(self, ipport):
|
|
self.connect(ipport)
|
|
cmd = AdcCommand(AdcCommand.CMD_SUP, AdcCommand.TYPE_HUB, 0)
|
|
cmd.addParam("ADBASE").addParam("ADTIGR")
|
|
self.command(cmd)
|
|
self.expect(AdcCommand.CMD_SUP)
|
|
sid = self.expect(AdcCommand.CMD_SID)
|
|
self.sid = AdcCommand_toSID(sid.getParam(0))
|
|
|
|
cmd = AdcCommand(AdcCommand.CMD_INF, AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("ID" + self.cid.toBase32())
|
|
cmd.addParam("PD" + self.pid.toBase32())
|
|
cmd.addParam("NI" + self.nick)
|
|
self.command(cmd)
|
|
|
|
# def test_close(self):
|
|
# self.sock.close()
|
|
|
|
def test_error(self):
|
|
cmd = AdcCommand(AdcCommand.CMD_MSG, AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("+error")
|
|
self.command(cmd)
|
|
|
|
def test_test(self):
|
|
cmd = AdcCommand(AdcCommand.CMD_MSG, AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("+test")
|
|
self.command(cmd)
|
|
|
|
def test_msg(self):
|
|
cmd = AdcCommand(AdcCommand.CMD_MSG, AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("hello from " + self.nick)
|
|
self.command(cmd)
|
|
|
|
def test_nick(self):
|
|
self.nick = "user_" + str(self.n) + "_" + str(CID_generate())
|
|
cmd = AdcCommand(AdcCommand.CMD_MSG, AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("renaming myself to " + self.nick)
|
|
self.command(cmd)
|
|
cmd = AdcCommand(AdcCommand.CMD_INF, AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("NI", self.nick)
|
|
self.command(cmd)
|
|
|
|
def test_big(self):
|
|
cmd = AdcCommand(AdcCommand.toCMD(ord('X'), ord('X'), ord('X')), AdcCommand.TYPE_BROADCAST, self.sid)
|
|
cmd.addParam("X" * 1000)
|
|
self.command(cmd)
|
|
|
|
def __call__(self):
|
|
try:
|
|
while self.get_command():
|
|
pass
|
|
self.sock.close()
|
|
except Exception, e:
|
|
print "Client " + self.nick + " died:", e
|
|
except ParseException, e:
|
|
print "Client " + self.nick + " died, line was:", self.lastline
|
|
self.running = False
|
|
try:
|
|
if len(sys.argv) > 2:
|
|
ip = sys.argv[1]
|
|
port = int(sys.argv[2])
|
|
else:
|
|
ip = "127.0.0.1"
|
|
port = 2780
|
|
|
|
clients = []
|
|
for i in range(CLIENTS):
|
|
if i > 0 and i % 10 == 0:
|
|
#time.sleep(3)
|
|
pass
|
|
print "Logging in", i
|
|
client = Client(i)
|
|
clients.append(client)
|
|
client.login((ip,port))
|
|
t = threading.Thread(target = client, name = client.nick)
|
|
t.setDaemon(True)
|
|
t.start()
|
|
|
|
time.sleep(3)
|
|
tests = []
|
|
for k,v in Client.__dict__.iteritems():
|
|
if len(k) < 4 or k[0:4] != "test":
|
|
continue
|
|
tests.append(v)
|
|
print tests
|
|
done = []
|
|
while len(clients) > 0:
|
|
#time.sleep(1)
|
|
for c in clients:
|
|
if not c.running:
|
|
clients.remove(c)
|
|
|
|
if len(clients) == 0:
|
|
break
|
|
|
|
if random.random() > (5./len(clients)):
|
|
continue
|
|
|
|
if MESSAGES > 0 and c.messages >= MESSAGES:
|
|
clients.remove(c)
|
|
continue
|
|
|
|
c.messages = c.messages + 1
|
|
try:
|
|
random.choice(tests)(c)
|
|
except Exception, e:
|
|
print e
|
|
|
|
time.sleep(20)
|
|
print "No more clients"
|
|
except Exception, e:
|
|
print e
|