/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.monitor;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class PipeliningTaskQueueTest {
static {
// java.util.logging.ConsoleHandler handler = new java.util.logging.ConsoleHandler();
// handler.setLevel(java.util.logging.Level.ALL);
//
// org.geotools.util.logging.Logging.getLogger("org.geoserver.monitor").setLevel(java.util.logging.Level.ALL);
// org.geotools.util.logging.Logging.getLogger("org.geoserver.monitor").addHandler(handler);
}
PipeliningTaskQueue<Integer> taskQueue;
@Before
public void setUp() throws Exception {
taskQueue = new PipeliningTaskQueue();
taskQueue.start();
}
@After
public void tearDown() throws Exception {
taskQueue.stop();
}
@Test
public void test() throws Exception {
ConcurrentLinkedQueue<Worker> completed = new ConcurrentLinkedQueue<Worker>();
int groups = 5;
ArrayList<Worker>[] workers = new ArrayList[groups];
for (int i = 0; i < workers.length; i++) {
workers[i] = new ArrayList();
for (int j = 0; j < groups; j++) {
workers[i].add(new Worker(i,j, completed));
}
}
for (int i = 0; i < groups; i++) {
for (int j = 0; j < workers.length; j++) {
Worker w = workers[j].get(i);
taskQueue.execute(w.group, w);
}
}
while(completed.size() < groups * workers.length) {
Thread.sleep(1000);
}
int[] status = new int[groups];
for (Worker w : completed) {
assertEquals(status[w.group], w.seq.intValue());
status[w.group]++;
}
}
static class Worker implements Runnable {
Integer group;
Integer seq;
Queue<Worker> completed;
public Worker(Integer group, Integer seq, Queue<Worker> completed) {
this.group = group;
this.seq = seq;
this.completed = completed;
}
public void run() {
Random r = new Random();
int x = r.nextInt(10) + 1;
try {
Thread.sleep(x*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
completed.add(this);
}
}
}