123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- # Copyright (c) Twisted Matrix Laboratories.
- # See LICENSE for details.
- """
- Tests for the command-line scripts in the top-level I{bin/} directory.
- Tests for actual functionality belong elsewhere, written in a way that doesn't
- involve launching child processes.
- """
- from os import devnull, getcwd, chdir
- from sys import executable
- from subprocess import PIPE, Popen
- from twisted.trial.unittest import SkipTest, TestCase
- from twisted.python.modules import getModule
- from twisted.python.filepath import FilePath
- from twisted.python.test.test_shellcomp import ZshScriptTestMixin
- def outputFromPythonScript(script, *args):
- """
- Synchronously run a Python script, with the same Python interpreter that
- ran the process calling this function, using L{Popen}, using the given
- command-line arguments, with standard input and standard error both
- redirected to L{os.devnull}, and return its output as a string.
- @param script: The path to the script.
- @type script: L{FilePath}
- @param args: The command-line arguments to follow the script in its
- invocation (the desired C{sys.argv[1:]}).
- @type args: L{tuple} of L{str}
- @return: the output passed to the proces's C{stdout}, without any messages
- from C{stderr}.
- @rtype: L{bytes}
- """
- with open(devnull, "rb") as nullInput, open(devnull, "wb") as nullError:
- process = Popen(
- [executable, script.path] + list(args),
- stdout=PIPE, stderr=nullError, stdin=nullInput)
- stdout = process.communicate()[0]
- return stdout
- class ScriptTestsMixin(object):
- """
- Mixin for L{TestCase} subclasses which defines a helper function for testing
- a Twisted-using script.
- """
- bin = getModule("twisted").pathEntry.filePath.child("bin")
- def scriptTest(self, name):
- """
- Verify that the given script runs and uses the version of Twisted
- currently being tested.
- This only works when running tests against a vcs checkout of Twisted,
- since it relies on the scripts being in the place they are kept in
- version control, and exercises their logic for finding the right version
- of Twisted to use in that situation.
- @param name: A path fragment, relative to the I{bin} directory of a
- Twisted source checkout, identifying a script to test.
- @type name: C{str}
- @raise SkipTest: if the script is not where it is expected to be.
- """
- script = self.bin.preauthChild(name)
- if not script.exists():
- raise SkipTest(
- "Script tests do not apply to installed configuration.")
- from twisted.copyright import version
- scriptVersion = outputFromPythonScript(script, '--version')
- self.assertIn(str(version), scriptVersion)
- class ScriptTests(TestCase, ScriptTestsMixin):
- """
- Tests for the core scripts.
- """
- def test_twistd(self):
- self.scriptTest("twistd")
- def test_twistdPathInsert(self):
- """
- The twistd script adds the current working directory to sys.path so
- that it's able to import modules from it.
- """
- script = self.bin.child("twistd")
- if not script.exists():
- raise SkipTest(
- "Script tests do not apply to installed configuration.")
- cwd = getcwd()
- self.addCleanup(chdir, cwd)
- testDir = FilePath(self.mktemp())
- testDir.makedirs()
- chdir(testDir.path)
- testDir.child("bar.tac").setContent(
- "import sys\n"
- "print sys.path\n")
- output = outputFromPythonScript(script, '-ny', 'bar.tac')
- self.assertIn(repr(testDir.path), output)
- def test_trial(self):
- self.scriptTest("trial")
- def test_trialPathInsert(self):
- """
- The trial script adds the current working directory to sys.path so that
- it's able to import modules from it.
- """
- script = self.bin.child("trial")
- if not script.exists():
- raise SkipTest(
- "Script tests do not apply to installed configuration.")
- cwd = getcwd()
- self.addCleanup(chdir, cwd)
- testDir = FilePath(self.mktemp())
- testDir.makedirs()
- chdir(testDir.path)
- testDir.child("foo.py").setContent("")
- output = outputFromPythonScript(script, 'foo')
- self.assertIn("PASSED", output)
- def test_pyhtmlizer(self):
- self.scriptTest("pyhtmlizer")
- class ZshIntegrationTests(TestCase, ZshScriptTestMixin):
- """
- Test that zsh completion functions are generated without error
- """
- generateFor = [('twistd', 'twisted.scripts.twistd.ServerOptions'),
- ('trial', 'twisted.scripts.trial.Options'),
- ('pyhtmlizer', 'twisted.scripts.htmlizer.Options'),
- ]
|