예제 #1
0
 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();
    }
  }
예제 #3
0
  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();
    }
  }
예제 #4
0
 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;
  }
예제 #6
0
  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;
  }
예제 #8
0
 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);
 }
예제 #9
0
  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));
  }
예제 #10
0
  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)));
  }
예제 #11
0
  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);
      }
    }
  }
예제 #13
0
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");
  }
}
예제 #14
0
  /**
   * 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();
      }
    }
  }
}
예제 #19
0
  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;
    }
  }
예제 #20
0
  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");
    }
  }