blob: 86953a5039e0813cb271b7987a88b42d33d73610 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.processor.resequencer;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import junit.framework.TestCase;
public class ResequencerEngineTest extends TestCase {
private static final boolean IGNORE_LOAD_TESTS
= Boolean.parseBoolean(System.getProperty("ignore.load.tests", "true"));
private ResequencerEngineSync<Integer> resequencer;
private ResequencerRunner<Integer> runner;
private SequenceBuffer<Integer> buffer;
public void setUp() throws Exception {
}
public void tearDown() throws Exception {
if (runner != null) {
runner.cancel();
}
if (resequencer != null) {
resequencer.stop();
}
}
public void testTimeout1() throws Exception {
initResequencer(500, 10);
resequencer.insert(4);
assertNull(buffer.poll(250));
assertEquals((Integer)4, buffer.take());
assertEquals((Integer)4, resequencer.getLastDelivered());
}
public void testTimeout2() throws Exception {
initResequencer(500, 10);
resequencer.setLastDelivered(2);
resequencer.insert(4);
assertNull(buffer.poll(250));
assertEquals((Integer)4, buffer.take());
assertEquals((Integer)4, resequencer.getLastDelivered());
}
public void testTimeout3() throws Exception {
initResequencer(500, 10);
resequencer.setLastDelivered(3);
resequencer.insert(4);
assertEquals((Integer)4, buffer.poll(250));
assertEquals((Integer)4, resequencer.getLastDelivered());
}
public void testTimout4() throws Exception {
initResequencer(500, 10);
resequencer.setLastDelivered(2);
resequencer.insert(4);
resequencer.insert(3);
assertEquals((Integer)3, buffer.poll(125));
assertEquals((Integer)4, buffer.poll(125));
assertEquals((Integer)4, resequencer.getLastDelivered());
}
public void testRandom() throws Exception {
if (IGNORE_LOAD_TESTS) {
return;
}
int input = 1000;
initResequencer(1000, 1000);
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < input; i++) {
list.add(i);
}
Random random = new Random(System.currentTimeMillis());
System.out.println("Input sequence:");
long millis = System.currentTimeMillis();
for (int i = input; i > 0; i--) {
int r = random.nextInt(i);
int next = list.remove(r);
System.out.print(next + " ");
resequencer.insert(next);
}
System.out.println("\nOutput sequence:");
for (int i = 0; i < input; i++) {
System.out.print(buffer.take() + " ");
}
millis = System.currentTimeMillis() - millis;
System.out.println("\nDuration = " + millis + " ms");
}
public void testReverse1() throws Exception {
if (IGNORE_LOAD_TESTS) {
return;
}
testReverse(10);
}
public void testReverse2() throws Exception {
if (IGNORE_LOAD_TESTS) {
return;
}
testReverse(100);
}
private void testReverse(int capacity) throws Exception {
initResequencer(1, capacity);
for (int i = 99; i >= 0; i--) {
resequencer.insert(i);
}
System.out.println("\nOutput sequence:");
for (int i = 0; i < 100; i++) {
System.out.print(buffer.take() + " ");
}
}
private void initResequencer(long timeout, int capacity) {
ResequencerEngine<Integer> engine;
buffer = new SequenceBuffer<Integer>();
engine = new ResequencerEngine<Integer>(new IntegerComparator());
engine.setSequenceSender(buffer);
engine.setTimeout(timeout);
engine.start();
resequencer = new ResequencerEngineSync<Integer>(engine);
runner = new ResequencerRunner<Integer>(resequencer, 50);
runner.start();
}
}