public void testUseSingleLibraryInstance() { TestLibrary lib = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class); int count = lib.callCount(); TestLibrary lib2 = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class); int count2 = lib2.callCount(); assertEquals("Interfaces should share a library instance", count + 1, count2); }
public static void main(String[] args) { System.out.println("\nRegression test for bug 4115696\n"); TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager"); try { LocateRegistry.createRegistry(REGISTRY_PORT); } catch (Exception e) { TestLibrary.bomb("creating registry", e); } RMID rmid = null; try { rmid = RMID.createRMID(true); rmid.addArguments( new String[] { "-C-Djava.security.policy=" + TestParams.defaultGroupPolicy + " -C-Djava.security.manager=java.rmi.RMISecurityManager " }); rmid.start(); Echo[] echo = spawnAndTest(); reactivateAndTest(echo); } catch (IOException e) { TestLibrary.bomb("creating rmid", e); } finally { if (rmid != null) rmid.destroy(); } }
public static void main(String[] args) { RMID rmid = null; System.out.println("\nRegression test for bug 4510355\n"); try { TestLibrary.suggestSecurityManager("java.lang.SecurityManager"); /* * Install group class file in codebase. */ System.err.println("install class file in codebase"); URL groupURL = TestLibrary.installClassInCodebase("MyActivationGroupImpl", "group"); System.err.println("class file installed"); /* * Start rmid. */ RMID.removeLog(); rmid = RMID.createRMID(); String execPolicyOption = "-Dsun.rmi.activation.execPolicy=none"; rmid.addOptions(new String[] {execPolicyOption}); rmid.start(); /* * Create and register descriptors for custom group and an * activatable object in that group. */ System.err.println("register group"); Properties p = new Properties(); p.put("java.security.policy", TestParams.defaultGroupPolicy); ActivationGroupDesc groupDesc = new ActivationGroupDesc( "MyActivationGroupImpl", groupURL.toExternalForm(), null, p, null); ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupDesc); System.err.println("register activatable object"); ActivationDesc desc = new ActivationDesc(groupID, "DownloadActivationGroup", null, null); Ping obj = (Ping) Activatable.register(desc); /* * Start group (by calling ping). */ System.err.println("ping object (forces download of group's class)"); obj.ping(); System.err.println("TEST PASSED: group's class downloaded successfully"); System.err.println("shutdown object"); obj.shutdown(); System.err.println("TEST PASSED"); } catch (Exception e) { TestLibrary.bomb(e); } finally { rmid.cleanup(); } }
public void testAliasLibraryFilename() { TestLibrary lib = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class); int count = lib.callCount(); NativeLibrary nl = NativeLibrary.getInstance("testlib"); TestLibrary lib2 = (TestLibrary) Native.loadLibrary(nl.getFile().getName(), TestLibrary.class); int count2 = lib2.callCount(); assertEquals("Simple filename load not aliased", count + 1, count2); }
private static Echo[] spawnAndTest() { System.err.println("\nCreate Test-->"); Echo[] echo = new Echo[protocol.length]; for (int i = 0; i < protocol.length; i++) { JavaVM serverVM = new JavaVM("EchoImpl", "-Djava.security.policy=" + TestParams.defaultPolicy, protocol[i]); System.err.println("\nusing protocol: " + (protocol[i] == "" ? "none" : protocol[i])); try { /* spawn VM for EchoServer */ serverVM.start(); /* lookup server */ int tries = 12; // need enough tries for slow machine. echo[i] = null; do { try { echo[i] = (Echo) Naming.lookup("//:" + REGISTRY_PORT + "/EchoServer"); break; } catch (NotBoundException e) { try { Thread.sleep(2000); } catch (Exception ignore) { } continue; } } while (--tries > 0); if (echo[i] == null) TestLibrary.bomb("server not bound in 12 tries", null); /* invoke remote method and print result*/ System.err.println("Bound to " + echo[i]); byte[] data = ("Greetings, citizen " + System.getProperty("user.name") + "!").getBytes(); byte[] result = echo[i].echoNot(data); for (int j = 0; j < result.length; j++) result[j] = (byte) ~result[j]; System.err.println("Result: " + new String(result)); echo[i].shutdown(); } catch (Exception e) { TestLibrary.bomb("test failed", e); } finally { serverVM.destroy(); try { Naming.unbind("//:" + REGISTRY_PORT + "/EchoServer"); } catch (Exception e) { TestLibrary.bomb("unbinding EchoServer", e); } } } return echo; }
public void testAvoidDuplicateLoads() { NativeLibrary.disposeAll(); TestLibrary lib = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class); assertEquals("Library should be newly loaded after all others disposed", 1, lib.callCount()); if (lib.callCount() <= 1) { fail("Library should not be reloaded"); } }
/** return a vector of valid legal RMI naming URLs. */ private static Vector getLegalForms() { String localHostAddress = null; String localHostName = null; // get the local host name and address try { localHostName = InetAddress.getLocalHost().getHostName(); localHostAddress = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { TestLibrary.bomb("Test failed: unexpected exception", e); } Vector legalForms = new Vector(); legalForms.add("///MyName"); legalForms.add("//:" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("//" + localHostAddress + "/MyName"); legalForms.add("//" + localHostAddress + ":" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("//localhost/MyName"); legalForms.add("//localhost:" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("//" + localHostName + "/MyName"); legalForms.add("//" + localHostName + ":" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("MyName"); legalForms.add("/MyName"); legalForms.add("rmi:///MyName"); legalForms.add("rmi://:" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("rmi://" + localHostAddress + "/MyName"); legalForms.add("rmi://" + localHostAddress + ":" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("rmi://localhost/MyName"); legalForms.add("rmi://localhost:" + Registry.REGISTRY_PORT + "/MyName"); legalForms.add("rmi://" + localHostName + "/MyName"); legalForms.add("rmi://" + localHostName + ":" + Registry.REGISTRY_PORT + "/MyName"); return legalForms; }
public void testAliasSimpleLibraryName() throws Exception { NativeLibrary nl = NativeLibrary.getInstance("testlib"); File file = nl.getFile(); WeakReference ref = new WeakReference(nl); nl = null; System.gc(); long start = System.currentTimeMillis(); while (ref.get() != null) { Thread.sleep(10); if (System.currentTimeMillis() - start > 5000) fail("Timed out waiting for library to be GC'd"); } TestLibrary lib = (TestLibrary) Native.loadLibrary(file.getAbsolutePath(), TestLibrary.class); int count = lib.callCount(); TestLibrary lib2 = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class); int count2 = lib2.callCount(); assertEquals("Simple library name not aliased", count + 1, count2); }
public void testBooleanToIntArgumentConversion() { final int MAGIC = 0xABEDCF23; Map options = new HashMap(); DefaultTypeMapper mapper = new DefaultTypeMapper(); mapper.addToNativeConverter( Boolean.class, new ToNativeConverter() { public Object toNative(Object arg, ToNativeContext ctx) { return new Integer(Boolean.TRUE.equals(arg) ? MAGIC : 0); } public Class nativeType() { return Integer.class; } }); options.put(Library.OPTION_TYPE_MAPPER, mapper); TestLibrary lib = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class, options); assertEquals("Failed to convert Boolean argument to Int", MAGIC, lib.returnInt32Argument(true)); }
public void testStringToIntArgumentConversion() { DefaultTypeMapper mapper = new DefaultTypeMapper(); mapper.addToNativeConverter( String.class, new ToNativeConverter() { public Object toNative(Object arg, ToNativeContext ctx) { return Integer.valueOf((String) arg, 16); } public Class nativeType() { return Integer.class; } }); Map options = new HashMap(); options.put(Library.OPTION_TYPE_MAPPER, mapper); final int MAGIC = 0x7BEDCF23; TestLibrary lib = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class, options); assertEquals( "Failed to convert String argument to Int", MAGIC, lib.returnInt32Argument(Integer.toHexString(MAGIC))); }
public void testNumberToIntArgumentConversion() { DefaultTypeMapper mapper = new DefaultTypeMapper(); mapper.addToNativeConverter( Double.class, new ToNativeConverter() { public Object toNative(Object arg, ToNativeContext ctx) { return new Integer(((Double) arg).intValue()); } public Class nativeType() { return Integer.class; } }); Map options = new HashMap(); options.put(Library.OPTION_TYPE_MAPPER, mapper); final int MAGIC = 0x7BEDCF23; TestLibrary lib = (TestLibrary) Native.loadLibrary("testlib", TestLibrary.class, options); assertEquals( "Failed to convert Double argument to Int", MAGIC, lib.returnInt32Argument(new Double(MAGIC))); }
private static void reactivateAndTest(Echo[] echo) { System.err.println("\nReactivate Test-->"); for (int i = 0; i < echo.length; i++) { try { System.err.println("\nusing protocol: " + (protocol[i] == "" ? "none" : protocol[i])); byte[] data = ("Greetings, citizen " + System.getProperty("user.name") + "!").getBytes(); byte[] result = echo[i].echoNot(data); for (int j = 0; j < result.length; j++) result[j] = (byte) ~result[j]; System.err.println("Result: " + new String(result)); echo[i].shutdown(); } catch (Exception e) { TestLibrary.bomb("activating EchoServer for protocol " + protocol[i], e); } } }
public class RapidExportUnexport { private static final int PORT = TestLibrary.getUnusedRandomPort(); private static final int REPS = 100; private static final long TIMEOUT = 60000; public static void main(String[] args) throws Exception { System.err.println("\nRegression test for bug 6275081\n"); Remote impl = new Remote() {}; long start = System.currentTimeMillis(); for (int i = 0; i < REPS; i++) { System.err.println(i); UnicastRemoteObject.exportObject(impl, PORT); UnicastRemoteObject.unexportObject(impl, true); Thread.sleep(1); // work around BindException (bug?) } long delta = System.currentTimeMillis() - start; System.err.println(REPS + " export/unexport operations took " + delta + "ms"); if (delta > TIMEOUT) { throw new Error("TEST FAILED: took over " + TIMEOUT + "ms"); } System.err.println("TEST PASSED"); } }
/** * Entry point for the "juicer" server process. Create and export an apple user implementation in * an rmiregistry running on localhost. */ public static void main(String[] args) { String durationString = null; boolean othervm = false; boolean exit = false; try { // parse command line args for (int i = 0; i < args.length; i++) { String arg = args[i]; if (arg.equals("-hours")) { if (durationString != null) { usage(); } i++; int hours = Integer.parseInt(args[i]); durationString = hours + " hours"; testDuration = hours * 60 * 60 * 1000; } else if (arg.equals("-seconds")) { if (durationString != null) { usage(); } i++; long seconds = Long.parseLong(args[i]); durationString = seconds + " seconds"; testDuration = seconds * 1000; } else if (arg.equals("-maxLevel")) { i++; maxLevel = Integer.parseInt(args[i]); } else if (arg.equals("-othervm")) { othervm = true; } else if (arg.equals("-exit")) { exit = true; } else { usage(); } } if (durationString == null) { durationString = testDuration + " milliseconds"; } } catch (Throwable t) { usage(); throw new RuntimeException("TEST FAILED: Bad argument"); } AppleUserImpl user = null; long startTime = 0; Thread server = null; int exitValue = 0; try { user = new AppleUserImpl(); synchronized (user) { // create new registry and bind new AppleUserImpl in registry Registry registry = TestLibrary.createRegistryOnUnusedPort(); registryPort = TestLibrary.getRegistryPort(registry); LocateRegistry.getRegistry(registryPort).rebind("AppleUser", user); // start the other server if applicable if (othervm) { // the other server must be running in a separate process logger.log(Level.INFO, "Application server must be " + "started in separate process"); } else { Class app = Class.forName("ApplicationServer"); java.lang.reflect.Constructor appConstructor = app.getDeclaredConstructor(new Class[] {Integer.TYPE}); server = new Thread((Runnable) appConstructor.newInstance(registryPort)); logger.log(Level.INFO, "Starting application server " + "in same process"); server.start(); } // wait for other server to call startTest method logger.log(Level.INFO, "Waiting for application server " + "process to start"); while (!startTestNotified) { user.wait(); } } startTime = System.currentTimeMillis(); logger.log(Level.INFO, "Test starting"); // wait for exception to be reported or first thread to complete logger.log( Level.INFO, "Waiting " + durationString + " for " + "test to complete or exception to be thrown"); synchronized (lock) { while (status == null && !finished) { lock.wait(); } } if (status != null) { throw new RuntimeException("TEST FAILED: " + "juicer server reported an exception", status); } else { logger.log(Level.INFO, "TEST PASSED"); } } catch (Exception e) { logger.log(Level.INFO, "TEST FAILED"); exitValue = 1; if (exit) { e.printStackTrace(); } throw new RuntimeException("TEST FAILED: " + "unexpected exception", e); } finally { long actualDuration = System.currentTimeMillis() - startTime; logger.log(Level.INFO, "Test finished"); try { UnicastRemoteObject.unexportObject(user, true); } catch (NoSuchObjectException ignore) { } logger.log( Level.INFO, "Test duration was " + (actualDuration / 1000) + " seconds " + "(" + (actualDuration / 3600000) + " hours)"); System.gc(); System.gc(); if (exit) { System.exit(exitValue); } } }
public static void main(String args[]) throws RuntimeException { System.err.println("\nRegression test for bug/rfe 4254808\n"); Registry registry = null; LegalRegistryNames legal = null; boolean oneFormFailed = false; String[] names = null; Vector legalForms = getLegalForms(); Remote shouldFind = null; // create a registry and the test object try { legal = new LegalRegistryNames(); System.err.println("Starting registry on default port"); registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT); } catch (Exception e) { TestLibrary.bomb("registry already running on test port"); } // enumerate through all legal URLs to verify that a remote // object can be bound and unbound String s = null; Enumeration en = legalForms.elements(); while (en.hasMoreElements()) { s = (String) en.nextElement(); System.err.println("\ntesting form: " + s); try { Naming.rebind(s, legal); names = registry.list(); // ensure that the name in the registry is what is expected if ((names.length > 0) && (names[0].compareTo("MyName") != 0)) { oneFormFailed = true; System.err.println("\tRegistry entry for form: " + s + " is incorrect: " + names[0]); } // ensure that the object can be unbound under the URL string shouldFind = Naming.lookup(s); Naming.unbind(s); System.err.println("\tform " + s + " OK"); } catch (Exception e) { e.printStackTrace(); oneFormFailed = true; System.err.println( "\tunexpected lookup or unbind " + "exception for form: " + s + e.getMessage()); } } if (oneFormFailed) { TestLibrary.bomb("Test failed"); } // get the test to exit quickly TestLibrary.unexport(legal); }
public static void main(String[] args) { System.out.println("\nRegression test for bug 4095165, 4140736\n"); TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager"); RMID rmid = null; RestartCrashedService unicastObj = null; try { RMID.removeLog(); rmid = RMID.createRMID(); rmid.start(); /* Cause activation groups to have a security policy that will * allow security managers to be downloaded and installed */ final Properties p = new Properties(); // this test must always set policies/managers in its // activation groups p.put("java.security.policy", TestParams.defaultGroupPolicy); p.put("java.security.manager", TestParams.defaultSecurityManager); /* * Create unicast object to be contacted when service is activated. */ unicastObj = new RestartCrashedService(); /* * Create and register descriptors for a restartable and * non-restartable service (respectively) in a group other than * this VM's group. */ System.err.println("Creating descriptors"); Object[] stuff = new Object[] {RESTARTABLE, unicastObj}; MarshalledObject restartMobj = new MarshalledObject(stuff); ActivationGroupDesc groupDesc = new ActivationGroupDesc(p, null); stuff[0] = ACTIVATABLE; MarshalledObject activateMobj = new MarshalledObject(stuff); ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupDesc); ActivationDesc restartableDesc = new ActivationDesc(groupID, "RestartCrashedService", null, restartMobj, true); ActivationDesc activatableDesc = new ActivationDesc(groupID, "RestartCrashedService", null, activateMobj, false); System.err.println("Registering descriptors"); ActivateMe restartableObj = (ActivateMe) Activatable.register(restartableDesc); ActivateMe activatableObj = (ActivateMe) Activatable.register(activatableDesc); /* * Restart rmid; it should start up the restartable service */ rmid.restart(); /* * Wait for service to be automatically restarted. */ int repeat = 1; do { for (int i = 0; i < 15; i++) { synchronized (lock) { if (unicastObj.receivedPing(RESTARTABLE) != true) { lock.wait(5000); if (unicastObj.receivedPing(RESTARTABLE) == true) { System.err.println("Test1 passed: rmid " + "restarted service"); break; } } else { break; } } } if (unicastObj.receivedPing(RESTARTABLE) != true) TestLibrary.bomb("Test1 failed: service not restarted by timeout", null); /* * Make sure activatable services wasn't automatically * restarted. */ synchronized (lock) { if (unicastObj.receivedPing(ACTIVATABLE) != true) { lock.wait(5000); if (unicastObj.receivedPing(ACTIVATABLE) != true) { System.err.println("Test2 passed: rmid did not " + "restart activatable service"); } else { TestLibrary.bomb("Test2 failed: activatable service restarted", null); } } else { TestLibrary.bomb("Test2 failed: activatable service restarted!", null); } } if (repeat > 0) { try { System.err.println("\nCrash restartable object"); unicastObj.resetResponders(); restartableObj.crash(); } catch (Exception e) { } } } while (repeat-- > 0); } catch (Exception e) { TestLibrary.bomb("test failed", e); } finally { ActivationLibrary.rmidCleanup(rmid); TestLibrary.unexport(unicastObj); } }
public static void main(String args[]) { /* * The following line is required with the JDK 1.2 VM so that the * VM can exit gracefully when this test completes. Otherwise, the * conservative garbage collector will find a handle to the server * object on the native stack and not clear the weak reference to * it in the RMI runtime's object table. */ Object dummy1 = new Object(); RMID rmid = null; System.err.println("\nRegression test for bug/rfe 4109103\n"); try { // Set security manager according to the // testlibrary. TestLibrary.suggestSecurityManager(TestParams.defaultSecurityManager); // start an rmid. RMID.removeLog(); rmid = RMID.createRMID(rmidOut, rmidErr, false); rmid.start(); /* Cause activation groups to have a security policy that will * allow security managers to be downloaded and installed */ Properties p = new Properties(); // this test must always set policies/managers in its // activation groups p.put("java.security.policy", TestParams.defaultGroupPolicy); p.put("java.security.manager", TestParams.defaultSecurityManager); /* new desc - we will reuse in order to get multiple vms.*/ System.err.println("Create activation group in this VM"); ActivationGroupDesc groupDesc = new ActivationGroupDesc(p, null); ActivationSystem system = ActivationGroup.getSystem(); ActivationGroupID groupID = system.registerGroup(groupDesc); ActivationGroup.createGroup(groupID, groupDesc, 0); ActivationDesc desc = new ActivationDesc("CheckAnnotations", null, null); myRMI = (MyRMI) Activatable.register(desc); /* The test- * Loop a bunch of times to force activator to * spawn VMs (groups) */ for (int i = 0; i < 3; i++) { // object activated in annotation check via method call if (!checkAnnotations(i - 1)) { TestLibrary.bomb("Test failed: output improperly annotated."); } /* * Clean up object too. */ System.err.println("Deactivate object via method call"); myRMI.shutdown(); } System.err.println("\nsuccess: CheckAnnotations test passed "); } catch (Exception e) { TestLibrary.bomb("\nfailure: unexpected exception ", e); } finally { try { Thread.sleep(4000); } catch (InterruptedException e) { } myRMI = null; System.err.println("rmid shut down"); ActivationLibrary.rmidCleanup(rmid); } }
public class CloseServerSocket implements Remote { private static final int PORT = TestLibrary.getUnusedRandomPort(); private CloseServerSocket() {} public static void main(String[] args) throws Exception { System.err.println("\nRegression test for bug 4457683\n"); verifyPortFree(PORT); Registry registry = LocateRegistry.createRegistry(PORT); System.err.println("- exported registry: " + registry); verifyPortInUse(PORT); UnicastRemoteObject.unexportObject(registry, true); System.err.println("- unexported registry"); Thread.sleep(1); // work around BindException (bug?) verifyPortFree(PORT); /* * The follow portion of this test is disabled temporarily * because 4457683 was partially backed out because of * 6269166; for now, only server sockets originally opened for * exports on non-anonymous ports will be closed when all of * the corresponding remote objects have been exported. A * separate bug will be filed to represent the remainder of * 4457683 for anonymous-port exports. */ // SSF ssf = new SSF(); // Remote impl = new CloseServerSocket(); // Remote stub = UnicastRemoteObject.exportObject(impl, 0, null, ssf); // System.err.println("- exported object: " + stub); // UnicastRemoteObject.unexportObject(impl, true); // System.err.println("- unexported object"); // synchronized (ssf) { // if (!ssf.serverSocketClosed) { // throw new RuntimeException("TEST FAILED: " + // "server socket not closed"); // } // } System.err.println("TEST PASSED"); } private static void verifyPortFree(int port) throws IOException { ServerSocket ss = new ServerSocket(port); ss.close(); System.err.println("- port " + port + " is free"); } private static void verifyPortInUse(int port) throws IOException { try { verifyPortFree(port); } catch (BindException e) { System.err.println("- port " + port + " is in use"); return; } } private static class SSF implements RMIServerSocketFactory { boolean serverSocketClosed = false; SSF() {}; public ServerSocket createServerSocket(int port) throws IOException { return new SS(port); } private class SS extends ServerSocket { SS(int port) throws IOException { super(port); System.err.println("- created server socket: " + this); }; public void close() throws IOException { synchronized (SSF.this) { serverSocketClosed = true; SSF.this.notifyAll(); } System.err.println("- closing server socket: " + this); super.close(); } } } }
public static void main(String[] args) { Ping obj = null; Registry registry = null; try { /* * create registry */ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager"); System.err.println("creating Registry..."); registry = TestLibrary.createRegistryOnUnusedPort(); int port = TestLibrary.getRegistryPort(registry); /* * create object with custom ref and bind in registry */ System.err.println("creating UseCustomRef..."); UseCustomRef cr = new UseCustomRef(); RemoteRef ref = cr.getRef(); if (!(ref instanceof CustomServerRef)) { TestLibrary.bomb("test failed: reference not " + "instanceof CustomServerRef"); } String name = "//:" + port + "/UseCustomRef"; // String name = "UseCustomRef"; System.err.println("binding object in registry..."); Naming.rebind(name, cr); /* * look up object and invoke its ping method */ System.err.println("ping object..."); obj = (Ping) Naming.lookup(name); obj.ping(); /* * pass object with custom ref in remote call */ System.err.println("pass object in remote call..."); obj.receiveAndPing(cr); /* * write remote object with custom ref to output stream */ System.err.println("writing remote object to stream..."); ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout); out.writeObject(cr); out.flush(); out.close(); /* * read back remote object from output stream */ System.err.println("reading remote object from stream..."); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray())); cr = (UseCustomRef) in.readObject(); /* * re-export object and ping */ System.err.println("re-export object read..."); cr.exportObject(); System.err.println("look up object again..."); Naming.rebind(name, cr); System.err.println("ping object read..."); obj = (Ping) Naming.lookup(name); obj.ping(); System.err.println("TEST PASSED"); Naming.unbind(name); cr = null; } catch (Exception e) { TestLibrary.bomb("test failed with exception: ", e); } finally { TestLibrary.unexport(obj); TestLibrary.unexport(registry); registry = null; obj = null; } }
public static void main(String args[]) { sameGroup = true; RMID rmid = null; System.err.println("\nRegression test for bug/rfe 4179055\n"); try { TestLibrary.suggestSecurityManager("java.lang.SecurityManager"); registry = java.rmi.registry.LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT); // must run with java.lang.SecurityManager or the test // result will be nullified if running with a build where // 4180392 has not been fixed. String smClassName = System.getSecurityManager().getClass().getName(); if (!smClassName.equals("java.lang.SecurityManager")) { TestLibrary.bomb("Test must run with java.lang.SecurityManager"); } // start an rmid. RMID.removeLog(); rmid = RMID.createRMID(); rmid.start(); // rmid.addOptions(new String[] {"-C-Djava.rmi.server.logCalls=true"}); // Ensure that activation groups run with the correct // security manager. // Properties p = new Properties(); p.put("java.security.policy", TestParams.defaultGroupPolicy); p.put("java.security.manager", "java.lang.SecurityManager"); // This action causes the following classes to be created // in this VM (RMI must permit the creation of these classes): // // sun.rmi.server.Activation$ActivationSystemImpl_Stub // sun.rmi.server.Activation$ActivationMonitorImpl_Stub // System.err.println("Create activation group, in a new VM"); ActivationGroupDesc groupDesc = new ActivationGroupDesc(p, null); ActivationSystem system = ActivationGroup.getSystem(); ActivationGroupID groupID = system.registerGroup(groupDesc); System.err.println("register activatable"); // Fix for: 4271615: make sure activation group runs in a new VM ActivationDesc desc = new ActivationDesc(groupID, "StubClassesPermitted", null, null); canCreateStubs = (CanCreateStubs) Activatable.register(desc); // ensure registry stub can be passed in a remote call System.err.println("getting the registry"); registry = canCreateStubs.getRegistry(); // make sure a client cant load just any sun.* class, just // as a sanity check, try to create a class we are not // allowed to access but which was passed in a remote call try { System.err.println("accessing forbidden class"); Object secureRandom = canCreateStubs.getForbiddenClass(); TestLibrary.bomb( "test allowed to access forbidden class," + " sun.security.provider.SecureRandom"); } catch (java.security.AccessControlException e) { // Make sure we received a *local* AccessControlException ByteArrayOutputStream bout = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(bout); e.printStackTrace(ps); ps.flush(); String trace = new String(bout.toByteArray()); if ((trace.indexOf("exceptionReceivedFromServer") >= 0) || trace.equals("")) { throw e; } System.err.println("received expected local access control exception"); } // make sure that an ActivationGroupID can be passed in a // remote call; this is slightly more inclusive than // just passing a reference to the activation system System.err.println("returning group desc"); canCreateStubs.returnGroupID(); // Clean up object System.err.println("Deactivate object via method call"); canCreateStubs.shutdown(); System.err.println("\nsuccess: StubClassesPermitted test passed "); } catch (Exception e) { TestLibrary.bomb("\nfailure: unexpected exception ", e); } finally { try { Thread.sleep(4000); } catch (InterruptedException e) { } canCreateStubs = null; ActivationLibrary.rmidCleanup(rmid); System.err.println("rmid shut down"); } }