You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by dr...@apache.org on 2017/05/02 20:06:24 UTC

[16/50] curator git commit: reworked this so that it now properly retries one time while still doing each test twice - once for classic and once for standard

reworked this so that it now properly retries one time while still doing each test twice - once for classic and once for standard


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/acd90971
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/acd90971
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/acd90971

Branch: refs/heads/master
Commit: acd90971dafd9c3b4373f45734dd9f8f88a165ce
Parents: 90b39dd
Author: randgalt <ra...@apache.org>
Authored: Wed Jan 11 00:28:11 2017 -0500
Committer: randgalt <ra...@apache.org>
Committed: Wed Jan 11 00:28:11 2017 -0500

----------------------------------------------------------------------
 .../apache/curator/test/BaseClassForTests.java  | 152 +++++++++++++++----
 1 file changed, 125 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/acd90971/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
index a5afaf2..fe4acd2 100644
--- a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
+++ b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
@@ -22,16 +22,19 @@ package org.apache.curator.test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.IInvokedMethod;
-import org.testng.IInvokedMethodListener;
+import org.testng.IInvokedMethodListener2;
+import org.testng.IRetryAnalyzer;
 import org.testng.ITestContext;
-import org.testng.ITestNGListener;
 import org.testng.ITestNGMethod;
 import org.testng.ITestResult;
+import org.testng.TestListenerAdapter;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.BeforeSuite;
 import java.io.IOException;
 import java.net.BindException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 public class BaseClassForTests
 {
@@ -84,31 +87,7 @@ public class BaseClassForTests
     @BeforeSuite(alwaysRun = true)
     public void beforeSuite(ITestContext context)
     {
-        if ( !enabledSessionExpiredStateAware() )
-        {
-            ITestNGListener listener = new IInvokedMethodListener()
-            {
-                @Override
-                public void beforeInvocation(IInvokedMethod method, ITestResult testResult)
-                {
-                    int invocationCount = method.getTestMethod().getCurrentInvocationCount();
-                    System.setProperty("curator-use-classic-connection-handling", Boolean.toString(invocationCount == 1));
-                    log.info("curator-use-classic-connection-handling: " + Boolean.toString(invocationCount == 1));
-                }
-
-                @Override
-                public void afterInvocation(IInvokedMethod method, ITestResult testResult)
-                {
-                    System.clearProperty("curator-use-classic-connection-handling");
-                }
-            };
-            context.getSuite().addListener(listener);
-        }
-
-        for ( ITestNGMethod method : context.getAllTestMethods() )
-        {
-            method.setInvocationCount(enabledSessionExpiredStateAware() ? 1 : 2);
-        }
+        context.getSuite().addListener(new MethodListener(log, enabledSessionExpiredStateAware()));
     }
 
     @BeforeMethod
@@ -161,4 +140,123 @@ public class BaseClassForTests
     {
         return false;
     }
+
+    private static class RetryContext
+    {
+        final AtomicBoolean isRetrying = new AtomicBoolean(false);
+        final AtomicInteger runVersion = new AtomicInteger(0);
+    }
+
+    private static class RetryAnalyzer implements IRetryAnalyzer
+    {
+        private final Logger log;
+        private final RetryContext retryContext;
+
+        RetryAnalyzer(Logger log, RetryContext retryContext)
+        {
+            this.log = log;
+            this.retryContext = retryContext;
+        }
+
+        @Override
+        public boolean retry(ITestResult result)
+        {
+            if ( result.isSuccess() || retryContext.isRetrying.get() )
+            {
+                retryContext.isRetrying.set(false);
+                return false;
+            }
+
+            log.error("Retrying 1 time");
+            retryContext.isRetrying.set(true);
+            return true;
+        }
+    }
+
+    private static class MethodListener implements IInvokedMethodListener2
+    {
+        private final Logger log;
+        private final boolean sessionExpiredStateAware;
+
+        private static final String ATTRIBUTE_NAME = "__curator";
+
+        MethodListener(Logger log, boolean sessionExpiredStateAware)
+        {
+            this.log = log;
+            this.sessionExpiredStateAware = sessionExpiredStateAware;
+        }
+
+        @Override
+        public void beforeInvocation(IInvokedMethod method, ITestResult testResult)
+        {
+            // NOP
+        }
+
+        @Override
+        public void afterInvocation(IInvokedMethod method, ITestResult testResult)
+        {
+            // NOP
+        }
+
+        @Override
+        public void beforeInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context)
+        {
+            if ( method.getTestMethod().isBeforeMethodConfiguration() )
+            {
+                TestListenerAdapter x = null;
+                RetryContext retryContext = (RetryContext)context.getAttribute(ATTRIBUTE_NAME);
+                if ( retryContext == null )
+                {
+                    retryContext = new RetryContext();
+                    context.setAttribute(ATTRIBUTE_NAME, retryContext);
+                }
+
+                if ( !sessionExpiredStateAware )
+                {
+                    System.setProperty("curator-use-classic-connection-handling", Boolean.toString(retryContext.runVersion.get() > 0));
+                    log.info("curator-use-classic-connection-handling: " + Boolean.toString(retryContext.runVersion.get() > 0));
+                }
+            }
+            else if ( method.isTestMethod() )
+            {
+                method.getTestMethod().setRetryAnalyzer(new RetryAnalyzer(log, (RetryContext)context.getAttribute(ATTRIBUTE_NAME)));
+            }
+        }
+
+        @Override
+        public void afterInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context)
+        {
+            if ( method.getTestMethod().isBeforeSuiteConfiguration() && !sessionExpiredStateAware )
+            {
+                for ( ITestNGMethod testMethod : context.getAllTestMethods() )
+                {
+                    testMethod.setInvocationCount(2);
+                }
+            }
+
+            if ( method.isTestMethod() )
+            {
+                RetryContext retryContext = (RetryContext)context.getAttribute(ATTRIBUTE_NAME);
+                if ( retryContext == null )
+                {
+                    log.error("No retryContext!");
+                }
+                else
+                {
+                    System.clearProperty("curator-use-classic-connection-handling");
+                    if ( testResult.isSuccess() )
+                    {
+                        retryContext.isRetrying.set(false);
+                    }
+                    if ( testResult.isSuccess() || retryContext.isRetrying.get() )
+                    {
+                        if ( retryContext.runVersion.incrementAndGet() > 1 )
+                        {
+                            context.setAttribute(ATTRIBUTE_NAME, null);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }