package org.infinispan.stream;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.fail;
import org.infinispan.Cache;
import org.infinispan.commons.CacheException;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.container.DataContainer;
import org.infinispan.test.TestingUtil;
import org.testng.annotations.Test;
/**
* Test to verify stream iterator exception propagation behavior for a distributed cache.
*
* @author wburns
* @since 8.0
*/
@Test(groups = "functional", testName = "stream.DistributedStreamIteratorExceptionTest")
public class DistributedStreamIteratorExceptionTest extends BaseSetupStreamIteratorTest {
public DistributedStreamIteratorExceptionTest() {
super(false, CacheMode.DIST_SYNC);
}
public void ensureDataContainerRemoteExceptionPropagated() {
Cache cache0 = cache(0, CACHE_NAME);
Cache cache1 = cache(1, CACHE_NAME);
// Extract real one to replace after
DataContainer dataContainer = TestingUtil.extractComponent(cache1, DataContainer.class);
try {
Throwable t = new AssertionError();
DataContainer mockContainer = when(mock(DataContainer.class).iterator()).thenThrow(t).getMock();
TestingUtil.replaceComponent(cache1, DataContainer.class, mockContainer, true);
try {
cache0.entrySet().stream().iterator().hasNext();
fail("We should have gotten a CacheException");
} catch (CacheException e) {
Throwable cause = e;
while ((cause = cause.getCause()) != null) {
if (t.getClass().isInstance(cause)) {
break;
}
}
assertNotNull("We should have found the throwable as a cause", cause);
}
} finally {
TestingUtil.replaceComponent(cache1, DataContainer.class, dataContainer, true);
}
}
}