summaryrefslogtreecommitdiff
path: root/distutils2/tests/test_run.py
blob: a6e2c201fe08b59f4be28e7408f6f781a1c4ed9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""Tests for distutils2.run."""

import os
import sys
from StringIO import StringIO

from distutils2 import install
from distutils2.tests import unittest, support
from distutils2.run import main

from distutils2.tests.support import assert_python_ok, assert_python_failure

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

from distutils2.run import setup
setup()
"""

setup_prints_cwd = """\
import os
print os.getcwd()

from distutils2.run import setup
setup()
"""


class RunTestCase(support.TempdirManager,
                  support.LoggingCatcher,
                  unittest.TestCase):

    def setUp(self):
        super(RunTestCase, self).setUp()
        self.old_argv = sys.argv, sys.argv[:]

    def tearDown(self):
        sys.argv = self.old_argv[0]
        sys.argv[:] = self.old_argv[1]
        super(RunTestCase, self).tearDown()

    # TODO restore the tests removed six months ago and port them to pysetup

    def test_install(self):
        # making sure install returns 0 or 1 exit codes
        project = os.path.join(os.path.dirname(__file__), 'package.tgz')
        install_path = self.mkdtemp()
        old_get_path = install.get_path
        install.get_path = lambda path: install_path
        old_mod = os.stat(install_path).st_mode
        os.chmod(install_path, 0)
        old_stderr = sys.stderr
        sys.stderr = StringIO()
        try:
            self.assertFalse(install.install(project))
            self.assertEqual(main(['install', 'blabla']), 1)
        finally:
            sys.stderr = old_stderr
            os.chmod(install_path, old_mod)
            install.get_path = old_get_path

    def get_pythonpath(self):
        pythonpath = os.environ.get('PYTHONPATH')
        d2parent = os.path.dirname(os.path.dirname(__file__))
        if pythonpath is not None:
            pythonpath = os.pathsep.join((pythonpath, d2parent))
        else:
            pythonpath = d2parent
        return pythonpath

    def test_show_help(self):
        # smoke test, just makes sure some help is displayed
        status, out, err = assert_python_ok(
            '-c', 'from distutils2.run import main; main()', '--help',
            PYTHONPATH=self.get_pythonpath())
        self.assertEqual(status, 0)
        self.assertGreater(out, '')
        self.assertEqual(err, '')

    def test_list_commands(self):
        status, out, err = assert_python_ok(
            '-c', 'from distutils2.run import main; main()', 'run',
            '--list-commands', PYTHONPATH=self.get_pythonpath())
        # check that something is displayed
        self.assertEqual(status, 0)
        self.assertGreater(out, '')
        self.assertEqual(err, '')

        # make sure the manual grouping of commands is respected
        check_position = out.find('  check: ')
        build_position = out.find('  build: ')
        self.assertTrue(check_position, out)  # "out" printed as debugging aid
        self.assertTrue(build_position, out)
        self.assertLess(check_position, build_position, out)

    def test_unknown_run_option(self):
        status, out, err = assert_python_failure(
            '-c', 'from distutils2.run import main; main()', 'run', 'build',
            '--unknown', PYTHONPATH=self.get_pythonpath()
        )
        self.assertEqual(status, 1)
        self.assertGreater(out, '')
        self.assertEqual(err.splitlines()[-1],
                        'error: option --unknown not recognized')

    def test_unknown_command(self):
        status, out, err = assert_python_failure(
            '-c', 'from distutils2.run import main; main()', 'run',
            'invalid_command', PYTHONPATH=self.get_pythonpath()
        )
        self.assertEqual(status, 1)
        self.assertGreater(out, 1)
        self.assertEqual(err.splitlines()[-1],
            'error: Invalid command invalid_command')

    def test_unknown_action(self):
        status, out, err = assert_python_failure(
            '-c', 'from distutils2.run import main; main()', 'invalid_action',
            PYTHONPATH=self.get_pythonpath()
        )
        self.assertEqual(status, 1)
        self.assertGreater(out, 1)
        self.assertEqual(err.splitlines()[-1],
            'error: Unrecognized action invalid_action')

        # TODO test that custom commands don't break --list-commands


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

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