diff --git a/tests/first_stage_test.py b/tests/first_stage_test.py new file mode 100644 index 00000000..4baa024b --- /dev/null +++ b/tests/first_stage_test.py @@ -0,0 +1,42 @@ + +import subprocess +import unittest + +import mitogen.master +import testlib + + +class CommandLineTest(testlib.RouterMixin, testlib.TestCase): + # Ensure this version of Python produces a command line that is sufficient + # to bootstrap this version of Python. + # + # TODO: + # * 2.7 starting 2.4 + # * 2.7 starting 3.x + # * 3.x starting 2.7 + + def test_valid_syntax(self): + stream = mitogen.master.Stream(self.router, 0) + args = stream.get_boot_command() + + # Executing the boot command will print "EC0" and expect to read from + # stdin, which will fail because it's pointing at /dev/null, causing + # the forked child to crash with an EOFError and disconnect its write + # pipe. The forked and freshly execed parent will get a 0-byte read + # from the pipe, which is a valid script, and therefore exit indicating + # success. + + fp = file("/dev/null", "r") + proc = subprocess.Popen(args, + stdin=fp, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = proc.communicate() + self.assertEquals(0, proc.returncode) + self.assertEquals("EC0\n", stdout) + self.assertContains("EOFError", stderr) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/testlib.py b/tests/testlib.py index d1e2a168..b1f0825c 100644 --- a/tests/testlib.py +++ b/tests/testlib.py @@ -111,6 +111,9 @@ class TestCase(unittest.TestCase): assert 0, '%r raised %r, not %r' % (func, e, exc) assert 0, '%r did not raise %r' % (func, exc) + def assertContains(self, needle, hay): + assert needle in hay, "%r not found in %r" % (needle, hay) + class DockerizedSshDaemon(object): def __init__(self):