blob: 0289de28af2cbd56a85985cf5bcb5943eb2828a3 [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.util;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import junit.framework.TestCase;
import org.apache.camel.util.concurrent.ExecutorServiceHelper;
/**
* @version
*/
public class DefaultTimeoutMapTest extends TestCase {
private ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1);
public void testDefaultTimeoutMap() {
DefaultTimeoutMap map = new DefaultTimeoutMap(executor);
assertTrue(map.currentTime() > 0);
assertEquals(0, map.size());
}
public void testDefaultTimeoutMapPurge() throws Exception {
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
assertTrue(map.currentTime() > 0);
assertEquals(0, map.size());
map.put("A", 123, 50);
assertEquals(1, map.size());
Thread.sleep(250);
assertEquals(0, map.size());
}
public void testDefaultTimeoutMapForcePurge() throws Exception {
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
assertTrue(map.currentTime() > 0);
assertEquals(0, map.size());
map.put("A", 123, 50);
assertEquals(1, map.size());
Thread.sleep(250);
// will purge and remove old entries
map.purge();
assertEquals(0, map.size());
}
public void testDefaultTimeoutMapGetRemove() throws Exception {
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
assertTrue(map.currentTime() > 0);
assertEquals(0, map.size());
map.put("A", 123, 50);
assertEquals(1, map.size());
assertEquals(123, (int)map.get("A"));
Object old = map.remove("A");
assertEquals(123, old);
assertEquals(null, map.get("A"));
assertEquals(0, map.size());
}
public void testDefaultTimeoutMapGetKeys() throws Exception {
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
assertTrue(map.currentTime() > 0);
assertEquals(0, map.size());
map.put("A", 123, 50);
map.put("B", 456, 50);
assertEquals(2, map.size());
Object[] keys = map.getKeys();
assertNotNull(keys);
assertEquals(2, keys.length);
}
public void testExecutor() throws Exception {
ScheduledExecutorService e = ExecutorServiceHelper.newScheduledThreadPool(2, null, "foo", true);
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(e, 50);
assertEquals(50, map.getPurgePollTime());
map.put("A", 123, 100);
assertEquals(1, map.size());
Thread.sleep(250);
// should have been timed out now
assertEquals(0, map.size());
assertSame(e, map.getExecutor());
}
public void testExpiredInCorrectOrder() throws Exception {
final List<String> keys = new ArrayList<String>();
final List<Integer> values = new ArrayList<Integer>();
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100) {
@Override
public boolean onEviction(String key, Integer value) {
keys.add(key);
values.add(value);
return true;
}
};
assertEquals(0, map.size());
map.put("A", 1, 50);
map.put("B", 2, 30);
map.put("C", 3, 40);
map.put("D", 4, 20);
map.put("E", 5, 40);
// is not expired
map.put("F", 6, 800);
Thread.sleep(250);
// force purge
map.purge();
assertEquals("D", keys.get(0));
assertEquals(4, values.get(0).intValue());
assertEquals("B", keys.get(1));
assertEquals(2, values.get(1).intValue());
assertEquals("C", keys.get(2));
assertEquals(3, values.get(2).intValue());
assertEquals("E", keys.get(3));
assertEquals(5, values.get(3).intValue());
assertEquals("A", keys.get(4));
assertEquals(1, values.get(4).intValue());
assertEquals(1, map.size());
}
public void testExpiredNotEvicted() throws Exception {
final List<String> keys = new ArrayList<String>();
final List<Integer> values = new ArrayList<Integer>();
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100) {
@Override
public boolean onEviction(String key, Integer value) {
// do not evict special key
if ("gold".equals(key)) {
return false;
}
keys.add(key);
values.add(value);
return true;
}
};
assertEquals(0, map.size());
map.put("A", 1, 90);
map.put("B", 2, 100);
map.put("gold", 9, 110);
map.put("C", 3, 120);
Thread.sleep(250);
// force purge
map.purge();
assertEquals("A", keys.get(0));
assertEquals(1, values.get(0).intValue());
assertEquals("B", keys.get(1));
assertEquals(2, values.get(1).intValue());
assertEquals("C", keys.get(2));
assertEquals(3, values.get(2).intValue());
// and keep the gold in the map
assertEquals(1, map.size());
assertEquals(Integer.valueOf(9), map.get("gold"));
}
public void testDefaultTimeoutMapStopStart() throws Exception {
DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
map.put("A", 1, 500);
assertEquals(1, map.size());
map.stop();
assertEquals(0, map.size());
map.put("A", 1, 50);
// should not timeout as the scheduler doesn't run
Thread.sleep(250);
assertEquals(1, map.size());
// start
map.start();
// start and wait for scheduler to purge
Thread.sleep(250);
// now it should be gone
assertEquals(0, map.size());
}
}