package aQute.libg.forker; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import junit.framework.TestCase; public class TestForker extends TestCase { final Collection<Integer> EMPTY = Collections.emptyList(); final int TIMEOUT = 1000000; static class R implements Runnable { final Collection<Integer> result; final int n; R(Collection<Integer> result, int n) { this.result = result; this.n = n; } public void run() { result.add(n); } } public void testSimple() throws InterruptedException { final Forker<Integer> forker = new Forker<Integer>(); final Collection<Integer> result = Collections.synchronizedList(new ArrayList<Integer>()); forker.doWhen(Arrays.asList(3), 2, new R(result, 2)); forker.doWhen(Arrays.asList(2), 1, new R(result, 1)); forker.doWhen(EMPTY, 3, new R(result, 3)); forker.start(1000); assertEquals(Arrays.asList(3, 2, 1), result); } public void testSimple2() throws InterruptedException { final Forker<Integer> forker = new Forker<Integer>(); final Collection<Integer> result = Collections.synchronizedList(new ArrayList<Integer>()); forker.doWhen(Arrays.asList(1, 2, 3), 4, new R(result, 4)); forker.doWhen(EMPTY, 1, new R(result, 1)); forker.doWhen(EMPTY, 2, new R(result, 2)); forker.doWhen(EMPTY, 3, new R(result, 3)); forker.start(1000); assertTrue(result.containsAll(Arrays.asList(1, 2, 3, 4))); Object[] q = result.toArray(); assertEquals(Integer.valueOf(4), q[q.length - 1]); } public void testInvalid() { final Forker<Integer> forker = new Forker<Integer>(); final Collection<Integer> result = Collections.synchronizedList(new ArrayList<Integer>()); forker.doWhen(Arrays.asList(1, 2, 3), 4, new R(result, 4)); try { forker.start(100); fail(); } catch (Exception e) { System.err.println(e.getMessage()); assertEquals(IllegalArgumentException.class, e.getClass()); } } public void testCancel() throws InterruptedException { final Forker<Integer> forker = new Forker<Integer>(); final Collection<Integer> result = Collections.synchronizedList(new ArrayList<Integer>()); forker.doWhen(EMPTY, 4, new Runnable() { public void run() { synchronized (result) { try { System.err.println("starting to wait"); result.wait(TIMEOUT); System.err.println("finished wait"); } catch (Exception e) { System.err.println("exception"); e.printStackTrace(); } finally { System.err.println("leaving task"); } } } }); forker.start(-1); Thread.sleep(1000); assertEquals(1, forker.getCount()); forker.cancel(1000); assertEquals(0, forker.getCount()); } }