test/jdk/com/sun/jndi/ldap/DisconnectNPETest.java
branchJDK-8210696-branch
changeset 57345 ff884a2f247b
parent 51760 caac55d48dc3
--- a/test/jdk/com/sun/jndi/ldap/DisconnectNPETest.java	Tue Apr 30 12:52:23 2019 +0100
+++ b/test/jdk/com/sun/jndi/ldap/DisconnectNPETest.java	Wed May 01 00:06:22 2019 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,13 +25,9 @@
 import javax.naming.NamingException;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.InitialDirContext;
-import java.io.Closeable;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.ServerSocket;
-import java.net.Socket;
 import java.util.Hashtable;
 
 /*
@@ -41,6 +37,7 @@
  *          the LDAP directory server sends an (unsolicited)
  *          "Notice of Disconnection", make sure client handle it correctly,
  *          no NPE been thrown.
+ * @library lib/
  * @run main/othervm DisconnectNPETest
  */
 
@@ -49,18 +46,27 @@
     // case, we set repeat count to 1000 here.
     private static final int REPEAT_COUNT = 1000;
 
+    // "Notice of Disconnection" message
+    private static final byte[] DISCONNECT_MSG = { 0x30, 0x4C, 0x02, 0x01, 0x00,
+            0x78, 0x47, 0x0A, 0x01, 0x34, 0x04, 0x00, 0x04, 0x28, 0x55, 0x4E,
+            0x41, 0x56, 0x41, 0x49, 0x4C, 0x41, 0x42, 0x4C, 0x45, 0x3A, 0x20,
+            0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
+            0x77, 0x69, 0x6C, 0x6C, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6F, 0x6E,
+            0x6E, 0x65, 0x63, 0x74, 0x21, (byte) 0x8A, 0x16, 0x31, 0x2E, 0x33,
+            0x2E, 0x36, 0x2E, 0x31, 0x2E, 0x34, 0x2E, 0x31, 0x2E, 0x31, 0x34,
+            0x36, 0x36, 0x2E, 0x32, 0x30, 0x30, 0x33, 0x36 };
+    private static final byte[] BIND_RESPONSE = { 0x30, 0x0C, 0x02, 0x01, 0x01,
+            0x61, 0x07, 0x0A, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00 };
+
     public static void main(String[] args) throws IOException {
         new DisconnectNPETest().run();
     }
 
     private ServerSocket serverSocket;
     private Hashtable<Object, Object> env;
-    private TestLDAPServer server;
 
     private void initRes() throws IOException {
         serverSocket = new ServerSocket(0, 0, InetAddress.getLoopbackAddress());
-        server = new TestLDAPServer();
-        server.start();
     }
 
     private void initTest() {
@@ -80,7 +86,14 @@
         initRes();
         initTest();
         int count = 0;
-        try {
+        try (BaseLdapServer ignored = new BaseLdapServer(serverSocket)
+                .setCommonRequestHandler((msg, out) -> {
+                    if (msg.getOperation()
+                            == LdapMessage.Operation.BIND_REQUEST) {
+                        out.write(BIND_RESPONSE);
+                        out.write(DISCONNECT_MSG);
+                    }
+                }).startServer()) {
             while (count < REPEAT_COUNT) {
                 count++;
                 InitialDirContext context = null;
@@ -97,17 +110,9 @@
             }
         } finally {
             System.out.println("Test count: " + count + "/" + REPEAT_COUNT);
-            cleanupTest();
         }
     }
 
-    private void cleanupTest() {
-        if (server != null) {
-            server.stopServer();
-        }
-        cleanupClosableRes(serverSocket);
-    }
-
     private void cleanupContext(DirContext context) {
         if (context != null) {
             try {
@@ -117,77 +122,4 @@
             }
         }
     }
-
-    private static void cleanupClosableRes(Closeable res) {
-        if (res != null) {
-            try {
-                res.close();
-            } catch (Exception e) {
-                // ignore
-            }
-        }
-    }
-
-    class TestLDAPServer extends Thread {
-        private volatile boolean isRunning;
-
-        TestLDAPServer() {
-            isRunning = true;
-        }
-
-        private void stopServer() {
-            isRunning = false;
-        }
-
-        @Override
-        public void run() {
-            try {
-                while (isRunning) {
-                    Socket clientSocket = serverSocket.accept();
-                    Thread handler = new Thread(
-                            new LDAPServerHandler(clientSocket));
-                    handler.start();
-                }
-            } catch (IOException e) {
-                if (isRunning) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-    }
-
-    static class LDAPServerHandler implements Runnable {
-        // "Notice of Disconnection" message
-        private static final byte[] DISCONNECT_MSG = { 0x30, 0x4C, 0x02, 0x01,
-                0x00, 0x78, 0x47, 0x0A, 0x01, 0x34, 0x04, 0x00, 0x04, 0x28,
-                0x55, 0x4E, 0x41, 0x56, 0x41, 0x49, 0x4C, 0x41, 0x42, 0x4C,
-                0x45, 0x3A, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72,
-                0x76, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x64,
-                0x69, 0x73, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x21,
-                (byte) 0x8A, 0x16, 0x31, 0x2E, 0x33, 0x2E, 0x36, 0x2E, 0x31,
-                0x2E, 0x34, 0x2E, 0x31, 0x2E, 0x31, 0x34, 0x36, 0x36, 0x2E,
-                0x32, 0x30, 0x30, 0x33, 0x36 };
-        private static final byte[] BIND_RESPONSE = { 0x30, 0x0C, 0x02, 0x01,
-                0x01, 0x61, 0x07, 0x0A, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00 };
-        private final Socket clientSocket;
-
-        private LDAPServerHandler(final Socket clientSocket) {
-            this.clientSocket = clientSocket;
-        }
-
-        @Override
-        public void run() {
-            try (clientSocket;
-                    OutputStream out = clientSocket.getOutputStream();
-                    InputStream in = clientSocket.getInputStream()) {
-                if (in.read() > 0) {
-                    in.skip(in.available());
-                    out.write(BIND_RESPONSE);
-                    out.write(DISCONNECT_MSG);
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
 }