package org.infinispan.interceptors.impl; import static org.testng.AssertJUnit.assertEquals; import java.util.concurrent.CompletableFuture; import org.infinispan.interceptors.InvocationCallback; import org.infinispan.test.AbstractInfinispanTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * @author Dan Berindei * @since 9.0 */ @Test(groups = "unit", testName = "interceptors.QueueAsyncInvocationStageTest") public class QueueAsyncInvocationStageTest extends AbstractInfinispanTest { @DataProvider(name = "offsets") public Object[][] offsets() { return new Object[][]{{0}, {1}}; } @Test(dataProvider = "offsets") public void testExpandCapacity(int splitOffset) throws Throwable { CompletableFuture<Object> future = new CompletableFuture<>(); QueueAsyncInvocationStage stage = new QueueAsyncInvocationStage(null, null, future, makeCallback(0)); assertCallback(0, stage.queuePoll()); addAndPoll(stage, splitOffset); // Now trigger 2 expansions int count = 2 * QueueAsyncInvocationStage.QUEUE_INITIAL_CAPACITY; addAndPoll(stage, count); } private InvocationCallback makeCallback(int i) { return (rCtx, rCommand, rv, throwable) -> "v" + i; } private void assertCallback(int index, InvocationCallback callback) throws Throwable { assertEquals("v" + index, callback.apply(null, null, null, null)); } private void addAndPoll(QueueAsyncInvocationStage stage, int splitOffset) throws Throwable { for (int i = 0; i < splitOffset; i++) { stage.queueAdd(makeCallback(i)); } assertEquals(splitOffset, stage.queueSize()); for (int i = 0; i < splitOffset; i++) { assertCallback(i, stage.queuePoll()); } assertEquals(0, stage.queueSize()); } }