001package edu.pdx.cs.joy.rmi;
002
003import edu.pdx.cs.joy.InvokeMainTestCase;
004import org.junit.jupiter.api.AfterAll;
005import org.junit.jupiter.api.BeforeAll;
006
007import java.net.MalformedURLException;
008import java.rmi.AlreadyBoundException;
009import java.rmi.NotBoundException;
010import java.rmi.RemoteException;
011import java.rmi.registry.LocateRegistry;
012import java.rmi.registry.Registry;
013import java.rmi.server.UnicastRemoteObject;
014
015public class MovieDatabaseRmiTestCase extends InvokeMainTestCase {
016  static int rmiPort;
017
018  private static int getRandomPort() {
019    return (int) (1_025 + Math.random() * (9_000 - 1));
020  }
021
022  static final String RMI_HOST = "localhost";
023  private static MovieDatabaseImpl movieDatabaseImpl;
024  private static Registry rmiRegistry;
025
026  @BeforeAll
027  public static void bindMovieDatabaseIntoRmiRegistry() throws RemoteException, AlreadyBoundException, MalformedURLException {
028    movieDatabaseImpl = new MovieDatabaseImpl();
029    rmiPort = getRandomPort();
030    MovieDatabase database = (MovieDatabase) UnicastRemoteObject.exportObject(movieDatabaseImpl, rmiPort);
031    rmiRegistry = LocateRegistry.createRegistry(rmiPort);
032    rmiRegistry.bind(MovieDatabase.RMI_OBJECT_NAME, database);
033  }
034
035  @AfterAll
036  public static void unbindMovieDatabaseFromRmiRegistry() throws RemoteException, NotBoundException {
037    Registry registry = rmiRegistry;
038    UnicastRemoteObject.unexportObject(movieDatabaseImpl, true);
039    registry.unbind(MovieDatabase.RMI_OBJECT_NAME);
040    UnicastRemoteObject.unexportObject(rmiRegistry, true);
041    movieDatabaseImpl = null;
042  }
043
044  private static Registry getRmiRegistry() throws RemoteException {
045    return LocateRegistry.getRegistry(RMI_HOST, rmiPort);
046  }
047
048  static MovieDatabase getMovieDatabase() throws RemoteException, NotBoundException {
049    return (MovieDatabase) getRmiRegistry().lookup(MovieDatabase.RMI_OBJECT_NAME);
050  }
051}