[Telepathy-commits] [telepathy-salut/master] mesh.py and simplemeshtest.py should be in lib/gibber/tests
Guillaume Desmottes
guillaume.desmottes at collabora.co.uk
Tue Feb 17 08:17:03 PST 2009
---
lib/gibber/tests/mesh.py | 235 ++++++++++++++++++++++++++++++++++++
lib/gibber/tests/simplemeshtest.py | 101 +++++++++++++++
tests/Makefile.am | 2 -
tests/mesh.py | 235 ------------------------------------
tests/simplemeshtest.py | 101 ---------------
5 files changed, 336 insertions(+), 338 deletions(-)
create mode 100644 lib/gibber/tests/mesh.py
create mode 100644 lib/gibber/tests/simplemeshtest.py
delete mode 100644 tests/mesh.py
delete mode 100644 tests/simplemeshtest.py
diff --git a/lib/gibber/tests/mesh.py b/lib/gibber/tests/mesh.py
new file mode 100644
index 0000000..e0a7fef
--- /dev/null
+++ b/lib/gibber/tests/mesh.py
@@ -0,0 +1,235 @@
+#!/usr/bin/env python
+
+from twisted.internet import reactor, protocol
+from base64 import b64encode, b64decode
+from struct import unpack
+import random
+
+packettypes = { 0: "Whois request",
+ 1: "Whois reply",
+ 2: "Repair request",
+ 3: "Session",
+ 0xf: "Data",
+ 0x10: "No data",
+ 0x11: "Failure",
+ 0x12: "Attempt join",
+ 0x13: "Join",
+ 0x14: "Bye"
+}
+
+WHOIS_REQUEST = 0x0
+WHOIS_REPLY = 0x1
+REPAIR_REQUEST = 0x2
+SESSION = 0x3
+DATA = 0xf
+NO_DATA = 0x10
+FAILURE = 0x11
+ATTEMPT_JOIN = 0x12
+JOIN = 0x13
+BYE = 0x14
+
+def packet_sender(data):
+ return unpack ("!I", data[8:12])[0]
+
+def packet_type(data):
+ return unpack("B", data[7])[0]
+
+def dump_depends(data):
+ sender = packet_sender(data)
+ num_senders = unpack("B", data[16])[0]
+ print "sender: %x (%d)" % (sender, num_senders)
+ for x in xrange (0, num_senders):
+ (sender, depend) = unpack("!II", data[17 + x:17 + x + 8])
+ print "%x:\t%x" % (sender, depend)
+
+
+class BaseMeshNode(protocol.ProcessProtocol):
+ delimiter = '\n'
+ __buffer = ''
+
+ def __init__(self, name):
+ self.name = name
+ self.process = reactor.spawnProcess(self,
+ "./test-r-multicast-transport-io",
+ ("test-r-multicast-transport-io", name),
+ None)
+ self.peers = []
+ self.packets = {}
+
+ def sendPacket(self, data):
+ "Should be overridden"
+ print "Should send: " + data
+
+ def __sendPacket(self, data):
+ binary = b64decode(data)
+ type = packet_type(binary)
+ self.packets[type] = self.packets.get(type, 0) + 1
+ return self.sendPacket(binary)
+
+ def stats(self):
+ print "-------" + self.name + "-------"
+ for (a,b) in self.packets.iteritems():
+ print packettypes[a] + ":\t" + str(b)
+
+ def gotOutput(self, sender, data):
+ "Should be overridden"
+ print "Output: " + data
+
+ def node_connected(self):
+ "Should be overridden"
+ print "Connected!!"
+
+ def node_disconnected(self):
+ "Should be overridden"
+ print "Disconnected!!"
+
+ def __connected(self, data):
+ self.node_connected()
+
+ def __disconnected(self, data):
+ self.node_disconnected()
+
+ def __gotOutput(self, data):
+ (sender, rawdata) = data.split(":", 1)
+ self.gotOutput(sender, b64decode(rawdata))
+
+
+ def newNode(self, data):
+ if not data in self.peers:
+ self.peers.append(data)
+
+ def __newNodes(self, data):
+ for x in data.split():
+ self.newNode(x)
+
+ def leftNode(self, node):
+ self.peers.remove(node)
+
+ def __leftNodes(self, data):
+ for x in data.split():
+ self.leftNode (x)
+
+ def recvPacket(self, data):
+ self.process.write("RECV:" + b64encode(data) + "\n")
+
+ def pushInput(self, data):
+ self.process.write("INPUT:" + b64encode(data) + "\n")
+
+ def fail(self, name):
+ self.process.write("FAIL:" + name + "\n")
+
+ def disconnect(self):
+ self.process.write("DISCONNECT\n")
+
+ def lineReceived(self, line):
+ commands = { "SEND" : self.__sendPacket,
+ "OUTPUT" : self.__gotOutput,
+ "CONNECTED" : self.__connected,
+ "DISCONNECTED" : self.__disconnected,
+ "NEWNODES" : self.__newNodes,
+ "LOSTNODES" : self.__leftNodes
+ }
+
+ parts = line.rstrip().split(":", 1)
+ if len(parts) == 2:
+ command = parts[0]
+ rawdata = parts[1]
+ if command in commands:
+ commands[command](rawdata)
+ return
+ self.unknownOutput(line)
+
+ def unknownOutput(self, line):
+ print self.name + " (U) " + line.rstrip()
+
+ def outReceived(self, data):
+ lines = (self.__buffer + data).split(self.delimiter)
+ self.__buffer = lines.pop(-1)
+ for line in lines:
+ self.lineReceived(line)
+
+ def errReceived(self, data):
+ print self.name + " Error: " + data.rstrip()
+
+ def processEnded(self, reason):
+ if self.process.status != 0:
+ print "process ended: " + str(reason)
+
+class MeshNode(BaseMeshNode):
+ def __init__(self, name, mesh):
+ BaseMeshNode.__init__(self, name)
+ self.mesh = mesh
+
+ def sendPacket(self, data):
+ self.mesh.sendPacket(self, data)
+
+ def gotOutput(self, sender, data):
+ self.mesh.gotOutput(self, sender, data)
+
+ def node_connected(self):
+ self.mesh.connected(self)
+
+class Link:
+ def __init__(self, target, bandwidth, latency, dropchance):
+ self.target = target
+ self.bandwidth = bandwidth
+ self.latency = latency
+ self.dropchance = dropchance
+
+ def send(self, data):
+ if random.random() > self.dropchance:
+ self.target.recvPacket(data)
+
+class Mesh:
+ def __init__ (self):
+ self.nodes = []
+ self.connections = {}
+
+ def connect(self, node):
+ print node.name + " got connected"
+
+ def gotOutput(self, node, sender, data):
+ print "Got " + data + " from " + node.name + " send by " + sender
+
+ def connect(self, node0, node1, bandwidth, latency, dropchance):
+ self.connections.setdefault(node0, []).append(
+ Link(node1, bandwidth, latency, dropchance))
+
+ def connect_duplex(self, node0, node1, bandwidth, latency, dropchance):
+ self.connect(node0, node1, bandwidth, latency, dropchance)
+ self.connect(node1, node0, bandwidth, latency, dropchance)
+
+ def connect_full(self, bandwidth, latency, dropchance):
+ self.connections = {}
+ for x in self.nodes:
+ for y in self.nodes:
+ if x != y:
+ self.connect(x, y, bandwidth, latency, dropchance)
+
+ def sendPacket(self, node, data):
+ conn = self.connections.get(node, [])
+ for link in conn:
+ link.send(data)
+
+ def addNode(self, name):
+ node = MeshNode(name, self)
+ self.nodes.append(node)
+ return node
+
+ def addMeshNode(self, node):
+ self.nodes.append(node)
+ return node
+
+ def removeMeshNode (self, node):
+ self.nodes.remove(node)
+ del self.connections[node]
+ for (n, links) in self.connections.iteritems():
+ for link in links:
+ if link.target == node:
+ self.connections[n].remove(link)
+
+
+ def connected (self, node):
+ "To be overwritten"
+ pass
+
diff --git a/lib/gibber/tests/simplemeshtest.py b/lib/gibber/tests/simplemeshtest.py
new file mode 100644
index 0000000..575eeb9
--- /dev/null
+++ b/lib/gibber/tests/simplemeshtest.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+from twisted.internet import reactor
+from mesh import Mesh, MeshNode
+import sys
+
+NUMNODES = 5
+NUMPACKETS = 10
+DELAY = 0.1
+
+
+nodes = []
+# We're optimists
+success = True
+
+class TestMeshNode(MeshNode):
+ nodes = 1
+
+ def __init__ (self, name, mesh):
+ MeshNode.__init__(self, name, mesh)
+
+ def node_connected(self):
+ MeshNode.node_connected(self)
+ print "Connected"
+
+ def newNode (self, data):
+ MeshNode.newNode (self, data)
+ print "node0 - Added " + data
+ self.nodes += 1
+ if self.nodes == NUMNODES:
+ print "Everybody joined"
+ for x in xrange(0, NUMPACKETS):
+ reactor.callLater(0.1 * x, (lambda y: self.pushInput(str(y) + "\n")), x)
+
+ def leftNode (self, data):
+ MeshNode.leftNode (self, data)
+ print data.rstrip() + " left"
+ reactor.stop()
+
+class TestMesh(Mesh):
+ expected = {}
+ done = 0
+
+ def gotOutput(self, node, sender, data):
+ global success
+
+ if self.expected.get(node) == None:
+ self.expected[node] = 0
+
+ if (self.expected.get(node, int(data)) != int(data)):
+ print "Got " + data.rstrip() + " instead of " + \
+ str(self.expected[node]) + " from " + node.name
+
+ success = False
+ reactor.crash()
+
+ if not sender in node.peers:
+ print "Sender " + sender + " not in node peers"
+ success = False
+ reactor.crash()
+
+ self.expected[node] = int(data) + 1
+
+ if self.expected[node] == 10:
+ self.done += 1
+
+ if self.done == NUMNODES - 1:
+ for x in self.nodes:
+ x.stats()
+ self.nodes[-1].disconnect()
+
+m = TestMesh()
+
+
+n = TestMeshNode("node0", m)
+nodes.append(n)
+m.addMeshNode(n)
+
+for x in xrange(1, NUMNODES):
+ nodes.append(m.addNode("node" + str(x)))
+
+# Connect all nodes to all others. 1024 bytes/s bandwidth, 50ms delay and 0%
+# packet loss.. (bandwidth and delay aren't implemented just yet)
+m.connect_full(1024, 50, 0.30)
+
+def timeout():
+ global success
+ print "TIMEOUT!"
+ success = False
+ reactor.crash()
+
+reactor.callLater(60, timeout)
+
+reactor.run()
+
+
+if not success:
+ print "FAILED"
+ sys.exit(-1)
+
+print "SUCCESS"
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 405e3b7..3856abe 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -10,8 +10,6 @@ $(top_builddir)/lib/gibber/libgibber.la:
.PHONY: $(top_builddir)/lib/gibber/libgibber.la
-EXTRA_DIST = simplemeshtest.py mesh.py $(check_SCRIPTS)
-
noinst_PROGRAMS = \
telepathy-salut-debug
diff --git a/tests/mesh.py b/tests/mesh.py
deleted file mode 100644
index e0a7fef..0000000
--- a/tests/mesh.py
+++ /dev/null
@@ -1,235 +0,0 @@
-#!/usr/bin/env python
-
-from twisted.internet import reactor, protocol
-from base64 import b64encode, b64decode
-from struct import unpack
-import random
-
-packettypes = { 0: "Whois request",
- 1: "Whois reply",
- 2: "Repair request",
- 3: "Session",
- 0xf: "Data",
- 0x10: "No data",
- 0x11: "Failure",
- 0x12: "Attempt join",
- 0x13: "Join",
- 0x14: "Bye"
-}
-
-WHOIS_REQUEST = 0x0
-WHOIS_REPLY = 0x1
-REPAIR_REQUEST = 0x2
-SESSION = 0x3
-DATA = 0xf
-NO_DATA = 0x10
-FAILURE = 0x11
-ATTEMPT_JOIN = 0x12
-JOIN = 0x13
-BYE = 0x14
-
-def packet_sender(data):
- return unpack ("!I", data[8:12])[0]
-
-def packet_type(data):
- return unpack("B", data[7])[0]
-
-def dump_depends(data):
- sender = packet_sender(data)
- num_senders = unpack("B", data[16])[0]
- print "sender: %x (%d)" % (sender, num_senders)
- for x in xrange (0, num_senders):
- (sender, depend) = unpack("!II", data[17 + x:17 + x + 8])
- print "%x:\t%x" % (sender, depend)
-
-
-class BaseMeshNode(protocol.ProcessProtocol):
- delimiter = '\n'
- __buffer = ''
-
- def __init__(self, name):
- self.name = name
- self.process = reactor.spawnProcess(self,
- "./test-r-multicast-transport-io",
- ("test-r-multicast-transport-io", name),
- None)
- self.peers = []
- self.packets = {}
-
- def sendPacket(self, data):
- "Should be overridden"
- print "Should send: " + data
-
- def __sendPacket(self, data):
- binary = b64decode(data)
- type = packet_type(binary)
- self.packets[type] = self.packets.get(type, 0) + 1
- return self.sendPacket(binary)
-
- def stats(self):
- print "-------" + self.name + "-------"
- for (a,b) in self.packets.iteritems():
- print packettypes[a] + ":\t" + str(b)
-
- def gotOutput(self, sender, data):
- "Should be overridden"
- print "Output: " + data
-
- def node_connected(self):
- "Should be overridden"
- print "Connected!!"
-
- def node_disconnected(self):
- "Should be overridden"
- print "Disconnected!!"
-
- def __connected(self, data):
- self.node_connected()
-
- def __disconnected(self, data):
- self.node_disconnected()
-
- def __gotOutput(self, data):
- (sender, rawdata) = data.split(":", 1)
- self.gotOutput(sender, b64decode(rawdata))
-
-
- def newNode(self, data):
- if not data in self.peers:
- self.peers.append(data)
-
- def __newNodes(self, data):
- for x in data.split():
- self.newNode(x)
-
- def leftNode(self, node):
- self.peers.remove(node)
-
- def __leftNodes(self, data):
- for x in data.split():
- self.leftNode (x)
-
- def recvPacket(self, data):
- self.process.write("RECV:" + b64encode(data) + "\n")
-
- def pushInput(self, data):
- self.process.write("INPUT:" + b64encode(data) + "\n")
-
- def fail(self, name):
- self.process.write("FAIL:" + name + "\n")
-
- def disconnect(self):
- self.process.write("DISCONNECT\n")
-
- def lineReceived(self, line):
- commands = { "SEND" : self.__sendPacket,
- "OUTPUT" : self.__gotOutput,
- "CONNECTED" : self.__connected,
- "DISCONNECTED" : self.__disconnected,
- "NEWNODES" : self.__newNodes,
- "LOSTNODES" : self.__leftNodes
- }
-
- parts = line.rstrip().split(":", 1)
- if len(parts) == 2:
- command = parts[0]
- rawdata = parts[1]
- if command in commands:
- commands[command](rawdata)
- return
- self.unknownOutput(line)
-
- def unknownOutput(self, line):
- print self.name + " (U) " + line.rstrip()
-
- def outReceived(self, data):
- lines = (self.__buffer + data).split(self.delimiter)
- self.__buffer = lines.pop(-1)
- for line in lines:
- self.lineReceived(line)
-
- def errReceived(self, data):
- print self.name + " Error: " + data.rstrip()
-
- def processEnded(self, reason):
- if self.process.status != 0:
- print "process ended: " + str(reason)
-
-class MeshNode(BaseMeshNode):
- def __init__(self, name, mesh):
- BaseMeshNode.__init__(self, name)
- self.mesh = mesh
-
- def sendPacket(self, data):
- self.mesh.sendPacket(self, data)
-
- def gotOutput(self, sender, data):
- self.mesh.gotOutput(self, sender, data)
-
- def node_connected(self):
- self.mesh.connected(self)
-
-class Link:
- def __init__(self, target, bandwidth, latency, dropchance):
- self.target = target
- self.bandwidth = bandwidth
- self.latency = latency
- self.dropchance = dropchance
-
- def send(self, data):
- if random.random() > self.dropchance:
- self.target.recvPacket(data)
-
-class Mesh:
- def __init__ (self):
- self.nodes = []
- self.connections = {}
-
- def connect(self, node):
- print node.name + " got connected"
-
- def gotOutput(self, node, sender, data):
- print "Got " + data + " from " + node.name + " send by " + sender
-
- def connect(self, node0, node1, bandwidth, latency, dropchance):
- self.connections.setdefault(node0, []).append(
- Link(node1, bandwidth, latency, dropchance))
-
- def connect_duplex(self, node0, node1, bandwidth, latency, dropchance):
- self.connect(node0, node1, bandwidth, latency, dropchance)
- self.connect(node1, node0, bandwidth, latency, dropchance)
-
- def connect_full(self, bandwidth, latency, dropchance):
- self.connections = {}
- for x in self.nodes:
- for y in self.nodes:
- if x != y:
- self.connect(x, y, bandwidth, latency, dropchance)
-
- def sendPacket(self, node, data):
- conn = self.connections.get(node, [])
- for link in conn:
- link.send(data)
-
- def addNode(self, name):
- node = MeshNode(name, self)
- self.nodes.append(node)
- return node
-
- def addMeshNode(self, node):
- self.nodes.append(node)
- return node
-
- def removeMeshNode (self, node):
- self.nodes.remove(node)
- del self.connections[node]
- for (n, links) in self.connections.iteritems():
- for link in links:
- if link.target == node:
- self.connections[n].remove(link)
-
-
- def connected (self, node):
- "To be overwritten"
- pass
-
diff --git a/tests/simplemeshtest.py b/tests/simplemeshtest.py
deleted file mode 100644
index 575eeb9..0000000
--- a/tests/simplemeshtest.py
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/env python
-
-from twisted.internet import reactor
-from mesh import Mesh, MeshNode
-import sys
-
-NUMNODES = 5
-NUMPACKETS = 10
-DELAY = 0.1
-
-
-nodes = []
-# We're optimists
-success = True
-
-class TestMeshNode(MeshNode):
- nodes = 1
-
- def __init__ (self, name, mesh):
- MeshNode.__init__(self, name, mesh)
-
- def node_connected(self):
- MeshNode.node_connected(self)
- print "Connected"
-
- def newNode (self, data):
- MeshNode.newNode (self, data)
- print "node0 - Added " + data
- self.nodes += 1
- if self.nodes == NUMNODES:
- print "Everybody joined"
- for x in xrange(0, NUMPACKETS):
- reactor.callLater(0.1 * x, (lambda y: self.pushInput(str(y) + "\n")), x)
-
- def leftNode (self, data):
- MeshNode.leftNode (self, data)
- print data.rstrip() + " left"
- reactor.stop()
-
-class TestMesh(Mesh):
- expected = {}
- done = 0
-
- def gotOutput(self, node, sender, data):
- global success
-
- if self.expected.get(node) == None:
- self.expected[node] = 0
-
- if (self.expected.get(node, int(data)) != int(data)):
- print "Got " + data.rstrip() + " instead of " + \
- str(self.expected[node]) + " from " + node.name
-
- success = False
- reactor.crash()
-
- if not sender in node.peers:
- print "Sender " + sender + " not in node peers"
- success = False
- reactor.crash()
-
- self.expected[node] = int(data) + 1
-
- if self.expected[node] == 10:
- self.done += 1
-
- if self.done == NUMNODES - 1:
- for x in self.nodes:
- x.stats()
- self.nodes[-1].disconnect()
-
-m = TestMesh()
-
-
-n = TestMeshNode("node0", m)
-nodes.append(n)
-m.addMeshNode(n)
-
-for x in xrange(1, NUMNODES):
- nodes.append(m.addNode("node" + str(x)))
-
-# Connect all nodes to all others. 1024 bytes/s bandwidth, 50ms delay and 0%
-# packet loss.. (bandwidth and delay aren't implemented just yet)
-m.connect_full(1024, 50, 0.30)
-
-def timeout():
- global success
- print "TIMEOUT!"
- success = False
- reactor.crash()
-
-reactor.callLater(60, timeout)
-
-reactor.run()
-
-
-if not success:
- print "FAILED"
- sys.exit(-1)
-
-print "SUCCESS"
--
1.5.6.5
More information about the telepathy-commits
mailing list