8168613: CORBA ObjectStreamTest fails with address in use
authorrriggs
Wed, 26 Oct 2016 09:38:16 -0400
changeset 41768 b9d599d18150
parent 41767 0301970d37d3
child 41769 f6f8a00fdba9
8168613: CORBA ObjectStreamTest fails with address in use Reviewed-by: psandoz
jdk/test/com/sun/corba/serialization/ObjectStreamTest.java
--- a/jdk/test/com/sun/corba/serialization/ObjectStreamTest.java	Wed Oct 26 11:08:12 2016 +0100
+++ b/jdk/test/com/sun/corba/serialization/ObjectStreamTest.java	Wed Oct 26 09:38:16 2016 -0400
@@ -42,13 +42,8 @@
 import java.util.Objects;
 import java.util.PropertyPermission;
 import java.util.Set;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.LongAdder;
 
-import javax.naming.CommunicationException;
-import javax.naming.InitialContext;
-import javax.naming.Context;
-import javax.naming.NamingException;
 import javax.rmi.CORBA.Util;
 import javax.rmi.PortableRemoteObject;
 
@@ -56,11 +51,9 @@
 import org.omg.CORBA_2_3.portable.OutputStream;
 import org.omg.CORBA_2_3.portable.InputStream;
 
-import jdk.test.lib.JDKToolFinder;
-import jdk.test.lib.JDKToolLauncher;
-
 import org.testng.Assert;
-import org.testng.annotations.AfterSuite;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import org.testng.annotations.DataProvider;
 import org.testng.TestNG;
@@ -69,15 +62,13 @@
  * @test
  * @library /test/lib
  * @build jdk.test.lib.*
- * @compile  ObjectStreamTest.java  ObjectStreamTest$_Echo_Stub.java  ObjectStreamTest$_Server_Tie.java
- * @modules java.corba/com.sun.corba.se.impl.io java.base/java.io java.corba/com.sun.corba.se.impl.activation
+ * @compile  ObjectStreamTest.java  ObjectStreamTest$_Echo_Stub.java
+ *           ObjectStreamTest$_Server_Tie.java
+ * @modules java.corba/com.sun.corba.se.impl.io java.base/java.io
+ *          java.corba/com.sun.corba.se.impl.activation
  * @summary Tests of ReflectionFactory use in IIOP Serialization
- * @run testng/othervm
- *       -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
- *       -Djava.naming.provider.url=iiop://localhost:1050 ObjectStreamTest
- * @run testng/othervm/policy=security.policy
- *       -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
- *       -Djava.naming.provider.url=iiop://localhost:1050 ObjectStreamTest
+ * @run testng/othervm ObjectStreamTest
+ * @run testng/othervm/policy=security.policy ObjectStreamTest
  */
 
 @Test
@@ -92,12 +83,6 @@
         colorSet.add(Colors.GREEN);
     }
 
-    /**
-     * The process spawned to run orbd.
-     */
-    static Process orbdProcess;
-    static Thread orbThread;
-
     @DataProvider(name = "Objects")
     static Object[][] patterns() {
         BigInteger bigInteger = new BigInteger("8943892002309239");
@@ -141,7 +126,7 @@
      * @param value
      */
     @Test(dataProvider = "Objects")
-    static void factCheck(Serializable value) {
+    void factCheck(Serializable value) {
         Class<?> clazz = value.getClass();
         java.io.ObjectStreamClass sOSC = java.io.ObjectStreamClass.lookup(clazz);
         java.io.ObjectStreamField[] sFields = sOSC.getFields();
@@ -150,25 +135,33 @@
 
         Assert.assertEquals(sFields.length, cFields.length, "Different number of fields");
         for (int i = 0; i < sFields.length; i++) {
-            Assert.assertEquals(sFields[i].getName(), cFields[i].getName(), "different field names " + cFields[i].getName());
-            Assert.assertEquals(sFields[i].getType(), cFields[i].getType(), "different field types " + cFields[i].getName());
-            Assert.assertEquals(sFields[i].getTypeString(), cFields[i].getTypeString(), "different field typestrings " + cFields[i].getName());
+            Assert.assertEquals(sFields[i].getName(), cFields[i].getName(),
+                    "different field names " + cFields[i].getName());
+            Assert.assertEquals(sFields[i].getType(), cFields[i].getType(),
+                    "different field types " + cFields[i].getName());
+            Assert.assertEquals(sFields[i].getTypeString(), cFields[i].getTypeString(),
+                    "different field typestrings " + cFields[i].getName());
         }
 
         Assert.assertEquals(baseMethod("hasReadObjectMethod", sOSC, (Class<?>[]) null),
-                corbaMethod("hasReadObject", cOSC, (Class<?>[]) null), "hasReadObject: " + value.getClass());
+                corbaMethod("hasReadObject", cOSC, (Class<?>[]) null),
+                "hasReadObject: " + value.getClass());
 
         Assert.assertEquals(baseMethod("hasWriteObjectMethod", sOSC, (Class<?>[]) null),
-                corbaMethod("hasWriteObject", cOSC, (Class<?>[]) null), "hasWriteObject: " + value.getClass());
+                corbaMethod("hasWriteObject", cOSC, (Class<?>[]) null),
+                "hasWriteObject: " + value.getClass());
 
         Assert.assertEquals(baseMethod("hasWriteReplaceMethod", sOSC, (Class<?>[]) null),
-                corbaMethod("hasWriteReplaceMethod", cOSC, (Class<?>[]) null), "hasWriteReplace: " + value.getClass());
+                corbaMethod("hasWriteReplaceMethod", cOSC, (Class<?>[]) null),
+                "hasWriteReplace: " + value.getClass());
 
         Assert.assertEquals(baseMethod("hasReadResolveMethod", sOSC, (Class<?>[]) null),
-                corbaMethod("hasReadResolveMethod", cOSC, (Class<?>[]) null), "hasReadResolve: " + value.getClass());
+                corbaMethod("hasReadResolveMethod", cOSC, (Class<?>[]) null),
+                "hasReadResolve: " + value.getClass());
 
         Assert.assertEquals(baseMethod("getSerialVersionUID", sOSC, (Class<?>[]) null),
-                corbaMethod("getSerialVersionUID", cOSC, (Class<?>[]) null), "getSerialVersionUID: " + value.getClass());
+                corbaMethod("getSerialVersionUID", cOSC, (Class<?>[]) null),
+                "getSerialVersionUID: " + value.getClass());
 
     }
 
@@ -178,7 +171,7 @@
      * and deserialized using Util.readAny to equivalent objects.
      */
     @Test(dataProvider = "Objects", enabled = true, dependsOnMethods = {"factCheck"})
-    static void WriteValueObjectStreamTest01(Serializable value) throws Exception {
+    void WriteValueObjectStreamTest01(Serializable value) throws Exception {
         ORB orb = (ORB) ORB.init(new String[0], null);
 
         OutputStream out = (OutputStream) orb.create_output_stream();
@@ -193,15 +186,43 @@
     /**
      * Test that objects can be echoed to a server and come back equivalent.
      */
-    @Test(dataProvider = "Objects", enabled = false, dependsOnMethods = {"factCheck"})
-    static void echoObjects(Serializable value) throws Exception {
-        Context initialNamingContext = Server.init();
-        Echo echo = (Echo) PortableRemoteObject.narrow(
-                initialNamingContext.lookup(Server.serverID), Echo.class);
+    @Test(dataProvider = "Objects", enabled = true, dependsOnMethods = {"factCheck"})
+    void echoObjects(Serializable value) throws Exception {
+        Echo echo = getEchoStub();
         Object actual = echo.echo(value);
         checkEquals(actual, value);
     }
 
+
+    /**
+     * Initialize the ORB and the singleton Echo server stub.
+     * @return the stub for the Echo server.
+     * @throws RemoteException if an error occurs
+     */
+    synchronized Echo getEchoStub() throws RemoteException {
+        if (echoStub == null) {
+            ORB orb = (ORB) ORB.init(new String[0], null);
+            Echo server = new Server();
+            echoStub = (javax.rmi.CORBA.Stub) PortableRemoteObject.toStub(server);
+            echoStub.connect(orb);
+        }
+        return (Echo)echoStub;
+    }
+
+    /**
+     * The stub for the Echo Server class. Initialized on first use.
+     */
+    private javax.rmi.CORBA.Stub echoStub;
+
+    /**
+     * After all the tests run shutdown the orb.
+     */
+    @AfterClass
+    void shutdownOrb() {
+        ORB orb = (ORB) ORB.init(new String[0], null);
+        orb.shutdown(true);
+    }
+
     /**
      * Check if the value and result are equals, with some tests depending on the type.
      * @param expected the expected value
@@ -209,15 +230,18 @@
      */
     static void checkEquals(Object actual, Object expected) {
         Class<?> cl = expected.getClass();
-        Assert.assertEquals(actual.getClass(), cl, "type of value not equal to class of result");
+        Assert.assertEquals(actual.getClass(), cl,
+                "type of value not equal to class of result");
         try {
             if (cl.isArray() || !(cl.getDeclaredMethod("equals", cl) == null)) {
                 Assert.assertEquals(actual, expected, "echo'd object not equal");
             } else {
-                Assert.assertEquals(toString(actual), toString(expected), "toString values not equal");
+                Assert.assertEquals(toString(actual), toString(expected),
+                        "toString values not equal");
             }
         } catch (NoSuchMethodException ex) {
-            Assert.assertEquals(toString(actual), toString(expected), "toString values not equal");
+            Assert.assertEquals(toString(actual), toString(expected),
+                    "toString values not equal");
         }
     }
 
@@ -301,7 +325,9 @@
      * @param argClasses method arguments
      * @return the value returned from invoking the method
      */
-    static Object corbaMethod(String methodName, com.sun.corba.se.impl.io.ObjectStreamClass osc, Class<?>... argClasses) {
+    static Object corbaMethod(String methodName,
+                              com.sun.corba.se.impl.io.ObjectStreamClass osc,
+                              Class<?>... argClasses) {
         Class<?> oscClass = com.sun.corba.se.impl.io.ObjectStreamClass.class;
 
         try {
@@ -325,7 +351,8 @@
      * @param argClasses method arguments
      * @return the value returned from invoking the method
      */
-    static Object baseMethod(String methodName, java.io.ObjectStreamClass osc, Class<?>... argClasses) {
+    static Object baseMethod(String methodName, java.io.ObjectStreamClass osc,
+                             Class<?>... argClasses) {
         Class<?> oscClass = java.io.ObjectStreamClass.class;
 
         try {
@@ -342,7 +369,7 @@
     }
 
     /**
-     * Simple echo interface to check serialization/deserialization.
+     * Simple echo interface to check IIOP serialization/deserialization.
      */
     interface Echo extends Remote {
         Object echo(Object obj) throws RemoteException;
@@ -350,12 +377,6 @@
 
     static class Server extends PortableRemoteObject implements Echo {
 
-        public static final String serverID = "ObjectStreamTestServer";
-
-        private static Context initialNamingContext;
-
-        private static Server server;
-
         public Server() throws RemoteException {
             super();
         }
@@ -363,63 +384,8 @@
         public Object echo(Object obj) {
             return obj;
         }
-
-
-        public static Context init() {
-            if (initialNamingContext == null) {
-                try {
-                    startOrbd();
-                    Thread.sleep(5000L);        // Give it 5 seconds
-                } catch (Exception eex) {
-                    throw new RuntimeException("Orbd", eex);
-                }
-                for (int i = 0; i < 1; i++) {
-                    try {
-                        Thread.sleep(1L);
-                        initialNamingContext = new InitialContext();
-                        server = new Server();
-                        initialNamingContext.rebind(serverID, server);
-                    } catch (CommunicationException | InterruptedException cex) {
-                        System.out.printf("retry #%d sec: ex: %s%n", i, cex);
-                    } catch (NamingException ex) {
-                        throw new RuntimeException("can't initialize naming context", ex);
-                    } catch (RemoteException rex) {
-                        throw new RuntimeException("can't initialize server", rex);
-                    }
-                }
-            }
-            if (initialNamingContext == null) {
-                Assert.fail("Can't initialize the Orb, no naming context");
-            }
-            return initialNamingContext;
-        }
     }
 
-    static void startOrbd() throws Exception {
-        System.out.println("\nStarting orbd with NS port 1050 ");
-        JDKToolLauncher orbdLauncher = JDKToolLauncher.create("orbd")
-                        .addToolArg("-ORBInitialHost").addToolArg("localhost")
-                        .addToolArg("-ORBInitialPort").addToolArg("1050");
-
-        System.out.println("ObjectStreamTest: Executing: " + Arrays.asList(orbdLauncher.getCommand()));
-        ProcessBuilder pb = new ProcessBuilder(orbdLauncher.getCommand());
-
-        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
-        orbdProcess = pb.start();
-    }
-
-    @AfterSuite
-    static void killOrbd() throws Exception {
-        if (orbdProcess != null) {
-            orbdProcess.destroyForcibly();
-            orbdProcess.waitFor();
-            System.out.printf("destroyed orbd, pid: %d, exitValue: %d%n",
-                    orbdProcess.getPid(), orbdProcess.exitValue());
-        }
-    }
-
-
-
     // Main can be used to run the tests from the command line with only testng.jar.
     @SuppressWarnings("raw_types")
     @Test(enabled = false)