summaryrefslogtreecommitdiff
path: root/distutils2/tests/test_command_build_scripts.py
blob: f96a34c182462ac3879c7d926f3d97d8f7e5edb1 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
"""Tests for distutils.command.build_scripts."""

import os
import sys
from distutils2.dist import Distribution
from distutils2.command.build_scripts import build_scripts
from distutils2._backport import sysconfig

from distutils2.tests import unittest, support


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

    def test_default_settings(self):
        cmd = self.get_build_scripts_cmd("/foo/bar", [])
        self.assertFalse(cmd.force)
        self.assertIs(cmd.build_dir, None)

        cmd.finalize_options()

        self.assertFalse(cmd.force)
        self.assertEqual(cmd.build_dir, "/foo/bar")

    def test_build(self):
        source = self.mkdtemp()
        target = self.mkdtemp()
        expected = self.write_sample_scripts(source)

        cmd = self.get_build_scripts_cmd(target,
                                         [os.path.join(source, fn)
                                          for fn in expected])
        cmd.finalize_options()
        cmd.run()

        built = os.listdir(target)
        for name in expected:
            self.assertIn(name, built)

    def get_build_scripts_cmd(self, target, scripts,
                              executable=sys.executable):
        dist = Distribution()
        dist.scripts = scripts
        dist.command_obj["build"] = support.DummyCommand(
            build_scripts=target,
            force=False,
            executable=executable,
            use_2to3=False,
            use_2to3_fixers=None,
            convert_2to3_doctests=None
            )
        return build_scripts(dist)

    def write_sample_scripts(self, dir):
        expected = []
        expected.append("script1.py")
        self.write_script(dir, "script1.py",
                          ("#! /usr/bin/env python2.3\n"
                           "# bogus script w/ Python sh-bang\n"
                           "pass\n"))
        expected.append("script2.py")
        self.write_script(dir, "script2.py",
                          ("#!/usr/bin/python\n"
                           "# bogus script w/ Python sh-bang\n"
                           "pass\n"))
        expected.append("shell.sh")
        self.write_script(dir, "shell.sh",
                          ("#!/bin/sh\n"
                           "# bogus shell script w/ sh-bang\n"
                           "exit 0\n"))
        return expected

    def write_script(self, dir, name, text):
        with open(os.path.join(dir, name), "w") as f:
            f.write(text)

    def test_version_int(self):
        source = self.mkdtemp()
        target = self.mkdtemp()
        expected = self.write_sample_scripts(source)

        cmd = self.get_build_scripts_cmd(
            target, [os.path.join(source, fn) for fn in expected])
        cmd.finalize_options()

        # http://bugs.python.org/issue4524
        #
        # On linux-g++-32 with command line `./configure --enable-ipv6
        # --with-suffix=3`, python is compiled okay but the build scripts
        # failed when writing the name of the executable
        old = sysconfig.get_config_vars().get('VERSION')
        sysconfig._CONFIG_VARS['VERSION'] = 4
        try:
            cmd.run()
        finally:
            if old is not None:
                sysconfig._CONFIG_VARS['VERSION'] = old

        built = os.listdir(target)
        for name in expected:
            self.assertIn(name, built)

    def test_build_dir_recreated(self):
        source = self.mkdtemp()
        target = self.mkdtemp()
        self.write_script(source, 'taunt', '#! /usr/bin/python')

        built = os.path.join(target, 'taunt')

        cmd = self.get_build_scripts_cmd(
            target, [os.path.join(source, 'taunt')], 'pythona')
        cmd.finalize_options()
        cmd.run()

        with open(built) as fp:
            firstline = fp.readline().strip()
        self.assertEqual(firstline, '#!pythona')

        cmd = self.get_build_scripts_cmd(
            target, [os.path.join(source, 'taunt')], 'pythonx')
        cmd.finalize_options()
        cmd.run()

        with open(built) as fp:
            firstline = fp.readline().strip()
        self.assertEqual(firstline, '#!pythonx')

    def test_build_old_scripts_deleted(self):
        source = self.mkdtemp()
        target = self.mkdtemp()

        expected = ['script1.py', 'script2.py']
        self.write_script(source, "script1.py",
                          ("#! /usr/bin/env python2.3\n"
                           "pass\n"))
        self.write_script(source, "script2.py",
                          ("#!/usr/bin/python\n"
                           "pass\n"))

        cmd = self.get_build_scripts_cmd(
            target, [os.path.join(source, fn) for fn in expected])
        cmd.finalize_options()
        cmd.run()

        built = sorted(os.listdir(target))
        self.assertEqual(built, expected)

        # if we run build_scripts with a different list of scripts, the old
        # ones used to be left over in the build directory and installed anyway
        cmd = self.get_build_scripts_cmd(
            target, [os.path.join(source, 'script1.py')])
        cmd.finalize_options()
        cmd.run()

        built = os.listdir(target)
        self.assertEqual(built, ['script1.py'])


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

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