blob: 4ade2cbc0d4b18467be012b511b7ee442d9828f1 [file] [log] [blame]
Berker Peksagce643912015-05-06 06:33:17 +03001"""Unittests for test.support.script_helper. Who tests the test helper?"""
Gregory P. Smithb5684c42015-01-20 17:19:47 -08002
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -08003import subprocess
4import sys
Lorenz Mendea390cb62018-07-04 12:10:15 +02005import os
Berker Peksagce643912015-05-06 06:33:17 +03006from test.support import script_helper
Gregory P. Smithb5684c42015-01-20 17:19:47 -08007import unittest
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -08008from unittest import mock
Gregory P. Smithb5684c42015-01-20 17:19:47 -08009
10
11class TestScriptHelper(unittest.TestCase):
Antoine Pitrou25f85d42015-04-13 19:41:47 +020012
13 def test_assert_python_ok(self):
14 t = script_helper.assert_python_ok('-c', 'import sys; sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080015 self.assertEqual(0, t[0], 'return code was not 0')
16
Antoine Pitrou25f85d42015-04-13 19:41:47 +020017 def test_assert_python_failure(self):
Gregory P. Smithb5684c42015-01-20 17:19:47 -080018 # I didn't import the sys module so this child will fail.
Antoine Pitrou25f85d42015-04-13 19:41:47 +020019 rc, out, err = script_helper.assert_python_failure('-c', 'sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080020 self.assertNotEqual(0, rc, 'return code should not be 0')
21
Antoine Pitrou25f85d42015-04-13 19:41:47 +020022 def test_assert_python_ok_raises(self):
Gregory P. Smithb5684c42015-01-20 17:19:47 -080023 # I didn't import the sys module so this child will fail.
24 with self.assertRaises(AssertionError) as error_context:
Antoine Pitrou25f85d42015-04-13 19:41:47 +020025 script_helper.assert_python_ok('-c', 'sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080026 error_msg = str(error_context.exception)
Victor Stinner268225f2015-03-20 14:02:33 +010027 self.assertIn('command line:', error_msg)
Gregory P. Smithb5684c42015-01-20 17:19:47 -080028 self.assertIn('sys.exit(0)', error_msg, msg='unexpected command line')
29
Antoine Pitrou25f85d42015-04-13 19:41:47 +020030 def test_assert_python_failure_raises(self):
Gregory P. Smithb5684c42015-01-20 17:19:47 -080031 with self.assertRaises(AssertionError) as error_context:
Antoine Pitrou25f85d42015-04-13 19:41:47 +020032 script_helper.assert_python_failure('-c', 'import sys; sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080033 error_msg = str(error_context.exception)
Victor Stinner268225f2015-03-20 14:02:33 +010034 self.assertIn('Process return code is 0\n', error_msg)
Gregory P. Smithb5684c42015-01-20 17:19:47 -080035 self.assertIn('import sys; sys.exit(0)', error_msg,
36 msg='unexpected command line.')
37
Gregory P. Smithc3493aa2015-02-04 17:10:19 -080038 @mock.patch('subprocess.Popen')
39 def test_assert_python_isolated_when_env_not_required(self, mock_popen):
40 with mock.patch.object(script_helper,
Gregory P. Smith7c60eb82015-02-04 17:16:30 -080041 'interpreter_requires_environment',
Gregory P. Smithc3493aa2015-02-04 17:10:19 -080042 return_value=False) as mock_ire_func:
43 mock_popen.side_effect = RuntimeError('bail out of unittest')
44 try:
45 script_helper._assert_python(True, '-c', 'None')
46 except RuntimeError as err:
47 self.assertEqual('bail out of unittest', err.args[0])
48 self.assertEqual(1, mock_popen.call_count)
49 self.assertEqual(1, mock_ire_func.call_count)
50 popen_command = mock_popen.call_args[0][0]
51 self.assertEqual(sys.executable, popen_command[0])
52 self.assertIn('None', popen_command)
53 self.assertIn('-I', popen_command)
54 self.assertNotIn('-E', popen_command) # -I overrides this
55
56 @mock.patch('subprocess.Popen')
57 def test_assert_python_not_isolated_when_env_is_required(self, mock_popen):
58 """Ensure that -I is not passed when the environment is required."""
59 with mock.patch.object(script_helper,
Gregory P. Smith7c60eb82015-02-04 17:16:30 -080060 'interpreter_requires_environment',
Gregory P. Smithc3493aa2015-02-04 17:10:19 -080061 return_value=True) as mock_ire_func:
62 mock_popen.side_effect = RuntimeError('bail out of unittest')
63 try:
64 script_helper._assert_python(True, '-c', 'None')
65 except RuntimeError as err:
66 self.assertEqual('bail out of unittest', err.args[0])
67 popen_command = mock_popen.call_args[0][0]
68 self.assertNotIn('-I', popen_command)
69 self.assertNotIn('-E', popen_command)
70
Gregory P. Smithb5684c42015-01-20 17:19:47 -080071
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080072class TestScriptHelperEnvironment(unittest.TestCase):
Gregory P. Smith8f2fae12015-02-04 01:04:31 -080073 """Code coverage for interpreter_requires_environment()."""
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080074
75 def setUp(self):
76 self.assertTrue(
Lorenz Mendea390cb62018-07-04 12:10:15 +020077 hasattr(script_helper, '__cached_interp_requires_environment'))
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080078 # Reset the private cached state.
79 script_helper.__dict__['__cached_interp_requires_environment'] = None
80
81 def tearDown(self):
82 # Reset the private cached state.
83 script_helper.__dict__['__cached_interp_requires_environment'] = None
84
85 @mock.patch('subprocess.check_call')
86 def test_interpreter_requires_environment_true(self, mock_check_call):
Lorenz Mendea390cb62018-07-04 12:10:15 +020087 with mock.patch.dict(os.environ):
88 os.environ.pop('PYTHONHOME', None)
89 mock_check_call.side_effect = subprocess.CalledProcessError('', '')
90 self.assertTrue(script_helper.interpreter_requires_environment())
91 self.assertTrue(script_helper.interpreter_requires_environment())
92 self.assertEqual(1, mock_check_call.call_count)
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080093
94 @mock.patch('subprocess.check_call')
95 def test_interpreter_requires_environment_false(self, mock_check_call):
Lorenz Mendea390cb62018-07-04 12:10:15 +020096 with mock.patch.dict(os.environ):
97 os.environ.pop('PYTHONHOME', None)
98 # The mocked subprocess.check_call fakes a no-error process.
99 script_helper.interpreter_requires_environment()
100 self.assertFalse(script_helper.interpreter_requires_environment())
101 self.assertEqual(1, mock_check_call.call_count)
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -0800102
103 @mock.patch('subprocess.check_call')
104 def test_interpreter_requires_environment_details(self, mock_check_call):
Lorenz Mendea390cb62018-07-04 12:10:15 +0200105 with mock.patch.dict(os.environ):
106 os.environ.pop('PYTHONHOME', None)
107 script_helper.interpreter_requires_environment()
108 self.assertFalse(script_helper.interpreter_requires_environment())
109 self.assertFalse(script_helper.interpreter_requires_environment())
110 self.assertEqual(1, mock_check_call.call_count)
111 check_call_command = mock_check_call.call_args[0][0]
112 self.assertEqual(sys.executable, check_call_command[0])
113 self.assertIn('-E', check_call_command)
114
115 @mock.patch('subprocess.check_call')
116 def test_interpreter_requires_environment_with_pythonhome(self, mock_check_call):
117 with mock.patch.dict(os.environ):
118 os.environ['PYTHONHOME'] = 'MockedHome'
119 self.assertTrue(script_helper.interpreter_requires_environment())
120 self.assertTrue(script_helper.interpreter_requires_environment())
121 self.assertEqual(0, mock_check_call.call_count)
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -0800122
123
Gregory P. Smithb5684c42015-01-20 17:19:47 -0800124if __name__ == '__main__':
125 unittest.main()