blob: c66f49b2310b31e3faabc0d3db987583c9b02ce3 [file] [log] [blame]
Facundo Batistab6a5c9d2007-03-29 18:22:35 +00001import socket
Facundo Batistab6a5c9d2007-03-29 18:22:35 +00002import telnetlib
3import time
Jack Diederich183028e2009-04-06 02:08:44 +00004import Queue
Facundo Batistab6a5c9d2007-03-29 18:22:35 +00005
6from unittest import TestCase
7from test import test_support
Victor Stinner6a102812010-04-27 23:55:59 +00008threading = test_support.import_module('threading')
Facundo Batistab6a5c9d2007-03-29 18:22:35 +00009
Trent Nelsone41b0062008-04-08 23:47:30 +000010HOST = test_support.HOST
Jack Diederich183028e2009-04-06 02:08:44 +000011EOF_sigil = object()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000012
Jack Diederich183028e2009-04-06 02:08:44 +000013def server(evt, serv, dataq=None):
14 """ Open a tcp server in three steps
15 1) set evt to true to let the parent know we are ready
Jack Diederich3b2312e2009-04-07 20:22:59 +000016 2) [optional] if is not False, write the list of data from dataq.get()
17 to the socket.
Jack Diederich183028e2009-04-06 02:08:44 +000018 """
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000019 serv.listen(5)
Neal Norwitz37184292008-01-26 21:21:59 +000020 evt.set()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000021 try:
22 conn, addr = serv.accept()
Jack Diederich183028e2009-04-06 02:08:44 +000023 if dataq:
24 data = ''
Jack Diederich7f9bb912009-04-07 23:56:57 +000025 new_data = dataq.get(True, 0.5)
26 dataq.task_done()
27 for item in new_data:
28 if item == EOF_sigil:
Jack Diederich3b2312e2009-04-07 20:22:59 +000029 break
Jack Diederich7f9bb912009-04-07 23:56:57 +000030 if type(item) in [int, float]:
31 time.sleep(item)
Jack Diederich3b2312e2009-04-07 20:22:59 +000032 else:
Jack Diederich7f9bb912009-04-07 23:56:57 +000033 data += item
Jack Diederich183028e2009-04-06 02:08:44 +000034 written = conn.send(data)
35 data = data[written:]
Jesus Ceacb65f322011-11-08 16:06:44 +010036 conn.close()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000037 except socket.timeout:
38 pass
39 finally:
40 serv.close()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000041
42class GeneralTests(TestCase):
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000043
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000044 def setUp(self):
45 self.evt = threading.Event()
Trent Nelsone41b0062008-04-08 23:47:30 +000046 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Jesus Ceacb65f322011-11-08 16:06:44 +010047 self.sock.settimeout(60) # Safety net. Look issue 11812
Trent Nelsone41b0062008-04-08 23:47:30 +000048 self.port = test_support.bind_port(self.sock)
Jack Diederich183028e2009-04-06 02:08:44 +000049 self.thread = threading.Thread(target=server, args=(self.evt,self.sock))
Jesus Ceacb65f322011-11-08 16:06:44 +010050 self.thread.setDaemon(True)
Jack Diederich183028e2009-04-06 02:08:44 +000051 self.thread.start()
Neal Norwitz37184292008-01-26 21:21:59 +000052 self.evt.wait()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000053
54 def tearDown(self):
Jack Diederich183028e2009-04-06 02:08:44 +000055 self.thread.join()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000056
57 def testBasic(self):
58 # connects
Trent Nelsone41b0062008-04-08 23:47:30 +000059 telnet = telnetlib.Telnet(HOST, self.port)
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000060 telnet.sock.close()
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000061
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000062 def testTimeoutDefault(self):
Facundo Batista4f1b1ed2008-05-29 16:39:26 +000063 self.assertTrue(socket.getdefaulttimeout() is None)
64 socket.setdefaulttimeout(30)
65 try:
Jesus Ceacb65f322011-11-08 16:06:44 +010066 telnet = telnetlib.Telnet(HOST, self.port)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +000067 finally:
68 socket.setdefaulttimeout(None)
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000069 self.assertEqual(telnet.sock.gettimeout(), 30)
70 telnet.sock.close()
71
72 def testTimeoutNone(self):
73 # None, having other default
Facundo Batista4f1b1ed2008-05-29 16:39:26 +000074 self.assertTrue(socket.getdefaulttimeout() is None)
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000075 socket.setdefaulttimeout(30)
76 try:
Trent Nelsone41b0062008-04-08 23:47:30 +000077 telnet = telnetlib.Telnet(HOST, self.port, timeout=None)
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000078 finally:
Facundo Batista4f1b1ed2008-05-29 16:39:26 +000079 socket.setdefaulttimeout(None)
80 self.assertTrue(telnet.sock.gettimeout() is None)
81 telnet.sock.close()
82
83 def testTimeoutValue(self):
Jesus Ceacb65f322011-11-08 16:06:44 +010084 telnet = telnetlib.Telnet(HOST, self.port, timeout=30)
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000085 self.assertEqual(telnet.sock.gettimeout(), 30)
86 telnet.sock.close()
87
Facundo Batista4f1b1ed2008-05-29 16:39:26 +000088 def testTimeoutOpen(self):
89 telnet = telnetlib.Telnet()
Jesus Ceacb65f322011-11-08 16:06:44 +010090 telnet.open(HOST, self.port, timeout=30)
Facundo Batista4f1b1ed2008-05-29 16:39:26 +000091 self.assertEqual(telnet.sock.gettimeout(), 30)
92 telnet.sock.close()
Facundo Batistab6a5c9d2007-03-29 18:22:35 +000093
Jack Diederich183028e2009-04-06 02:08:44 +000094def _read_setUp(self):
Jack Diederich183028e2009-04-06 02:08:44 +000095 self.evt = threading.Event()
96 self.dataq = Queue.Queue()
97 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Charles-François Natali3b818072011-12-19 16:11:04 +010098 self.sock.settimeout(10)
Jack Diederich183028e2009-04-06 02:08:44 +000099 self.port = test_support.bind_port(self.sock)
100 self.thread = threading.Thread(target=server, args=(self.evt,self.sock, self.dataq))
101 self.thread.start()
102 self.evt.wait()
Jack Diederich183028e2009-04-06 02:08:44 +0000103
104def _read_tearDown(self):
Jack Diederich183028e2009-04-06 02:08:44 +0000105 self.thread.join()
106
Jack Diederich183028e2009-04-06 02:08:44 +0000107class ReadTests(TestCase):
108 setUp = _read_setUp
109 tearDown = _read_tearDown
110
Jack Diederich7f9bb912009-04-07 23:56:57 +0000111 # use a similar approach to testing timeouts as test_timeout.py
112 # these will never pass 100% but make the fuzz big enough that it is rare
113 block_long = 0.6
114 block_short = 0.3
Jack Diederich183028e2009-04-06 02:08:44 +0000115 def test_read_until_A(self):
116 """
117 read_until(expected, [timeout])
118 Read until the expected string has been seen, or a timeout is
119 hit (default is no timeout); may block.
120 """
121 want = ['x' * 10, 'match', 'y' * 10, EOF_sigil]
Jack Diederich3b2312e2009-04-07 20:22:59 +0000122 self.dataq.put(want)
Jack Diederich183028e2009-04-06 02:08:44 +0000123 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000124 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000125 data = telnet.read_until('match')
126 self.assertEqual(data, ''.join(want[:-2]))
127
128 def test_read_until_B(self):
129 # test the timeout - it does NOT raise socket.timeout
Jack Diederich7f9bb912009-04-07 23:56:57 +0000130 want = ['hello', self.block_long, 'not seen', EOF_sigil]
Jack Diederich3b2312e2009-04-07 20:22:59 +0000131 self.dataq.put(want)
Jack Diederich183028e2009-04-06 02:08:44 +0000132 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000133 self.dataq.join()
Jack Diederich7f9bb912009-04-07 23:56:57 +0000134 data = telnet.read_until('not seen', self.block_short)
Jack Diederich183028e2009-04-06 02:08:44 +0000135 self.assertEqual(data, want[0])
Jack Diederich7f9bb912009-04-07 23:56:57 +0000136 self.assertEqual(telnet.read_all(), 'not seen')
Jack Diederich183028e2009-04-06 02:08:44 +0000137
Gregory P. Smithe0c22202012-07-15 22:16:06 -0700138 def test_read_until_with_poll(self):
139 """Use select.poll() to implement telnet.read_until()."""
140 want = ['x' * 10, 'match', 'y' * 10, EOF_sigil]
141 self.dataq.put(want)
142 telnet = telnetlib.Telnet(HOST, self.port)
143 if not telnet._has_poll:
144 raise unittest.SkipTest('select.poll() is required')
145 telnet._has_poll = True
146 self.dataq.join()
147 data = telnet.read_until('match')
148 self.assertEqual(data, ''.join(want[:-2]))
149
150 def test_read_until_with_select(self):
151 """Use select.select() to implement telnet.read_until()."""
152 want = ['x' * 10, 'match', 'y' * 10, EOF_sigil]
153 self.dataq.put(want)
154 telnet = telnetlib.Telnet(HOST, self.port)
155 telnet._has_poll = False
156 self.dataq.join()
157 data = telnet.read_until('match')
158 self.assertEqual(data, ''.join(want[:-2]))
159
Jack Diederich183028e2009-04-06 02:08:44 +0000160 def test_read_all_A(self):
161 """
162 read_all()
163 Read all data until EOF; may block.
164 """
165 want = ['x' * 500, 'y' * 500, 'z' * 500, EOF_sigil]
Jack Diederich3b2312e2009-04-07 20:22:59 +0000166 self.dataq.put(want)
Jack Diederich183028e2009-04-06 02:08:44 +0000167 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000168 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000169 data = telnet.read_all()
170 self.assertEqual(data, ''.join(want[:-1]))
171 return
172
Jack Diederich3b2312e2009-04-07 20:22:59 +0000173 def _test_blocking(self, func):
Jack Diederich7f9bb912009-04-07 23:56:57 +0000174 self.dataq.put([self.block_long, EOF_sigil])
Jack Diederich3b2312e2009-04-07 20:22:59 +0000175 self.dataq.join()
176 start = time.time()
177 data = func()
Jack Diederich7f9bb912009-04-07 23:56:57 +0000178 self.assertTrue(self.block_short <= time.time() - start)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000179
Jack Diederich183028e2009-04-06 02:08:44 +0000180 def test_read_all_B(self):
181 self._test_blocking(telnetlib.Telnet(HOST, self.port).read_all)
182
Jack Diederich3b2312e2009-04-07 20:22:59 +0000183 def test_read_all_C(self):
184 self.dataq.put([EOF_sigil])
185 telnet = telnetlib.Telnet(HOST, self.port)
186 self.dataq.join()
187 telnet.read_all()
188 telnet.read_all() # shouldn't raise
189
Jack Diederich183028e2009-04-06 02:08:44 +0000190 def test_read_some_A(self):
191 """
192 read_some()
193 Read at least one byte or EOF; may block.
194 """
195 # test 'at least one byte'
196 want = ['x' * 500, EOF_sigil]
Jack Diederich3b2312e2009-04-07 20:22:59 +0000197 self.dataq.put(want)
Jack Diederich183028e2009-04-06 02:08:44 +0000198 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000199 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000200 data = telnet.read_all()
201 self.assertTrue(len(data) >= 1)
202
203 def test_read_some_B(self):
204 # test EOF
Jack Diederich3b2312e2009-04-07 20:22:59 +0000205 self.dataq.put([EOF_sigil])
Jack Diederich183028e2009-04-06 02:08:44 +0000206 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000207 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000208 self.assertEqual('', telnet.read_some())
209
Jack Diederich3b2312e2009-04-07 20:22:59 +0000210 def test_read_some_C(self):
Jack Diederich183028e2009-04-06 02:08:44 +0000211 self._test_blocking(telnetlib.Telnet(HOST, self.port).read_some)
212
213 def _test_read_any_eager_A(self, func_name):
214 """
215 read_very_eager()
216 Read all data available already queued or on the socket,
217 without blocking.
218 """
Jack Diederich7f9bb912009-04-07 23:56:57 +0000219 want = [self.block_long, 'x' * 100, 'y' * 100, EOF_sigil]
220 expects = want[1] + want[2]
Jack Diederich3b2312e2009-04-07 20:22:59 +0000221 self.dataq.put(want)
Jack Diederich183028e2009-04-06 02:08:44 +0000222 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000223 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000224 func = getattr(telnet, func_name)
Jack Diederich183028e2009-04-06 02:08:44 +0000225 data = ''
226 while True:
227 try:
228 data += func()
229 self.assertTrue(expects.startswith(data))
Jack Diederich183028e2009-04-06 02:08:44 +0000230 except EOFError:
231 break
232 self.assertEqual(expects, data)
233
234 def _test_read_any_eager_B(self, func_name):
235 # test EOF
Jack Diederich3b2312e2009-04-07 20:22:59 +0000236 self.dataq.put([EOF_sigil])
Jack Diederich183028e2009-04-06 02:08:44 +0000237 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000238 self.dataq.join()
Jack Diederich7f9bb912009-04-07 23:56:57 +0000239 time.sleep(self.block_short)
Jack Diederich183028e2009-04-06 02:08:44 +0000240 func = getattr(telnet, func_name)
241 self.assertRaises(EOFError, func)
242
243 # read_eager and read_very_eager make the same gaurantees
244 # (they behave differently but we only test the gaurantees)
245 def test_read_very_eager_A(self):
246 self._test_read_any_eager_A('read_very_eager')
247 def test_read_very_eager_B(self):
248 self._test_read_any_eager_B('read_very_eager')
249 def test_read_eager_A(self):
250 self._test_read_any_eager_A('read_eager')
251 def test_read_eager_B(self):
252 self._test_read_any_eager_B('read_eager')
253 # NB -- we need to test the IAC block which is mentioned in the docstring
254 # but not in the module docs
255
Jack Diederich183028e2009-04-06 02:08:44 +0000256 def _test_read_any_lazy_B(self, func_name):
Jack Diederich3b2312e2009-04-07 20:22:59 +0000257 self.dataq.put([EOF_sigil])
Jack Diederich183028e2009-04-06 02:08:44 +0000258 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000259 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000260 func = getattr(telnet, func_name)
Jack Diederich183028e2009-04-06 02:08:44 +0000261 telnet.fill_rawq()
262 self.assertRaises(EOFError, func)
263
Jack Diederich7f9bb912009-04-07 23:56:57 +0000264 def test_read_lazy_A(self):
265 want = ['x' * 100, EOF_sigil]
266 self.dataq.put(want)
267 telnet = telnetlib.Telnet(HOST, self.port)
268 self.dataq.join()
269 time.sleep(self.block_short)
270 self.assertEqual('', telnet.read_lazy())
271 data = ''
272 while True:
273 try:
274 read_data = telnet.read_lazy()
275 data += read_data
276 if not read_data:
277 telnet.fill_rawq()
278 except EOFError:
279 break
280 self.assertTrue(want[0].startswith(data))
281 self.assertEqual(data, want[0])
282
Jack Diederich183028e2009-04-06 02:08:44 +0000283 def test_read_lazy_B(self):
284 self._test_read_any_lazy_B('read_lazy')
285
Jack Diederich7f9bb912009-04-07 23:56:57 +0000286 def test_read_very_lazy_A(self):
287 want = ['x' * 100, EOF_sigil]
288 self.dataq.put(want)
289 telnet = telnetlib.Telnet(HOST, self.port)
290 self.dataq.join()
291 time.sleep(self.block_short)
292 self.assertEqual('', telnet.read_very_lazy())
293 data = ''
294 while True:
295 try:
296 read_data = telnet.read_very_lazy()
297 except EOFError:
298 break
299 data += read_data
300 if not read_data:
301 telnet.fill_rawq()
302 self.assertEqual('', telnet.cookedq)
303 telnet.process_rawq()
304 self.assertTrue(want[0].startswith(data))
305 self.assertEqual(data, want[0])
306
307 def test_read_very_lazy_B(self):
308 self._test_read_any_lazy_B('read_very_lazy')
309
Jack Diederich183028e2009-04-06 02:08:44 +0000310class nego_collector(object):
311 def __init__(self, sb_getter=None):
312 self.seen = ''
313 self.sb_getter = sb_getter
314 self.sb_seen = ''
315
316 def do_nego(self, sock, cmd, opt):
317 self.seen += cmd + opt
318 if cmd == tl.SE and self.sb_getter:
319 sb_data = self.sb_getter()
320 self.sb_seen += sb_data
321
322tl = telnetlib
323class OptionTests(TestCase):
324 setUp = _read_setUp
325 tearDown = _read_tearDown
326 # RFC 854 commands
327 cmds = [tl.AO, tl.AYT, tl.BRK, tl.EC, tl.EL, tl.GA, tl.IP, tl.NOP]
328
329 def _test_command(self, data):
330 """ helper for testing IAC + cmd """
331 self.setUp()
Jack Diederich3b2312e2009-04-07 20:22:59 +0000332 self.dataq.put(data)
Jack Diederich183028e2009-04-06 02:08:44 +0000333 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000334 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000335 nego = nego_collector()
336 telnet.set_option_negotiation_callback(nego.do_nego)
Jack Diederich183028e2009-04-06 02:08:44 +0000337 txt = telnet.read_all()
338 cmd = nego.seen
339 self.assertTrue(len(cmd) > 0) # we expect at least one command
Ezio Melottiaa980582010-01-23 23:04:36 +0000340 self.assertIn(cmd[0], self.cmds)
Jack Diederich183028e2009-04-06 02:08:44 +0000341 self.assertEqual(cmd[1], tl.NOOPT)
342 self.assertEqual(len(''.join(data[:-1])), len(txt + cmd))
Jack Diederich7f9bb912009-04-07 23:56:57 +0000343 nego.sb_getter = None # break the nego => telnet cycle
Jack Diederich183028e2009-04-06 02:08:44 +0000344 self.tearDown()
345
346 def test_IAC_commands(self):
347 # reset our setup
Jack Diederich3b2312e2009-04-07 20:22:59 +0000348 self.dataq.put([EOF_sigil])
Jack Diederich183028e2009-04-06 02:08:44 +0000349 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000350 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000351 self.tearDown()
352
353 for cmd in self.cmds:
354 self._test_command(['x' * 100, tl.IAC + cmd, 'y'*100, EOF_sigil])
355 self._test_command(['x' * 10, tl.IAC + cmd, 'y'*10, EOF_sigil])
356 self._test_command([tl.IAC + cmd, EOF_sigil])
357 # all at once
358 self._test_command([tl.IAC + cmd for (cmd) in self.cmds] + [EOF_sigil])
Jack Diederich3b2312e2009-04-07 20:22:59 +0000359 self.assertEqual('', telnet.read_sb_data())
Jack Diederich183028e2009-04-06 02:08:44 +0000360
361 def test_SB_commands(self):
362 # RFC 855, subnegotiations portion
363 send = [tl.IAC + tl.SB + tl.IAC + tl.SE,
364 tl.IAC + tl.SB + tl.IAC + tl.IAC + tl.IAC + tl.SE,
365 tl.IAC + tl.SB + tl.IAC + tl.IAC + 'aa' + tl.IAC + tl.SE,
366 tl.IAC + tl.SB + 'bb' + tl.IAC + tl.IAC + tl.IAC + tl.SE,
367 tl.IAC + tl.SB + 'cc' + tl.IAC + tl.IAC + 'dd' + tl.IAC + tl.SE,
368 EOF_sigil,
369 ]
Jack Diederich3b2312e2009-04-07 20:22:59 +0000370 self.dataq.put(send)
Jack Diederich183028e2009-04-06 02:08:44 +0000371 telnet = telnetlib.Telnet(HOST, self.port)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000372 self.dataq.join()
Jack Diederich183028e2009-04-06 02:08:44 +0000373 nego = nego_collector(telnet.read_sb_data)
374 telnet.set_option_negotiation_callback(nego.do_nego)
Jack Diederich183028e2009-04-06 02:08:44 +0000375 txt = telnet.read_all()
376 self.assertEqual(txt, '')
377 want_sb_data = tl.IAC + tl.IAC + 'aabb' + tl.IAC + 'cc' + tl.IAC + 'dd'
378 self.assertEqual(nego.sb_seen, want_sb_data)
Jack Diederich3b2312e2009-04-07 20:22:59 +0000379 self.assertEqual('', telnet.read_sb_data())
Jack Diederich7f9bb912009-04-07 23:56:57 +0000380 nego.sb_getter = None # break the nego => telnet cycle
Facundo Batistab6a5c9d2007-03-29 18:22:35 +0000381
Gregory P. Smithe0c22202012-07-15 22:16:06 -0700382
383class ExpectTests(TestCase):
384 def setUp(self):
385 self.evt = threading.Event()
386 self.dataq = Queue.Queue()
387 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
388 self.sock.settimeout(10)
389 self.port = test_support.bind_port(self.sock)
390 self.thread = threading.Thread(target=server, args=(self.evt,self.sock,
391 self.dataq))
392 self.thread.start()
393 self.evt.wait()
394
395 def tearDown(self):
396 self.thread.join()
397
398 # use a similar approach to testing timeouts as test_timeout.py
399 # these will never pass 100% but make the fuzz big enough that it is rare
400 block_long = 0.6
401 block_short = 0.3
402 def test_expect_A(self):
403 """
404 expect(expected, [timeout])
405 Read until the expected string has been seen, or a timeout is
406 hit (default is no timeout); may block.
407 """
408 want = ['x' * 10, 'match', 'y' * 10, EOF_sigil]
409 self.dataq.put(want)
410 telnet = telnetlib.Telnet(HOST, self.port)
411 self.dataq.join()
412 (_,_,data) = telnet.expect(['match'])
413 self.assertEqual(data, ''.join(want[:-2]))
414
415 def test_expect_B(self):
416 # test the timeout - it does NOT raise socket.timeout
417 want = ['hello', self.block_long, 'not seen', EOF_sigil]
418 self.dataq.put(want)
419 telnet = telnetlib.Telnet(HOST, self.port)
420 self.dataq.join()
421 (_,_,data) = telnet.expect(['not seen'], self.block_short)
422 self.assertEqual(data, want[0])
423 self.assertEqual(telnet.read_all(), 'not seen')
424
425 def test_expect_with_poll(self):
426 """Use select.poll() to implement telnet.expect()."""
427 want = ['x' * 10, 'match', 'y' * 10, EOF_sigil]
428 self.dataq.put(want)
429 telnet = telnetlib.Telnet(HOST, self.port)
430 if not telnet._has_poll:
431 raise unittest.SkipTest('select.poll() is required')
432 telnet._has_poll = True
433 self.dataq.join()
434 (_,_,data) = telnet.expect(['match'])
435 self.assertEqual(data, ''.join(want[:-2]))
436
437 def test_expect_with_select(self):
438 """Use select.select() to implement telnet.expect()."""
439 want = ['x' * 10, 'match', 'y' * 10, EOF_sigil]
440 self.dataq.put(want)
441 telnet = telnetlib.Telnet(HOST, self.port)
442 telnet._has_poll = False
443 self.dataq.join()
444 (_,_,data) = telnet.expect(['match'])
445 self.assertEqual(data, ''.join(want[:-2]))
446
447
Facundo Batistab6a5c9d2007-03-29 18:22:35 +0000448def test_main(verbose=None):
Gregory P. Smithe0c22202012-07-15 22:16:06 -0700449 test_support.run_unittest(GeneralTests, ReadTests, OptionTests,
450 ExpectTests)
Facundo Batistab6a5c9d2007-03-29 18:22:35 +0000451
452if __name__ == '__main__':
453 test_main()