You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kh...@apache.org on 2016/12/05 16:16:59 UTC

incubator-geode git commit: GEODE-2095: Stabilize flaky tests

Repository: incubator-geode
Updated Branches:
  refs/heads/develop 00c46557e -> 0d2823ffe


GEODE-2095: Stabilize flaky tests

Changed checks for expected log messages from time based to event based.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/0d2823ff
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/0d2823ff
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/0d2823ff

Branch: refs/heads/develop
Commit: 0d2823ffe602ac029144614ea811e95084afeb47
Parents: 00c4655
Author: Ken Howe <kh...@pivotal.io>
Authored: Thu Nov 17 09:36:45 2016 -0800
Committer: Ken Howe <kh...@pivotal.io>
Committed: Mon Dec 5 08:09:55 2016 -0800

----------------------------------------------------------------------
 ...tentColocatedPartitionedRegionDUnitTest.java | 151 ++++++++-----------
 1 file changed, 65 insertions(+), 86 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0d2823ff/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/PersistentColocatedPartitionedRegionDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/PersistentColocatedPartitionedRegionDUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/PersistentColocatedPartitionedRegionDUnitTest.java
index a044a61..504c16b 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/PersistentColocatedPartitionedRegionDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/partitioned/PersistentColocatedPartitionedRegionDUnitTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache.partitioned;
 
 import org.junit.experimental.categories.Category;
 import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.Appender;
@@ -28,6 +27,7 @@ import static org.junit.Assert.*;
 
 import static com.jayway.awaitility.Awaitility.await;
 
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -47,8 +47,6 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import com.jayway.awaitility.core.ConditionTimeoutException;
-
 import org.apache.geode.admin.internal.AdminDistributedSystemImpl;
 import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.Cache;
@@ -400,15 +398,12 @@ public class PersistentColocatedPartitionedRegionDUnitTest
             createPR(PR_REGION_NAME, true);
             // Let this thread continue running long enough for the missing region to be logged a
             // couple times.
-            // Child regions do not get created by this thread. (1.5*logInterval < delay <
-            // 2*logInterval)
-            await().atMost((int) (1.75 * logInterval), TimeUnit.MILLISECONDS).until(() -> {
+            // Child regions do not get created by this thread.
+            await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> {
               verify(mockAppender, times(numExpectedLogMessages))
                   .append(loggingEventCaptor.capture());
             });
             // createPR("region2", PR_REGION_NAME, true); // This child region is never created
-          } catch (Exception e) {
-            e.printStackTrace();
           } finally {
             logEvents = loggingEventCaptor.getAllValues();
             assertEquals(String.format("Expected %d messages to be logged, got %d.",
@@ -446,15 +441,14 @@ public class PersistentColocatedPartitionedRegionDUnitTest
             createPR(PR_REGION_NAME, true);
             // Delay creation of second (i.e child) region to see missing colocated region log
             // message (logInterval/2 < delay < logInterval)
-            await().atMost((int) (.75 * logInterval), TimeUnit.MILLISECONDS).until(() -> {
+            await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> {
               verify(mockAppender, times(1)).append(loggingEventCaptor.capture());
             });
             logEvents = loggingEventCaptor.getAllValues();
             createPR("region2", PR_REGION_NAME, true);
             // Another delay before exiting the thread to make sure that missing region logging
-            // doesn't continue after
-            // missing region is created (delay > logInterval)
-            await().atMost((int) (1.25 * logInterval), TimeUnit.MILLISECONDS).until(() -> {
+            // doesn't continue after missing region is created (delay > logInterval)
+            await().atMost(logInterval * 2, TimeUnit.MILLISECONDS).until(() -> {
               verifyNoMoreInteractions(mockAppender);
             });
             fail("Unexpected missing colocated region log message");
@@ -494,7 +488,6 @@ public class PersistentColocatedPartitionedRegionDUnitTest
 
           createPR(PR_REGION_NAME, true);
           // Delay creation of child generation regions to see missing colocated region log message
-          // (logInterval/2 < delay < logInterval)
           // parent region is generation 1, child region is generation 2, grandchild is 3, etc.
           for (int generation = 2; generation < (numChildPRGenerations + 2); ++generation) {
             String childPRName = "region" + generation;
@@ -502,36 +495,34 @@ public class PersistentColocatedPartitionedRegionDUnitTest
                 generation == 2 ? PR_REGION_NAME : "region" + (generation - 1);
             loggingEventCaptor = ArgumentCaptor.forClass(LogEvent.class);
 
-            // delay between starting generations of child regions
-            try {
-              await().atMost(delayForChildCreation, TimeUnit.MILLISECONDS).until(() -> {
-                return false;
-              });
-            } catch (ConditionTimeoutException e) {
-            }
+            // delay between starting generations of child regions until the expected missing
+            // colocation messages are logged
+            int n = (generation - 1) * generation / 2;
+            await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> {
+              verify(mockAppender, times(n)).append(loggingEventCaptor.capture());
+            });
             // check for log messages
-            verify(mockAppender, times((generation - 1) * generation / 2))
-                .append(loggingEventCaptor.capture());
             logEvents = loggingEventCaptor.getAllValues();
             String logMsg = loggingEventCaptor.getValue().getMessage().getFormattedMessage();
 
             // Start the child region
             createPR(childPRName, colocatedWithRegionName, true);
           }
-          // Another delay before exiting the thread to make sure that missing region logging
-          // doesn't continue after
-          // all regions created (delay > logInterval)
           String logMsg = "";
+          logEvents = loggingEventCaptor.getAllValues();
+          assertEquals(String.format("Expected warning messages to be logged."),
+              numExpectedLogMessages, logEvents.size());
+          logMsg = logEvents.get(0).getMessage().getFormattedMessage();
+
+          // acknowledge interactions with the mock that have occurred
+          verify(mockAppender, atLeastOnce()).getName();
+          verify(mockAppender, atLeastOnce()).isStarted();
           try {
-            await().atMost((int) (delayForChildCreation * 1.2), TimeUnit.MILLISECONDS).until(() -> {
-              return false;
-            });
-          } catch (ConditionTimeoutException e) {
+            // Another delay before exiting the thread to make sure that missing region logging
+            // doesn't continue after all regions are created (delay > logInterval)
+            Thread.sleep(logInterval * 2);
+            verifyNoMoreInteractions(mockAppender);
           } finally {
-            logEvents = loggingEventCaptor.getAllValues();
-            assertEquals(String.format("Expected warning messages to be logged."),
-                numExpectedLogMessages, logEvents.size());
-            logMsg = logEvents.get(0).getMessage().getFormattedMessage();
             logger.removeAppender(mockAppender);
           }
           numExpectedLogMessages = 1;
@@ -563,51 +554,44 @@ public class PersistentColocatedPartitionedRegionDUnitTest
 
           createPR(PR_REGION_NAME, true);
           // Delay creation of child generation regions to see missing colocated region log message
-          // (logInterval/2 < delay < logInterval)
           for (int regionNum = 2; regionNum < (numChildPRs + 2); ++regionNum) {
             String childPRName = "region" + regionNum;
             loggingEventCaptor = ArgumentCaptor.forClass(LogEvent.class);
 
-            // delay between starting generations of child regions
-            try {
-              await().atMost(delayForChildCreation, TimeUnit.MILLISECONDS).until(() -> {
-                return false;
-              });
-            } catch (ConditionTimeoutException e) {
-            }
-            // check for log messages
-            verify(mockAppender, times(regionNum - 1)).append(loggingEventCaptor.capture());
+            // delay between starting generations of child regions until the expected missing
+            // colocation messages are logged
+            int n = regionNum - 1;
+            await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> {
+              verify(mockAppender, times(n)).append(loggingEventCaptor.capture());
+            });
+            // check for expected number of log messages
             logEvents = loggingEventCaptor.getAllValues();
             String logMsg = loggingEventCaptor.getValue().getMessage().getFormattedMessage();
             numLogEvents = logEvents.size();
             assertEquals("Expected warning messages to be logged.", regionNum - 1, numLogEvents);
 
             // Start the child region
-            try {
-              createPR(childPRName, PR_REGION_NAME, true);
-            } catch (Exception e) {
-            }
-          }
-          // Another delay before exiting the thread to make sure that missing region logging
-          // doesn't continue after
-          // all regions created (delay > logInterval)
-          try {
-            await().atMost((int) (delayForChildCreation * 1.2), TimeUnit.MILLISECONDS).until(() -> {
-              return false;
-            });
-          } catch (ConditionTimeoutException e) {
+            createPR(childPRName, PR_REGION_NAME, true);
           }
-          String logMsg;
+          String logMsg = "";
+          logEvents = loggingEventCaptor.getAllValues();
+          assertEquals(String.format("Expected warning messages to be logged."),
+              numExpectedLogMessages, logEvents.size());
+          logMsg = logEvents.get(0).getMessage().getFormattedMessage();
+
+          // acknowledge interactions with the mock that have occurred
+          verify(mockAppender, atLeastOnce()).getName();
+          verify(mockAppender, atLeastOnce()).isStarted();
           try {
-            logEvents = loggingEventCaptor.getAllValues();
-            assertEquals(String.format("Expected warning messages to be logged."),
-                numExpectedLogMessages, logEvents.size());
-            logMsg = logEvents.get(0).getMessage().getFormattedMessage();
+            // Another delay before exiting the thread to make sure that missing region logging
+            // doesn't continue after all regions are created (delay > logInterval)
+            Thread.sleep(logInterval * 2);
+            verifyNoMoreInteractions(mockAppender);
           } finally {
             logger.removeAppender(mockAppender);
-            numExpectedLogMessages = 1;
-            mockAppender = null;
           }
+          numExpectedLogMessages = 1;
+          mockAppender = null;
           return logMsg;
         }
       };
@@ -1226,38 +1210,33 @@ public class PersistentColocatedPartitionedRegionDUnitTest
             String colocatedWithRegionName = (String) regionInfo[1];
             int nLogsAfterRegionCreation = (int) regionInfo[2];
 
-            // delay between starting generations of child regions
-            try {
-              await().atMost(delayForChildCreation, TimeUnit.MILLISECONDS).until(() -> {
-                return false;
-              });
-            } catch (ConditionTimeoutException e) {
-            }
-            // check for log messages that occurred during the delay
-            verify(mockAppender, times(nExpectedLogs)).append(loggingEventCaptor.capture());
-            nExpectedLogs += nLogsAfterRegionCreation;
-            logEvents = loggingEventCaptor.getAllValues();
-            String logMsg = loggingEventCaptor.getValue().getMessage().getFormattedMessage();
+            // delay between starting generations of child regions and verify expected logging
+            int n = nExpectedLogs;
+            await().atMost(MAX_WAIT, TimeUnit.MILLISECONDS).until(() -> {
+              verify(mockAppender, times(n)).append(loggingEventCaptor.capture());
+            });
 
             // Finally start the next child region
             createPR(childPRName, colocatedWithRegionName, true);
           }
-          // Another delay before exiting the thread to make sure that missing region logging
-          // doesn't continue after
-          // all regions created (delay > logInterval)
           String logMsg = "";
+          logEvents = loggingEventCaptor.getAllValues();
+          assertEquals(String.format("Expected warning messages to be logged."), nExpectedLogs,
+              logEvents.size());
+          logMsg = logEvents.get(0).getMessage().getFormattedMessage();
+
+          // acknowledge interactions with the mock that have occurred
+          verify(mockAppender, atLeastOnce()).getName();
+          verify(mockAppender, atLeastOnce()).isStarted();
           try {
-            await().atMost((int) (delayForChildCreation * 1.2), TimeUnit.MILLISECONDS).until(() -> {
-              return false;
-            });
-          } catch (ConditionTimeoutException e) {
+            // Another delay before exiting the thread to make sure that missing region logging
+            // doesn't continue after all regions are created (delay > logInterval)
+            Thread.sleep(logInterval * 2);
+            verifyNoMoreInteractions(mockAppender);
           } finally {
-            logEvents = loggingEventCaptor.getAllValues();
-            assertEquals(String.format("Expected warning messages to be logged."), nExpectedLogs,
-                logEvents.size());
-            logMsg = logEvents.get(0).getMessage().getFormattedMessage();
             logger.removeAppender(mockAppender);
           }
+
           numExpectedLogMessages = 1;
           mockAppender = null;
           return logMsg;