This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new bb8ee69  Refactor for IT parallel execute (#9297)
bb8ee69 is described below

commit bb8ee69e312ef38610216b24f1e6251078c43174
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Feb 3 18:08:48 2021 +0800

    Refactor for IT parallel execute (#9297)
    
    * Code format for BaseIT
    
    * Code format for BatchIT
    
    * Code format for ParallelParameterized
    
    * Refactor ITRunnerScheduler
    
    * Remove ITRunnerScheduler.executorCounter
    
    * Refactor ITRunnerScheduler
    
    * Refactor ITRunnerWithParametersFactory
    
    * Move ITWatcher to junit package
---
 .../test/integration/engine/it/BaseIT.java         |   5 +-
 .../test/integration/engine/it/BatchIT.java        |   5 +-
 .../test/integration/engine/it/SingleIT.java       |   2 +-
 .../ITBlockJUnit4ClassRunnerWithParameters.java    |   8 +-
 .../engine/junit/ITRunnerScheduler.java            | 105 +++++++++++----------
 .../junit/ITRunnerWithParametersFactory.java       |  12 +--
 .../engine/{watcher => junit}/ITWatcher.java       |   2 +-
 .../engine/junit/ParallelParameterized.java        |  13 ++-
 8 files changed, 76 insertions(+), 76 deletions(-)

diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
index b64b88e..09b6124 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BaseIT.java
@@ -26,12 +26,13 @@ import 
org.apache.shardingsphere.test.integration.engine.junit.ITRunnerWithParam
 import 
org.apache.shardingsphere.test.integration.engine.junit.ParallelParameterized;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import 
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
+import 
org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
 import 
org.apache.shardingsphere.test.integration.env.datasource.builder.ActualDataSourceBuilder;
 import 
org.apache.shardingsphere.test.integration.env.datasource.builder.ProxyDataSourceBuilder;
-import 
org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized.UseParametersRunnerFactory;
 
 import javax.sql.DataSource;
 import javax.xml.bind.JAXBException;
@@ -42,7 +43,7 @@ import java.util.Map;
 import java.util.TimeZone;
 
 @RunWith(ParallelParameterized.class)
[email protected](ITRunnerWithParametersFactory.class)
+@UseParametersRunnerFactory(ITRunnerWithParametersFactory.class)
 @Getter(AccessLevel.PROTECTED)
 public abstract class BaseIT {
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
index 1727129..4853655 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/BatchIT.java
@@ -57,13 +57,14 @@ import static org.junit.Assert.assertThat;
 @Getter(AccessLevel.PROTECTED)
 public abstract class BatchIT extends BaseIT {
     
-    private DataSetEnvironmentManager dataSetEnvironmentManager;
-    
     private final IntegrationTestCaseContext testCaseContext;
     
     private final String sql;
     
     private final Collection<DataSet> dataSets;
+
+    @Getter(AccessLevel.NONE)
+    private final DataSetEnvironmentManager dataSetEnvironmentManager;
     
     protected BatchIT(final IntegrationTestCaseContext testCaseContext,
                       final String adapter, final String scenario, final 
DatabaseType databaseType, final String sql) throws IOException, JAXBException, 
SQLException {
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
index 7cb4634..19ae29d 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/it/SingleIT.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.test.integration.engine.param.SQLExecuteType;
 import org.apache.shardingsphere.test.integration.cases.value.SQLValue;
 import org.apache.shardingsphere.test.integration.cases.dataset.DataSet;
 import org.apache.shardingsphere.test.integration.cases.dataset.DataSetLoader;
-import org.apache.shardingsphere.test.integration.engine.watcher.ITWatcher;
+import org.apache.shardingsphere.test.integration.engine.junit.ITWatcher;
 import org.junit.Rule;
 
 import javax.xml.bind.JAXBException;
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
index 78c56e5..da3d7aa 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITBlockJUnit4ClassRunnerWithParameters.java
@@ -37,15 +37,15 @@ import java.util.List;
  */
 public final class ITBlockJUnit4ClassRunnerWithParameters extends 
BlockJUnit4ClassRunner {
     
+    private final String name;
+    
     @Getter
     private final Object[] parameters;
     
-    private final String name;
-    
     public ITBlockJUnit4ClassRunnerWithParameters(final TestWithParameters 
test) throws InitializationError {
         super(test.getTestClass().getJavaClass());
-        parameters = test.getParameters().toArray(new 
Object[test.getParameters().size()]);
         name = test.getName();
+        parameters = test.getParameters().toArray(new 
Object[test.getParameters().size()]);
     }
     
     @Override
@@ -57,7 +57,7 @@ public final class ITBlockJUnit4ClassRunnerWithParameters 
extends BlockJUnit4Cla
         }
     }
     
-    private Object createTestUsingConstructorInjection() throws Exception {
+    private Object createTestUsingConstructorInjection() throws 
ReflectiveOperationException {
         return getTestClass().getOnlyConstructor().newInstance(parameters);
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
index 1327b3e..c407eef 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerScheduler.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.test.integration.engine.junit;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.test.integration.env.IntegrationTestEnvironment;
 import org.junit.runners.model.RunnerScheduler;
@@ -29,94 +28,102 @@ import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * Represents a strategy for scheduling when individual test methods
- * should be run (in serial or parallel).
+ * Represents a strategy for scheduling when individual test methods should be 
run (in serial or parallel).
+ * 
  * <p>
  * WARNING: still experimental, may go away.
  * </p>
  */
-@Slf4j
-public class ITRunnerScheduler implements RunnerScheduler {
+public final class ITRunnerScheduler implements RunnerScheduler {
     
     private static final String DEFAULT_EXECUTOR_KEY = "default";
     
     private final Map<String, ExecutorService> executors = new HashMap<>();
     
-    private final Map<String, AtomicInteger> executorCounter = new HashMap<>();
-    
     public ITRunnerScheduler() {
-        Collection<String> adapters = 
IntegrationTestEnvironment.getInstance().getAdapters();
-        Collection<String> scenarios = 
IntegrationTestEnvironment.getInstance().getScenarios();
-        Set<DatabaseType> databaseTypes = 
IntegrationTestEnvironment.getInstance().getDatabaseEnvironments().keySet();
-        
-        executors.put(DEFAULT_EXECUTOR_KEY, 
getExecutorService(DEFAULT_EXECUTOR_KEY));
-        executorCounter.put(DEFAULT_EXECUTOR_KEY, new AtomicInteger(0));
+        IntegrationTestEnvironment itEnv = 
IntegrationTestEnvironment.getInstance();
+        addExecutors(itEnv.getAdapters(), itEnv.getScenarios(), 
itEnv.getDatabaseEnvironments().keySet());
+        addExecutor(DEFAULT_EXECUTOR_KEY);
+    }
+    
+    private void addExecutors(final Collection<String> adapters, final 
Collection<String> scenarios, final Collection<DatabaseType> databaseTypes) {
         for (String each : adapters) {
-            for (String scenario : scenarios) {
-                for (DatabaseType databaseType : databaseTypes) {
-                    String executorServiceKey = getExecutorServiceKey(each, 
scenario, databaseType.getName());
-                    executors.put(executorServiceKey, 
getExecutorService(executorServiceKey));
-                    executorCounter.put(executorServiceKey, new 
AtomicInteger(0));
-                }
-            }
+            addExecutors(each, scenarios, databaseTypes);
+        }
+    }
+    
+    private void addExecutors(final String adapter, final Collection<String> 
scenarios, final Collection<DatabaseType> databaseTypes) {
+        for (String each : scenarios) {
+            addExecutors(adapter, each, databaseTypes);
         }
     }
     
-    @SneakyThrows
+    private void addExecutors(final String adapter, final String scenario, 
final Collection<DatabaseType> databaseTypes) {
+        for (DatabaseType each : databaseTypes) {
+            addExecutor(String.join("_", adapter, scenario, each.getName()));
+        }
+    }
+    
+    private void addExecutor(final String executorKey) {
+        executors.put(executorKey, createExecutorService(executorKey));
+    }
+    
+    private ExecutorService createExecutorService(final String 
executorServiceKey) {
+        return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<>(), new 
ThreadFactoryBuilder().setNameFormat("ITRunnerScheduler-" + executorServiceKey 
+ "-pool-%d").build());
+    }
+    
     @Override
     public void schedule(final Runnable childStatement) {
         // TODO Gets the parameters of the Runnable closure
-        Field field = childStatement.getClass().getDeclaredField("val$each");
-        field.setAccessible(true);
-        ITBlockJUnit4ClassRunnerWithParameters runnerWithParameters = 
(ITBlockJUnit4ClassRunnerWithParameters) field.get(childStatement);
-        String executorServiceKey = 
getExecutorServiceKey(runnerWithParameters.getParameters(), 
runnerWithParameters.getTestClass());
-        executorCounter.get(executorServiceKey).incrementAndGet();
-        executors.get(executorServiceKey).submit(childStatement);
+        ITBlockJUnit4ClassRunnerWithParameters runnerWithParameters = 
getRunnerWithParameters(childStatement);
+        String executorKey = 
getExecutorKey(runnerWithParameters.getTestClass(), 
runnerWithParameters.getParameters());
+        executors.get(executorKey).submit(childStatement);
     }
     
-    private String getExecutorServiceKey(final String adapter, final String 
scenario, final String databaseTypeName) {
-        return String.join("_", adapter, scenario, databaseTypeName);
+    @SneakyThrows(ReflectiveOperationException.class)
+    private ITBlockJUnit4ClassRunnerWithParameters 
getRunnerWithParameters(final Runnable childStatement) {
+        Field field = childStatement.getClass().getDeclaredField("val$each");
+        field.setAccessible(true);
+        return (ITBlockJUnit4ClassRunnerWithParameters) 
field.get(childStatement);
     }
     
-    private String getExecutorServiceKey(final Object[] parameters, final 
TestClass testClass) {
-        Class<?> realTestClass = testClass.getJavaClass();
-        if (realTestClass == null) {
+    private String getExecutorKey(final TestClass testClass, final Object[] 
parameters) {
+        if (null == testClass.getJavaClass()) {
             return DEFAULT_EXECUTOR_KEY;
         }
         int parametersLength = parameters.length;
-        if (parametersLength == 7) {
+        if (isSingleTest(parametersLength)) {
             return String.join("_", String.valueOf(parameters[2]), 
String.valueOf(parameters[3]), String.valueOf(parameters[4]));
-        } else if (parametersLength == 5) {
+        } else if (isBatchTest(parametersLength)) {
             return String.join("_", String.valueOf(parameters[1]), 
String.valueOf(parameters[2]), String.valueOf(parameters[3]));
         }
         return DEFAULT_EXECUTOR_KEY;
     }
     
+    private boolean isSingleTest(final int parametersLength) {
+        return 7 == parametersLength;
+    }
+    
+    private boolean isBatchTest(final int parametersLength) {
+        return 5 == parametersLength;
+    }
+    
     @Override
     public void finished() {
-        for (Map.Entry<String, AtomicInteger> each : 
executorCounter.entrySet()) {
-            log.info(String.join(" -> ", each.getKey(), 
String.valueOf(each.getValue().get())));
-        }
-        executors.values().forEach(executorService -> {
+        executors.values().forEach(each -> {
             try {
-                executorService.shutdown();
-                executorService.awaitTermination(Long.MAX_VALUE, 
TimeUnit.NANOSECONDS);
-            } catch (InterruptedException e) {
-                e.printStackTrace(System.err);
+                each.shutdown();
+                each.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
+            } catch (final InterruptedException ex) {
+                ex.printStackTrace(System.err);
             }
         });
     }
-    
-    private ExecutorService getExecutorService(final String 
executorServiceKey) {
-        return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
-                new LinkedBlockingQueue<Runnable>(), new 
ThreadFactoryBuilder().setNameFormat("ITRunnerScheduler-" + executorServiceKey 
+ "-pool-%d").build());
-    }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
index 740d7ef..f661d6c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITRunnerWithParametersFactory.java
@@ -23,19 +23,11 @@ import 
org.junit.runners.parameterized.ParametersRunnerFactory;
 import org.junit.runners.parameterized.TestWithParameters;
 
 /**
- * A {@code ParameterizedRunnerFactory} creates a runner for a single
- * {@link TestWithParameters}.
+ * Integration test runner with parameters factory.
  */
 public final class ITRunnerWithParametersFactory implements 
ParametersRunnerFactory {
     
-    /**
-     * Returns a runner for the specified {@link TestWithParameters}.
-     *
-     * @param test test with parameters
-     * @return runner runner
-     * @throws InitializationError
-     *             if the runner could not be created.
-     */
+    @Override
     public Runner createRunnerForTestWithParameters(final TestWithParameters 
test) throws InitializationError {
         return new ITBlockJUnit4ClassRunnerWithParameters(test);
     }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/watcher/ITWatcher.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITWatcher.java
similarity index 94%
rename from 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/watcher/ITWatcher.java
rename to 
shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITWatcher.java
index 277bf3d..eb11939 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/watcher/ITWatcher.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ITWatcher.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.integration.engine.watcher;
+package org.apache.shardingsphere.test.integration.engine.junit;
 
 import lombok.extern.slf4j.Slf4j;
 import org.junit.rules.TestWatcher;
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
index de947d0..20943c3 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/engine/junit/ParallelParameterized.java
@@ -20,19 +20,18 @@ package 
org.apache.shardingsphere.test.integration.engine.junit;
 import org.junit.runners.Parameterized;
 
 /**
- * Parallel parameterized by parameter.
+ * Parallel parameterized.
+ * 
+ * <p>
+ *     Reflective call only, do not use programmatically.
+ * </p>
  */
 public final class ParallelParameterized extends Parameterized {
     
-    /**
-     * Only called reflectively. Do not use programmatically.
-     *
-     * @param klass root of the suite
-     */
     //CHECKSTYLE:OFF
     public ParallelParameterized(final Class<?> klass) throws Throwable {
+        //CHECKSTYLE:ON
         super(klass);
         setScheduler(new ITRunnerScheduler());
-        //CHECKSTYLE:ON
     }
 }

Reply via email to