test/java/rmi/transport/readTimeout/ReadTimeoutTest.java
Print this page
*** 42,51 ****
--- 42,53 ----
import java.rmi.*;
import java.rmi.server.RMISocketFactory;
import java.io.*;
import java.net.*;
+ import java.util.concurrent.CountDownLatch;
+ import java.util.concurrent.TimeUnit;
public class ReadTimeoutTest
{
private static final int DELAY = 5000; // milliseconds
*** 67,137 ****
// Create remote object
TestImpl impl = new TestImpl();
// Export and get which port.
System.err.println("(exporting remote object)");
- TestIface stub = impl.export();
- Socket DoS = null;
- try {
int port = fac.whichPort();
// Sanity
if (port == 0)
throw new Error("TEST FAILED: export didn't reserve a port(?)");
!
// Now, connect to that port
//Thread.sleep(2000);
System.err.println("(connecting to listening port on 127.0.0.1:" +
port + ")");
- DoS = new Socket("127.0.0.1", port);
InputStream stream = DoS.getInputStream();
// Read on the socket in the background
! boolean[] successful = new boolean[] { false };
! (new SomeReader(stream, successful)).start();
// Wait for completion
! int nretries = 4;
! while (nretries-- > 0) {
! if (successful[0])
! break;
! Thread.sleep(DELAY);
! }
!
! if (successful[0]) {
System.err.println("TEST PASSED.");
} else {
throw new Error("TEST FAILED.");
}
!
} finally {
- try {
- if (DoS != null)
- DoS.close(); // aborts the reader if still blocked
impl.unexport();
- } catch (Throwable unmatter) {
- }
}
-
// Should exit here
}
private static class SomeFactory
extends RMISocketFactory
{
private int servport = 0;
public Socket createSocket(String h, int p)
throws IOException
{
return (new Socket(h, p));
}
/** Create a server socket and remember which port it's on.
* Aborts if createServerSocket(0) is called twice, because then
* it doesn't know whether to remember the first or second port.
*/
public ServerSocket createServerSocket(int p)
throws IOException
{
ServerSocket ss;
ss = new ServerSocket(p);
--- 69,125 ----
// Create remote object
TestImpl impl = new TestImpl();
// Export and get which port.
System.err.println("(exporting remote object)");
int port = fac.whichPort();
// Sanity
if (port == 0)
throw new Error("TEST FAILED: export didn't reserve a port(?)");
! try (Socket DoS = new Socket("127.0.0.1", port)) {
// Now, connect to that port
//Thread.sleep(2000);
System.err.println("(connecting to listening port on 127.0.0.1:" +
port + ")");
InputStream stream = DoS.getInputStream();
// Read on the socket in the background
! CountDownLatch done = new CountDownLatch(1);
! (new SomeReader(stream, done)).start();
// Wait for completion
! if (done.await(DELAY * 4, TimeUnit.SECONDS)) {
System.err.println("TEST PASSED.");
} else {
throw new Error("TEST FAILED.");
}
! } catch (InterruptedException ie) {
! throw new Error("Unexpected error happen in reader:" + ie);
} finally {
impl.unexport();
}
// Should exit here
}
private static class SomeFactory
extends RMISocketFactory
{
private int servport = 0;
+ @Override
public Socket createSocket(String h, int p)
throws IOException
{
return (new Socket(h, p));
}
/** Create a server socket and remember which port it's on.
* Aborts if createServerSocket(0) is called twice, because then
* it doesn't know whether to remember the first or second port.
*/
+ @Override
public ServerSocket createServerSocket(int p)
throws IOException
{
ServerSocket ss;
ss = new ServerSocket(p);
*** 153,179 ****
return (servport);
}
} // end class SomeFactory
protected static class SomeReader extends Thread {
! private InputStream readon;
! private boolean[] vec;
! public SomeReader(InputStream s, boolean[] successvec) {
super();
this.setDaemon(true);
this.readon = s;
! this.vec = successvec;
}
public void run() {
try {
int c = this.readon.read();
if (c != -1)
throw new Error ("Server returned " + c);
! this.vec[0] = true;
!
} catch (IOException e) {
e.printStackTrace();
}
}
} // end class SomeReader
--- 141,167 ----
return (servport);
}
} // end class SomeFactory
protected static class SomeReader extends Thread {
! private final InputStream readon;
! private final CountDownLatch done;
! public SomeReader(InputStream s, CountDownLatch done) {
super();
this.setDaemon(true);
this.readon = s;
! this.done = done;
}
+ @Override
public void run() {
try {
int c = this.readon.read();
if (c != -1)
throw new Error ("Server returned " + c);
! done.countDown();
} catch (IOException e) {
e.printStackTrace();
}
}
} // end class SomeReader