blob: 856921679d6350cd863e97f5626e59f2394c7b98 [file] [log] [blame]
Tarek Ziadé015c8102009-06-10 18:56:35 +00001"""Tests for distutils.cygwinccompiler."""
2import unittest
3import sys
4import os
Tarek Ziadé41fe2822009-07-12 08:39:08 +00005from io import BytesIO
Tarek Ziadé015c8102009-06-10 18:56:35 +00006import subprocess
Éric Araujob344dd02011-02-02 21:38:37 +00007from test.support import run_unittest
Tarek Ziadé015c8102009-06-10 18:56:35 +00008
9from distutils import cygwinccompiler
10from distutils.cygwinccompiler import (CygwinCCompiler, check_config_h,
11 CONFIG_H_OK, CONFIG_H_NOTOK,
Tarek Ziadéff543362009-06-11 09:25:41 +000012 CONFIG_H_UNCERTAIN, get_versions,
13 get_msvcr)
Tarek Ziadé015c8102009-06-10 18:56:35 +000014from distutils.tests import support
15
16class FakePopen(object):
17 test_class = None
18
19 def __init__(self, cmd, shell, stdout):
20 self.cmd = cmd.split()[0]
21 exes = self.test_class._exes
22 if self.cmd in exes:
Tarek Ziadé41fe2822009-07-12 08:39:08 +000023 # issue #6438 in Python 3.x, Popen returns bytes
24 self.stdout = BytesIO(exes[self.cmd])
Tarek Ziadé015c8102009-06-10 18:56:35 +000025 else:
26 self.stdout = os.popen(cmd, 'r')
27
28
29class CygwinCCompilerTestCase(support.TempdirManager,
30 unittest.TestCase):
31
32 def setUp(self):
33 super(CygwinCCompilerTestCase, self).setUp()
34 self.version = sys.version
35 self.python_h = os.path.join(self.mkdtemp(), 'python.h')
36 from distutils import sysconfig
37 self.old_get_config_h_filename = sysconfig.get_config_h_filename
38 sysconfig.get_config_h_filename = self._get_config_h_filename
39 self.old_find_executable = cygwinccompiler.find_executable
40 cygwinccompiler.find_executable = self._find_executable
41 self._exes = {}
42 self.old_popen = cygwinccompiler.Popen
43 FakePopen.test_class = self
44 cygwinccompiler.Popen = FakePopen
45
46 def tearDown(self):
47 sys.version = self.version
48 from distutils import sysconfig
49 sysconfig.get_config_h_filename = self.old_get_config_h_filename
50 cygwinccompiler.find_executable = self.old_find_executable
51 cygwinccompiler.Popen = self.old_popen
52 super(CygwinCCompilerTestCase, self).tearDown()
53
54 def _get_config_h_filename(self):
55 return self.python_h
56
57 def _find_executable(self, name):
58 if name in self._exes:
59 return name
60 return None
61
62 def test_check_config_h(self):
63
64 # check_config_h looks for "GCC" in sys.version first
65 # returns CONFIG_H_OK if found
66 sys.version = ('2.6.1 (r261:67515, Dec 6 2008, 16:42:21) \n[GCC '
67 '4.0.1 (Apple Computer, Inc. build 5370)]')
68
Ezio Melotti19f2aeb2010-11-21 01:30:29 +000069 self.assertEqual(check_config_h()[0], CONFIG_H_OK)
Tarek Ziadé015c8102009-06-10 18:56:35 +000070
71 # then it tries to see if it can find "__GNUC__" in pyconfig.h
72 sys.version = 'something without the *CC word'
73
74 # if the file doesn't exist it returns CONFIG_H_UNCERTAIN
Ezio Melotti19f2aeb2010-11-21 01:30:29 +000075 self.assertEqual(check_config_h()[0], CONFIG_H_UNCERTAIN)
Tarek Ziadé015c8102009-06-10 18:56:35 +000076
77 # if it exists but does not contain __GNUC__, it returns CONFIG_H_NOTOK
78 self.write_file(self.python_h, 'xxx')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +000079 self.assertEqual(check_config_h()[0], CONFIG_H_NOTOK)
Tarek Ziadé015c8102009-06-10 18:56:35 +000080
81 # and CONFIG_H_OK if __GNUC__ is found
82 self.write_file(self.python_h, 'xxx __GNUC__ xxx')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +000083 self.assertEqual(check_config_h()[0], CONFIG_H_OK)
Tarek Ziadé015c8102009-06-10 18:56:35 +000084
85 def test_get_versions(self):
86
87 # get_versions calls distutils.spawn.find_executable on
88 # 'gcc', 'ld' and 'dllwrap'
Ezio Melotti19f2aeb2010-11-21 01:30:29 +000089 self.assertEqual(get_versions(), (None, None, None))
Tarek Ziadé015c8102009-06-10 18:56:35 +000090
91 # Let's fake we have 'gcc' and it returns '3.4.5'
Tarek Ziadé41fe2822009-07-12 08:39:08 +000092 self._exes['gcc'] = b'gcc (GCC) 3.4.5 (mingw special)\nFSF'
Tarek Ziadé015c8102009-06-10 18:56:35 +000093 res = get_versions()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +000094 self.assertEqual(str(res[0]), '3.4.5')
Tarek Ziadé015c8102009-06-10 18:56:35 +000095
96 # and let's see what happens when the version
97 # doesn't match the regular expression
98 # (\d+\.\d+(\.\d+)*)
Tarek Ziadé41fe2822009-07-12 08:39:08 +000099 self._exes['gcc'] = b'very strange output'
Tarek Ziadé015c8102009-06-10 18:56:35 +0000100 res = get_versions()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000101 self.assertEqual(res[0], None)
Tarek Ziadé015c8102009-06-10 18:56:35 +0000102
103 # same thing for ld
Tarek Ziadé41fe2822009-07-12 08:39:08 +0000104 self._exes['ld'] = b'GNU ld version 2.17.50 20060824'
Tarek Ziadé015c8102009-06-10 18:56:35 +0000105 res = get_versions()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000106 self.assertEqual(str(res[1]), '2.17.50')
Tarek Ziadé41fe2822009-07-12 08:39:08 +0000107 self._exes['ld'] = b'@(#)PROGRAM:ld PROJECT:ld64-77'
Tarek Ziadé015c8102009-06-10 18:56:35 +0000108 res = get_versions()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000109 self.assertEqual(res[1], None)
Tarek Ziadé015c8102009-06-10 18:56:35 +0000110
111 # and dllwrap
Tarek Ziadé41fe2822009-07-12 08:39:08 +0000112 self._exes['dllwrap'] = b'GNU dllwrap 2.17.50 20060824\nFSF'
Tarek Ziadé015c8102009-06-10 18:56:35 +0000113 res = get_versions()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000114 self.assertEqual(str(res[2]), '2.17.50')
Tarek Ziadé41fe2822009-07-12 08:39:08 +0000115 self._exes['dllwrap'] = b'Cheese Wrap'
Tarek Ziadé015c8102009-06-10 18:56:35 +0000116 res = get_versions()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000117 self.assertEqual(res[2], None)
Tarek Ziadé015c8102009-06-10 18:56:35 +0000118
Tarek Ziadéff543362009-06-11 09:25:41 +0000119 def test_get_msvcr(self):
120
121 # none
122 sys.version = ('2.6.1 (r261:67515, Dec 6 2008, 16:42:21) '
123 '\n[GCC 4.0.1 (Apple Computer, Inc. build 5370)]')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000124 self.assertEqual(get_msvcr(), None)
Tarek Ziadéff543362009-06-11 09:25:41 +0000125
126 # MSVC 7.0
127 sys.version = ('2.5.1 (r251:54863, Apr 18 2007, 08:51:08) '
128 '[MSC v.1300 32 bits (Intel)]')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000129 self.assertEqual(get_msvcr(), ['msvcr70'])
Tarek Ziadéff543362009-06-11 09:25:41 +0000130
131 # MSVC 7.1
132 sys.version = ('2.5.1 (r251:54863, Apr 18 2007, 08:51:08) '
133 '[MSC v.1310 32 bits (Intel)]')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000134 self.assertEqual(get_msvcr(), ['msvcr71'])
Tarek Ziadéff543362009-06-11 09:25:41 +0000135
136 # VS2005 / MSVC 8.0
137 sys.version = ('2.5.1 (r251:54863, Apr 18 2007, 08:51:08) '
138 '[MSC v.1400 32 bits (Intel)]')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000139 self.assertEqual(get_msvcr(), ['msvcr80'])
Tarek Ziadéff543362009-06-11 09:25:41 +0000140
141 # VS2008 / MSVC 9.0
142 sys.version = ('2.5.1 (r251:54863, Apr 18 2007, 08:51:08) '
143 '[MSC v.1500 32 bits (Intel)]')
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000144 self.assertEqual(get_msvcr(), ['msvcr90'])
Tarek Ziadéff543362009-06-11 09:25:41 +0000145
146 # unknown
147 sys.version = ('2.5.1 (r251:54863, Apr 18 2007, 08:51:08) '
148 '[MSC v.1999 32 bits (Intel)]')
149 self.assertRaises(ValueError, get_msvcr)
150
Tarek Ziadé015c8102009-06-10 18:56:35 +0000151def test_suite():
152 return unittest.makeSuite(CygwinCCompilerTestCase)
153
154if __name__ == '__main__':
Éric Araujob344dd02011-02-02 21:38:37 +0000155 run_unittest(test_suite())