From 2a4712dc80bcc873bea2238fcc855c9b92b82095 Mon Sep 17 00:00:00 2001
From: Tim Peters <tim.peters@gmail.com>
Date: Tue, 24 Jan 2006 22:44:54 +0000
Subject: test_rude_shutdown():  Rewrote to use proper thread synchronization
 and termination.

---
 Lib/test/test_socket_ssl.py | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/Lib/test/test_socket_ssl.py b/Lib/test/test_socket_ssl.py
index bcdb705..5db5ab1 100644
--- a/Lib/test/test_socket_ssl.py
+++ b/Lib/test/test_socket_ssl.py
@@ -2,7 +2,6 @@
 
 from test import test_support
 import socket
-import time
 
 # Optionally test SSL support.  This requires the 'network' resource as given
 # on the regrtest command line.
@@ -29,34 +28,43 @@ def test_basic():
 
 def test_rude_shutdown():
     try:
-        import thread
+        import threading
     except ImportError:
         return
 
-    # some random port to connect to
+    # Some random port to connect to.
     PORT = 9934
+
+    listener_gone = threading.Event()
+
+    # `listener` runs in a thread.  It opens a socket listening on PORT, and
+    # sits in an accept() until the main thread connects.  Then it rudely
+    # closes the socket, and sets Event `listener_gone` to let the main thread
+    # know the socket is gone.
     def listener():
-        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        s = socket.socket()
         s.bind(('', PORT))
         s.listen(5)
         s.accept()
-        del s
-        thread.exit()
+        s = None # reclaim the socket object, which also closes it
+        listener_gone.set()
 
     def connector():
-        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        s = socket.socket()
         s.connect(('localhost', PORT))
+        listener_gone.wait()
         try:
             ssl_sock = socket.ssl(s)
         except socket.sslerror:
             pass
         else:
-            raise test_support.TestFailed, \
-                        'connecting to closed SSL socket failed'
+            raise test_support.TestFailed(
+                      'connecting to closed SSL socket should have failed')
 
-    thread.start_new_thread(listener, ())
-    time.sleep(1)
+    t = threading.Thread(target=listener)
+    t.start()
     connector()
+    t.join()
 
 def test_main():
     if not hasattr(socket, "ssl"):
-- 
cgit v0.12