test/com/sun/jndi/ldap/ReadTimeoutTest.java

Print this page

        

@@ -21,11 +21,11 @@
  * questions.
  */
 
 /**
  * @test
- * @bug 6176036
+ * @bug 6176036 7056489
  * @summary Read-timeout specification for LDAP operations
  */
 
 import java.net.Socket;
 import java.net.ServerSocket;

@@ -35,70 +35,79 @@
 import java.util.Hashtable;
 
 public class ReadTimeoutTest {
 
     public static void main(String[] args) throws Exception {
-
         boolean passed = false;
 
+        // create the server
+        try (Server server = Server.create()) {
         // Set up the environment for creating the initial context
-        Hashtable env = new Hashtable(11);
+            Hashtable<String,Object> env = new Hashtable<>(11);
         env.put(Context.INITIAL_CONTEXT_FACTORY,
             "com.sun.jndi.ldap.LdapCtxFactory");
         env.put("com.sun.jndi.ldap.read.timeout", "1000");
-        env.put(Context.PROVIDER_URL, "ldap://localhost:2001");
+            env.put(Context.PROVIDER_URL, "ldap://localhost:" + server.port());
 
-        Server s = new Server();
 
-        try {
-
-            // start the server
-            s.start();
-
             // Create initial context
             DirContext ctx = new InitialDirContext(env);
+            try {
             System.out.println("LDAP Client: Connected to the Server");
 
             SearchControls scl = new SearchControls();
             scl.setSearchScope(SearchControls.SUBTREE_SCOPE);
             System.out.println("Performing Search");
-            NamingEnumeration answer =
+                NamingEnumeration<SearchResult> answer =
                 ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl);
-
+            } finally {
             // Close the context when we're done
             ctx.close();
+            }
         } catch (NamingException e) {
             passed = true;
             e.printStackTrace();
         }
-        s.interrupt();
+
         if (!passed) {
             throw new Exception("Read timeout test failed," +
                          " read timeout exception not thrown");
         }
         System.out.println("The test PASSED");
     }
 
-    static class Server extends Thread {
+    static class Server implements Runnable, Closeable {
+        private final ServerSocket ss;
 
-        static int serverPort = 2001;
+        private Server(ServerSocket ss) {
+            this.ss = ss;
+        }
 
-        Server() {
+        static Server create() throws IOException {
+            Server server = new Server(new ServerSocket(0));
+            new Thread(server).start();
+            return server;
         }
 
+        int port() {
+            return ss.getLocalPort();
+        }
+
         public void run() {
-            try {
-                ServerSocket serverSock = new ServerSocket(serverPort);
-                Socket socket = serverSock.accept();
+            try (Socket s = ss.accept()) {
                 System.out.println("Server: Connection accepted");
-
-                BufferedInputStream bin = new BufferedInputStream(socket.
-                                getInputStream());
-                while (true) {
-                    bin.read();
-                }
+                BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
+                byte[] buf = new byte[100];
+                int n;
+                do {
+                    n = bis.read(buf);
+                } while (n > 0);
             } catch (IOException e) {
                 // ignore
             }
     }
-}
+
+        public void close() throws IOException {
+            ss.close();
+        }
+    }
 }