##// END OF EJS Templates
utils/tests: move to pytest.mark.parameterize in test_process.py
Nate Rush -
Show More
@@ -1,187 +1,185 b''
1 1 # encoding: utf-8
2 2 """
3 3 Tests for platutils.py
4 4 """
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2008-2011 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 import sys
18 18 import signal
19 19 import os
20 20 import time
21 21 from _thread import interrupt_main # Py 3
22 22 import threading
23 23
24 24 import pytest
25 25
26 26 from IPython.utils.process import (find_cmd, FindCmdError, arg_split,
27 27 system, getoutput, getoutputerror,
28 28 get_output_error_code)
29 29 from IPython.utils.capture import capture_output
30 30 from IPython.testing import decorators as dec
31 31 from IPython.testing import tools as tt
32 32
33 33 python = os.path.basename(sys.executable)
34 34
35 35 #-----------------------------------------------------------------------------
36 36 # Tests
37 37 #-----------------------------------------------------------------------------
38 38
39 39
40 40 @dec.skip_win32
41 41 def test_find_cmd_ls():
42 42 """Make sure we can find the full path to ls."""
43 43 path = find_cmd("ls")
44 44 assert path.endswith("ls")
45 45
46 46
47 47 @dec.skip_if_not_win32
48 48 def test_find_cmd_pythonw():
49 49 """Try to find pythonw on Windows."""
50 50 path = find_cmd('pythonw')
51 51 assert path.lower().endswith('pythonw.exe'), path
52 52
53 53
54 54 def test_find_cmd_fail():
55 55 """Make sure that FindCmdError is raised if we can't find the cmd."""
56 56 pytest.raises(FindCmdError, find_cmd, "asdfasdf")
57 57
58 58
59 # TODO: move to pytest.mark.parametrize once nose gone
60 59 @dec.skip_win32
61 def test_arg_split():
62 """Ensure that argument lines are correctly split like in a shell."""
63 tests = [['hi', ['hi']],
64 [u'hi', [u'hi']],
65 ['hello there', ['hello', 'there']],
60 @pytest.mark.parametrize('argstr, argv', [
61 ('hi', ['hi']),
62 (u'hi', [u'hi']),
63 ('hello there', ['hello', 'there']),
66 64 # \u01ce == \N{LATIN SMALL LETTER A WITH CARON}
67 65 # Do not use \N because the tests crash with syntax error in
68 66 # some cases, for example windows python2.6.
69 [u'h\u01cello', [u'h\u01cello']],
70 ['something "with quotes"', ['something', '"with quotes"']],
71 ]
72 for argstr, argv in tests:
67 (u'h\u01cello', [u'h\u01cello']),
68 ('something "with quotes"', ['something', '"with quotes"']),
69 ])
70 def test_arg_split(argstr, argv):
71 """Ensure that argument lines are correctly split like in a shell."""
73 72 assert arg_split(argstr) == argv
74 73
75 74
76 # TODO: move to pytest.mark.parametrize once nose gone
77 75 @dec.skip_if_not_win32
78 def test_arg_split_win32():
76 @pytest.mark.parametrize('argstr,argv', [
77 ('hi', ['hi']),
78 (u'hi', [u'hi']),
79 ('hello there', ['hello', 'there']),
80 (u'h\u01cello', [u'h\u01cello']),
81 ('something "with quotes"', ['something', 'with quotes']),
82 ])
83 def test_arg_split_win32(argstr, argv):
79 84 """Ensure that argument lines are correctly split like in a shell."""
80 tests = [['hi', ['hi']],
81 [u'hi', [u'hi']],
82 ['hello there', ['hello', 'there']],
83 [u'h\u01cello', [u'h\u01cello']],
84 ['something "with quotes"', ['something', 'with quotes']],
85 ]
86 for argstr, argv in tests:
87 85 assert arg_split(argstr) == argv
88 86
89 87
90 88 class SubProcessTestCase(tt.TempFileMixin):
91 89 def setUp(self):
92 90 """Make a valid python temp file."""
93 91 lines = [ "import sys",
94 92 "print('on stdout', end='', file=sys.stdout)",
95 93 "print('on stderr', end='', file=sys.stderr)",
96 94 "sys.stdout.flush()",
97 95 "sys.stderr.flush()"]
98 96 self.mktmp('\n'.join(lines))
99 97
100 98 def test_system(self):
101 99 status = system('%s "%s"' % (python, self.fname))
102 100 self.assertEqual(status, 0)
103 101
104 102 def test_system_quotes(self):
105 103 status = system('%s -c "import sys"' % python)
106 104 self.assertEqual(status, 0)
107 105
108 106 def assert_interrupts(self, command):
109 107 """
110 108 Interrupt a subprocess after a second.
111 109 """
112 110 if threading.main_thread() != threading.current_thread():
113 111 raise pytest.skip("Can't run this test if not in main thread.")
114 112
115 113 # Some tests can overwrite SIGINT handler (by using pdb for example),
116 114 # which then breaks this test, so just make sure it's operating
117 115 # normally.
118 116 signal.signal(signal.SIGINT, signal.default_int_handler)
119 117
120 118 def interrupt():
121 119 # Wait for subprocess to start:
122 120 time.sleep(0.5)
123 121 interrupt_main()
124 122
125 123 threading.Thread(target=interrupt).start()
126 124 start = time.time()
127 125 try:
128 126 result = command()
129 127 except KeyboardInterrupt:
130 128 # Success!
131 129 pass
132 130 end = time.time()
133 131 self.assertTrue(
134 132 end - start < 2, "Process didn't die quickly: %s" % (end - start)
135 133 )
136 134 return result
137 135
138 136 def test_system_interrupt(self):
139 137 """
140 138 When interrupted in the way ipykernel interrupts IPython, the
141 139 subprocess is interrupted.
142 140 """
143 141 def command():
144 142 return system('%s -c "import time; time.sleep(5)"' % python)
145 143
146 144 status = self.assert_interrupts(command)
147 145 self.assertNotEqual(
148 146 status, 0, "The process wasn't interrupted. Status: %s" % (status,)
149 147 )
150 148
151 149 def test_getoutput(self):
152 150 out = getoutput('%s "%s"' % (python, self.fname))
153 151 # we can't rely on the order the line buffered streams are flushed
154 152 try:
155 153 self.assertEqual(out, 'on stderron stdout')
156 154 except AssertionError:
157 155 self.assertEqual(out, 'on stdouton stderr')
158 156
159 157 def test_getoutput_quoted(self):
160 158 out = getoutput('%s -c "print (1)"' % python)
161 159 self.assertEqual(out.strip(), '1')
162 160
163 161 #Invalid quoting on windows
164 162 @dec.skip_win32
165 163 def test_getoutput_quoted2(self):
166 164 out = getoutput("%s -c 'print (1)'" % python)
167 165 self.assertEqual(out.strip(), '1')
168 166 out = getoutput("%s -c 'print (\"1\")'" % python)
169 167 self.assertEqual(out.strip(), '1')
170 168
171 169 def test_getoutput_error(self):
172 170 out, err = getoutputerror('%s "%s"' % (python, self.fname))
173 171 self.assertEqual(out, 'on stdout')
174 172 self.assertEqual(err, 'on stderr')
175 173
176 174 def test_get_output_error_code(self):
177 175 quiet_exit = '%s -c "import sys; sys.exit(1)"' % python
178 176 out, err, code = get_output_error_code(quiet_exit)
179 177 self.assertEqual(out, '')
180 178 self.assertEqual(err, '')
181 179 self.assertEqual(code, 1)
182 180 out, err, code = get_output_error_code('%s "%s"' % (python, self.fname))
183 181 self.assertEqual(out, 'on stdout')
184 182 self.assertEqual(err, 'on stderr')
185 183 self.assertEqual(code, 0)
186 184
187 185
General Comments 0
You need to be logged in to leave comments. Login now