blob: a7680f886a8d7419572148e162fed945a21f6a29 [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
Berker Peksagce643912015-05-06 06:33:17 +03005from test.support import script_helper
Gregory P. Smithb5684c42015-01-20 17:19:47 -08006import unittest
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -08007from unittest import mock
Gregory P. Smithb5684c42015-01-20 17:19:47 -08008
9
10class TestScriptHelper(unittest.TestCase):
Antoine Pitrou25f85d42015-04-13 19:41:47 +020011
12 def test_assert_python_ok(self):
13 t = script_helper.assert_python_ok('-c', 'import sys; sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080014 self.assertEqual(0, t[0], 'return code was not 0')
15
Antoine Pitrou25f85d42015-04-13 19:41:47 +020016 def test_assert_python_failure(self):
Gregory P. Smithb5684c42015-01-20 17:19:47 -080017 # I didn't import the sys module so this child will fail.
Antoine Pitrou25f85d42015-04-13 19:41:47 +020018 rc, out, err = script_helper.assert_python_failure('-c', 'sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080019 self.assertNotEqual(0, rc, 'return code should not be 0')
20
Antoine Pitrou25f85d42015-04-13 19:41:47 +020021 def test_assert_python_ok_raises(self):
Gregory P. Smithb5684c42015-01-20 17:19:47 -080022 # I didn't import the sys module so this child will fail.
23 with self.assertRaises(AssertionError) as error_context:
Antoine Pitrou25f85d42015-04-13 19:41:47 +020024 script_helper.assert_python_ok('-c', 'sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080025 error_msg = str(error_context.exception)
Victor Stinner268225f2015-03-20 14:02:33 +010026 self.assertIn('command line:', error_msg)
Gregory P. Smithb5684c42015-01-20 17:19:47 -080027 self.assertIn('sys.exit(0)', error_msg, msg='unexpected command line')
28
Antoine Pitrou25f85d42015-04-13 19:41:47 +020029 def test_assert_python_failure_raises(self):
Gregory P. Smithb5684c42015-01-20 17:19:47 -080030 with self.assertRaises(AssertionError) as error_context:
Antoine Pitrou25f85d42015-04-13 19:41:47 +020031 script_helper.assert_python_failure('-c', 'import sys; sys.exit(0)')
Gregory P. Smithb5684c42015-01-20 17:19:47 -080032 error_msg = str(error_context.exception)
Victor Stinner268225f2015-03-20 14:02:33 +010033 self.assertIn('Process return code is 0\n', error_msg)
Gregory P. Smithb5684c42015-01-20 17:19:47 -080034 self.assertIn('import sys; sys.exit(0)', error_msg,
35 msg='unexpected command line.')
36
Gregory P. Smithc3493aa2015-02-04 17:10:19 -080037 @mock.patch('subprocess.Popen')
38 def test_assert_python_isolated_when_env_not_required(self, mock_popen):
39 with mock.patch.object(script_helper,
Gregory P. Smith7c60eb82015-02-04 17:16:30 -080040 'interpreter_requires_environment',
Gregory P. Smithc3493aa2015-02-04 17:10:19 -080041 return_value=False) as mock_ire_func:
42 mock_popen.side_effect = RuntimeError('bail out of unittest')
43 try:
44 script_helper._assert_python(True, '-c', 'None')
45 except RuntimeError as err:
46 self.assertEqual('bail out of unittest', err.args[0])
47 self.assertEqual(1, mock_popen.call_count)
48 self.assertEqual(1, mock_ire_func.call_count)
49 popen_command = mock_popen.call_args[0][0]
50 self.assertEqual(sys.executable, popen_command[0])
51 self.assertIn('None', popen_command)
52 self.assertIn('-I', popen_command)
53 self.assertNotIn('-E', popen_command) # -I overrides this
54
55 @mock.patch('subprocess.Popen')
56 def test_assert_python_not_isolated_when_env_is_required(self, mock_popen):
57 """Ensure that -I is not passed when the environment is required."""
58 with mock.patch.object(script_helper,
Gregory P. Smith7c60eb82015-02-04 17:16:30 -080059 'interpreter_requires_environment',
Gregory P. Smithc3493aa2015-02-04 17:10:19 -080060 return_value=True) as mock_ire_func:
61 mock_popen.side_effect = RuntimeError('bail out of unittest')
62 try:
63 script_helper._assert_python(True, '-c', 'None')
64 except RuntimeError as err:
65 self.assertEqual('bail out of unittest', err.args[0])
66 popen_command = mock_popen.call_args[0][0]
67 self.assertNotIn('-I', popen_command)
68 self.assertNotIn('-E', popen_command)
69
Gregory P. Smithb5684c42015-01-20 17:19:47 -080070
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080071class TestScriptHelperEnvironment(unittest.TestCase):
Gregory P. Smith8f2fae12015-02-04 01:04:31 -080072 """Code coverage for interpreter_requires_environment()."""
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080073
74 def setUp(self):
75 self.assertTrue(
76 hasattr(script_helper, '__cached_interp_requires_environment'))
77 # Reset the private cached state.
78 script_helper.__dict__['__cached_interp_requires_environment'] = None
79
80 def tearDown(self):
81 # Reset the private cached state.
82 script_helper.__dict__['__cached_interp_requires_environment'] = None
83
84 @mock.patch('subprocess.check_call')
85 def test_interpreter_requires_environment_true(self, mock_check_call):
86 mock_check_call.side_effect = subprocess.CalledProcessError('', '')
Gregory P. Smith8f2fae12015-02-04 01:04:31 -080087 self.assertTrue(script_helper.interpreter_requires_environment())
88 self.assertTrue(script_helper.interpreter_requires_environment())
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080089 self.assertEqual(1, mock_check_call.call_count)
90
91 @mock.patch('subprocess.check_call')
92 def test_interpreter_requires_environment_false(self, mock_check_call):
93 # The mocked subprocess.check_call fakes a no-error process.
Gregory P. Smith8f2fae12015-02-04 01:04:31 -080094 script_helper.interpreter_requires_environment()
95 self.assertFalse(script_helper.interpreter_requires_environment())
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -080096 self.assertEqual(1, mock_check_call.call_count)
97
98 @mock.patch('subprocess.check_call')
99 def test_interpreter_requires_environment_details(self, mock_check_call):
Gregory P. Smith8f2fae12015-02-04 01:04:31 -0800100 script_helper.interpreter_requires_environment()
101 self.assertFalse(script_helper.interpreter_requires_environment())
102 self.assertFalse(script_helper.interpreter_requires_environment())
Gregory P. Smithb9a3dd92015-02-04 00:59:40 -0800103 self.assertEqual(1, mock_check_call.call_count)
104 check_call_command = mock_check_call.call_args[0][0]
105 self.assertEqual(sys.executable, check_call_command[0])
106 self.assertIn('-E', check_call_command)
107
108
Gregory P. Smithb5684c42015-01-20 17:19:47 -0800109if __name__ == '__main__':
110 unittest.main()