package org.threadly.concurrent.wrapper.limiter;
import static org.junit.Assert.*;
import static org.threadly.TestConstants.*;
import java.util.Map;
import org.junit.Test;
import org.threadly.BlockingTestRunnable;
import org.threadly.concurrent.DoNothingRunnable;
import org.threadly.util.StringUtils;
@SuppressWarnings("javadoc")
public abstract class AbstractKeyedLimiterTest {
protected abstract AbstractKeyedLimiter<?> makeLimiter(int limit);
@Test
public void getMaxConcurrencyPerKeyTest() {
assertEquals(1, makeLimiter(1).getMaxConcurrencyPerKey());
int val = 10;
assertEquals(val, makeLimiter(val).getMaxConcurrencyPerKey());
}
@Test
public void getUnsubmittedTaskCountTest() {
AbstractKeyedLimiter<?> singleConcurrencyLimiter = makeLimiter(1);
String key = StringUtils.makeRandomString(5);
BlockingTestRunnable btr = new BlockingTestRunnable();
try {
assertEquals(0, singleConcurrencyLimiter.getUnsubmittedTaskCount(key));
singleConcurrencyLimiter.execute(key, btr);
btr.blockTillStarted();
// should not be queued any more
assertEquals(0, singleConcurrencyLimiter.getUnsubmittedTaskCount(key));
for (int i = 1; i < TEST_QTY; i++) {
singleConcurrencyLimiter.submit(key, DoNothingRunnable.instance());
assertEquals(i, singleConcurrencyLimiter.getUnsubmittedTaskCount(key));
}
} finally {
btr.unblock();
}
}
@Test (expected = IllegalArgumentException.class)
public void getUnsubmittedTaskCountNullFail() {
makeLimiter(1).getUnsubmittedTaskCount(null);
}
@Test
public void getUnsubmittedTaskCountMapTest() {
AbstractKeyedLimiter<?> singleConcurrencyLimiter = makeLimiter(1);
String key = StringUtils.makeRandomString(5);
BlockingTestRunnable btr = new BlockingTestRunnable();
try {
assertTrue(singleConcurrencyLimiter.getUnsubmittedTaskCountMap().isEmpty());
singleConcurrencyLimiter.execute(key, btr);
btr.blockTillStarted();
// should not be queued any more
assertTrue(singleConcurrencyLimiter.getUnsubmittedTaskCountMap().isEmpty());
for (int i = 1; i < TEST_QTY; i++) {
singleConcurrencyLimiter.submit(key, DoNothingRunnable.instance());
Map<?, ?> taskCountMap = singleConcurrencyLimiter.getUnsubmittedTaskCountMap();
assertEquals(1, taskCountMap.size());
assertEquals(i, taskCountMap.get(key));
}
} finally {
btr.unblock();
}
}
@Test
public void getTrackedKeyCountTest() {
AbstractKeyedLimiter<?> limiter = makeLimiter(1);
BlockingTestRunnable btr = new BlockingTestRunnable();
try {
assertEquals(0, limiter.getTrackedKeyCount());
limiter.execute(btr, btr);
assertEquals(1, limiter.getTrackedKeyCount());
btr.unblock();
btr.blockTillFinished();
assertEquals(0, limiter.getTrackedKeyCount());
} finally {
btr.unblock();
}
}
}