tests: split blocking out to its own file
also clean up the output when pip-e -vs- entrypoint -vs- Versioneer makes the entrypoint script refuse to run from a version mismatch.
This commit is contained in:
parent
0cd7471c06
commit
2e2bd1bb5f
96
src/wormhole/test/test_blocking.py
Normal file
96
src/wormhole/test/test_blocking.py
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
import json
|
||||||
|
from twisted.trial import unittest
|
||||||
|
from twisted.internet import defer
|
||||||
|
from twisted.internet.threads import deferToThread
|
||||||
|
from ..blocking.transcribe import Wormhole as BlockingWormhole, UsageError
|
||||||
|
from .common import ServerBase
|
||||||
|
|
||||||
|
class Blocking(ServerBase, unittest.TestCase):
|
||||||
|
# we need Twisted to run the server, but we run the sender and receiver
|
||||||
|
# with deferToThread()
|
||||||
|
|
||||||
|
def test_basic(self):
|
||||||
|
appid = "appid"
|
||||||
|
w1 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
w2 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
d = deferToThread(w1.get_code)
|
||||||
|
def _got_code(code):
|
||||||
|
w2.set_code(code)
|
||||||
|
d1 = deferToThread(w1.get_data, "data1")
|
||||||
|
d2 = deferToThread(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, dataX)
|
||||||
|
self.assertTrue(success2, dataY)
|
||||||
|
self.assertEqual(dataX, "data2")
|
||||||
|
self.assertEqual(dataY, "data1")
|
||||||
|
d.addCallback(_done)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def test_fixed_code(self):
|
||||||
|
appid = "appid"
|
||||||
|
w1 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
w2 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
w1.set_code("123-purple-elephant")
|
||||||
|
w2.set_code("123-purple-elephant")
|
||||||
|
d1 = deferToThread(w1.get_data, "data1")
|
||||||
|
d2 = deferToThread(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, dataX)
|
||||||
|
self.assertTrue(success2, dataY)
|
||||||
|
self.assertEqual(dataX, "data2")
|
||||||
|
self.assertEqual(dataY, "data1")
|
||||||
|
d.addCallback(_done)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def test_errors(self):
|
||||||
|
appid = "appid"
|
||||||
|
w1 = BlockingWormhole(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 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
d = deferToThread(w2.get_code)
|
||||||
|
def _done(code):
|
||||||
|
self.assertRaises(UsageError, w2.get_code)
|
||||||
|
d.addCallback(_done)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def test_serialize(self):
|
||||||
|
appid = "appid"
|
||||||
|
w1 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
self.assertRaises(UsageError, w1.serialize) # too early
|
||||||
|
w2 = BlockingWormhole(appid, self.relayurl)
|
||||||
|
d = deferToThread(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 = BlockingWormhole.from_serialized(s)
|
||||||
|
d1 = deferToThread(new_w1.get_data, "data1")
|
||||||
|
d2 = deferToThread(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, dataX)
|
||||||
|
self.assertTrue(success2, dataY)
|
||||||
|
self.assertEqual(dataX, "data2")
|
||||||
|
self.assertEqual(dataY, "data1")
|
||||||
|
self.assertRaises(UsageError, w2.serialize) # too late
|
||||||
|
d.addCallback(_done)
|
||||||
|
return d
|
||||||
|
test_serialize.skip = "not yet implemented for the blocking flavor"
|
|
@ -5,9 +5,7 @@ from twisted.internet.utils import getProcessOutputAndValue
|
||||||
from .. import __version__
|
from .. import __version__
|
||||||
from .common import ServerBase
|
from .common import ServerBase
|
||||||
|
|
||||||
class Scripts(ServerBase, unittest.TestCase):
|
class ScriptsBase:
|
||||||
# we need Twisted to run the server, but we run the sender and receiver
|
|
||||||
# with deferToThread()
|
|
||||||
def find_executable(self):
|
def find_executable(self):
|
||||||
# to make sure we're running the right executable (in a virtualenv),
|
# to make sure we're running the right executable (in a virtualenv),
|
||||||
# we require that our "wormhole" lives in the same directory as our
|
# we require that our "wormhole" lives in the same directory as our
|
||||||
|
@ -24,6 +22,32 @@ class Scripts(ServerBase, unittest.TestCase):
|
||||||
% (wormhole, sys.executable))
|
% (wormhole, sys.executable))
|
||||||
return wormhole
|
return wormhole
|
||||||
|
|
||||||
|
def is_runnable(self):
|
||||||
|
# One property of Versioneer is that many changes to the source tree
|
||||||
|
# (making a commit, dirtying a previously-clean tree) will change the
|
||||||
|
# version string. Entrypoint scripts frequently insist upon importing
|
||||||
|
# a library version that matches the script version (whatever was
|
||||||
|
# reported when 'pip install' was run), and throw a
|
||||||
|
# DistributionNotFound error when they don't match. This is really
|
||||||
|
# annoying in a workspace created with "pip install -e .", as you
|
||||||
|
# must re-run pip after each commit.
|
||||||
|
|
||||||
|
# So let's report just one error in this case (from test_version),
|
||||||
|
# and skip the other tests that we know will fail.
|
||||||
|
|
||||||
|
wormhole = self.find_executable()
|
||||||
|
d = getProcessOutputAndValue(wormhole, ["--version"])
|
||||||
|
def _check(res):
|
||||||
|
out, err, rc = res
|
||||||
|
if rc != 0:
|
||||||
|
raise unittest.SkipTest("wormhole is not runnable in this tree")
|
||||||
|
d.addCallback(_check)
|
||||||
|
return d
|
||||||
|
|
||||||
|
class ScriptVersion(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
|
# we need Twisted to run the server, but we run the sender and receiver
|
||||||
|
# with deferToThread()
|
||||||
|
|
||||||
def test_version(self):
|
def test_version(self):
|
||||||
# "wormhole" must be on the path, so e.g. "pip install -e ." in a
|
# "wormhole" must be on the path, so e.g. "pip install -e ." in a
|
||||||
# virtualenv
|
# virtualenv
|
||||||
|
@ -32,11 +56,24 @@ class Scripts(ServerBase, unittest.TestCase):
|
||||||
def _check(res):
|
def _check(res):
|
||||||
out, err, rc = res
|
out, err, rc = res
|
||||||
self.failUnlessEqual(out, "")
|
self.failUnlessEqual(out, "")
|
||||||
|
if "DistributionNotFound" in err:
|
||||||
|
log.msg("stderr was %s" % err)
|
||||||
|
last = err.strip().split("\n")[-1]
|
||||||
|
self.fail("wormhole not runnable: %s" % last)
|
||||||
self.failUnlessEqual(err, "magic-wormhole %s\n" % __version__)
|
self.failUnlessEqual(err, "magic-wormhole %s\n" % __version__)
|
||||||
self.failUnlessEqual(rc, 0)
|
self.failUnlessEqual(rc, 0)
|
||||||
d.addCallback(_check)
|
d.addCallback(_check)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
class Scripts(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
|
# we need Twisted to run the server, but we run the sender and receiver
|
||||||
|
# with deferToThread()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
d = self.is_runnable()
|
||||||
|
d.addCallback(lambda _: ServerBase.setUp(self))
|
||||||
|
return d
|
||||||
|
|
||||||
def test_send_text_pre_generated_code(self):
|
def test_send_text_pre_generated_code(self):
|
||||||
wormhole = self.find_executable()
|
wormhole = self.find_executable()
|
||||||
server_args = ["--relay-url", self.relayurl]
|
server_args = ["--relay-url", self.relayurl]
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
import json
|
import json
|
||||||
from twisted.trial import unittest
|
from twisted.trial import unittest
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from twisted.internet.threads import deferToThread
|
|
||||||
from ..twisted.transcribe import Wormhole, UsageError
|
from ..twisted.transcribe import Wormhole, UsageError
|
||||||
from ..blocking.transcribe import Wormhole as BlockingWormhole
|
|
||||||
from .common import ServerBase
|
from .common import ServerBase
|
||||||
#from twisted.python import log
|
#from twisted.python import log
|
||||||
#import sys
|
#import sys
|
||||||
|
@ -92,93 +90,3 @@ class Basic(ServerBase, unittest.TestCase):
|
||||||
self.assertRaises(UsageError, w2.serialize) # too late
|
self.assertRaises(UsageError, w2.serialize) # too late
|
||||||
d.addCallback(_done)
|
d.addCallback(_done)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
class Blocking(ServerBase, unittest.TestCase):
|
|
||||||
# we need Twisted to run the server, but we run the sender and receiver
|
|
||||||
# with deferToThread()
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
appid = "appid"
|
|
||||||
w1 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
w2 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
d = deferToThread(w1.get_code)
|
|
||||||
def _got_code(code):
|
|
||||||
w2.set_code(code)
|
|
||||||
d1 = deferToThread(w1.get_data, "data1")
|
|
||||||
d2 = deferToThread(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, dataX)
|
|
||||||
self.assertTrue(success2, dataY)
|
|
||||||
self.assertEqual(dataX, "data2")
|
|
||||||
self.assertEqual(dataY, "data1")
|
|
||||||
d.addCallback(_done)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def test_fixed_code(self):
|
|
||||||
appid = "appid"
|
|
||||||
w1 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
w2 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
w1.set_code("123-purple-elephant")
|
|
||||||
w2.set_code("123-purple-elephant")
|
|
||||||
d1 = deferToThread(w1.get_data, "data1")
|
|
||||||
d2 = deferToThread(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, dataX)
|
|
||||||
self.assertTrue(success2, dataY)
|
|
||||||
self.assertEqual(dataX, "data2")
|
|
||||||
self.assertEqual(dataY, "data1")
|
|
||||||
d.addCallback(_done)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def test_errors(self):
|
|
||||||
appid = "appid"
|
|
||||||
w1 = BlockingWormhole(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 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
d = deferToThread(w2.get_code)
|
|
||||||
def _done(code):
|
|
||||||
self.assertRaises(UsageError, w2.get_code)
|
|
||||||
d.addCallback(_done)
|
|
||||||
return d
|
|
||||||
|
|
||||||
def test_serialize(self):
|
|
||||||
appid = "appid"
|
|
||||||
w1 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
self.assertRaises(UsageError, w1.serialize) # too early
|
|
||||||
w2 = BlockingWormhole(appid, self.relayurl)
|
|
||||||
d = deferToThread(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 = BlockingWormhole.from_serialized(s)
|
|
||||||
d1 = deferToThread(new_w1.get_data, "data1")
|
|
||||||
d2 = deferToThread(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, dataX)
|
|
||||||
self.assertTrue(success2, dataY)
|
|
||||||
self.assertEqual(dataX, "data2")
|
|
||||||
self.assertEqual(dataY, "data1")
|
|
||||||
self.assertRaises(UsageError, w2.serialize) # too late
|
|
||||||
d.addCallback(_done)
|
|
||||||
return d
|
|
||||||
test_serialize.skip = "not yet implemented for the blocking flavor"
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user