133 lines
4.7 KiB
Python
133 lines
4.7 KiB
Python
|
import json
|
||
|
from twisted.trial import unittest
|
||
|
from twisted.internet import defer, protocol, endpoints, reactor
|
||
|
from twisted.application import service
|
||
|
from ..servers.relay import RelayServer
|
||
|
from ..twisted.transcribe import SymmetricWormhole, UsageError
|
||
|
from .. import __version__
|
||
|
#from twisted.python import log
|
||
|
#import sys
|
||
|
#log.startLogging(sys.stdout)
|
||
|
|
||
|
def allocate_port():
|
||
|
ep = endpoints.serverFromString(reactor, "tcp:0:interface=127.0.0.1")
|
||
|
d = ep.listen(protocol.Factory())
|
||
|
def _listening(lp):
|
||
|
port = lp.getHost().port
|
||
|
d2 = lp.stopListening()
|
||
|
d2.addCallback(lambda _: port)
|
||
|
return d2
|
||
|
d.addCallback(_listening)
|
||
|
return d
|
||
|
|
||
|
def allocate_ports():
|
||
|
d = defer.DeferredList([allocate_port(), allocate_port()])
|
||
|
def _done(results):
|
||
|
port1 = results[0][1]
|
||
|
port2 = results[1][1]
|
||
|
return (port1, port2)
|
||
|
d.addCallback(_done)
|
||
|
return d
|
||
|
|
||
|
class Basic(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
self.sp = service.MultiService()
|
||
|
self.sp.startService()
|
||
|
d = allocate_ports()
|
||
|
def _got_ports(ports):
|
||
|
relayport, transitport = ports
|
||
|
s = RelayServer("tcp:%d:interface=127.0.0.1" % relayport,
|
||
|
"tcp:%s:interface=127.0.0.1" % transitport,
|
||
|
__version__)
|
||
|
s.setServiceParent(self.sp)
|
||
|
self.relayurl = "http://127.0.0.1:%d/wormhole-relay/" % relayport
|
||
|
self.transit = "tcp:127.0.0.1:%d" % transitport
|
||
|
d.addCallback(_got_ports)
|
||
|
return d
|
||
|
|
||
|
def tearDown(self):
|
||
|
return self.sp.stopService()
|
||
|
|
||
|
def test_basic(self):
|
||
|
appid = "appid"
|
||
|
w1 = SymmetricWormhole(appid, self.relayurl)
|
||
|
w2 = SymmetricWormhole(appid, self.relayurl)
|
||
|
d = w1.get_code()
|
||
|
def _got_code(code):
|
||
|
w2.set_code(code)
|
||
|
d1 = w1.get_data("data1")
|
||
|
d2 = w2.get_data("data2")
|
||
|
return defer.DeferredList([d1,d2], fireOnOneErrback=False)
|
||
|
d.addCallback(_got_code)
|
||
|
def _done(dl):
|
||
|
((success1, dataX), (success2, dataY)) = dl
|
||
|
r1,r2 = dl
|
||
|
self.assertTrue(success1)
|
||
|
self.assertTrue(success2)
|
||
|
self.assertEqual(dataX, "data2")
|
||
|
self.assertEqual(dataY, "data1")
|
||
|
d.addCallback(_done)
|
||
|
return d
|
||
|
|
||
|
def test_fixed_code(self):
|
||
|
appid = "appid"
|
||
|
w1 = SymmetricWormhole(appid, self.relayurl)
|
||
|
w2 = SymmetricWormhole(appid, self.relayurl)
|
||
|
w1.set_code("123-purple-elephant")
|
||
|
w2.set_code("123-purple-elephant")
|
||
|
d1 = w1.get_data("data1")
|
||
|
d2 = w2.get_data("data2")
|
||
|
d = defer.DeferredList([d1,d2], fireOnOneErrback=False)
|
||
|
def _done(dl):
|
||
|
((success1, dataX), (success2, dataY)) = dl
|
||
|
r1,r2 = dl
|
||
|
self.assertTrue(success1)
|
||
|
self.assertTrue(success2)
|
||
|
self.assertEqual(dataX, "data2")
|
||
|
self.assertEqual(dataY, "data1")
|
||
|
d.addCallback(_done)
|
||
|
return d
|
||
|
|
||
|
def test_errors(self):
|
||
|
appid = "appid"
|
||
|
w1 = SymmetricWormhole(appid, self.relayurl)
|
||
|
self.assertRaises(UsageError, w1.get_verifier)
|
||
|
self.assertRaises(UsageError, w1.get_data, "data")
|
||
|
w1.set_code("123-purple-elephant")
|
||
|
self.assertRaises(UsageError, w1.set_code, "123-nope")
|
||
|
self.assertRaises(UsageError, w1.get_code)
|
||
|
w2 = SymmetricWormhole(appid, self.relayurl)
|
||
|
d = w2.get_code()
|
||
|
self.assertRaises(UsageError, w2.get_code)
|
||
|
return d
|
||
|
|
||
|
def test_serialize(self):
|
||
|
appid = "appid"
|
||
|
w1 = SymmetricWormhole(appid, self.relayurl)
|
||
|
self.assertRaises(UsageError, w1.serialize) # too early
|
||
|
w2 = SymmetricWormhole(appid, self.relayurl)
|
||
|
d = w1.get_code()
|
||
|
def _got_code(code):
|
||
|
self.assertRaises(UsageError, w2.serialize) # too early
|
||
|
w2.set_code(code)
|
||
|
w2.serialize() # ok
|
||
|
s = w1.serialize()
|
||
|
self.assertEqual(type(s), type(""))
|
||
|
unpacked = json.loads(s) # this is supposed to be JSON
|
||
|
self.assertEqual(type(unpacked), dict)
|
||
|
new_w1 = SymmetricWormhole.from_serialized(s)
|
||
|
d1 = new_w1.get_data("data1")
|
||
|
d2 = w2.get_data("data2")
|
||
|
return defer.DeferredList([d1,d2], fireOnOneErrback=False)
|
||
|
d.addCallback(_got_code)
|
||
|
def _done(dl):
|
||
|
((success1, dataX), (success2, dataY)) = dl
|
||
|
r1,r2 = dl
|
||
|
self.assertTrue(success1)
|
||
|
self.assertTrue(success2)
|
||
|
self.assertEqual(dataX, "data2")
|
||
|
self.assertEqual(dataY, "data1")
|
||
|
self.assertRaises(UsageError, w2.serialize) # too late
|
||
|
d.addCallback(_done)
|
||
|
return d
|