package org.jgroups.tests; import org.jgroups.Global; import org.jgroups.TimeoutException; import org.jgroups.util.Promise; import org.jgroups.util.Util; import org.testng.Assert; import org.testng.annotations.Test; /** * Various test cases for Promise * @author Bela Ban */ @Test(groups=Global.FUNCTIONAL) public class PromiseTest { public static void testGetWithResultAvailable() { final Promise<Integer> p=new Promise<Integer>(); p.setResult(22); assert p.getResult() == 22; } public static void testGetResultNoTimeout() { final Promise p=new Promise(); Object result; new ResultSetter(p, 500).start(); result=p.getResult(0); Assert.assertEquals(Boolean.TRUE, result); } public static final void testRepeatedGet() { final Promise<Integer> p=new Promise<Integer>(); p.setResult(10); System.out.println("p: " + p); Integer result=p.getResult(100); System.out.println("result = " + result); result=p.getResult(100); System.out.println("result = " + result); } public static void testGetResultNoTimeout_ResultAlreadySet() { final Promise p=new Promise(); Object result; new ResultSetter(p, 1).start(); Util.sleep(100); result=p.getResult(0); Assert.assertEquals(Boolean.TRUE, result); } @Test(expectedExceptions=TimeoutException.class) public static void testGetResultWithTimeout() throws TimeoutException { final Promise p=new Promise(); p.getResultWithTimeout(500); } public static void testGetResultWithTimeoutNoException() { final Promise p=new Promise(); Object ret=p.getResult(500); assert ret == null; } public static void testGetResultWithTimeoutAndInterrupt() { final Promise p=new Promise(); new Interrupter(Thread.currentThread(), 100).start(); Object result=p.getResult(500); assert result == null; } public static void testGetResultWithTimeoutAndResultSetter() { final Promise p=new Promise(); Thread t=new Thread() { public void run() { Util.sleep(500); System.out.println("-- setting promise to \"Bela\""); p.setResult("Bela"); } }; t.start(); long start=System.currentTimeMillis(), stop; Object result=p.getResult(30000); stop=System.currentTimeMillis(); System.out.println("-- waited for " + (stop-start) + "ms, result is " + result); assert result != null; Assert.assertEquals("Bela", result); assert p.hasResult(); assert p.getResult().equals("Bela"); } public static void testReset() { final Promise p=new Promise(); Resetter resetter=new Resetter(p, 2000); resetter.start(); Object result=p.getResultWithTimeout(5000); System.out.println("result = " + result); assert result == null; } static class ResultSetter extends Thread { long wait_time=2000; Promise target=null; ResultSetter(Promise target, long wait_time) { this.target=target; this.wait_time=wait_time; } public void run() { Util.sleep(wait_time); target.setResult(Boolean.TRUE); } } static class Interrupter extends Thread { long wait_time=2000; Thread target=null; Interrupter(Thread target, long wait_time) { this.target=target; this.wait_time=wait_time; } public void run() { Util.sleep(wait_time); target.interrupt(); } } static class Resetter extends Thread { protected final Promise<?> target; protected final long wait_time; public Resetter(Promise<?> target, long wait_time) { this.target=target; this.wait_time=wait_time; } public void run() { Util.sleep(wait_time); // target.reset(); target.setResult(null); } } }