annotate Lib/test/test_socketserver.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 4298d6e79ecb
children 8c2635afbfe1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
1 """
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
2 Test suite for SocketServer.py.
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
3 """
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
5 import contextlib
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
6 import imp
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
7 import os
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 import select
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
9 import signal
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
10 import socket
76167
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
11 import select
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
12 import errno
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
13 import tempfile
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
14 import unittest
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
15 import SocketServer
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
16
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
17 import test.test_support
56904
204f33d42762 Reduce the probability of refleaks in test_socketserver.
Antoine Pitrou <solipsis@pitrou.net>
parents: 52355
diff changeset
18 from test.test_support import reap_children, reap_threads, verbose
61046
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60965
diff changeset
19 try:
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60965
diff changeset
20 import threading
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60965
diff changeset
21 except ImportError:
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60965
diff changeset
22 threading = None
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
23
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
24 test.test_support.requires("network")
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
26 TEST_STR = "hello world\n"
46362
d917da2b1946 - Issue #2550: The approach used by client/server code for obtaining ports
Trent Nelson <trent.nelson@snakebite.org>
parents: 46025
diff changeset
27 HOST = test.test_support.HOST
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
28
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
29 HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX")
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
30 HAVE_FORKING = hasattr(os, "fork") and os.name != "os2"
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
31
45669
436105125445 Fix test_socketserver on Windows after r61099 added several signal.alarm()
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45551
diff changeset
32 def signal_alarm(n):
436105125445 Fix test_socketserver on Windows after r61099 added several signal.alarm()
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45551
diff changeset
33 """Call signal.alarm when it exists (i.e. not on Windows)."""
436105125445 Fix test_socketserver on Windows after r61099 added several signal.alarm()
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45551
diff changeset
34 if hasattr(signal, 'alarm'):
436105125445 Fix test_socketserver on Windows after r61099 added several signal.alarm()
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45551
diff changeset
35 signal.alarm(n)
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
76168
463fd270c5de Fix flakiness in test_socketserver
Antoine Pitrou <solipsis@pitrou.net>
parents: 76167
diff changeset
37 # Remember real select() to avoid interferences with mocking
463fd270c5de Fix flakiness in test_socketserver
Antoine Pitrou <solipsis@pitrou.net>
parents: 76167
diff changeset
38 _real_select = select.select
463fd270c5de Fix flakiness in test_socketserver
Antoine Pitrou <solipsis@pitrou.net>
parents: 76167
diff changeset
39
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 def receive(sock, n, timeout=20):
76168
463fd270c5de Fix flakiness in test_socketserver
Antoine Pitrou <solipsis@pitrou.net>
parents: 76167
diff changeset
41 r, w, x = _real_select([sock], [], [], timeout)
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 if sock in r:
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 return sock.recv(n)
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 else:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 27020
diff changeset
45 raise RuntimeError, "timed out on %r" % (sock,)
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
45141
3850d13bf96b Let test_socketserver pass on win32, which does not have AF_UNIX sockets.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 45117
diff changeset
47 if HAVE_UNIX_SOCKETS:
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
48 class ForkingUnixStreamServer(SocketServer.ForkingMixIn,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
49 SocketServer.UnixStreamServer):
45141
3850d13bf96b Let test_socketserver pass on win32, which does not have AF_UNIX sockets.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 45117
diff changeset
50 pass
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
52 class ForkingUnixDatagramServer(SocketServer.ForkingMixIn,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
53 SocketServer.UnixDatagramServer):
45141
3850d13bf96b Let test_socketserver pass on win32, which does not have AF_UNIX sockets.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 45117
diff changeset
54 pass
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
55
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
56
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
57 @contextlib.contextmanager
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
58 def simple_subprocess(testcase):
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
59 pid = os.fork()
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
60 if pid == 0:
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
61 # Don't throw an exception; it would be caught by the test harness.
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
62 os._exit(72)
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
63 yield None
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
64 pid2, status = os.waitpid(pid, 0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61926
diff changeset
65 testcase.assertEqual(pid2, pid)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61926
diff changeset
66 testcase.assertEqual(72 << 8, status)
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
67
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
68
61926
49d497790607 Issue #7449: Skip test_socketserver if threading support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61046
diff changeset
69 @unittest.skipUnless(threading, 'Threading required for this test.')
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
70 class SocketServerTest(unittest.TestCase):
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
71 """Test all socket servers."""
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
72
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
73 def setUp(self):
71326
d3cebbd500aa Issue #12250: test_socketserver uses a timeout of 60 seconds instead of 20
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68256
diff changeset
74 signal_alarm(60) # Kill deadlocks after 60 seconds.
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
75 self.port_seed = 0
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
76 self.test_files = []
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
77
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
78 def tearDown(self):
46025
9634c17e8fe5 Try to prevent the alarm going off early in tearDown
Neal Norwitz <nnorwitz@gmail.com>
parents: 45944
diff changeset
79 signal_alarm(0) # Didn't deadlock.
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
80 reap_children()
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
81
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
82 for fn in self.test_files:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
83 try:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
84 os.remove(fn)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
85 except os.error:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
86 pass
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
87 self.test_files[:] = []
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
88
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
89 def pickaddr(self, proto):
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
90 if proto == socket.AF_INET:
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
91 return (HOST, 0)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
92 else:
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
93 # XXX: We need a way to tell AF_UNIX to pick its own name
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
94 # like AF_INET provides port==0.
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
95 dir = None
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
96 if os.name == 'os2':
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
97 dir = '\socket'
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
98 fn = tempfile.mktemp(prefix='unix_socket.', dir=dir)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
99 if os.name == 'os2':
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
100 # AF_UNIX socket names on OS/2 require a specific prefix
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
101 # which can't include a drive letter and must also use
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
102 # backslashes as directory separators
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
103 if fn[1] == ':':
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
104 fn = fn[2:]
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
105 if fn[0] in (os.sep, os.altsep):
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
106 fn = fn[1:]
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
107 if os.sep == '/':
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
108 fn = fn.replace(os.sep, os.altsep)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
109 else:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
110 fn = fn.replace(os.altsep, os.sep)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
111 self.test_files.append(fn)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
112 return fn
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
113
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
114 def make_server(self, addr, svrcls, hdlrbase):
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
115 class MyServer(svrcls):
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
116 def handle_error(self, request, client_address):
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
117 self.close_request(request)
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
118 self.server_close()
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
119 raise
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
120
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
121 class MyHandler(hdlrbase):
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
122 def handle(self):
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
123 line = self.rfile.readline()
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
124 self.wfile.write(line)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
125
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
126 if verbose: print "creating server"
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
127 server = MyServer(addr, MyHandler)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61926
diff changeset
128 self.assertEqual(server.server_address, server.socket.getsockname())
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
129 return server
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
130
56904
204f33d42762 Reduce the probability of refleaks in test_socketserver.
Antoine Pitrou <solipsis@pitrou.net>
parents: 52355
diff changeset
131 @reap_threads
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
132 def run_server(self, svrcls, hdlrbase, testfunc):
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
133 server = self.make_server(self.pickaddr(svrcls.address_family),
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
134 svrcls, hdlrbase)
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
135 # We had the OS pick a port, so pull the real address out of
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
136 # the server.
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
137 addr = server.server_address
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
138 if verbose:
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
139 print "server created"
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
140 print "ADDR =", addr
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
141 print "CLASS =", svrcls
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
142 t = threading.Thread(
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
143 name='%s serving' % svrcls,
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
144 target=server.serve_forever,
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
145 # Short poll interval to make the test finish quickly.
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
146 # Time between requests is short enough that we won't wake
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
147 # up spuriously too many times.
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
148 kwargs={'poll_interval':0.01})
48289
024b2b984866 change a few uses of the threading APIs
Benjamin Peterson <benjamin@python.org>
parents: 47598
diff changeset
149 t.daemon = True # In case this function raises.
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
150 t.start()
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
151 if verbose: print "server running"
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
152 for i in range(3):
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
153 if verbose: print "test client", i
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
154 testfunc(svrcls.address_family, addr)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
155 if verbose: print "waiting for server"
45702
a8754c0db53f Progress on issue #1193577 by adding a polling .shutdown() method to
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45669
diff changeset
156 server.shutdown()
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
157 t.join()
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
158 if verbose: print "done"
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
159
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
160 def stream_examine(self, proto, addr):
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
161 s = socket.socket(proto, socket.SOCK_STREAM)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
162 s.connect(addr)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
163 s.sendall(TEST_STR)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
164 buf = data = receive(s, 100)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
165 while data and '\n' not in buf:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
166 data = receive(s, 100)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
167 buf += data
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61926
diff changeset
168 self.assertEqual(buf, TEST_STR)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
169 s.close()
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
170
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
171 def dgram_examine(self, proto, addr):
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
172 s = socket.socket(proto, socket.SOCK_DGRAM)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
173 s.sendto(TEST_STR, addr)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
174 buf = data = receive(s, 100)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
175 while data and '\n' not in buf:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
176 data = receive(s, 100)
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
177 buf += data
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61926
diff changeset
178 self.assertEqual(buf, TEST_STR)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
179 s.close()
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
180
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
181 def test_TCPServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
182 self.run_server(SocketServer.TCPServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
183 SocketServer.StreamRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
184 self.stream_examine)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
185
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
186 def test_ThreadingTCPServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
187 self.run_server(SocketServer.ThreadingTCPServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
188 SocketServer.StreamRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
189 self.stream_examine)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
190
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
191 if HAVE_FORKING:
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
192 def test_ForkingTCPServer(self):
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
193 with simple_subprocess(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
194 self.run_server(SocketServer.ForkingTCPServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
195 SocketServer.StreamRequestHandler,
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
196 self.stream_examine)
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
197
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
198 if HAVE_UNIX_SOCKETS:
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
199 def test_UnixStreamServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
200 self.run_server(SocketServer.UnixStreamServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
201 SocketServer.StreamRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
202 self.stream_examine)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
203
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
204 def test_ThreadingUnixStreamServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
205 self.run_server(SocketServer.ThreadingUnixStreamServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
206 SocketServer.StreamRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
207 self.stream_examine)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
208
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
209 if HAVE_FORKING:
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
210 def test_ForkingUnixStreamServer(self):
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
211 with simple_subprocess(self):
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
212 self.run_server(ForkingUnixStreamServer,
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
213 SocketServer.StreamRequestHandler,
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
214 self.stream_examine)
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
215
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
216 def test_UDPServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
217 self.run_server(SocketServer.UDPServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
218 SocketServer.DatagramRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
219 self.dgram_examine)
39505
e90e7e768cb3 Fix the test for SocketServer so it should pass on cygwin and not fail
Neal Norwitz <nnorwitz@gmail.com>
parents: 38961
diff changeset
220
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
221 def test_ThreadingUDPServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
222 self.run_server(SocketServer.ThreadingUDPServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
223 SocketServer.DatagramRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
224 self.dgram_examine)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
225
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
226 if HAVE_FORKING:
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
227 def test_ForkingUDPServer(self):
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
228 with simple_subprocess(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
229 self.run_server(SocketServer.ForkingUDPServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
230 SocketServer.DatagramRequestHandler,
45551
cc220745e4e5 Prevent SocketServer.ForkingMixIn from waiting on child processes that it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45544
diff changeset
231 self.dgram_examine)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
232
76167
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
233 @contextlib.contextmanager
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
234 def mocked_select_module(self):
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
235 """Mocks the select.select() call to raise EINTR for first call"""
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
236 old_select = select.select
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
237
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
238 class MockSelect:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
239 def __init__(self):
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
240 self.called = 0
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
241
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
242 def __call__(self, *args):
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
243 self.called += 1
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
244 if self.called == 1:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
245 # raise the exception on first call
76173
4298d6e79ecb Fix the patch for issue #7978: select() raises select.error before 3.3, not OSError.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76168
diff changeset
246 raise select.error(errno.EINTR, os.strerror(errno.EINTR))
76167
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
247 else:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
248 # Return real select value for consecutive calls
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
249 return old_select(*args)
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
250
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
251 select.select = MockSelect()
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
252 try:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
253 yield select.select
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
254 finally:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
255 select.select = old_select
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
256
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
257 def test_InterruptServerSelectCall(self):
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
258 with self.mocked_select_module() as mock_select:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
259 pid = self.run_server(SocketServer.TCPServer,
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
260 SocketServer.StreamRequestHandler,
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
261 self.stream_examine)
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
262 # Make sure select was called again:
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
263 self.assertGreater(mock_select.called, 1)
d941d1fcc6e6 Issue #7978: socketserver now restarts the select() call when EINTR is returned.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73347
diff changeset
264
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
265 # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
266 # client address so this cannot work:
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
267
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
268 # if HAVE_UNIX_SOCKETS:
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
269 # def test_UnixDatagramServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
270 # self.run_server(SocketServer.UnixDatagramServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
271 # SocketServer.DatagramRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
272 # self.dgram_examine)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
273 #
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
274 # def test_ThreadingUnixDatagramServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
275 # self.run_server(SocketServer.ThreadingUnixDatagramServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
276 # SocketServer.DatagramRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
277 # self.dgram_examine)
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
278 #
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
279 # if HAVE_FORKING:
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
280 # def test_ForkingUnixDatagramServer(self):
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
281 # self.run_server(SocketServer.ForkingUnixDatagramServer,
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 46929
diff changeset
282 # SocketServer.DatagramRequestHandler,
45544
8aaf1495da39 Speed test_socketserver up from 28.739s to 0.226s, simplify the logic, and make
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45468
diff changeset
283 # self.dgram_examine)
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
284
60965
5f1962220792 Issue #2302: Fix a race condition in SocketServer.BaseServer.shutdown,
Antoine Pitrou <solipsis@pitrou.net>
parents: 58817
diff changeset
285 @reap_threads
60967
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
286 def test_shutdown(self):
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
287 # Issue #2302: shutdown() should always succeed in making an
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
288 # other thread leave serve_forever().
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
289 class MyServer(SocketServer.TCPServer):
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
290 pass
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
291
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
292 class MyHandler(SocketServer.StreamRequestHandler):
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
293 pass
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
294
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
295 threads = []
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
296 for i in range(20):
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
297 s = MyServer((HOST, 0), MyHandler)
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
298 t = threading.Thread(
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
299 name='MyServer serving',
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
300 target=s.serve_forever,
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
301 kwargs={'poll_interval':0.01})
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
302 t.daemon = True # In case this function raises.
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
303 threads.append((t, s))
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
304 for t, s in threads:
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
305 t.start()
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
306 s.shutdown()
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
307 for t, s in threads:
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
308 t.join()
ea43f7f6e84c Merged revisions 80484 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48289
diff changeset
309
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
310
19949
04ce2a48c0a8 Rework akin to test_threaded_import, so that this can run under regrtest.
Tim Peters <tim.peters@gmail.com>
parents: 18545
diff changeset
311 def test_main():
04ce2a48c0a8 Rework akin to test_threaded_import, so that this can run under regrtest.
Tim Peters <tim.peters@gmail.com>
parents: 18545
diff changeset
312 if imp.lock_held():
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
313 # If the import lock is held, the threads will hang
52355
228cfb6e2900 fix incorrect auto-translation of TestSkipped -> unittest.SkipTest
Benjamin Peterson <benjamin@python.org>
parents: 52353
diff changeset
314 raise unittest.SkipTest("can't run when import lock is held")
19949
04ce2a48c0a8 Rework akin to test_threaded_import, so that this can run under regrtest.
Tim Peters <tim.peters@gmail.com>
parents: 18545
diff changeset
315
45109
a81ef63a1009 Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
Georg Brandl <georg@python.org>
parents: 42861
diff changeset
316 test.test_support.run_unittest(SocketServerTest)
18443
9c04e23f8d43 A test suite for SocketServer.py that exposes the various bugs just
Guido van Rossum <guido@python.org>
parents:
diff changeset
317
19949
04ce2a48c0a8 Rework akin to test_threaded_import, so that this can run under regrtest.
Tim Peters <tim.peters@gmail.com>
parents: 18545
diff changeset
318 if __name__ == "__main__":
04ce2a48c0a8 Rework akin to test_threaded_import, so that this can run under regrtest.
Tim Peters <tim.peters@gmail.com>
parents: 18545
diff changeset
319 test_main()