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