| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  | import os | 
					
						
							|  |  |  | import subprocess | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2020-04-30 01:48:37 +02:00
										 |  |  | from test.test_tools import scriptsdir, skip_if_missing | 
					
						
							| 
									
										
										
										
											2019-09-05 18:09:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # need Tools/script/ directory: skip if run on Python installed on the system | 
					
						
							|  |  |  | skip_if_missing() | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestPathfixFunctional(unittest.TestCase): | 
					
						
							|  |  |  |     script = os.path.join(scriptsdir, 'pathfix.py') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.addCleanup(support.unlink, support.TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 15:36:50 +02:00
										 |  |  |     def pathfix(self, shebang, pathfix_flags, exitcode=0, stdout='', stderr='', | 
					
						
							|  |  |  |                 directory=''): | 
					
						
							|  |  |  |         if directory: | 
					
						
							|  |  |  |             # bpo-38347: Test filename should contain lowercase, uppercase, | 
					
						
							|  |  |  |             # "-", "_" and digits. | 
					
						
							|  |  |  |             filename = os.path.join(directory, 'script-A_1.py') | 
					
						
							|  |  |  |             pathfix_arg = directory | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             filename = support.TESTFN | 
					
						
							|  |  |  |             pathfix_arg = filename | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         with open(filename, 'w', encoding='utf8') as f: | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  |             f.write(f'{shebang}\n' + 'print("Hello world")\n') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-25 20:39:12 +03:00
										 |  |  |         encoding = sys.getfilesystemencoding() | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  |         proc = subprocess.run( | 
					
						
							|  |  |  |             [sys.executable, self.script, | 
					
						
							| 
									
										
										
										
											2019-10-11 15:36:50 +02:00
										 |  |  |              *pathfix_flags, '-n', pathfix_arg], | 
					
						
							| 
									
										
										
										
											2020-06-25 20:39:12 +03:00
										 |  |  |             env={**os.environ, 'PYTHONIOENCODING': encoding}, | 
					
						
							|  |  |  |             capture_output=True) | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if stdout == '' and proc.returncode == 0: | 
					
						
							| 
									
										
										
										
											2019-10-11 15:36:50 +02:00
										 |  |  |             stdout = f'{filename}: updating\n' | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  |         self.assertEqual(proc.returncode, exitcode, proc) | 
					
						
							| 
									
										
										
										
											2020-06-25 20:39:12 +03:00
										 |  |  |         self.assertEqual(proc.stdout.decode(encoding), stdout.replace('\n', os.linesep), proc) | 
					
						
							|  |  |  |         self.assertEqual(proc.stderr.decode(encoding), stderr.replace('\n', os.linesep), proc) | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 15:36:50 +02:00
										 |  |  |         with open(filename, 'r', encoding='utf8') as f: | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  |             output = f.read() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         lines = output.split('\n') | 
					
						
							|  |  |  |         self.assertEqual(lines[1:], ['print("Hello world")', '']) | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  |         new_shebang = lines[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if proc.returncode != 0: | 
					
						
							|  |  |  |             self.assertEqual(shebang, new_shebang) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return new_shebang | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 15:36:50 +02:00
										 |  |  |     def test_recursive(self): | 
					
						
							|  |  |  |         tmpdir = support.TESTFN + '.d' | 
					
						
							|  |  |  |         self.addCleanup(support.rmtree, tmpdir) | 
					
						
							|  |  |  |         os.mkdir(tmpdir) | 
					
						
							|  |  |  |         expected_stderr = f"recursedown('{os.path.basename(tmpdir)}')\n" | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python', | 
					
						
							|  |  |  |                 ['-i', '/usr/bin/python3'], | 
					
						
							|  |  |  |                 directory=tmpdir, | 
					
						
							|  |  |  |                 stderr=expected_stderr), | 
					
						
							|  |  |  |             '#! /usr/bin/python3') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  |     def test_pathfix(self): | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python', | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  |                 ['-i', '/usr/bin/python3']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3') | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python -R', | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  |                 ['-i', '/usr/bin/python3']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3') | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_pathfix_keeping_flags(self): | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python -R', | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  |                 ['-i', '/usr/bin/python3', '-k']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3 -R') | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python', | 
					
						
							| 
									
										
										
										
											2019-09-25 14:26:28 +02:00
										 |  |  |                 ['-i', '/usr/bin/python3', '-k']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pathfix_adding_flag(self): | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python', | 
					
						
							|  |  |  |                 ['-i', '/usr/bin/python3', '-a', 's']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3 -s') | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python -S', | 
					
						
							|  |  |  |                 ['-i', '/usr/bin/python3', '-a', 's']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3 -s') | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python -V', | 
					
						
							|  |  |  |                 ['-i', '/usr/bin/python3', '-a', 'v', '-k']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3 -vV') | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python', | 
					
						
							|  |  |  |                 ['-i', '/usr/bin/python3', '-a', 'Rs']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3 -Rs') | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.pathfix( | 
					
						
							|  |  |  |                 '#! /usr/bin/env python -W default', | 
					
						
							|  |  |  |                 ['-i', '/usr/bin/python3', '-a', 's', '-k']), | 
					
						
							|  |  |  |             '#! /usr/bin/python3 -sW default') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_pathfix_adding_errors(self): | 
					
						
							|  |  |  |         self.pathfix( | 
					
						
							|  |  |  |             '#! /usr/bin/env python -E', | 
					
						
							|  |  |  |             ['-i', '/usr/bin/python3', '-a', 'W default', '-k'], | 
					
						
							|  |  |  |             exitcode=2, | 
					
						
							|  |  |  |             stderr="-a option doesn't support whitespaces") | 
					
						
							| 
									
										
										
										
											2019-09-05 16:54:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |