This is an automated email from the ASF dual-hosted git repository. klund pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push: new 0a1701e GEODE-7964: Upgrade Mockito to 3.3.3 (#4924) 0a1701e is described below commit 0a1701e92dc09bcd6b79edd3b52f20ee9e9a867c Author: Kirk Lund <kl...@apache.org> AuthorDate: Fri Apr 24 09:20:21 2020 -0700 GEODE-7964: Upgrade Mockito to 3.3.3 (#4924) --- .../src/test/resources/expected-pom.xml | 2 +- .../gradle/plugins/DependencyConstraints.groovy | 2 +- .../geode/connectors/jdbc/JdbcAsyncWriterTest.java | 4 +- .../geode/connectors/jdbc/JdbcWriterTest.java | 6 +- .../jdbc/internal/xml/ElementTypeTest.java | 4 +- .../xml/JdbcConnectorServiceXmlParserTest.java | 6 +- ...butedSystemMXBeanWithAlertsDistributedTest.java | 10 +- .../client/internal/QueueManagerJUnitTest.java | 15 + .../AvailableConnectionManagerConcurrentTest.java | 152 ++++++- .../pooling/ConnectionManagerJUnitTest.java | 15 + .../CacheDistributionAdvisorConcurrentTest.java | 23 +- .../cache/ha/HARegionQueueIntegrationTest.java | 460 +++++++++------------ .../ControlFileWatchdogIntegrationTest.java | 6 +- .../geode/cache/client/internal/Connection.java | 6 + .../cache/client/internal/ConnectionImpl.java | 15 + .../cache/client/internal/QueueConnectionImpl.java | 15 + .../pooling/AvailableConnectionManager.java | 36 +- .../internal/pooling/ConnectionManagerImpl.java | 8 +- .../client/internal/pooling/PooledConnection.java | 3 + .../internal/ClusterAlertMessagingTest.java | 4 +- .../client/internal/OpExecutorImplJUnitTest.java | 15 + .../pooling/AvailableConnectionManagerTest.java | 50 +-- .../geode/distributed/ServerLauncherTest.java | 10 +- .../internal/cache/InternalCacheBuilderTest.java | 4 +- .../PartitionedRegionRedundancyTrackerTest.java | 3 +- .../internal/cache/backup/BackupOperationTest.java | 6 +- .../SingleThreadColocationLoggerTest.java | 3 +- .../sockets/command/ExecuteFunction65Test.java | 4 +- .../sockets/command/ExecuteFunction66Test.java | 6 +- .../tier/sockets/command/ExecuteFunctionTest.java | 6 +- .../io/CompositeOutputStreamJUnitTest.java | 8 +- .../management/internal/FederatingManagerTest.java | 4 +- .../internal/beans/ManagementListenerTest.java | 8 +- .../test/dunit/internal/VMEventNotifierTest.java | 4 +- .../functions/AlterQueryServiceFunctionTest.java | 8 +- .../cli/functions/RegionAlterFunctionTest.java | 4 +- 36 files changed, 551 insertions(+), 384 deletions(-) diff --git a/boms/geode-all-bom/src/test/resources/expected-pom.xml b/boms/geode-all-bom/src/test/resources/expected-pom.xml index cbea352..d3da3d8 100644 --- a/boms/geode-all-bom/src/test/resources/expected-pom.xml +++ b/boms/geode-all-bom/src/test/resources/expected-pom.xml @@ -466,7 +466,7 @@ <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> - <version>2.23.0</version> + <version>3.3.3</version> <scope>compile</scope> </dependency> <dependency> diff --git a/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy b/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy index 7123296..3f85f56 100644 --- a/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy +++ b/buildSrc/src/main/groovy/org/apache/geode/gradle/plugins/DependencyConstraints.groovy @@ -154,7 +154,7 @@ class DependencyConstraints implements Plugin<Project> { api(group: 'org.httpunit', name: 'httpunit', version: '1.7.3') api(group: 'org.iq80.snappy', name: 'snappy', version: '0.4') api(group: 'org.jgroups', name: 'jgroups', version: get('jgroups.version')) - api(group: 'org.mockito', name: 'mockito-core', version: '2.23.0') + api(group: 'org.mockito', name: 'mockito-core', version: '3.3.3') api(group: 'org.mortbay.jetty', name: 'servlet-api', version: '3.0.20100224') api(group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.23') api(group: 'org.postgresql', name: 'postgresql', version: '42.2.8') diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java index 51dcfd1..aad2f0d 100644 --- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java +++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java @@ -20,7 +20,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.ArrayList; @@ -65,7 +65,7 @@ public class JdbcAsyncWriterTest { public void doesNothingIfEventListIsEmpty() { writer.processEvents(Collections.emptyList()); - verifyZeroInteractions(sqlHandler); + verifyNoMoreInteractions(sqlHandler); assertThat(writer.getSuccessfulEvents()).isZero(); assertThat(writer.getTotalEvents()).isZero(); } diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java index 7cd3186..a889561 100644 --- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java +++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java @@ -21,7 +21,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.junit.Before; @@ -133,7 +133,7 @@ public class JdbcWriterTest { public void beforeRegionDestroyDoesNotWriteToSqlHandler() { writer.beforeRegionDestroy(mock(RegionEvent.class)); - verifyZeroInteractions(sqlHandler); + verifyNoMoreInteractions(sqlHandler); } @SuppressWarnings("unchecked") @@ -141,6 +141,6 @@ public class JdbcWriterTest { public void beforeRegionClearDoesNotWriteToSqlHandler() { writer.beforeRegionClear(mock(RegionEvent.class)); - verifyZeroInteractions(sqlHandler); + verifyNoMoreInteractions(sqlHandler); } } diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java index efb9230..32ba65b 100644 --- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java +++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java @@ -30,7 +30,7 @@ import static org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorService import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.Stack; @@ -147,6 +147,6 @@ public class ElementTypeTest { ElementType.FIELD_MAPPING.endElement(stack); assertThat(stack.size()).isEqualTo(1); - verifyZeroInteractions(mapping); + verifyNoMoreInteractions(mapping); } } diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParserTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParserTest.java index b3db7ae..ec8726c 100644 --- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParserTest.java +++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParserTest.java @@ -18,7 +18,7 @@ import static org.apache.geode.connectors.jdbc.internal.xml.ElementType.JDBC_MAP import static org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.NAMESPACE; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.Stack; @@ -87,7 +87,7 @@ public class JdbcConnectorServiceXmlParserTest { parser.endElement(NAMESPACE, JDBC_MAPPING.getTypeName(), null); assertThat(stack.pop()).isEqualTo(regionCreation); - verifyZeroInteractions(regionMapping); + verifyNoMoreInteractions(regionMapping); } @Test @@ -101,6 +101,6 @@ public class JdbcConnectorServiceXmlParserTest { parser.endElement("wrongNamespace", JDBC_MAPPING.getTypeName(), null); assertThat(stack.pop()).isEqualTo(regionMapping); - verifyZeroInteractions(regionMapping); + verifyNoMoreInteractions(regionMapping); } } diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java index 888c404..f23303d 100644 --- a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java +++ b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java @@ -39,7 +39,7 @@ import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import java.io.Serializable; import java.util.ArrayList; @@ -198,7 +198,7 @@ public class DistributedSystemMXBeanWithAlertsDistributedTest implements Seriali }); managerVM.invoke(() -> { - verifyZeroInteractions(notificationListener); + verifyNoMoreInteractions(notificationListener); }); } @@ -245,7 +245,7 @@ public class DistributedSystemMXBeanWithAlertsDistributedTest implements Seriali }); managerVM.invoke(() -> { - verifyZeroInteractions(notificationListener); + verifyNoMoreInteractions(notificationListener); }); } @@ -333,7 +333,7 @@ public class DistributedSystemMXBeanWithAlertsDistributedTest implements Seriali } managerVM.invoke(() -> { - verifyZeroInteractions(notificationListener); + verifyNoMoreInteractions(notificationListener); }); } @@ -363,7 +363,7 @@ public class DistributedSystemMXBeanWithAlertsDistributedTest implements Seriali // managerVM should have missed the alerts from BEFORE it started managerVM.invoke(() -> { - verifyZeroInteractions(notificationListener); + verifyNoMoreInteractions(notificationListener); }); // managerVM should now receive any new alerts though diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/QueueManagerJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/QueueManagerJUnitTest.java index 1653081..a3e6112 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/QueueManagerJUnitTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/QueueManagerJUnitTest.java @@ -753,11 +753,26 @@ public class QueueManagerJUnitTest { } @Override + public long getBirthDate() { + return 0; + } + + @Override + public void setBirthDate(long ts) { + + } + + @Override public ConnectionStats getStats() { return null; } @Override + public boolean isActive() { + return false; + } + + @Override public boolean isDestroyed() { return false; } diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerConcurrentTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerConcurrentTest.java index de86b96..97f6501 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerConcurrentTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerConcurrentTest.java @@ -12,26 +12,35 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ - package org.apache.geode.cache.client.internal.pooling; import static org.apache.geode.test.concurrency.Utilities.availableProcessors; import static org.apache.geode.test.concurrency.Utilities.repeat; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutionException; import org.junit.Test; import org.junit.runner.RunWith; +import org.apache.geode.cache.client.internal.Connection; +import org.apache.geode.cache.client.internal.ConnectionStats; +import org.apache.geode.cache.client.internal.Endpoint; +import org.apache.geode.cache.client.internal.Op; +import org.apache.geode.distributed.internal.ServerLocation; +import org.apache.geode.internal.cache.tier.sockets.ServerQueueStatus; import org.apache.geode.test.concurrency.ConcurrentTestRunner; import org.apache.geode.test.concurrency.ParallelExecutor; @RunWith(ConcurrentTestRunner.class) public class AvailableConnectionManagerConcurrentTest { + private final int parallelCount = availableProcessors(); private final int iterationCount = 250; private final AvailableConnectionManager instance = new AvailableConnectionManager(); @@ -43,7 +52,7 @@ public class AvailableConnectionManagerConcurrentTest { executor.inParallel(() -> { repeat(() -> { - PooledConnection used = instance.useFirst(); + Connection used = instance.useFirst(); instance.addFirst(used, true); }, iterationCount); }, parallelCount); @@ -59,7 +68,7 @@ public class AvailableConnectionManagerConcurrentTest { executor.inParallel(() -> { repeat(() -> { - PooledConnection used = instance.useFirst(c -> true); + Connection used = instance.useFirst(c -> true); instance.addFirst(used, true); }, iterationCount); }, parallelCount); @@ -75,7 +84,7 @@ public class AvailableConnectionManagerConcurrentTest { executor.inParallel(() -> { repeat(() -> { - PooledConnection used = instance.useFirst(); + Connection used = instance.useFirst(); instance.addLast(used, true); }, iterationCount); }, parallelCount); @@ -94,7 +103,7 @@ public class AvailableConnectionManagerConcurrentTest { executor.inParallel(() -> { repeat(() -> { - PooledConnection used = instance.useFirst(); + Connection used = instance.useFirst(); if (used != null) { Thread.yield(); instance.addFirst(used, true); @@ -116,7 +125,7 @@ public class AvailableConnectionManagerConcurrentTest { executor.inParallel(() -> { repeat(() -> { - PooledConnection used = instance.useFirst(c -> true); + Connection used = instance.useFirst(c -> true); if (used != null) { Thread.yield(); instance.addFirst(used, true); @@ -137,14 +146,13 @@ public class AvailableConnectionManagerConcurrentTest { repeat(() -> instance.addFirst(createConnection(), false), connectionCount); // now add a bunch of connections that will not match the predicate repeat(() -> { - PooledConnection nonMatchingConnection = createConnection(); - when(nonMatchingConnection.getBirthDate()).thenReturn(1L); + Connection nonMatchingConnection = createConnection(1); instance.addFirst(nonMatchingConnection, false); }, connectionCount); executor.inParallel(() -> { repeat(() -> { - PooledConnection used = instance.useFirst(c -> c.getBirthDate() == 0L); + Connection used = instance.useFirst(c -> c.getBirthDate() == 0L); if (used != null) { Thread.yield(); assertThat(used.getBirthDate()).isEqualTo(0L); @@ -161,16 +169,16 @@ public class AvailableConnectionManagerConcurrentTest { public void addLastRemoveDoesNotRemoveOtherConnections(ParallelExecutor executor) throws ExecutionException, InterruptedException { int originalCount = 7; - ArrayList<PooledConnection> originalConnections = new ArrayList<>(); + List<Connection> originalConnections = new ArrayList<>(); repeat(() -> { - PooledConnection original = createConnection(); + Connection original = createConnection(); originalConnections.add(original); instance.addFirst(original, false); }, originalCount); executor.inParallel(() -> { repeat(() -> { - PooledConnection removed = createConnection(); + Connection removed = createConnection(); instance.addLast(removed, true); assertThat(instance.remove(removed)).isTrue(); }, iterationCount); @@ -180,10 +188,116 @@ public class AvailableConnectionManagerConcurrentTest { assertThat(instance.getDeque()).containsExactlyInAnyOrderElementsOf(originalConnections); } - private PooledConnection createConnection() { - PooledConnection result = mock(PooledConnection.class); - when(result.activate()).thenReturn(true); - when(result.isActive()).thenReturn(true); - return result; + private Connection createConnection() { + return createConnection(0); + } + + private Connection createConnection(long birthDate) { + return new Connection() { + @Override + public Socket getSocket() { + return null; + } + + @Override + public long getBirthDate() { + return birthDate; + } + + @Override + public void setBirthDate(long ts) { + // nothing + } + + @Override + public ByteBuffer getCommBuffer() { + return null; + } + + @Override + public ConnectionStats getStats() { + return null; + } + + @Override + public boolean isActive() { + return true; + } + + @Override + public void destroy() { + // nothing + } + + @Override + public boolean isDestroyed() { + return false; + } + + @Override + public void close(boolean keepAlive) { + // nothing + } + + @Override + public ServerLocation getServer() { + return null; + } + + @Override + public Endpoint getEndpoint() { + return null; + } + + @Override + public ServerQueueStatus getQueueStatus() { + return null; + } + + @Override + public Object execute(Op op) { + return null; + } + + @Override + public void emergencyClose() { + // nothing + } + + @Override + public short getWanSiteVersion() { + return 0; + } + + @Override + public void setWanSiteVersion(short wanSiteVersion) { + // nothing + } + + @Override + public int getDistributedSystemId() { + return 0; + } + + @Override + public OutputStream getOutputStream() { + return null; + } + + @Override + public InputStream getInputStream() { + return null; + } + + @Override + public void setConnectionID(long id) { + // nothing + } + + @Override + public long getConnectionID() { + return 0; + } + }; } } diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java index 4e00589..87eda46 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java @@ -987,11 +987,26 @@ public class ConnectionManagerJUnitTest { } @Override + public long getBirthDate() { + return 0; + } + + @Override + public void setBirthDate(long ts) { + + } + + @Override public ConnectionStats getStats() { return null; } @Override + public boolean isActive() { + return false; + } + + @Override public void close(boolean keepAlive) throws Exception { synchronized (DummyFactory.this) { closes++; diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/CacheDistributionAdvisorConcurrentTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/CacheDistributionAdvisorConcurrentTest.java index d2367a1..fb38993 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/CacheDistributionAdvisorConcurrentTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/CacheDistributionAdvisorConcurrentTest.java @@ -14,18 +14,21 @@ */ package org.apache.geode.internal.cache; - +import static org.apache.geode.internal.inet.LocalHostUtil.getLocalHost; import static org.apache.geode.test.concurrency.Utilities.availableProcessors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; -import java.net.InetAddress; import java.net.UnknownHostException; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.apache.geode.CancelCriterion; import org.apache.geode.cache.Operation; @@ -36,11 +39,14 @@ import org.apache.geode.internal.cache.CacheDistributionAdvisor.CacheProfile; import org.apache.geode.test.concurrency.ConcurrentTestRunner; import org.apache.geode.test.concurrency.ParallelExecutor; - @RunWith(ConcurrentTestRunner.class) public class CacheDistributionAdvisorConcurrentTest { + private final int count = availableProcessors() * 2; + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + @Test public void getAdviseAllEventsOrCachedForConcurrentUpdateShouldSucceed( ParallelExecutor executor) throws Exception { @@ -87,17 +93,24 @@ public class CacheDistributionAdvisorConcurrentTest { CacheDistributionAdvisee advisee = mock(CacheDistributionAdvisee.class); CancelCriterion cancelCriterion = mock(CancelCriterion.class); when(advisee.getCancelCriterion()).thenReturn(cancelCriterion); + DistributionManager distributionManager = mock(DistributionManager.class); when(advisee.getDistributionManager()).thenReturn(distributionManager); + CacheDistributionAdvisor result = CacheDistributionAdvisor.createCacheDistributionAdvisor(advisee); when(advisee.getDistributionAdvisor()).thenReturn(result); + return result; } private CacheProfile createCacheProfile() throws UnknownHostException { InternalDistributedMember member = - new InternalDistributedMember(InetAddress.getLocalHost(), 0, false, false); + new InternalDistributedMember(getLocalHost(), 0, false, false); return new CacheProfile(member, 1); } + + private static <T> T mock(Class<T> classToMock) { + return Mockito.mock(classToMock, withSettings().stubOnly()); + } } diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueIntegrationTest.java index e9d8fd8..4778608 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueIntegrationTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueIntegrationTest.java @@ -14,43 +14,41 @@ */ package org.apache.geode.internal.cache.ha; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT; import static org.apache.geode.test.awaitility.GeodeAwaitility.await; +import static org.apache.geode.test.awaitility.GeodeAwaitility.getTimeout; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; +import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Queue; import java.util.Set; -import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; -import org.awaitility.core.ConditionTimeoutException; import org.junit.After; -import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import util.TestException; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.quality.Strictness; import org.apache.geode.CancelCriterion; import org.apache.geode.cache.AttributesFactory; -import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.DataPolicy; import org.apache.geode.cache.EvictionAction; @@ -63,7 +61,6 @@ import org.apache.geode.internal.cache.CacheServerImpl; import org.apache.geode.internal.cache.CachedDeserializable; import org.apache.geode.internal.cache.EnumListenerEvent; import org.apache.geode.internal.cache.EventID; -import org.apache.geode.internal.cache.GemFireCacheImpl; import org.apache.geode.internal.cache.HARegion; import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.cache.InternalRegionArguments; @@ -81,22 +78,28 @@ import org.apache.geode.internal.serialization.Version; import org.apache.geode.internal.statistics.StatisticsClock; import org.apache.geode.internal.util.BlobHelper; import org.apache.geode.internal.util.concurrent.StoppableReentrantReadWriteLock; +import org.apache.geode.internal.util.concurrent.StoppableReentrantReadWriteLock.StoppableReadLock; +import org.apache.geode.internal.util.concurrent.StoppableReentrantReadWriteLock.StoppableWriteLock; +import org.apache.geode.test.junit.rules.ExecutorServiceRule; public class HARegionQueueIntegrationTest { - private Cache cache; + private static final int NUM_QUEUES = 100; + private static final EvictionAttributes OVERFLOW_TO_DISK = + EvictionAttributes.createLIFOEntryAttributes(1000, EvictionAction.OVERFLOW_TO_DISK); + private InternalCache cache; private Region dataRegion; - private CacheClientNotifier ccn; - private InternalDistributedMember member; - private static final int NUM_QUEUES = 100; + @Rule + public ExecutorServiceRule executorServiceRule = new ExecutorServiceRule(); + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(Strictness.LENIENT); @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); cache = createCache(); dataRegion = createDataRegion(); ccn = createCacheClientNotifier(); @@ -109,30 +112,6 @@ public class HARegionQueueIntegrationTest { cache.close(); } - private Cache createCache() { - return new CacheFactory().set(MCAST_PORT, "0").create(); - } - - private Region createDataRegion() { - return cache.createRegionFactory(RegionShortcut.REPLICATE).create("data"); - } - - private CacheClientNotifier createCacheClientNotifier() { - CacheClientNotifier ccn = - CacheClientNotifier.getInstance((InternalCache) cache, - mock(ClientRegistrationEventQueueManager.class), mock(StatisticsClock.class), - mock(CacheServerStats.class), 100000, 100000, mock(ConnectionListener.class), null, - false); - return ccn; - } - - private InternalDistributedMember createMember() { - // Create an InternalDistributedMember - InternalDistributedMember member = mock(InternalDistributedMember.class); - when(member.getVersionObject()).thenReturn(Version.CURRENT); - return member; - } - @Test public void verifyEndGiiQueueingEmptiesQueueAndHAContainer() throws Exception { HAContainerWrapper haContainerWrapper = (HAContainerWrapper) ccn.getHaContainer(); @@ -148,19 +127,19 @@ public class HARegionQueueIntegrationTest { // Create and update HARegionQueues forcing one queue to startGiiQueueing int numQueues = 10; HARegionQueue targetQueue = createAndUpdateHARegionQueuesWithGiiQueueing(haContainerWrapper, - wrapper, message, numQueues); + wrapper, numQueues); // Verify HAContainerWrapper (1) and refCount (numQueues(10)) - assertEquals(1, haContainerWrapper.size()); + assertThat(haContainerWrapper).hasSize(1); HAEventWrapper wrapperInContainer = (HAEventWrapper) haContainerWrapper.getKey(wrapper); - assertEquals(numQueues - 1, wrapperInContainer.getReferenceCount()); - assertTrue(wrapperInContainer.getPutInProgress()); + assertThat(wrapperInContainer.getReferenceCount()).isEqualTo(numQueues - 1); + assertThat(wrapperInContainer.getPutInProgress()).isTrue(); // Verify that the HAEventWrapper in the giiQueue now has msg != null // We don't null this out while putInProgress > 0 (true) Queue giiQueue = targetQueue.getGiiQueue(); - assertEquals(1, giiQueue.size()); + assertThat(giiQueue).hasSize(1); // Simulate that we have iterated through all interested proxies // and are now decrementing the PutInProgressCounter @@ -173,14 +152,14 @@ public class HARegionQueueIntegrationTest { } HAEventWrapper giiQueueEntry = (HAEventWrapper) giiQueue.peek(); - assertNotNull(giiQueueEntry); - assertNotNull(giiQueueEntry.getClientUpdateMessage()); + assertThat(giiQueueEntry).isNotNull(); + assertThat(giiQueueEntry.getClientUpdateMessage()).isNotNull(); // endGiiQueueing and verify queue and HAContainer are empty targetQueue.endGiiQueueing(); - assertEquals(0, giiQueue.size()); - Assert.assertEquals("Expected HAContainer to be empty", 0, haContainerWrapper.size()); + assertThat(giiQueue).isEmpty(); + assertThat(haContainerWrapper).isEmpty(); } @Test @@ -242,19 +221,18 @@ public class HARegionQueueIntegrationTest { @Test public void verifySimultaneousPutHAEventWrapperWithRegion() throws Exception { HAContainerWrapper haContainerWrapper = createHAContainerRegion(); - - final int numQueues = 30; - final int numOperations = 1000; + int numQueues = 30; + int numOperations = 1000; Set<HAEventWrapper> haEventWrappersToValidate = - createAndPutHARegionQueuesSimulataneously(haContainerWrapper, numQueues, numOperations); + createAndPutHARegionQueuesSimultaneously(haContainerWrapper, numQueues, numOperations); - assertEquals(numOperations, haContainerWrapper.size()); + assertThat(haContainerWrapper).hasSize(numOperations); for (HAEventWrapper haEventWrapperToValidate : haEventWrappersToValidate) { HAEventWrapper wrapperInContainer = (HAEventWrapper) haContainerWrapper.getKey(haEventWrapperToValidate); - assertEquals(numQueues, wrapperInContainer.getReferenceCount()); + assertThat(wrapperInContainer.getReferenceCount()).isEqualTo(numQueues); } } @@ -268,33 +246,32 @@ public class HARegionQueueIntegrationTest { HAEventWrapper haEventWrapper = new HAEventWrapper(message); haEventWrapper.setHAContainer(haContainerWrapper); - final int numQueues = 10; + int numQueues = 10; createAndPutHARegionQueuesSequentially(haContainerWrapper, haEventWrapper, numQueues); - assertEquals(1, haContainerWrapper.size()); + assertThat(haContainerWrapper).hasSize(1); HAEventWrapper wrapperInContainer = (HAEventWrapper) haContainerWrapper.getKey(haEventWrapper); - assertEquals(numQueues, wrapperInContainer.getReferenceCount()); + assertThat(wrapperInContainer.getReferenceCount()).isEqualTo(numQueues); } @Test public void verifySimultaneousPutHAEventWrapperWithMap() throws Exception { HAContainerWrapper haContainerWrapper = (HAContainerWrapper) ccn.getHaContainer(); - - final int numQueues = 30; - final int numOperations = 1000; + int numQueues = 30; + int numOperations = 1000; Set<HAEventWrapper> haEventWrappersToValidate = - createAndPutHARegionQueuesSimulataneously(haContainerWrapper, numQueues, numOperations); + createAndPutHARegionQueuesSimultaneously(haContainerWrapper, numQueues, numOperations); - assertEquals(numOperations, haContainerWrapper.size()); + assertThat(haContainerWrapper).hasSize(numOperations); for (HAEventWrapper haEventWrapperToValidate : haEventWrappersToValidate) { HAEventWrapper wrapperInContainer = (HAEventWrapper) haContainerWrapper.getKey(haEventWrapperToValidate); - assertEquals(numQueues, wrapperInContainer.getReferenceCount()); + assertThat(wrapperInContainer.getReferenceCount()).isEqualTo(numQueues); } } @@ -308,14 +285,15 @@ public class HARegionQueueIntegrationTest { HAEventWrapper haEventWrapper = new HAEventWrapper(message); haEventWrapper.setHAContainer(haContainerWrapper); - final int numQueues = 10; + int numQueues = 10; + createAndPutHARegionQueuesSequentially(haContainerWrapper, haEventWrapper, numQueues); - assertEquals(1, haContainerWrapper.size()); + assertThat(haContainerWrapper).hasSize(1); HAEventWrapper wrapperInContainer = (HAEventWrapper) haContainerWrapper.getKey(haEventWrapper); - assertEquals(numQueues, wrapperInContainer.getReferenceCount()); + assertThat(wrapperInContainer.getReferenceCount()).isEqualTo(numQueues); } @Test @@ -323,20 +301,13 @@ public class HARegionQueueIntegrationTest { HAContainerWrapper haContainerWrapper = (HAContainerWrapper) ccn.getHaContainer(); List<HARegionQueue> regionQueues = new ArrayList<>(); - for (int i = 0; i < 2; ++i) { HARegion haRegion = createMockHARegion(); regionQueues.add(createHARegionQueue(haContainerWrapper, i, haRegion, false)); } - ExecutorService service = Executors.newFixedThreadPool(2); - - List<Callable<Object>> callables = new ArrayList<>(); - for (int i = 0; i < 10000; ++i) { - callables.clear(); - EventID eventID = new EventID(new byte[] {1}, 1, i); ClientUpdateMessage message = new ClientUpdateMessageImpl(EnumListenerEvent.AFTER_UPDATE, @@ -353,52 +324,37 @@ public class HARegionQueueIntegrationTest { wrapper.decrementPutInProgressCounter(); + List<Future<Void>> futures = new ArrayList<>(); for (HARegionQueue queue : regionQueues) { - callables.add(Executors.callable(() -> { - try { - queue.peek(); - queue.remove(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + futures.add(executorServiceRule.submit(() -> { + queue.peek(); + queue.remove(); })); - callables.add(Executors.callable(() -> { - try { - queue.removeDispatchedEvents(eventID); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + futures.add(executorServiceRule.submit(() -> { + queue.removeDispatchedEvents(eventID); })); } - // invokeAll() will wait until our two callables have completed - List<Future<Object>> futures = service.invokeAll(callables, 10, TimeUnit.SECONDS); - - for (Future<Object> future : futures) { - try { - future.get(); - } catch (Exception ex) { - throw new TestException( - "Exception thrown while executing regionQueue methods concurrently on iteration: " - + i, - ex); - } + for (Future<Void> future : futures) { + future.get(getTimeout().toMillis(), MILLISECONDS); } } } @Test public void verifyPutEntryConditionallyInHAContainerNoOverwrite() throws Exception { - HAContainerWrapper haContainerWrapper = new HAContainerMap(new ConcurrentHashMap()); - // create message and HAEventWrapper EventID eventID = new EventID(cache.getDistributedSystem()); + ClientUpdateMessage oldMessage = new ClientUpdateMessageImpl(EnumListenerEvent.AFTER_UPDATE, (LocalRegion) dataRegion, "key", "value".getBytes(), (byte) 0x01, null, new ClientProxyMembershipID(), eventID); + HAEventWrapper originalWrapperInstance = new HAEventWrapper(oldMessage); originalWrapperInstance.incrementPutInProgressCounter("test"); + + HAContainerWrapper haContainerWrapper = new HAContainerMap(new ConcurrentHashMap()); originalWrapperInstance.setHAContainer(haContainerWrapper); HARegionQueue haRegionQueue = createHARegionQueue(haContainerWrapper, 0); @@ -412,6 +368,7 @@ public class HARegionQueueIntegrationTest { ClientUpdateMessage newMessage = new ClientUpdateMessageImpl(EnumListenerEvent.AFTER_UPDATE, (LocalRegion) dataRegion, "key", "value".getBytes(), (byte) 0x01, null, new ClientProxyMembershipID(), eventID); + HAEventWrapper newWrapperInstance = new HAEventWrapper(newMessage); newWrapperInstance.incrementPutInProgressCounter("test"); newWrapperInstance.setHAContainer(haContainerWrapper); @@ -422,215 +379,211 @@ public class HARegionQueueIntegrationTest { // and that it increments the ref count on the container key. haRegionQueue.putEventInHARegion(originalWrapperInstance, 1L); - Assert.assertEquals("Original message overwrote new message in container", - haContainerWrapper.get(originalWrapperInstance), - newWrapperInstance.getClientUpdateMessage()); - Assert.assertEquals("Reference count was not the expected value", 2, - newWrapperInstance.getReferenceCount()); - Assert.assertEquals("Container size was not the expected value", haContainerWrapper.size(), 1); + assertThat(newWrapperInstance.getClientUpdateMessage()) + .withFailMessage("Original message overwrote new message in container") + .isEqualTo(haContainerWrapper.get(originalWrapperInstance)); + + assertThat(newWrapperInstance.getReferenceCount()) + .withFailMessage("Reference count was not the expected value") + .isEqualTo(2); + + assertThat(haContainerWrapper) + .withFailMessage("Container size was not the expected value") + .hasSize(1); } @Test public void removeDispatchedEventsViaQRMAndDestroyQueueSimultaneouslySingleDecrement() throws Exception { HAContainerWrapper haContainerWrapper = new HAContainerMap(new ConcurrentHashMap()); - HARegion haRegion = createMockHARegion(); HARegionQueue haRegionQueue = createHARegionQueue(haContainerWrapper, 0, haRegion, false); - EventID eventID = new EventID(cache.getDistributedSystem()); + ClientUpdateMessage clientUpdateMessage = new ClientUpdateMessageImpl(EnumListenerEvent.AFTER_UPDATE, (LocalRegion) dataRegion, "key", "value".getBytes(), (byte) 0x01, null, new ClientProxyMembershipID(), eventID); + HAEventWrapper haEventWrapper = new HAEventWrapper(clientUpdateMessage); haEventWrapper.incrementPutInProgressCounter("test"); haEventWrapper.setHAContainer(haContainerWrapper); haRegionQueue.put(haEventWrapper); - ExecutorService service = Executors.newFixedThreadPool(2); - - List<Callable<Object>> callables = new ArrayList<>(); + List<Future<Void>> futures = new ArrayList<>(); // In one thread, simulate processing a queue removal message // by removing the dispatched event - callables.add(Executors.callable(() -> { - try { - haRegionQueue.removeDispatchedEvents(eventID); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + futures.add(executorServiceRule.submit(() -> { + haRegionQueue.removeDispatchedEvents(eventID); })); // In another thread, simulate that the region is being destroyed, for instance // when a SocketTimeoutException is thrown and we are cleaning up - callables.add(Executors.callable(() -> { - try { - haRegionQueue.destroy(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + futures.add(executorServiceRule.submit(() -> { + haRegionQueue.destroy(); })); - List<Future<Object>> futures = service.invokeAll(callables, 10, TimeUnit.SECONDS); - - for (Future<Object> future : futures) { - try { - future.get(); - } catch (Exception ex) { - throw new TestException( - "Exception thrown while executing queue removal and destroy region queue logic concurrently.", - ex); - } + for (Future<Void> future : futures) { + future.get(); } - try { - await().until(() -> haEventWrapper.getReferenceCount() == 0); - } catch (ConditionTimeoutException conditionTimeoutException) { - throw new TestException( - "Expected HAEventWrapper reference count to be decremented to 0 by either the queue removal or destroy queue logic, but the actual reference count was " - + haEventWrapper.getReferenceCount()); - } + await().untilAsserted(() -> { + assertThat(haEventWrapper.getReferenceCount()) + .withFailMessage( + "Expected HAEventWrapper reference count to be decremented to 0 by either the queue removal or destroy queue logic") + .isZero(); + }); } @Test public void removeDispatchedEventsViaMessageDispatcherAndDestroyQueueSimultaneouslySingleDecrement() throws Exception { HAContainerWrapper haContainerWrapper = new HAContainerMap(new ConcurrentHashMap()); - HARegion haRegion = createMockHARegion(); HARegionQueue haRegionQueue = createHARegionQueue(haContainerWrapper, 0, haRegion, false); - EventID eventID = new EventID(cache.getDistributedSystem()); + ClientUpdateMessage clientUpdateMessage = new ClientUpdateMessageImpl(EnumListenerEvent.AFTER_UPDATE, (LocalRegion) dataRegion, "key", "value".getBytes(), (byte) 0x01, null, new ClientProxyMembershipID(), eventID); + HAEventWrapper haEventWrapper = new HAEventWrapper(clientUpdateMessage); haEventWrapper.incrementPutInProgressCounter("test"); haEventWrapper.setHAContainer(haContainerWrapper); haRegionQueue.put(haEventWrapper); - ExecutorService service = Executors.newFixedThreadPool(2); - - List<Callable<Object>> callables = new ArrayList<>(); + List<Future<Void>> futures = new ArrayList<>(); // In one thread, simulate processing a queue removal message // by removing the dispatched event - callables.add(Executors.callable(() -> { - try { - // Simulate dispatching a message by peeking and removing the HAEventWrapper - haRegionQueue.peek(); - haRegionQueue.remove(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + futures.add(executorServiceRule.submit(() -> { + // Simulate dispatching a message by peeking and removing the HAEventWrapper + haRegionQueue.peek(); + haRegionQueue.remove(); })); // In another thread, simulate that the region is being destroyed, for instance // when a SocketTimeoutException is thrown and we are cleaning up - callables.add(Executors.callable(() -> { - try { - haRegionQueue.destroy(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + futures.add(executorServiceRule.submit(() -> { + haRegionQueue.destroy(); })); - List<Future<Object>> futures = service.invokeAll(callables, 10, TimeUnit.SECONDS); - - for (Future<Object> future : futures) { - try { - future.get(); - } catch (Exception ex) { - throw new TestException( - "Exception thrown while executing message dispatching and destroy region queue logic concurrently.", - ex); - } + for (Future<Void> future : futures) { + future.get(); } - try { - await().until(() -> haEventWrapper.getReferenceCount() == 0); - } catch (ConditionTimeoutException conditionTimeoutException) { - throw new TestException( - "Expected HAEventWrapper reference count to be decremented to 0 by either the message dispatcher or destroy queue logic, but the actual reference count was " - + haEventWrapper.getReferenceCount()); - } + await().untilAsserted(() -> { + assertThat(haEventWrapper.getReferenceCount()) + .withFailMessage( + "Expected HAEventWrapper reference count to be decremented to 0 by either the message dispatcher or destroy queue logic") + .isZero(); + }); } - private HARegion createMockHARegion() { - HARegion haRegion = mock(HARegion.class); - when(haRegion.getGemFireCache()).thenReturn((InternalCache) cache); + private InternalCache createCache() { + return (InternalCache) new CacheFactory().set(MCAST_PORT, "0").create(); + } - ConcurrentHashMap<Object, Object> mockRegion = new ConcurrentHashMap<>(); + private Region createDataRegion() { + return cache.createRegionFactory(RegionShortcut.REPLICATE).create("data"); + } - when(haRegion.put(Mockito.any(Object.class), Mockito.any(Object.class))).then(answer -> { - Object existingValue = mockRegion.put(answer.getArgument(0), answer.getArgument(1)); - return existingValue; - }); + private CacheClientNotifier createCacheClientNotifier() { + CacheClientNotifier ccn = + CacheClientNotifier.getInstance(cache, + mock(ClientRegistrationEventQueueManager.class), + mock(StatisticsClock.class), + mock(CacheServerStats.class), + 100000, + 100000, + mock(ConnectionListener.class), + null, + false); + return ccn; + } - when(haRegion.get(Mockito.any(Object.class))).then(answer -> { - return mockRegion.get(answer.getArgument(0)); - }); + private InternalDistributedMember createMember() { + // Create an InternalDistributedMember + InternalDistributedMember member = mock(InternalDistributedMember.class); + when(member.getVersionObject()).thenReturn(Version.CURRENT); + return member; + } + + private HARegion createMockHARegion() { + HARegion haRegion = mock(HARegion.class); + Map<Object, Object> map = new ConcurrentHashMap<>(); + + when(haRegion.getGemFireCache()) + .thenReturn(cache); + when(haRegion.put(any(Object.class), any(Object.class))) + .then(answer -> map.put(answer.getArgument(0), answer.getArgument(1))); + when(haRegion.get(any(Object.class))) + .then(answer -> map.get(answer.getArgument(0))); doAnswer(answer -> { - mockRegion.remove(answer.getArgument(0)); + map.remove(answer.getArgument(0)); return null; - }).when(haRegion).localDestroy(Mockito.any(Object.class)); + }).when(haRegion).localDestroy(any(Object.class)); + return haRegion; } - private HAContainerRegion createHAContainerRegion() throws Exception { - Region haContainerRegionRegion = createHAContainerRegionRegion(); - - HAContainerRegion haContainerRegion = new HAContainerRegion(haContainerRegionRegion); - - return haContainerRegion; + private HAContainerRegion createHAContainerRegion() throws IOException, ClassNotFoundException { + return new HAContainerRegion(createHAContainerRegionRegion()); } - private Region createHAContainerRegionRegion() throws Exception { - AttributesFactory factory = new AttributesFactory(); - factory.setScope(Scope.LOCAL); + private Region<Object, Object> createHAContainerRegionRegion() + throws IOException, ClassNotFoundException { + String regionName = CacheServerImpl.generateNameForClientMsgsRegion(0); + + AttributesFactory<Object, Object> factory = new AttributesFactory<>(); + factory.setDataPolicy(DataPolicy.NORMAL); factory.setDiskStoreName(null); factory.setDiskSynchronous(true); - factory.setDataPolicy(DataPolicy.NORMAL); + factory.setEvictionAttributes(OVERFLOW_TO_DISK); factory.setStatisticsEnabled(true); - factory.setEvictionAttributes( - EvictionAttributes.createLIFOEntryAttributes(1000, EvictionAction.OVERFLOW_TO_DISK)); - Region region = ((GemFireCacheImpl) cache).createVMRegion( - CacheServerImpl.generateNameForClientMsgsRegion(0), factory.create(), - new InternalRegionArguments().setDestroyLockFlag(true).setRecreateFlag(false) - .setSnapshotInputStream(null).setImageTarget(null).setIsUsedForMetaRegion(true)); - return region; + factory.setScope(Scope.LOCAL); + + InternalRegionArguments arguments = new InternalRegionArguments() + .setDestroyLockFlag(true) + .setRecreateFlag(false) + .setSnapshotInputStream(null) + .setImageTarget(null) + .setIsUsedForMetaRegion(true); + + return cache.createVMRegion(regionName, factory.create(), arguments); } private HARegionQueue createHARegionQueue(Map haContainer, int index, HARegion haRegion, - boolean puttingGIIDataInQueue) throws Exception { + boolean puttingGIIDataInQueue) + throws InterruptedException, IOException, ClassNotFoundException { StoppableReentrantReadWriteLock giiLock = mock(StoppableReentrantReadWriteLock.class); - doReturn(mock(StoppableReentrantReadWriteLock.StoppableWriteLock.class)).when(giiLock) - .writeLock(); - doReturn(mock(StoppableReentrantReadWriteLock.StoppableReadLock.class)).when(giiLock) - .readLock(); - StoppableReentrantReadWriteLock rwLock = new StoppableReentrantReadWriteLock(cache.getCancelCriterion()); - return new HARegionQueue("haRegion+" + index, haRegion, (InternalCache) cache, haContainer, + when(giiLock.writeLock()).thenReturn(mock(StoppableWriteLock.class)); + when(giiLock.readLock()).thenReturn(mock(StoppableReadLock.class)); + + return new HARegionQueue("haRegion+" + index, haRegion, cache, haContainer, null, (byte) 1, true, mock(HARegionQueueStats.class), giiLock, rwLock, mock(CancelCriterion.class), puttingGIIDataInQueue, mock(StatisticsClock.class)); } - private HARegionQueue createHARegionQueue(Map haContainer, int index) throws Exception { + private HARegionQueue createHARegionQueue(Map haContainer, int index) + throws InterruptedException, IOException, ClassNotFoundException { HARegion haRegion = mock(HARegion.class); - when(haRegion.getGemFireCache()).thenReturn((InternalCache) cache); + + when(haRegion.getGemFireCache()).thenReturn(cache); return createHARegionQueue(haContainer, index, haRegion, false); } private CachedDeserializable createCachedDeserializable(HAContainerWrapper haContainerWrapper) - throws Exception { + throws IOException { // Create ClientUpdateMessage and HAEventWrapper ClientUpdateMessage message = new ClientUpdateMessageImpl(EnumListenerEvent.AFTER_UPDATE, (LocalRegion) dataRegion, "key", "value".getBytes(), (byte) 0x01, null, @@ -644,12 +597,13 @@ public class HARegionQueueIntegrationTest { byte[] wrapperBytes = BlobHelper.serializeToBlob(wrapper); CachedDeserializable cd = new VMCachedDeserializable(wrapperBytes); haContainerWrapper.remove(wrapper); - assertThat(haContainerWrapper.size()).isEqualTo(0); + assertThat(haContainerWrapper).isEmpty(); return cd; } private void createAndUpdateHARegionQueuesSequentially(HAContainerWrapper haContainerWrapper, - CachedDeserializable cd, int numQueues) throws Exception { + CachedDeserializable cd, int numQueues) + throws InterruptedException, IOException, ClassNotFoundException { // Create some HARegionQueues for (int i = 0; i < numQueues; i++) { HARegionQueue haRegionQueue = createHARegionQueue(haContainerWrapper, i); @@ -658,9 +612,8 @@ public class HARegionQueueIntegrationTest { } private HARegionQueue createAndUpdateHARegionQueuesWithGiiQueueing( - HAContainerWrapper haContainerWrapper, HAEventWrapper wrapper, ClientUpdateMessage message, - int numQueues) throws Exception { - + HAContainerWrapper haContainerWrapper, HAEventWrapper wrapper, int numQueues) + throws InterruptedException, IOException, ClassNotFoundException { HARegionQueue targetQueue = null; int startGiiQueueingIndex = numQueues / 2; @@ -672,24 +625,23 @@ public class HARegionQueueIntegrationTest { if (i == startGiiQueueingIndex) { HARegion haRegion = mock(HARegion.class); - final HARegionQueue giiHaRegionQueue = + HARegionQueue giiHaRegionQueue = createHARegionQueue(haContainerWrapper, i, haRegion, false);; giiHaRegionQueue.startGiiQueueing(); targetQueue = giiHaRegionQueue; - when(haRegion.put(Mockito.any(Object.class), Mockito.any(HAEventWrapper.class))) + when(haRegion.put(any(Object.class), any(HAEventWrapper.class))) .then(answer -> { // Simulate that either a QRM or message dispatch has occurred immediately after the // put. // We want to ensure that the event is removed from the HAContainer if it is drained - // from the giiQueue - // and the ref count has dropped to 0. + // from the giiQueue and the ref count has dropped to 0. HAEventWrapper haContainerKey = answer.getArgument(1); giiHaRegionQueue.decAndRemoveFromHAContainer(haContainerKey); return null; }); - when(haRegion.getGemFireCache()).thenReturn((InternalCache) cache); + when(haRegion.getGemFireCache()).thenReturn(cache); haRegionQueue = giiHaRegionQueue; } else { @@ -702,17 +654,18 @@ public class HARegionQueueIntegrationTest { return targetQueue; } - private Set<HAEventWrapper> createAndPutHARegionQueuesSimulataneously( - HAContainerWrapper haContainerWrapper, int numQueues, int numOperations) throws Exception { - ConcurrentLinkedQueue<HARegionQueue> queues = new ConcurrentLinkedQueue<>(); - final Set<HAEventWrapper> testValidationWrapperSet = ConcurrentHashMap.newKeySet(); - final AtomicInteger count = new AtomicInteger(); + private Set<HAEventWrapper> createAndPutHARegionQueuesSimultaneously( + HAContainerWrapper haContainerWrapper, int numQueues, int numOperations) + throws InterruptedException, IOException, ClassNotFoundException { + Collection<HARegionQueue> queues = new ConcurrentLinkedQueue<>(); + AtomicInteger count = new AtomicInteger(); - // create HARegionQueuesv + // create HARegionQueues for (int i = 0; i < numQueues; i++) { queues.add(createHARegionQueue(haContainerWrapper, i)); } + Set<HAEventWrapper> testValidationWrapperSet = ConcurrentHashMap.newKeySet(); for (int i = 0; i < numOperations; i++) { count.set(i); @@ -740,8 +693,9 @@ public class HARegionQueueIntegrationTest { } private void createAndPutHARegionQueuesSequentially(HAContainerWrapper haContainerWrapper, - HAEventWrapper haEventWrapper, int numQueues) throws Exception { - ArrayList<HARegionQueue> queues = new ArrayList<>(); + HAEventWrapper haEventWrapper, int numQueues) + throws InterruptedException, IOException, ClassNotFoundException { + Collection<HARegionQueue> queues = new ArrayList<>(); // create HARegionQueues for (int i = 0; i < numQueues; i++) { @@ -758,7 +712,9 @@ public class HARegionQueueIntegrationTest { } private void createAndUpdateHARegionQueuesSimultaneously(HAContainerWrapper haContainerWrapper, - CachedDeserializable cd, int numQueues) throws Exception { + CachedDeserializable cd, int numQueues) + throws InterruptedException, IOException, ClassNotFoundException, TimeoutException, + ExecutionException { // Create some HARegionQueues HARegionQueue[] haRegionQueues = new HARegionQueue[numQueues]; for (int i = 0; i < numQueues; i++) { @@ -766,34 +722,30 @@ public class HARegionQueueIntegrationTest { } // Create threads to simultaneously update the HAEventWrapper - int j = 0; - Thread[] threads = new Thread[numQueues]; + Collection<Future<Void>> futures = new ArrayList<>(); for (HARegionQueue haRegionQueue : haRegionQueues) { - threads[j] = new Thread(() -> { + futures.add(executorServiceRule.submit(() -> { haRegionQueue.updateHAEventWrapper(member, cd, "haRegion"); - }); - j++; + })); } - // Start the threads - for (int i = 0; i < numQueues; i++) { - threads[i].start(); - } - - // Wait for the threads to complete - for (int i = 0; i < numQueues; i++) { - threads[i].join(); + for (Future<Void> future : futures) { + future.get(getTimeout().toMillis(), MILLISECONDS); } } private void verifyHAContainerWrapper(HAContainerWrapper haContainerWrapper, CachedDeserializable cd, int numQueues) { // Verify HAContainerRegion size - assertThat(haContainerWrapper.size()).isEqualTo(1); + assertThat(haContainerWrapper).hasSize(1); // Verify the refCount is correct HAEventWrapper wrapperInContainer = (HAEventWrapper) haContainerWrapper.getKey(cd.getDeserializedForReading()); assertThat(wrapperInContainer.getReferenceCount()).isEqualTo(numQueues); } + + private static <T> T mock(Class<T> classToMock) { + return Mockito.mock(classToMock, withSettings().stubOnly()); + } } diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/process/ControlFileWatchdogIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/process/ControlFileWatchdogIntegrationTest.java index 8cbcfc8..43672a8 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/internal/process/ControlFileWatchdogIntegrationTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/process/ControlFileWatchdogIntegrationTest.java @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import java.io.File; @@ -171,7 +171,7 @@ public class ControlFileWatchdogIntegrationTest { watchdog.start(); // assert - verifyZeroInteractions(requestHandler); // would be prefer to wait some time + verifyNoMoreInteractions(requestHandler); // would be prefer to wait some time } @Test @@ -184,7 +184,7 @@ public class ControlFileWatchdogIntegrationTest { File file = new EmptyFileWriter(requestFile).createNewFile(); // assert - verifyZeroInteractions(requestHandler); // would be prefer to wait some time + verifyNoMoreInteractions(requestHandler); // would be prefer to wait some time assertThat(file).exists(); } diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/Connection.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/Connection.java index 827e02c..dd18301 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/Connection.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/Connection.java @@ -36,10 +36,16 @@ public interface Connection { Socket getSocket(); + long getBirthDate(); + + void setBirthDate(long ts); + ByteBuffer getCommBuffer() throws SocketException; ConnectionStats getStats(); + boolean isActive(); + /** * Forcefully close the resources used by this connection. This should be called if the connection * or the server dies. diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java index aeb6677..bb98f2a 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/ConnectionImpl.java @@ -224,6 +224,16 @@ public class ConnectionImpl implements Connection { } @Override + public long getBirthDate() { + return 0; + } + + @Override + public void setBirthDate(long ts) { + // nothing + } + + @Override public OutputStream getOutputStream() { return out; } @@ -240,6 +250,11 @@ public class ConnectionImpl implements Connection { } @Override + public boolean isActive() { + return false; + } + + @Override public String toString() { return "Connection[" + endpoint + "]@" + hashCode(); } diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/QueueConnectionImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/QueueConnectionImpl.java index e50de27..5253440 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/QueueConnectionImpl.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/QueueConnectionImpl.java @@ -157,6 +157,16 @@ public class QueueConnectionImpl implements Connection { } @Override + public long getBirthDate() { + return 0; + } + + @Override + public void setBirthDate(long ts) { + // nothing + } + + @Override public OutputStream getOutputStream() { return getConnection().getOutputStream(); } @@ -172,6 +182,11 @@ public class QueueConnectionImpl implements Connection { } @Override + public boolean isActive() { + return false; + } + + @Override public Object execute(Op op) throws Exception { return getConnection().execute(op); } diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManager.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManager.java index 29c1387..fa71551 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManager.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManager.java @@ -18,6 +18,9 @@ import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.function.Predicate; +import org.apache.geode.annotations.VisibleForTesting; +import org.apache.geode.cache.client.internal.Connection; + /** * This manager maintains a collection of PooledConnection instances. * PooledConnections can be added to this manager using one of the add* methods. @@ -30,7 +33,7 @@ import java.util.function.Predicate; * */ public class AvailableConnectionManager { - private final Deque<PooledConnection> connections = + private final Deque<Connection> connections = new ConcurrentLinkedDeque<>(); /** @@ -39,8 +42,8 @@ public class AvailableConnectionManager { * * @return the activated connection or null if none found */ - public PooledConnection useFirst() { - PooledConnection connection; + public Connection useFirst() { + Connection connection; while (null != (connection = connections.pollFirst())) { if (connection.activate()) { return connection; @@ -55,7 +58,7 @@ public class AvailableConnectionManager { * @param connection the connection to remove * @return true if a connection was removed; otherwise false */ - public boolean remove(PooledConnection connection) { + public boolean remove(Connection connection) { return connections.remove(connection); } @@ -66,10 +69,10 @@ public class AvailableConnectionManager { * @param predicate that the connections are matched against * @return the activated connection or null if none found */ - public PooledConnection useFirst(Predicate<PooledConnection> predicate) { + public Connection useFirst(Predicate<Connection> predicate) { final EqualsWithPredicate equalsWithPredicate = new EqualsWithPredicate(predicate); while (connections.removeFirstOccurrence(equalsWithPredicate)) { - PooledConnection connection = equalsWithPredicate.getConnectionThatMatched(); + Connection connection = equalsWithPredicate.getConnectionThatMatched(); if (connection.activate()) { // Need to recheck the predicate after we have activated. // Until activated load conditioning can change the server @@ -91,7 +94,7 @@ public class AvailableConnectionManager { * @param connection the connection to passivate and add * @param accessed true if the connection was used by the caller, false otherwise */ - public void addFirst(PooledConnection connection, boolean accessed) { + public void addFirst(Connection connection, boolean accessed) { passivate(connection, accessed); connections.addFirst(connection); } @@ -102,12 +105,12 @@ public class AvailableConnectionManager { * @param connection the connection to passivate and add * @param accessed true if the connection was used by the caller, false otherwise */ - public void addLast(PooledConnection connection, boolean accessed) { + public void addLast(Connection connection, boolean accessed) { passivate(connection, accessed); connections.addLast(connection); } - private void passivate(PooledConnection connection, boolean accessed) { + private void passivate(Connection connection, boolean accessed) { // thread local connections are already passive at this point if (connection.isActive()) { connection.passivate(accessed); @@ -115,7 +118,8 @@ public class AvailableConnectionManager { } // used by unit tests - Deque<PooledConnection> getDeque() { + @VisibleForTesting + Deque<Connection> getDeque() { return connections; } @@ -126,19 +130,19 @@ public class AvailableConnectionManager { * that did match. */ private static class EqualsWithPredicate { - private final Predicate<PooledConnection> predicate; - private PooledConnection connectionThatMatched; + private final Predicate<Connection> predicate; + private Connection connectionThatMatched; - EqualsWithPredicate(Predicate<PooledConnection> predicate) { + EqualsWithPredicate(Predicate<Connection> predicate) { this.predicate = predicate; } @Override public boolean equals(Object o) { - if (!(o instanceof PooledConnection)) { + if (!(o instanceof Connection)) { return false; } - PooledConnection pooledConnection = (PooledConnection) o; + Connection pooledConnection = (Connection) o; if (predicate.test(pooledConnection)) { this.connectionThatMatched = pooledConnection; return true; @@ -146,7 +150,7 @@ public class AvailableConnectionManager { return false; } - public PooledConnection getConnectionThatMatched() { + public Connection getConnectionThatMatched() { return this.connectionThatMatched; } } diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java index d7295f6..ae48659 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java @@ -263,7 +263,7 @@ public class ConnectionManagerImpl implements ConnectionManager { try { long timeout = System.nanoTime() + MILLISECONDS.toNanos(acquireTimeout); while (true) { - PooledConnection connection = availableConnectionManager.useFirst(); + Connection connection = availableConnectionManager.useFirst(); if (null != connection) { return connection; } @@ -302,12 +302,12 @@ public class ConnectionManagerImpl implements ConnectionManager { } @Override - public PooledConnection borrowConnection(ServerLocation server, long acquireTimeout, + public Connection borrowConnection(ServerLocation server, long acquireTimeout, boolean onlyUseExistingCnx) throws AllConnectionsInUseException, NoAvailableServersException, ServerConnectivityException { - PooledConnection connection; + Connection connection; logger.trace("Connection borrowConnection single hop connection"); long waitStart = NOT_WAITING; @@ -353,7 +353,7 @@ public class ConnectionManagerImpl implements ConnectionManager { throws AllConnectionsInUseException { try { - PooledConnection connection = availableConnectionManager + Connection connection = availableConnectionManager .useFirst((c) -> !excludedServers.contains(c.getServer())); if (null != connection) { return connection; diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/PooledConnection.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/PooledConnection.java index ae5df9d..fa50f31 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/PooledConnection.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/PooledConnection.java @@ -62,6 +62,7 @@ public class PooledConnection implements Connection { return getEndpoint().getLocation(); } + @Override public boolean isActive() { synchronized (this) { return this.active; @@ -240,10 +241,12 @@ public class PooledConnection implements Connection { return lastAccessed; } + @Override public long getBirthDate() { return this.birthDate; } + @Override public void setBirthDate(long ts) { this.birthDate = ts; } diff --git a/geode-core/src/test/java/org/apache/geode/alerting/internal/ClusterAlertMessagingTest.java b/geode-core/src/test/java/org/apache/geode/alerting/internal/ClusterAlertMessagingTest.java index 4471ed3..f7bc8d8 100644 --- a/geode-core/src/test/java/org/apache/geode/alerting/internal/ClusterAlertMessagingTest.java +++ b/geode-core/src/test/java/org/apache/geode/alerting/internal/ClusterAlertMessagingTest.java @@ -26,7 +26,7 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.io.IOException; @@ -192,7 +192,7 @@ public class ClusterAlertMessagingTest { clusterAlertMessaging.sendAlert(remoteMember, AlertLevel.WARNING, Instant.now(), "threadName", Thread.currentThread().getId(), "formattedMessage", "stackTrace"); - verifyZeroInteractions(distributionManager); + verifyNoMoreInteractions(distributionManager); } @Test diff --git a/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java index 0fa4c37..ad7feea 100644 --- a/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java @@ -534,11 +534,26 @@ public class OpExecutorImplJUnitTest { } @Override + public long getBirthDate() { + return 0; + } + + @Override + public void setBirthDate(long ts) { + // nothing + } + + @Override public ConnectionStats getStats() { return null; } @Override + public boolean isActive() { + return false; + } + + @Override public int getDistributedSystemId() { return 0; } diff --git a/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerTest.java b/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerTest.java index 6ebdc4a..ee5b559 100644 --- a/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerTest.java +++ b/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/AvailableConnectionManagerTest.java @@ -27,6 +27,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Test; +import org.apache.geode.cache.client.internal.Connection; + public class AvailableConnectionManagerTest { private final AvailableConnectionManager instance = new AvailableConnectionManager(); @@ -42,17 +44,17 @@ public class AvailableConnectionManagerTest { public void useFirstReturnsNullGivenEmptyManager() { instance.getDeque().clear(); - PooledConnection result = instance.useFirst(); + Connection result = instance.useFirst(); assertThat(result).isNull(); } @Test public void useFirstReturnsExpectedConnectionGivenManagerWithOneItem() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); instance.getDeque().addFirst(expected); - PooledConnection result = instance.useFirst(); + Connection result = instance.useFirst(); assertThat(result).isSameAs(expected); assertThat(instance.getDeque()).isEmpty(); @@ -61,11 +63,11 @@ public class AvailableConnectionManagerTest { @Test public void useFirstReturnsNullGivenManagerWithOneItemThatCantBeActivated() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); when(expected.activate()).thenReturn(false); instance.getDeque().addFirst(expected); - PooledConnection result = instance.useFirst(); + Connection result = instance.useFirst(); assertThat(result).isNull(); assertThat(instance.getDeque()).isEmpty(); @@ -76,17 +78,17 @@ public class AvailableConnectionManagerTest { public void useFirstWithPredicateReturnsNullGivenEmptyManager() { instance.getDeque().clear(); - PooledConnection result = instance.useFirst(c -> true); + Connection result = instance.useFirst(c -> true); assertThat(result).isNull(); } @Test public void useFirstWithPredicateReturnsExpectedGivenManagerWithOneItem() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); instance.getDeque().addFirst(expected); - PooledConnection result = instance.useFirst(c -> c == expected); + Connection result = instance.useFirst(c -> c == expected); assertThat(result).isSameAs(expected); assertThat(instance.getDeque()).isEmpty(); @@ -95,10 +97,10 @@ public class AvailableConnectionManagerTest { @Test public void useFirstWithPredicateReturnsNullGivenManagerWithOneItemThatDoesNotMatch() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); instance.getDeque().addFirst(expected); - PooledConnection result = instance.useFirst(c -> false); + Connection result = instance.useFirst(c -> false); assertThat(result).isNull(); assertThat(instance.getDeque()).hasSize(1); @@ -107,11 +109,11 @@ public class AvailableConnectionManagerTest { @Test public void useFirstWithPredicateReturnsNullGivenManagerWithOneItemThatCantBeActivated() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); when(expected.activate()).thenReturn(false); instance.getDeque().addFirst(expected); - PooledConnection result = instance.useFirst(c -> c == expected); + Connection result = instance.useFirst(c -> c == expected); assertThat(result).isNull(); assertThat(instance.getDeque()).isEmpty(); @@ -120,12 +122,12 @@ public class AvailableConnectionManagerTest { @Test public void useFirstWithPredicateReturnsNullGivenManagerWithOneItemThatDoesNotMatchAfterBeingActivated() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); when(expected.activate()).thenReturn(true); instance.getDeque().addFirst(expected); final AtomicBoolean firstTime = new AtomicBoolean(true); - PooledConnection result = instance.useFirst(c -> { + Connection result = instance.useFirst(c -> { if (firstTime.get()) { firstTime.set(false); return true; @@ -151,7 +153,7 @@ public class AvailableConnectionManagerTest { @Test public void removeReturnsTrueGivenConnectionInManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); instance.getDeque().addFirst(connection); boolean result = instance.remove(connection); @@ -161,7 +163,7 @@ public class AvailableConnectionManagerTest { @Test public void removeEmptiesDequeGivenConnectionInManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); instance.getDeque().addFirst(connection); instance.remove(connection); @@ -171,7 +173,7 @@ public class AvailableConnectionManagerTest { @Test public void addFirstWithTrueAddsActiveConnectionToManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); instance.addFirst(connection, true); @@ -182,7 +184,7 @@ public class AvailableConnectionManagerTest { @Test public void addFirstWithFalseAddsActiveConnectionToManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); instance.addFirst(connection, false); @@ -193,7 +195,7 @@ public class AvailableConnectionManagerTest { @Test public void addFirstAddsInactiveConnectionToManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); when(connection.isActive()).thenReturn(false); instance.addFirst(connection, true); @@ -206,7 +208,7 @@ public class AvailableConnectionManagerTest { @Test public void addLastWithTrueAddsActiveConnectionToManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); instance.addLast(connection, true); @@ -217,7 +219,7 @@ public class AvailableConnectionManagerTest { @Test public void addLastWithFalseAddsActiveConnectionToManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); instance.addLast(connection, false); @@ -228,7 +230,7 @@ public class AvailableConnectionManagerTest { @Test public void addLastAddsInactiveConnectionToManager() { - PooledConnection connection = createConnection(); + Connection connection = createConnection(); when(connection.isActive()).thenReturn(false); instance.addLast(connection, true); @@ -240,12 +242,12 @@ public class AvailableConnectionManagerTest { @Test public void addFirstTakesPrecedenceOverAddLast() { - PooledConnection expected = createConnection(); + Connection expected = createConnection(); instance.addLast(createConnection(), true); instance.addFirst(expected, true); instance.addLast(createConnection(), true); - PooledConnection connection = instance.useFirst(); + Connection connection = instance.useFirst(); assertThat(instance.getDeque()).hasSize(2); assertThat(connection).isSameAs(expected); diff --git a/geode-core/src/test/java/org/apache/geode/distributed/ServerLauncherTest.java b/geode-core/src/test/java/org/apache/geode/distributed/ServerLauncherTest.java index afc0b43..a27c13a 100755 --- a/geode-core/src/test/java/org/apache/geode/distributed/ServerLauncherTest.java +++ b/geode-core/src/test/java/org/apache/geode/distributed/ServerLauncherTest.java @@ -24,7 +24,7 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.io.IOException; @@ -306,7 +306,7 @@ public class ServerLauncherTest { launcher.start(); - verifyZeroInteractions(cacheServer); + verifyNoMoreInteractions(cacheServer); } @Test @@ -324,7 +324,7 @@ public class ServerLauncherTest { launcher.start(); - verifyZeroInteractions(cacheServer2); + verifyNoMoreInteractions(cacheServer2); } @Test @@ -348,7 +348,7 @@ public class ServerLauncherTest { serverLauncher.start(); verify(startupCompletionAction).run(); - verifyZeroInteractions(startupExceptionAction); + verifyNoMoreInteractions(startupExceptionAction); } @Test @@ -371,7 +371,7 @@ public class ServerLauncherTest { serverLauncher.start(); verify(startupExceptionAction).accept(any()); - verifyZeroInteractions(startupCompletionAction); + verifyNoMoreInteractions(startupCompletionAction); } @Test diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java index abe34d3..76d9331 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/InternalCacheBuilderTest.java @@ -38,7 +38,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.same; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @@ -558,7 +558,7 @@ public class InternalCacheBuilderTest { .setIsExistingOk(true) .create(givenSystem)); - verifyZeroInteractions(givenSystem); + verifyNoMoreInteractions(givenSystem); } @Test diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionRedundancyTrackerTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionRedundancyTrackerTest.java index 24cb002..7bebc45 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionRedundancyTrackerTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/PartitionedRegionRedundancyTrackerTest.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; import org.junit.Before; import org.junit.Test; @@ -63,7 +62,7 @@ public class PartitionedRegionRedundancyTrackerTest { @Test public void willNotDecrementLowRedundancyBucketCountBelowZero() { redundancyTracker.decrementLowRedundancyBucketCount(); - verifyZeroInteractions(stats); + verifyNoMoreInteractions(stats); } @Test diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupOperationTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupOperationTest.java index 77d99d6..0d4416b 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupOperationTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupOperationTest.java @@ -20,7 +20,7 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.any; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.junit.Before; @@ -111,7 +111,7 @@ public class BackupOperationTest { any()); inOrder.verify(abortBackupFactory).createAbortBackupStep(any(), any(), any(), any(), any()); - verifyZeroInteractions(finishBackupFactory); + verifyNoMoreInteractions(finishBackupFactory); } @Test @@ -121,7 +121,7 @@ public class BackupOperationTest { assertThatThrownBy(() -> backupOperation.backupAllMembers(targetDirPath, baselineDirPath)) .isInstanceOf(ManagementException.class); - verifyZeroInteractions(flushToDiskFactory, prepareBackupFactory, abortBackupFactory, + verifyNoMoreInteractions(flushToDiskFactory, prepareBackupFactory, abortBackupFactory, finishBackupFactory); } } diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/colocation/SingleThreadColocationLoggerTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/colocation/SingleThreadColocationLoggerTest.java index ec7029c..ef909ca 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/colocation/SingleThreadColocationLoggerTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/colocation/SingleThreadColocationLoggerTest.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.util.Set; @@ -191,7 +190,7 @@ public class SingleThreadColocationLoggerTest { colocationLogger.addMissingChildRegion("/childRegion"); - verifyZeroInteractions(logger); + verifyNoMoreInteractions(logger); } @Test diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction65Test.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction65Test.java index 96b4d08..c29d4b7 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction65Test.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction65Test.java @@ -21,7 +21,7 @@ import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.junit.Before; @@ -220,6 +220,6 @@ public class ExecuteFunction65Test { executeFunction65.cmdExecute(message, serverConnection, securityService, 0); verify(securityService).authorize(ResourcePermissions.DATA_WRITE); - verifyZeroInteractions(serverToClientFunctionResultSender65Factory); + verifyNoMoreInteractions(serverToClientFunctionResultSender65Factory); } } diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction66Test.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction66Test.java index 0d8ae84..092a32e 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction66Test.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunction66Test.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.concurrent.Executor; @@ -212,7 +212,7 @@ public class ExecuteFunction66Test { verify(securityService).authorize(ResourcePermissions.DATA_WRITE); // verify(this.chunkedResponseMessage).sendChunk(this.serverConnection); - verifyZeroInteractions(serverToClientFunctionResultSender65Factory); + verifyNoMoreInteractions(serverToClientFunctionResultSender65Factory); } @Test @@ -240,6 +240,6 @@ public class ExecuteFunction66Test { securityService, 0)).isExactlyInstanceOf(NullPointerException.class); verify(securityService).authorize(ResourcePermissions.DATA_WRITE); - verifyZeroInteractions(serverToClientFunctionResultSender65Factory); + verifyNoMoreInteractions(serverToClientFunctionResultSender65Factory); } } diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunctionTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunctionTest.java index aa95fb4..abf9831 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunctionTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/command/ExecuteFunctionTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.junit.Before; @@ -194,7 +194,7 @@ public class ExecuteFunctionTest { verify(securityService).authorize(ResourcePermissions.DATA_WRITE); verify(chunkedResponseMessage).sendChunk(serverConnection); - verifyZeroInteractions(serverToClientFunctionResultSenderFactory); + verifyNoMoreInteractions(serverToClientFunctionResultSenderFactory); } @Test @@ -220,6 +220,6 @@ public class ExecuteFunctionTest { executeFunction.cmdExecute(message, serverConnection, securityService, 0); verify(chunkedResponseMessage).sendChunk(serverConnection); - verifyZeroInteractions(serverToClientFunctionResultSenderFactory); + verifyNoMoreInteractions(serverToClientFunctionResultSenderFactory); } } diff --git a/geode-core/src/test/java/org/apache/geode/internal/io/CompositeOutputStreamJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/io/CompositeOutputStreamJUnitTest.java index 34a438d..15704c4 100755 --- a/geode-core/src/test/java/org/apache/geode/internal/io/CompositeOutputStreamJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/io/CompositeOutputStreamJUnitTest.java @@ -19,7 +19,7 @@ import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import java.io.IOException; import java.io.OutputStream; @@ -234,7 +234,7 @@ public class CompositeOutputStreamJUnitTest { cos.flush(); cos.close(); - verifyZeroInteractions(streamTwo); + verifyNoMoreInteractions(streamTwo); InOrder inOrderStreams = inOrder(streamOne); inOrderStreams.verify(streamOne, times(1)).write(2); inOrderStreams.verify(streamOne, times(1)).write(3); @@ -261,7 +261,7 @@ public class CompositeOutputStreamJUnitTest { cos.flush(); cos.close(); - verifyZeroInteractions(streamOne); + verifyNoMoreInteractions(streamOne); } @Test @@ -279,6 +279,6 @@ public class CompositeOutputStreamJUnitTest { cos.flush(); cos.close(); - verifyZeroInteractions(streamOne); + verifyNoMoreInteractions(streamOne); } } diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java index 1b89f79..2de1c51 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java @@ -21,7 +21,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.powermock.api.mockito.PowerMockito.when; import java.net.InetAddress; @@ -442,7 +442,7 @@ public class FederatingManagerTest { federatingManager.removeMemberArtifacts(member, false); - verifyZeroInteractions(proxyFactory); + verifyNoMoreInteractions(proxyFactory); } private InternalDistributedMember member() { diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java index 585d2a1..26067a5 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java @@ -23,7 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.concurrent.locks.Lock; @@ -130,9 +130,9 @@ public class ManagementListenerTest { public void handleEventDoesNotUseLocksForSystemAlertEvent() { managementListener.handleEvent(SYSTEM_ALERT, null); - verifyZeroInteractions(readWriteLock); - verifyZeroInteractions(readLock); - verifyZeroInteractions(writeLock); + verifyNoMoreInteractions(readWriteLock); + verifyNoMoreInteractions(readLock); + verifyNoMoreInteractions(writeLock); } @Test diff --git a/geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/VMEventNotifierTest.java b/geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/VMEventNotifierTest.java index f516986..87c8030 100644 --- a/geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/VMEventNotifierTest.java +++ b/geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/VMEventNotifierTest.java @@ -18,7 +18,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; @@ -93,7 +93,7 @@ public class VMEventNotifierTest { notifiedFuture.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); verify(vmEventListener1).afterCreateVM(eq(vm)); - verifyZeroInteractions(vmEventListener2); + verifyNoMoreInteractions(vmEventListener2); } @Test diff --git a/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/AlterQueryServiceFunctionTest.java b/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/AlterQueryServiceFunctionTest.java index 90f0dc0..c75a0d6 100644 --- a/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/AlterQueryServiceFunctionTest.java +++ b/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/AlterQueryServiceFunctionTest.java @@ -31,7 +31,7 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.Arrays; @@ -110,7 +110,7 @@ public class AlterQueryServiceFunctionTest { when(mockContext.getArguments()).thenReturn(new Object[] {false, null, Collections.emptySet()}); CliFunctionResult result = function.executeFunction(mockContext); - verifyZeroInteractions(mockQueryConfigService); + verifyNoMoreInteractions(mockQueryConfigService); assertThat(result.getStatus()).isEqualTo(CliFunctionResult.StatusState.ERROR.toString()); assertThat(result.getStatusMessage()).isEqualTo(EMPTY_AUTHORIZER_ERROR); } @@ -120,7 +120,7 @@ public class AlterQueryServiceFunctionTest { doReturn(false).when(function).isSecurityEnabled(); CliFunctionResult result = function.executeFunction(mockContext); - verifyZeroInteractions(mockQueryConfigService); + verifyNoMoreInteractions(mockQueryConfigService); assertThat(result.getStatus()).isEqualTo(CliFunctionResult.StatusState.ERROR.toString()); assertThat(result.getStatusMessage()).isEqualTo(SECURITY_NOT_ENABLED_MESSAGE); } @@ -130,7 +130,7 @@ public class AlterQueryServiceFunctionTest { setAllowUntrustedMethodInvocationSystemProperty(); CliFunctionResult result = function.executeFunction(mockContext); - verifyZeroInteractions(mockQueryConfigService); + verifyNoMoreInteractions(mockQueryConfigService); assertThat(result.getStatus()).isEqualTo(CliFunctionResult.StatusState.ERROR.toString()); assertThat(result.getStatusMessage()).isEqualTo(DEPRECATED_PROPERTY_ERROR); } diff --git a/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunctionTest.java b/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunctionTest.java index 3ee0c6e..829fab9 100644 --- a/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunctionTest.java +++ b/geode-gfsh/src/test/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunctionTest.java @@ -24,7 +24,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.Arrays; @@ -123,7 +123,7 @@ public class RegionAlterFunctionTest { public void updateWithEmptyRegionAttributes() { // the regionAttributes starts with no values inside function.alterRegion(cache, config); - verifyZeroInteractions(mutator); + verifyNoMoreInteractions(mutator); } @Test