Author: j16sdiz
Date: 2009-04-08 05:04:47 +0000 (Wed, 08 Apr 2009)
New Revision: 26638

Added:
   trunk/freenet/test/freenet/support/PrioritizedSerialExecutorTest.java
Log:
JUnit for PrioritizedSerialExecutor

Added: trunk/freenet/test/freenet/support/PrioritizedSerialExecutorTest.java
===================================================================
--- trunk/freenet/test/freenet/support/PrioritizedSerialExecutorTest.java       
                        (rev 0)
+++ trunk/freenet/test/freenet/support/PrioritizedSerialExecutorTest.java       
2009-04-08 05:04:47 UTC (rev 26638)
@@ -0,0 +1,144 @@
+package freenet.support;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+import freenet.node.PrioRunnable;
+import freenet.support.io.NativeThread;
+
+public class PrioritizedSerialExecutorTest extends TestCase {
+       private Executor realExec;
+       private PrioritizedSerialExecutor exec;
+
+       private SynchronousQueue<String> completingJob;
+       private List<String> completedJobs;
+
+       private class J implements PrioRunnable {
+               private int prio;
+               private String name;
+
+               J(String name, int prio) {
+                       this.name = name;
+                       this.prio = prio;
+               }
+
+               public int getPriority() {
+                       return prio;
+               }
+
+               public void run() {
+                       synchronized (this) {
+                               notifyAll();
+                       }
+                       try {
+                               assertTrue(exec.onThread());
+                               completingJob.put(name);
+                       } catch (InterruptedException e) {
+                               fail(e.toString());
+                       }
+               }
+       }
+
+       @Override
+       protected void setUp() throws Exception {
+               super.setUp();
+               realExec = new PooledExecutor();
+               completedJobs = new ArrayList<String>();
+               completingJob = new SynchronousQueue<String>();
+               exec = new PrioritizedSerialExecutor(NativeThread.MAX_PRIORITY, 
10, 5, true);
+       }
+
+       private void Q(String j, int i, boolean waitForStart) throws 
InterruptedException {
+               J job = new J(j, i);
+
+               synchronized (job) {
+                       exec.execute(job, j);
+                       if (waitForStart)
+                               job.wait(5000);
+               }
+       }
+
+       private void waitFor(int count) throws InterruptedException {
+               int completed = 0;
+               while (completed < count) {
+                       String s = completingJob.poll(5, TimeUnit.SECONDS);
+                       if (s == null)
+                               fail("Hang?");
+
+                       completed++;
+                       completedJobs.add(s);
+               }
+               System.out.println(completedJobs);
+       }
+
+       public void testRun() throws InterruptedException {
+               assertTrue(completedJobs.isEmpty());
+
+               Q("J1", 0, false);
+               Q("J2", 0, false);
+               Q("J3", 0, false);
+               Q("J4", 0, false);
+               Thread.yield();
+               Thread.sleep(10);
+
+               assertTrue(completedJobs.isEmpty()); // not started yet!
+
+               exec.start(realExec, "testRun"); // start !
+               waitFor(4);
+
+               assertTrue(completedJobs.contains("J1"));
+               assertTrue(completedJobs.contains("J2"));
+               assertTrue(completedJobs.contains("J3"));
+               assertTrue(completedJobs.contains("J4"));
+
+               assertFalse(exec.onThread());
+       }
+
+       public void testRunPrio() throws InterruptedException {
+               assertTrue(completedJobs.isEmpty());
+
+               Q("JM", 9, false);
+               Q("J8", 8, false);
+
+               assertTrue(completedJobs.isEmpty()); // not started yet!
+
+               assertEquals(0, exec.getWaitingThreadsCount());
+               exec.start(realExec, "testRunPrio"); // start !
+
+               waitFor(1); // JM
+
+               Q("J2", 2, false);
+               Q("JN", 4, false);
+               Q("JO", 2, false);
+               Q("JP", 3, false);
+
+               assertEquals(0, exec.getQueueSize(9));
+               assertEquals(1, exec.getQueueSize(4));
+               assertEquals(1, exec.getQueueSize(3));
+               assertEquals(2, exec.getQueueSize(2));
+
+               waitFor(2); // J8,JN
+
+               Q("JQ", 4, false);
+               Q("JR", 0, false);
+               assertEquals(1, exec.getQueueSize(4));
+               assertEquals(0, exec.getQueueSize(3));
+               assertEquals(2, exec.getQueueSize(2));
+               assertEquals(0, exec.getQueueSize(1));
+               assertEquals(1, exec.getQueueSize(0));
+
+               assertTrue(Arrays.equals(new int[] { 1, 0, 2, 0, 1, 0, 0, 0, 0, 
0 }, exec.runningJobs()));
+
+               waitFor(5); // JP, JQ, J2, JO, JR
+
+               int i = 0;
+               for (String s : new String[] { "JM", "J8", "JN", "JP", "JQ", 
"J2", "JO", "JR" })
+                       assertEquals(s, s, completedJobs.get(i++));
+
+               assertEquals(1, exec.getWaitingThreadsCount());
+       }
+}


Property changes on: 
trunk/freenet/test/freenet/support/PrioritizedSerialExecutorTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/x-java
Added: svn:keywords
   + Id
Added: svn:eol-style
   + native

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to