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