test_core.py 2.89 KB
Newer Older
Neal Norwitz's avatar
Neal Norwitz committed
1 2 3 4 5 6 7
"""Tests for distutils.core."""

import io
import distutils.core
import os
import shutil
import sys
8
import test.support
9
from test.support import captured_stdout
Neal Norwitz's avatar
Neal Norwitz committed
10
import unittest
11
from distutils.tests import support
Neal Norwitz's avatar
Neal Norwitz committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

# setup script that uses __file__
setup_using___file__ = """\

__file__

from distutils.core import setup
setup()
"""

setup_prints_cwd = """\

import os
print(os.getcwd())

from distutils.core import setup
setup()
"""


32
class CoreTestCase(support.EnvironGuard, unittest.TestCase):
Neal Norwitz's avatar
Neal Norwitz committed
33 34

    def setUp(self):
35
        super(CoreTestCase, self).setUp()
Neal Norwitz's avatar
Neal Norwitz committed
36 37
        self.old_stdout = sys.stdout
        self.cleanup_testfn()
38
        self.old_argv = sys.argv, sys.argv[:]
Neal Norwitz's avatar
Neal Norwitz committed
39 40 41 42

    def tearDown(self):
        sys.stdout = self.old_stdout
        self.cleanup_testfn()
43 44 45
        sys.argv = self.old_argv[0]
        sys.argv[:] = self.old_argv[1]
        super(CoreTestCase, self).tearDown()
Neal Norwitz's avatar
Neal Norwitz committed
46 47

    def cleanup_testfn(self):
48
        path = test.support.TESTFN
Neal Norwitz's avatar
Neal Norwitz committed
49 50 51 52 53
        if os.path.isfile(path):
            os.remove(path)
        elif os.path.isdir(path):
            shutil.rmtree(path)

54
    def write_setup(self, text, path=test.support.TESTFN):
Neal Norwitz's avatar
Neal Norwitz committed
55 56 57 58 59 60 61 62 63 64 65
        open(path, "w").write(text)
        return path

    def test_run_setup_provides_file(self):
        # Make sure the script can use __file__; if that's missing, the test
        # setup.py script will raise NameError.
        distutils.core.run_setup(
            self.write_setup(setup_using___file__))

    def test_run_setup_uses_current_dir(self):
        # This tests that the setup script is run with the current directory
66
        # as its own current directory; this was temporarily broken by a
Neal Norwitz's avatar
Neal Norwitz committed
67 68 69 70 71
        # previous patch when TESTFN did not use the current directory.
        sys.stdout = io.StringIO()
        cwd = os.getcwd()

        # Create a directory and write the setup.py file there:
72 73
        os.mkdir(test.support.TESTFN)
        setup_py = os.path.join(test.support.TESTFN, "setup.py")
Neal Norwitz's avatar
Neal Norwitz committed
74 75 76 77 78 79 80 81
        distutils.core.run_setup(
            self.write_setup(setup_prints_cwd, path=setup_py))

        output = sys.stdout.getvalue()
        if output.endswith("\n"):
            output = output[:-1]
        self.assertEqual(cwd, output)

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
    def test_debug_mode(self):
        # this covers the code called when DEBUG is set
        sys.argv = ['setup.py', '--name']
        with captured_stdout() as stdout:
            distutils.core.setup(name='bar')
        stdout.seek(0)
        self.assertEquals(stdout.read(), 'bar\n')

        distutils.core.DEBUG = True
        try:
            with captured_stdout() as stdout:
                distutils.core.setup(name='bar')
        finally:
            distutils.core.DEBUG = False
        stdout.seek(0)
        wanted = "options (after parsing config files):\n"
        self.assertEquals(stdout.readlines()[0], wanted)
Neal Norwitz's avatar
Neal Norwitz committed
99 100 101 102 103 104

def test_suite():
    return unittest.makeSuite(CoreTestCase)

if __name__ == "__main__":
    unittest.main(defaultTest="test_suite")