##// END OF EJS Templates
find_cmd is not using pywin32 for a while already
Nikita Kniazev -
Show More
@@ -1,197 +1,187 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 def has_pywin32():
48 try:
49 import win32api
50 except ImportError:
51 return False
52 return True
53
54
55 @dec.onlyif(has_pywin32, "This test requires win32api to run")
47 @dec.skip_if_not_win32
56 48 def test_find_cmd_pythonw():
57 49 """Try to find pythonw on Windows."""
58 50 path = find_cmd('pythonw')
59 51 assert path.lower().endswith('pythonw.exe'), path
60 52
61 53
62 @dec.onlyif(lambda : sys.platform != 'win32' or has_pywin32(),
63 "This test runs on posix or in win32 with win32api installed")
64 54 def test_find_cmd_fail():
65 55 """Make sure that FindCmdError is raised if we can't find the cmd."""
66 56 pytest.raises(FindCmdError, find_cmd, "asdfasdf")
67 57
68 58
69 59 # TODO: move to pytest.mark.parametrize once nose gone
70 60 @dec.skip_win32
71 61 def test_arg_split():
72 62 """Ensure that argument lines are correctly split like in a shell."""
73 63 tests = [['hi', ['hi']],
74 64 [u'hi', [u'hi']],
75 65 ['hello there', ['hello', 'there']],
76 66 # \u01ce == \N{LATIN SMALL LETTER A WITH CARON}
77 67 # Do not use \N because the tests crash with syntax error in
78 68 # some cases, for example windows python2.6.
79 69 [u'h\u01cello', [u'h\u01cello']],
80 70 ['something "with quotes"', ['something', '"with quotes"']],
81 71 ]
82 72 for argstr, argv in tests:
83 73 assert arg_split(argstr) == argv
84 74
85 75
86 76 # TODO: move to pytest.mark.parametrize once nose gone
87 77 @dec.skip_if_not_win32
88 78 def test_arg_split_win32():
89 79 """Ensure that argument lines are correctly split like in a shell."""
90 80 tests = [['hi', ['hi']],
91 81 [u'hi', [u'hi']],
92 82 ['hello there', ['hello', 'there']],
93 83 [u'h\u01cello', [u'h\u01cello']],
94 84 ['something "with quotes"', ['something', 'with quotes']],
95 85 ]
96 86 for argstr, argv in tests:
97 87 assert arg_split(argstr) == argv
98 88
99 89
100 90 class SubProcessTestCase(tt.TempFileMixin):
101 91 def setUp(self):
102 92 """Make a valid python temp file."""
103 93 lines = [ "import sys",
104 94 "print('on stdout', end='', file=sys.stdout)",
105 95 "print('on stderr', end='', file=sys.stderr)",
106 96 "sys.stdout.flush()",
107 97 "sys.stderr.flush()"]
108 98 self.mktmp('\n'.join(lines))
109 99
110 100 def test_system(self):
111 101 status = system('%s "%s"' % (python, self.fname))
112 102 self.assertEqual(status, 0)
113 103
114 104 def test_system_quotes(self):
115 105 status = system('%s -c "import sys"' % python)
116 106 self.assertEqual(status, 0)
117 107
118 108 def assert_interrupts(self, command):
119 109 """
120 110 Interrupt a subprocess after a second.
121 111 """
122 112 if threading.main_thread() != threading.current_thread():
123 113 raise pytest.skip("Can't run this test if not in main thread.")
124 114
125 115 # Some tests can overwrite SIGINT handler (by using pdb for example),
126 116 # which then breaks this test, so just make sure it's operating
127 117 # normally.
128 118 signal.signal(signal.SIGINT, signal.default_int_handler)
129 119
130 120 def interrupt():
131 121 # Wait for subprocess to start:
132 122 time.sleep(0.5)
133 123 interrupt_main()
134 124
135 125 threading.Thread(target=interrupt).start()
136 126 start = time.time()
137 127 try:
138 128 result = command()
139 129 except KeyboardInterrupt:
140 130 # Success!
141 131 pass
142 132 end = time.time()
143 133 self.assertTrue(
144 134 end - start < 2, "Process didn't die quickly: %s" % (end - start)
145 135 )
146 136 return result
147 137
148 138 def test_system_interrupt(self):
149 139 """
150 140 When interrupted in the way ipykernel interrupts IPython, the
151 141 subprocess is interrupted.
152 142 """
153 143 def command():
154 144 return system('%s -c "import time; time.sleep(5)"' % python)
155 145
156 146 status = self.assert_interrupts(command)
157 147 self.assertNotEqual(
158 148 status, 0, "The process wasn't interrupted. Status: %s" % (status,)
159 149 )
160 150
161 151 def test_getoutput(self):
162 152 out = getoutput('%s "%s"' % (python, self.fname))
163 153 # we can't rely on the order the line buffered streams are flushed
164 154 try:
165 155 self.assertEqual(out, 'on stderron stdout')
166 156 except AssertionError:
167 157 self.assertEqual(out, 'on stdouton stderr')
168 158
169 159 def test_getoutput_quoted(self):
170 160 out = getoutput('%s -c "print (1)"' % python)
171 161 self.assertEqual(out.strip(), '1')
172 162
173 163 #Invalid quoting on windows
174 164 @dec.skip_win32
175 165 def test_getoutput_quoted2(self):
176 166 out = getoutput("%s -c 'print (1)'" % python)
177 167 self.assertEqual(out.strip(), '1')
178 168 out = getoutput("%s -c 'print (\"1\")'" % python)
179 169 self.assertEqual(out.strip(), '1')
180 170
181 171 def test_getoutput_error(self):
182 172 out, err = getoutputerror('%s "%s"' % (python, self.fname))
183 173 self.assertEqual(out, 'on stdout')
184 174 self.assertEqual(err, 'on stderr')
185 175
186 176 def test_get_output_error_code(self):
187 177 quiet_exit = '%s -c "import sys; sys.exit(1)"' % python
188 178 out, err, code = get_output_error_code(quiet_exit)
189 179 self.assertEqual(out, '')
190 180 self.assertEqual(err, '')
191 181 self.assertEqual(code, 1)
192 182 out, err, code = get_output_error_code('%s "%s"' % (python, self.fname))
193 183 self.assertEqual(out, 'on stdout')
194 184 self.assertEqual(err, 'on stderr')
195 185 self.assertEqual(code, 0)
196 186
197 187
General Comments 0
You need to be logged in to leave comments. Login now