1"""Tests for distutils.command.config."""
2import unittest
3import os
4import sys
5from test.support import run_unittest, missing_compiler_executable
6
7from distutils.command.config import dump_file, config
8from distutils.tests import support
9from distutils import log
10
11class ConfigTestCase(support.LoggingSilencer,
12                     support.TempdirManager,
13                     unittest.TestCase):
14
15    def _info(self, msg, *args):
16        for line in msg.splitlines():
17            self._logs.append(line)
18
19    def setUp(self):
20        super(ConfigTestCase, self).setUp()
21        self._logs = []
22        self.old_log = log.info
23        log.info = self._info
24
25    def tearDown(self):
26        log.info = self.old_log
27        super(ConfigTestCase, self).tearDown()
28
29    def test_dump_file(self):
30        this_file = os.path.splitext(__file__)[0] + '.py'
31        f = open(this_file)
32        try:
33            numlines = len(f.readlines())
34        finally:
35            f.close()
36
37        dump_file(this_file, 'I am the header')
38        self.assertEqual(len(self._logs), numlines+1)
39
40    @unittest.skipIf(sys.platform == 'win32', "can't test on Windows")
41    def test_search_cpp(self):
42        cmd = missing_compiler_executable(['preprocessor'])
43        if cmd is not None:
44            self.skipTest('The %r command is not found' % cmd)
45        pkg_dir, dist = self.create_dist()
46        cmd = config(dist)
47        cmd._check_compiler()
48        compiler = cmd.compiler
49        if sys.platform[:3] == "aix" and "xlc" in compiler.preprocessor[0].lower():
50            self.skipTest('xlc: The -E option overrides the -P, -o, and -qsyntaxonly options')
51
52        # simple pattern searches
53        match = cmd.search_cpp(pattern='xxx', body='/* xxx */')
54        self.assertEqual(match, 0)
55
56        match = cmd.search_cpp(pattern='_configtest', body='/* xxx */')
57        self.assertEqual(match, 1)
58
59    def test_finalize_options(self):
60        # finalize_options does a bit of transformation
61        # on options
62        pkg_dir, dist = self.create_dist()
63        cmd = config(dist)
64        cmd.include_dirs = 'one%stwo' % os.pathsep
65        cmd.libraries = 'one'
66        cmd.library_dirs = 'three%sfour' % os.pathsep
67        cmd.ensure_finalized()
68
69        self.assertEqual(cmd.include_dirs, ['one', 'two'])
70        self.assertEqual(cmd.libraries, ['one'])
71        self.assertEqual(cmd.library_dirs, ['three', 'four'])
72
73    def test_clean(self):
74        # _clean removes files
75        tmp_dir = self.mkdtemp()
76        f1 = os.path.join(tmp_dir, 'one')
77        f2 = os.path.join(tmp_dir, 'two')
78
79        self.write_file(f1, 'xxx')
80        self.write_file(f2, 'xxx')
81
82        for f in (f1, f2):
83            self.assertTrue(os.path.exists(f))
84
85        pkg_dir, dist = self.create_dist()
86        cmd = config(dist)
87        cmd._clean(f1, f2)
88
89        for f in (f1, f2):
90            self.assertFalse(os.path.exists(f))
91
92def test_suite():
93    return unittest.makeSuite(ConfigTestCase)
94
95if __name__ == "__main__":
96    run_unittest(test_suite())
97