summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncore.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_asyncore.py')
-rw-r--r--Lib/test/test_asyncore.py193
1 files changed, 103 insertions, 90 deletions
diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py
index 6f848a7..33c2fb2 100644
--- a/Lib/test/test_asyncore.py
+++ b/Lib/test/test_asyncore.py
@@ -12,7 +12,7 @@ from test.test_support import TESTFN, run_unittest, unlink
from io import StringIO, BytesIO
HOST = "127.0.0.1"
-PORT = 54329
+PORT = None
class dummysocket:
def __init__(self):
@@ -53,12 +53,14 @@ class crashingdummy:
# used when testing senders; just collects what it gets until newline is sent
def capture_server(evt, buf):
- serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- serv.settimeout(3)
- serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- serv.bind(("", PORT))
- serv.listen(5)
try:
+ serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ serv.settimeout(3)
+ serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ serv.bind(("", 0))
+ global PORT
+ PORT = serv.getsockname()[1]
+ serv.listen(5)
conn, addr = serv.accept()
except socket.timeout:
pass
@@ -79,6 +81,7 @@ def capture_server(evt, buf):
conn.close()
finally:
serv.close()
+ PORT = None
evt.set()
@@ -107,87 +110,83 @@ class HelperFunctionTests(unittest.TestCase):
asyncore._exception(tr2)
self.assertEqual(tr2.error_handled, True)
-## Commented out these tests because test a non-documented function
-## (which is actually public, why it's not documented?). Anyway, the
-## tests *and* the function uses constants in the select module that
-## are not present in Windows systems (see this thread:
-## http://mail.python.org/pipermail/python-list/2001-October/109973.html)
-## Note even that these constants are mentioned in the select
-## documentation, as a parameter of "poll" method "register", but are
-## not explicit declared as constants of the module.
-## . Facundo Batista
-##
-## def test_readwrite(self):
-## # Check that correct methods are called by readwrite()
-##
-## class testobj:
-## def __init__(self):
-## self.read = False
-## self.write = False
-## self.expt = False
-##
-## def handle_read_event(self):
-## self.read = True
-##
-## def handle_write_event(self):
-## self.write = True
-##
-## def handle_expt_event(self):
-## self.expt = True
-##
-## def handle_error(self):
-## self.error_handled = True
-##
-## for flag in (select.POLLIN, select.POLLPRI):
-## tobj = testobj()
-## self.assertEqual(tobj.read, False)
-## asyncore.readwrite(tobj, flag)
-## self.assertEqual(tobj.read, True)
-##
-## # check that ExitNow exceptions in the object handler method
-## # bubbles all the way up through asyncore readwrite call
-## tr1 = exitingdummy()
-## self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag)
-##
-## # check that an exception other than ExitNow in the object handler
-## # method causes the handle_error method to get called
-## tr2 = crashingdummy()
-## asyncore.readwrite(tr2, flag)
-## self.assertEqual(tr2.error_handled, True)
-##
-## tobj = testobj()
-## self.assertEqual(tobj.write, False)
-## asyncore.readwrite(tobj, select.POLLOUT)
-## self.assertEqual(tobj.write, True)
-##
-## # check that ExitNow exceptions in the object handler method
-## # bubbles all the way up through asyncore readwrite call
-## tr1 = exitingdummy()
-## self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1,
-## select.POLLOUT)
-##
-## # check that an exception other than ExitNow in the object handler
-## # method causes the handle_error method to get called
-## tr2 = crashingdummy()
-## asyncore.readwrite(tr2, select.POLLOUT)
-## self.assertEqual(tr2.error_handled, True)
-##
-## for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL):
-## tobj = testobj()
-## self.assertEqual(tobj.expt, False)
-## asyncore.readwrite(tobj, flag)
-## self.assertEqual(tobj.expt, True)
-##
-## # check that ExitNow exceptions in the object handler method
-## # bubbles all the way up through asyncore readwrite calls
-## tr1 = exitingdummy()
-## self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag)
-##
-## # check that an exception other than ExitNow in the object handler
-## # method causes the handle_error method to get called
-## tr2 = crashingdummy()
-## asyncore.readwrite(tr2, flag)
-## self.assertEqual(tr2.error_handled, True)
+ # asyncore.readwrite uses constants in the select module that
+ # are not present in Windows systems (see this thread:
+ # http://mail.python.org/pipermail/python-list/2001-October/109973.html)
+ # These constants should be present as long as poll is available
+
+ if hasattr(select, 'poll'):
+ def test_readwrite(self):
+ # Check that correct methods are called by readwrite()
+
+ class testobj:
+ def __init__(self):
+ self.read = False
+ self.write = False
+ self.expt = False
+
+ def handle_read_event(self):
+ self.read = True
+
+ def handle_write_event(self):
+ self.write = True
+
+ def handle_expt_event(self):
+ self.expt = True
+
+ def handle_error(self):
+ self.error_handled = True
+
+ for flag in (select.POLLIN, select.POLLPRI):
+ tobj = testobj()
+ self.assertEqual(tobj.read, False)
+ asyncore.readwrite(tobj, flag)
+ self.assertEqual(tobj.read, True)
+
+ # check that ExitNow exceptions in the object handler method
+ # bubbles all the way up through asyncore readwrite call
+ tr1 = exitingdummy()
+ self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag)
+
+ # check that an exception other than ExitNow in the object handler
+ # method causes the handle_error method to get called
+ tr2 = crashingdummy()
+ asyncore.readwrite(tr2, flag)
+ self.assertEqual(tr2.error_handled, True)
+
+ tobj = testobj()
+ self.assertEqual(tobj.write, False)
+ asyncore.readwrite(tobj, select.POLLOUT)
+ self.assertEqual(tobj.write, True)
+
+ # check that ExitNow exceptions in the object handler method
+ # bubbles all the way up through asyncore readwrite call
+ tr1 = exitingdummy()
+ self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1,
+ select.POLLOUT)
+
+ # check that an exception other than ExitNow in the object handler
+ # method causes the handle_error method to get called
+ tr2 = crashingdummy()
+ asyncore.readwrite(tr2, select.POLLOUT)
+ self.assertEqual(tr2.error_handled, True)
+
+ for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL):
+ tobj = testobj()
+ self.assertEqual(tobj.expt, False)
+ asyncore.readwrite(tobj, flag)
+ self.assertEqual(tobj.expt, True)
+
+ # check that ExitNow exceptions in the object handler method
+ # bubbles all the way up through asyncore readwrite calls
+ tr1 = exitingdummy()
+ self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag)
+
+ # check that an exception other than ExitNow in the object handler
+ # method causes the handle_error method to get called
+ tr2 = crashingdummy()
+ asyncore.readwrite(tr2, flag)
+ self.assertEqual(tr2.error_handled, True)
def test_closeall(self):
self.closeall_check(False)
@@ -343,12 +342,26 @@ class DispatcherWithSendTests(unittest.TestCase):
self.evt = threading.Event()
cap = BytesIO()
threading.Thread(target=capture_server, args=(self.evt, cap)).start()
- time.sleep(1) # Give server time to initialize
- data = b"Suppose there isn't a 16-ton weight?"*5
+ # wait until server thread has assigned a port number
+ n = 1000
+ while PORT is None and n > 0:
+ time.sleep(0.01)
+ n -= 1
+
+ # wait a little longer for the server to initialize (it sometimes
+ # refuses connections on slow machines without this wait)
+ time.sleep(0.2)
+
+ data = b"Suppose there isn't a 16-ton weight?"
d = dispatcherwithsend_noread()
d.create_socket(socket.AF_INET, socket.SOCK_STREAM)
d.connect((HOST, PORT))
+
+ # give time for socket to connect
+ time.sleep(0.1)
+
+ d.send(data)
d.send(data)
d.send(b'\n')
@@ -359,7 +372,7 @@ class DispatcherWithSendTests(unittest.TestCase):
self.evt.wait()
- self.assertEqual(cap.getvalue(), data)
+ self.assertEqual(cap.getvalue(), data*2)
class DispatcherWithSendTests_UsePoll(DispatcherWithSendTests):