package org.jgroups.tests;
import org.testng.annotations.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import org.jgroups.Global;
/**
* Tests Thread.interrupt() against InputStream.read(), Object.wait() and Thread.sleep()
* @author Bela Ban Oct 5 2001
*/
@Test(groups=Global.FUNCTIONAL)
public class InterruptTest {
static final long TIMEOUT=3000;
static final int SLEEP=1;
static final int WAIT=2;
static final int READ=3;
static final int SOCKET_READ=4;
static String modeToString(int m) {
switch(m) {
case SLEEP:
return "SLEEP";
case WAIT:
return "WAIT";
case READ:
return "READ";
case SOCKET_READ:
return "SOCKET_READ";
default:
return "<unknown>";
}
}
/**
* Starts the Interruptible and interrupts after TIMEOUT milliseconds. Then joins thread
* (waiting for TIMEOUT msecs). PASS if thread dead, FAIL if still alive
*/
public static void testSleepInterrupt() {
SleeperThread thread=new SleeperThread(SLEEP);
runTest(thread);
}
public static void testWaitInterrupt() {
SleeperThread thread=new SleeperThread(WAIT);
runTest(thread);
}
/* public void testSocketReadInterrupt() {
SleeperThread thread=new SleeperThread(SOCKET_READ);
runTest(thread);
}
public void testReadInterrupt() {
SleeperThread thread=new SleeperThread(READ);
runTest(thread);
}*/
static void runTest(SleeperThread thread) {
System.out.println();
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): starting other thread");
thread.start();
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): starting other thread -- done");
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): sleeping for " + TIMEOUT + " msecs");
sleep(TIMEOUT);
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): sleeping -- done");
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): interrupting other thread");
thread.interrupt();
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): interrupting other thread -- done");
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): joining other thread (timeout=" + TIMEOUT + " msecs");
try {
thread.join(TIMEOUT);
}
catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): joining other thread -- done");
System.out.println("InterruptTest.runTest(" + modeToString(thread.getMode()) + "): thread.isAlive()=" + thread.isAlive());
assert !thread.isAlive();
}
static void sleep(long msecs) {
try {
Thread.sleep(msecs);
}
catch(Exception ex) {
System.err.println("InterruptTest.sleep(): " + ex);
}
}
static class SleeperThread extends Thread {
int mode;
DatagramSocket sock=null;
SleeperThread(int mode) {
this.mode=mode;
}
public int getMode() {
return mode;
}
public void run() {
switch(mode) {
case SLEEP:
runSleep();
break;
case WAIT:
runWait();
break;
case READ:
runRead();
break;
case SOCKET_READ:
runSocketRead();
break;
default:
break;
}
}
static void runSleep() {
try {
Thread.sleep(TIMEOUT);
}
catch(InterruptedException ex) {
System.err.println("InterruptTest.SleeperThread.runSleep(): " + ex);
}
}
static void runWait() {
Object mutex=new Object();
synchronized(mutex) {
try {
mutex.wait();
}
catch(InterruptedException ex) {
System.err.println("InterruptTest.SleeperThread.runWait(): " + ex);
}
}
}
static void runRead() {
try {
System.in.read();
}
catch(Exception ex) {
System.err.println("InterruptTest.SleeperThread.runRead(): " + ex);
}
}
void runSocketRead() {
byte[] buf=new byte[2];
DatagramPacket packet;
try {
sock=new DatagramSocket(12345, InetAddress.getLocalHost());
// System.out.println("** mcast_sock=" + mcast_sock.getLocalAddress() + ":" + mcast_sock.getLocalPort());
packet=new DatagramPacket(buf, buf.length);
//System.out.println("** receive(): start");
sock.receive(packet);
//System.out.println("** receive(): done");
}
catch(Exception e) {
//System.out.println("** receive(): done, exception=" + e);
System.err.println(e);
}
}
}
}