package org.infinispan.counter;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.lang.reflect.Method;
import org.infinispan.counter.api.CounterConfiguration;
import org.infinispan.counter.api.CounterManager;
import org.infinispan.counter.api.CounterState;
import org.infinispan.counter.api.CounterType;
import org.infinispan.counter.api.Handle;
import org.infinispan.counter.api.StrongCounter;
import org.infinispan.counter.util.StrongTestCounter;
import org.infinispan.counter.util.TestCounter;
import org.testng.annotations.Test;
/**
* Notification test for threshold aware counters.
*
* @author Pedro Ruivo
* @since 9.0
*/
@Test(groups = "functional", testName = "counter.BoundedCounterNotificationTest")
public class BoundedCounterNotificationTest extends AbstractCounterNotificationTest {
public void testThreshold(Method method) throws Exception {
final String counterName = method.getName();
final StrongCounter[] counters = new StrongCounter[clusterSize()];
for (int i = 0; i < clusterSize(); ++i) {
counters[i] = createCounter(counterManager(i), counterName, -2, 2);
}
Handle<ListenerQueue> l = counters[0].addListener(new ListenerQueue());
for (StrongCounter counter : counters) {
counter.incrementAndGet();
}
l.getCounterListener().assertEvent(0, CounterState.VALID, 1, CounterState.VALID);
l.getCounterListener().assertEvent(1, CounterState.VALID, 2, CounterState.VALID);
l.getCounterListener().assertEvent(2, CounterState.VALID, 2, CounterState.UPPER_BOUND_REACHED);
//as soon as threshold is reached, no more events are triggered.
assertTrue(l.getCounterListener().queue.isEmpty());
assertEquals(2L, (long) counters[0].getValue().get());
for (StrongCounter counter : counters) {
counter.decrementAndGet();
}
l.getCounterListener().assertEvent(2, CounterState.UPPER_BOUND_REACHED, 1, CounterState.VALID);
l.getCounterListener().assertEvent(1, CounterState.VALID, 0, CounterState.VALID);
l.getCounterListener().assertEvent(0, CounterState.VALID, -1, CounterState.VALID);
l.getCounterListener().assertEvent(-1, CounterState.VALID, -2, CounterState.VALID);
assertEquals(-2L, (long) counters[0].getValue().get());
counters[0].decrementAndGet();
counters[0].decrementAndGet();
l.getCounterListener().assertEvent(-2, CounterState.VALID, -2, CounterState.LOWER_BOUND_REACHED);
//as soon as threshold is reached, no more events are triggered.
assertTrue(l.getCounterListener().queue.isEmpty());
assertEquals(-2L, (long) counters[0].getValue().get());
//removes the listener
l.remove();
counters[0].incrementAndGet();
counters[0].incrementAndGet();
assertTrue(l.getCounterListener().queue.isEmpty());
}
protected TestCounter createCounter(CounterManager counterManager, String counterName) {
return new StrongTestCounter(createCounter(counterManager, counterName, Long.MIN_VALUE, Long.MAX_VALUE));
}
private StrongCounter createCounter(CounterManager counterManager, String counterName, long min, long max) {
counterManager.defineCounter(counterName,
CounterConfiguration.builder(CounterType.BOUNDED_STRONG).lowerBound(min).upperBound(max).build());
return counterManager.getStrongCounter(counterName);
}
}