128 # (from http://docs.python.org/2/library/functions.html?#reload). |
128 # (from http://docs.python.org/2/library/functions.html?#reload). |
129 p = subprocess.Popen(cmd, shell=True, |
129 p = subprocess.Popen(cmd, shell=True, |
130 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
130 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
131 return p.communicate() # returns stdout, stderr |
131 return p.communicate() # returns stdout, stderr |
132 |
132 |
133 def printhexfail(testnumber, hexversion, stdout, expected): |
133 def hexfailmsg(testnumber, hexversion, stdout, expected): |
134 try: |
134 try: |
135 hexstring = hex(hexversion) |
135 hexstring = hex(hexversion) |
136 except TypeError: |
136 except TypeError: |
137 hexstring = None |
137 hexstring = None |
138 print("FAILED: version test #%s with Python %s and patched " |
138 return ("FAILED: version test #%s with Python %s and patched " |
139 "sys.hexversion %r (%r):\n Expected %s but got:\n-->'%s'\n" % |
139 "sys.hexversion %r (%r):\n Expected %s but got:\n-->'%s'\n" % |
140 (testnumber, sys.version_info, hexversion, hexstring, expected, |
140 (testnumber, sys.version_info, hexversion, hexstring, expected, |
141 stdout)) |
141 stdout)) |
142 |
|
143 def testversionokay(testnumber, hexversion): |
|
144 stdout, stderr = importparsers(hexversion) |
|
145 if stdout: |
|
146 printhexfail(testnumber, hexversion, stdout, expected="no stdout") |
|
147 |
|
148 def testversionfail(testnumber, hexversion): |
|
149 stdout, stderr = importparsers(hexversion) |
|
150 # We include versionerrortext to distinguish from other ImportErrors. |
|
151 errtext = b"ImportError: %s" % pycompat.sysbytes(parsers.versionerrortext) |
|
152 if errtext not in stdout: |
|
153 printhexfail(testnumber, hexversion, stdout, |
|
154 expected="stdout to contain %r" % errtext) |
|
155 |
142 |
156 def makehex(major, minor, micro): |
143 def makehex(major, minor, micro): |
157 return int("%x%02x%02x00" % (major, minor, micro), 16) |
144 return int("%x%02x%02x00" % (major, minor, micro), 16) |
158 |
145 |
159 class parseindex2tests(unittest.TestCase): |
146 class parseindex2tests(unittest.TestCase): |
|
147 |
|
148 def assertversionokay(self, testnumber, hexversion): |
|
149 stdout, stderr = importparsers(hexversion) |
|
150 self.assertFalse( |
|
151 stdout, hexfailmsg(testnumber, hexversion, stdout, 'no stdout')) |
|
152 |
|
153 def assertversionfail(self, testnumber, hexversion): |
|
154 stdout, stderr = importparsers(hexversion) |
|
155 # We include versionerrortext to distinguish from other ImportErrors. |
|
156 errtext = b"ImportError: %s" % pycompat.sysbytes( |
|
157 parsers.versionerrortext) |
|
158 self.assertIn(errtext, stdout, |
|
159 hexfailmsg(testnumber, hexversion, stdout, |
|
160 expected="stdout to contain %r" % errtext)) |
|
161 |
160 def testversiondetection(self): |
162 def testversiondetection(self): |
161 """Check the version-detection logic when importing parsers.""" |
163 """Check the version-detection logic when importing parsers.""" |
162 # Only test the version-detection logic if it is present. |
164 # Only test the version-detection logic if it is present. |
163 try: |
165 try: |
164 parsers.versionerrortext |
166 parsers.versionerrortext |
165 except AttributeError: |
167 except AttributeError: |
166 return |
168 return |
167 info = sys.version_info |
169 info = sys.version_info |
168 major, minor, micro = info[0], info[1], info[2] |
170 major, minor, micro = info[0], info[1], info[2] |
169 # Test same major-minor versions. |
171 # Test same major-minor versions. |
170 testversionokay(1, makehex(major, minor, micro)) |
172 self.assertversionokay(1, makehex(major, minor, micro)) |
171 testversionokay(2, makehex(major, minor, micro + 1)) |
173 self.assertversionokay(2, makehex(major, minor, micro + 1)) |
172 # Test different major-minor versions. |
174 # Test different major-minor versions. |
173 testversionfail(3, makehex(major + 1, minor, micro)) |
175 self.assertversionfail(3, makehex(major + 1, minor, micro)) |
174 testversionfail(4, makehex(major, minor + 1, micro)) |
176 self.assertversionfail(4, makehex(major, minor + 1, micro)) |
175 testversionfail(5, "'foo'") |
177 self.assertversionfail(5, "'foo'") |
176 |
178 |
177 def testbadargs(self): |
179 def testbadargs(self): |
178 # Check that parse_index2() raises TypeError on bad arguments. |
180 # Check that parse_index2() raises TypeError on bad arguments. |
179 with self.assertRaises(TypeError): |
181 with self.assertRaises(TypeError): |
180 parse_index2(0, True) |
182 parse_index2(0, True) |