1 # Written by Njaal Borch
2 # see LICENSE.txt for license information
6 # - You should also test whether Tribler responds correctly to multicast
7 # messages sent directly from a socket, and not via your code.
9 # - Some IPv6 tests will fail on Win32 if IPv6 is not installed.
17 from BaseLib.Core.Multicast import *
20 # class MyLoggerTest(unittest.TestCase):
23 # Test the MyLogger class
28 # self.log = MyLogger()
29 # self.conn = BTConnection('localhost',self.hisport)
33 # self.log.debug("DEBUG message")
35 # self.log.info("INFO message")
37 # self.log.warning("WARNING message")
39 # self.log.fatal("FATAL message")
42 # raise Exception("Exception text")
44 # self.log.exception("Should have a traceback below here:")
47 class FakeOverlayBridge:
48 def add_task(self, function, data):
51 class FakePeerDBHandler:
53 def addPeer(self, *args, **kargs):
56 def setPeerLocalFlag(self, *args):
60 class TestUDPServer(threading.Thread):
62 def __init__(self, socket, mc_channel):
63 threading.Thread.__init__(self)
66 self.mc_channel = mc_channel
73 if select.select([self.socket],[],[], 1)[0]:
74 (data, addr) = self.socket.recvfrom(1500)
75 self.mc_channel.data_came_in(addr, data)
84 class MulticastTest(unittest.TestCase):
91 def __init__(self, param):
92 unittest.TestCase.__init__(self, param)
94 #TestAsServer.__init__(self, param)
95 self.test_server = None
96 self.overlay_bridge = FakeOverlayBridge()
97 self.peer_db = FakePeerDBHandler()
99 def prepare_test(self, config, capabilitites=None):
101 Cannot be done by setUp as we need special config
104 self.multicast = Multicast(config, self.overlay_bridge, 1234, 1, self.peer_db,
105 capabilities=capabilitites)
107 self.test_server = TestUDPServer(self.multicast.getSocket(),
109 self.test_server.start()
112 if self.test_server is not None:
113 self.test_server.stop()
114 self.multicast = None
120 config = {'permid':'123',
121 'hostname':'myhostname',
123 'multicast_ipv4_address':'224.0.1.43',
124 'multicast_ipv6_address':'ff02::4124:1261:ffef',
125 'multicast_port':'6124',
126 'multicast_enabled':True,
127 'multicast_ipv4_enabled':True,
128 'multicast_ipv6_enabled':False,
129 'multicast_announce':True}
131 self.prepare_test(config)
135 for (permid, addr, capabilities) in self.multicast.discoverNodes():
139 raise Exception("Didn't discover myself using IPv4")
145 config = {'permid':'123',
146 'multicast_ipv4_address':'224.0.1.43',
147 'multicast_ipv6_address':'ff02::4124:1261:ffef',
148 'multicast_port':'6124',
149 'multicast_enabled':True,
150 'multicast_ipv4_enabled':False,
151 'multicast_ipv6_enabled':True,
152 'multicast_announce':True}
154 self.prepare_test(config)
156 for (permid, addr, capabilities) in self.multicast.discoverNodes():
160 raise Exception("Didn't discover myself using IPv6")
165 config = {'permid':'123',
166 'multicast_ipv4_address':'224.0.1.43',
167 'multicast_ipv6_address':'ff02::4124:1261:ffef',
168 'multicast_port':'6124',
169 'multicast_enabled':True,
170 'multicast_ipv4_enabled':True,
171 'multicast_ipv6_enabled':True,
172 'multicast_announce':True}
174 self.prepare_test(config)
177 for (permid, addr, capabilities) in self.multicast.discoverNodes():
181 raise Exception("Didn't discover myself enough using both (saw me %d times, expected 2)"%seen)
183 def testAllDisabled(self):
186 config = {'permid':'123',
187 'multicast_ipv4_address':'224.0.1.43',
188 'multicast_ipv6_address':'ff02::4124:1261:ffef',
189 'multicast_port':'6124',
190 'multicast_ipv4_enabled':False,
191 'multicast_ipv6_enabled':False,
192 'multicast_announce':True}
194 self.prepare_test(config)
197 if len(self.multicast.discoverNodes()) > 0:
198 raise Exception("Discovered nodes even though multicast is not allowed")
204 def testAnnounce(self):
207 config = {'permid':'123',
208 'multicast_ipv4_address':'224.0.1.43',
209 'multicast_ipv6_address':'ff02::4124:1261:ffef',
210 'multicast_port':'6124',
211 'multicast_enabled':True,
212 'multicast_ipv4_enabled':True,
213 'multicast_ipv6_enabled':True,
214 'multicast_announce':True}
216 self.prepare_test(config)
218 # Handle the announce
220 self.multicast.addAnnounceHandler(self.handleAnnounce)
221 self.multicast.sendAnnounce(['elem1','elem2'])
223 # Wait for asynchronous handling
226 for announce in self.announces:
227 if announce == ['123', 'elem1', 'elem2']:
230 raise Exception("Failed to get announce")
232 def handleAnnounce(self, permid, addr, list):
235 Handle announce callback function
237 self.announces.append([permid] + list)
239 def testCapabilities(self):
241 Test capabilities thingy
244 myCapabilities = ["Something", "something else", "something totally different"]
247 config = {'permid':'testCapabilities',
248 'multicast_ipv4_address':'224.0.1.43',
249 'multicast_ipv6_address':'ff02::4124:1261:ffef',
250 'multicast_port':'6124',
251 'multicast_enabled':True,
252 'multicast_ipv4_enabled':False,
253 'multicast_ipv6_enabled':True,
254 'multicast_announce':True}
256 self.prepare_test(config, myCapabilities)
259 for (permid, addr, capabilities) in self.multicast.discoverNodes():
260 if permid == config['permid']:
262 if capabilities != myCapabilities:
263 raise Exception("Got bad capabilities, got %s, expected %s"%(str(capabilities), str(myCapabilities)))
266 raise Exception("Didn't discover myself using IPv6")
270 suite = unittest.TestSuite()
271 suite.addTest(unittest.makeSuite(MulticastTest))
277 if __name__ == "__main__":
279 # TODO: Multicast does gives us multiple hits for ourselves, is that ok?
281 print "Testing the Multicast classes"