You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/02/11 14:25:36 UTC

[shardingsphere] branch master updated: Refactor db-discovery it use awaitility framework replace sleep (#24105)

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

duanzhengqiang 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 915dfd21770 Refactor db-discovery it use awaitility framework replace sleep (#24105)
915dfd21770 is described below

commit 915dfd217707874762a8fc255258bcf16e63e67f
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Sat Feb 11 22:25:29 2023 +0800

    Refactor db-discovery it use awaitility framework replace sleep (#24105)
    
    * Refactor db-discovery it use awaitility framework replace sleep
    
    * Add DistSQLCommandPOJO class
    
    * Fix ci
    
    * Fix code style
    
    * Adjustment Durations.ONE_MINUTE
    
    * Correct import
---
 test/e2e/discovery/pom.xml                         |  5 ++
 .../e2e/discovery/build/DiscoveryRuleBuilder.java  | 38 ++++++---
 .../discovery/cases/base/BaseDiscoveryE2EIT.java   | 24 ++----
 .../discovery/command/DiscoveryDistSQLCommand.java | 11 ++-
 .../DistSQLCommandPOJO.java}                       | 16 ++--
 .../resources/env/common/discovery-command.xml     | 97 +++++++++++++---------
 6 files changed, 112 insertions(+), 79 deletions(-)

diff --git a/test/e2e/discovery/pom.xml b/test/e2e/discovery/pom.xml
index ac62dd16a74..2e1b9880f70 100644
--- a/test/e2e/discovery/pom.xml
+++ b/test/e2e/discovery/pom.xml
@@ -46,6 +46,11 @@
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
         
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+        </dependency>
+        
         <dependency>
             <groupId>com.zaxxer</groupId>
             <artifactId>HikariCP</artifactId>
diff --git a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/build/DiscoveryRuleBuilder.java b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/build/DiscoveryRuleBuilder.java
index 3496d324f96..6bc68591474 100644
--- a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/build/DiscoveryRuleBuilder.java
+++ b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/build/DiscoveryRuleBuilder.java
@@ -17,17 +17,18 @@
 
 package org.apache.shardingsphere.test.e2e.discovery.build;
 
-import org.apache.shardingsphere.data.pipeline.core.util.ThreadUtil;
 import org.apache.shardingsphere.test.e2e.discovery.cases.base.BaseDiscoveryE2EIT;
 import org.apache.shardingsphere.test.e2e.discovery.command.DiscoveryDistSQLCommand;
+import org.awaitility.Awaitility;
+import org.awaitility.Durations;
 
 import javax.sql.DataSource;
 import javax.xml.bind.JAXB;
 import java.sql.Connection;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Objects;
-import java.util.concurrent.TimeUnit;
 
 /**
  * Build discovery rule.
@@ -60,23 +61,38 @@ public final class DiscoveryRuleBuilder {
     }
     
     private void createDatabase(final Statement statement) throws SQLException {
-        statement.execute("CREATE DATABASE db_discovery");
-        ThreadUtil.sleep(1, TimeUnit.SECONDS);
-        statement.execute("USE db_discovery");
+        statement.execute(discoveryDistSQLCommand.getCreateDatabase().getExecuteSQL());
+        Awaitility.await().atMost(Durations.ONE_SECOND).until(() -> assertResult(statement, discoveryDistSQLCommand.getCreateDatabase().getAssertionSQL()));
+    }
+    
+    private boolean assertResult(final Statement statement, final String assertionSQL) {
+        try (ResultSet resultSet = statement.executeQuery(assertionSQL)) {
+            return true;
+        } catch (final SQLException ignored) {
+            return false;
+        }
     }
     
     private void registerStorageUnits(final Statement statement) throws SQLException {
-        statement.execute(discoveryDistSQLCommand.getRegisterStorageUnit());
-        ThreadUtil.sleep(2, TimeUnit.SECONDS);
+        statement.execute(discoveryDistSQLCommand.getRegisterStorageUnits().getExecuteSQL());
+        Awaitility.await().atMost(Durations.TWO_SECONDS).until(() -> assertResult0(statement, discoveryDistSQLCommand.getRegisterStorageUnits().getAssertionSQL()));
     }
     
     private void createDiscoveryRule(final Statement statement) throws SQLException {
-        statement.execute(discoveryDistSQLCommand.getCreateDiscoveryRule());
-        ThreadUtil.sleep(2, TimeUnit.SECONDS);
+        statement.execute(discoveryDistSQLCommand.getCreateDiscoveryRule().getExecuteSQL());
+        Awaitility.await().atMost(Durations.TWO_SECONDS).until(() -> assertResult0(statement, discoveryDistSQLCommand.getCreateDiscoveryRule().getAssertionSQL()));
     }
     
     private void createReadwriteSplittingRule(final Statement statement) throws SQLException {
-        statement.execute(discoveryDistSQLCommand.getCreateReadwriteSplittingRule());
-        ThreadUtil.sleep(2, TimeUnit.SECONDS);
+        statement.execute(discoveryDistSQLCommand.getCreateReadwriteSplittingRule().getExecuteSQL());
+        Awaitility.await().atMost(Durations.TWO_SECONDS).until(() -> assertResult0(statement, discoveryDistSQLCommand.getCreateReadwriteSplittingRule().getAssertionSQL()));
+    }
+    
+    private boolean assertResult0(final Statement statement, final String assertionSQL) {
+        try (ResultSet resultSet = statement.executeQuery(assertionSQL)) {
+            return resultSet.next();
+        } catch (final SQLException ignored) {
+            return false;
+        }
     }
 }
diff --git a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
index 55bda35ae23..3cef8147bbc 100644
--- a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
+++ b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java
@@ -22,7 +22,6 @@ import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
-import org.apache.shardingsphere.data.pipeline.core.util.ThreadUtil;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.test.e2e.discovery.build.DiscoveryRuleBuilder;
 import org.apache.shardingsphere.test.e2e.discovery.cases.DatabaseClusterEnvironment;
@@ -30,6 +29,8 @@ import org.apache.shardingsphere.test.e2e.discovery.env.DiscoveryE2ETestEnvironm
 import org.apache.shardingsphere.test.e2e.discovery.framework.container.compose.BaseContainerComposer;
 import org.apache.shardingsphere.test.e2e.discovery.framework.container.compose.DockerContainerComposer;
 import org.apache.shardingsphere.test.e2e.discovery.framework.parameter.DiscoveryTestParameter;
+import org.awaitility.Awaitility;
+import org.awaitility.Durations;
 
 import javax.sql.DataSource;
 import java.sql.Connection;
@@ -39,11 +40,9 @@ import java.sql.Statement;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.TimeUnit;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertNotEquals;
 
 @Getter(AccessLevel.PROTECTED)
 @Slf4j
@@ -84,8 +83,7 @@ public abstract class BaseDiscoveryE2EIT {
     public void assertClosePrimaryDataSource(final DatabaseClusterEnvironment mgrEnvironment) throws SQLException {
         String oldPrimaryDataSourceName = getPrimaryDataSourceName();
         closeDataSource(mgrEnvironment.getDataSources().get(oldPrimaryDataSourceName));
-        String newPrimaryDataSourceName = getPrimaryDataSourceName();
-        assertPrimaryDataSourceChanged(oldPrimaryDataSourceName, newPrimaryDataSourceName);
+        Awaitility.await().atMost(Durations.ONE_MINUTE).until(() -> !oldPrimaryDataSourceName.equals(getPrimaryDataSourceName()));
         mgrEnvironment.getDataSources().remove(oldPrimaryDataSourceName);
     }
     
@@ -122,11 +120,6 @@ public abstract class BaseDiscoveryE2EIT {
                 Statement statement = connection.createStatement()) {
             statement.execute("SHUTDOWN");
         }
-        ThreadUtil.sleep(35, TimeUnit.SECONDS);
-    }
-    
-    private void assertPrimaryDataSourceChanged(final String oldPrimaryDataSourceName, final String newPrimaryDataSourceName) {
-        assertNotEquals(oldPrimaryDataSourceName, newPrimaryDataSourceName);
     }
     
     /**
@@ -138,8 +131,8 @@ public abstract class BaseDiscoveryE2EIT {
         mgrEnvironment.getDataSources().remove(getPrimaryDataSourceName());
         String closedRoutingDataSourceName = getCloseReplicationDataSourceName(mgrEnvironment);
         mgrEnvironment.getDataSources().remove(closedRoutingDataSourceName);
-        String routeDataSourceName = getRouteDataSourceName();
-        assertRouteDataSourceName(routeDataSourceName, Objects.requireNonNull(mgrEnvironment.getDataSources().entrySet().stream().findFirst().orElse(null)).getKey());
+        Awaitility.await().atMost(Durations.ONE_MINUTE).until(() ->
+                getRouteDataSourceName().equals(Objects.requireNonNull(mgrEnvironment.getDataSources().entrySet().stream().findFirst().orElse(null)).getKey()));
     }
     
     private String getCloseReplicationDataSourceName(final DatabaseClusterEnvironment mgrEnvironment) throws SQLException {
@@ -164,11 +157,6 @@ public abstract class BaseDiscoveryE2EIT {
         }
     }
     
-    private void assertRouteDataSourceName(final String actualRouteDataSourceName, final String expectedRouteDataSourceName) {
-        Preconditions.checkState(StringUtils.isNotBlank(actualRouteDataSourceName) && StringUtils.isNotBlank(expectedRouteDataSourceName));
-        assertThat(actualRouteDataSourceName, is(expectedRouteDataSourceName));
-    }
-    
     /**
      * Assert close all replication data source.
      * @param mgrEnvironment mgr environment
@@ -176,6 +164,6 @@ public abstract class BaseDiscoveryE2EIT {
      */
     public void assertCloseAllReplicationDataSource(final DatabaseClusterEnvironment mgrEnvironment) throws SQLException {
         closeDataSource(Objects.requireNonNull(mgrEnvironment.getDataSources().values().stream().findFirst().orElse(null)));
-        assertRouteDataSourceName(getRouteDataSourceName(), getPrimaryDataSourceName());
+        Awaitility.await().atMost(Durations.ONE_MINUTE).until(() -> getRouteDataSourceName().equals(getPrimaryDataSourceName()));
     }
 }
diff --git a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java
index b2736549426..ffea573a48c 100644
--- a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java
+++ b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.test.e2e.discovery.command;
 
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.shardingsphere.test.e2e.discovery.pojo.DistSQLCommandPOJO;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -30,15 +31,19 @@ import javax.xml.bind.annotation.XmlRootElement;
 @XmlAccessorType(XmlAccessType.FIELD)
 public final class DiscoveryDistSQLCommand {
     
+    @XmlElement(name = "create-database")
+    @Getter
+    private DistSQLCommandPOJO createDatabase;
+    
     @XmlElement(name = "register-storage-unit")
     @Getter
-    private String registerStorageUnit;
+    private DistSQLCommandPOJO registerStorageUnits;
     
     @XmlElement(name = "create-discovery-rule")
     @Getter
-    private String createDiscoveryRule;
+    private DistSQLCommandPOJO createDiscoveryRule;
     
     @XmlElement(name = "create-readwrite-splitting-rule")
     @Getter
-    private String createReadwriteSplittingRule;
+    private DistSQLCommandPOJO createReadwriteSplittingRule;
 }
diff --git a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/pojo/DistSQLCommandPOJO.java
similarity index 73%
copy from test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java
copy to test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/pojo/DistSQLCommandPOJO.java
index b2736549426..0be98b4887a 100644
--- a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/command/DiscoveryDistSQLCommand.java
+++ b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/pojo/DistSQLCommandPOJO.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.e2e.discovery.command;
+package org.apache.shardingsphere.test.e2e.discovery.pojo;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -28,17 +28,13 @@ import javax.xml.bind.annotation.XmlRootElement;
 @Setter
 @XmlRootElement(name = "command")
 @XmlAccessorType(XmlAccessType.FIELD)
-public final class DiscoveryDistSQLCommand {
+public final class DistSQLCommandPOJO {
     
-    @XmlElement(name = "register-storage-unit")
+    @XmlElement(name = "execute-sql")
     @Getter
-    private String registerStorageUnit;
+    private String executeSQL;
     
-    @XmlElement(name = "create-discovery-rule")
+    @XmlElement(name = "assertion-sql")
     @Getter
-    private String createDiscoveryRule;
-    
-    @XmlElement(name = "create-readwrite-splitting-rule")
-    @Getter
-    private String createReadwriteSplittingRule;
+    private String assertionSQL;
 }
diff --git a/test/e2e/discovery/src/test/resources/env/common/discovery-command.xml b/test/e2e/discovery/src/test/resources/env/common/discovery-command.xml
index cd87ad4ef58..6c8fd58b3f2 100644
--- a/test/e2e/discovery/src/test/resources/env/common/discovery-command.xml
+++ b/test/e2e/discovery/src/test/resources/env/common/discovery-command.xml
@@ -16,49 +16,72 @@
   -->
 
 <command>
+    <create-database>
+        <execute-sql>
+            CREATE DATABASE db_discovery;
+        </execute-sql>
+        <assertion-sql>
+            USE db_discovery;
+        </assertion-sql>
+    </create-database>
     <register-storage-unit>
-        REGISTER STORAGE UNIT ds_0 (
-        HOST="mysql_1",
-        PORT=3306,
-        DB="it_discovery_test",
-        USER="test_user",
-        PASSWORD="Test@123",
-        PROPERTIES("connectionTimeout"="5000")
-        ),ds_1 (
-        HOST="mysql_2",
-        PORT=3306,
-        DB="it_discovery_test",
-        USER="test_user",
-        PASSWORD="Test@123",
-        PROPERTIES("connectionTimeout"="5000")
-        ),ds_2 (
-        HOST="mysql_3",
-        PORT=3306,
-        DB="it_discovery_test",
-        USER="test_user",
-        PASSWORD="Test@123",
-        PROPERTIES("connectionTimeout"="5000")
-        ),ds_3 (
-        HOST="mysql_4",
-        PORT=3306,
-        DB="it_discovery_test",
-        USER="test_user",
-        PASSWORD="Test@123",
-        PROPERTIES("connectionTimeout"="5000")
-        );
+        <execute-sql>
+            REGISTER STORAGE UNIT ds_0 (
+            HOST="mysql_1",
+            PORT=3306,
+            DB="it_discovery_test",
+            USER="test_user",
+            PASSWORD="Test@123",
+            PROPERTIES("connectionTimeout"="5000")
+            ),ds_1 (
+            HOST="mysql_2",
+            PORT=3306,
+            DB="it_discovery_test",
+            USER="test_user",
+            PASSWORD="Test@123",
+            PROPERTIES("connectionTimeout"="5000")
+            ),ds_2 (
+            HOST="mysql_3",
+            PORT=3306,
+            DB="it_discovery_test",
+            USER="test_user",
+            PASSWORD="Test@123",
+            PROPERTIES("connectionTimeout"="5000")
+            ),ds_3 (
+            HOST="mysql_4",
+            PORT=3306,
+            DB="it_discovery_test",
+            USER="test_user",
+            PASSWORD="Test@123",
+            PROPERTIES("connectionTimeout"="5000")
+            );
+        </execute-sql>
+        <assertion-sql>
+            SHOW STORAGE UNITS;
+        </assertion-sql>
     </register-storage-unit>
 
     <create-discovery-rule>
-        CREATE DB_DISCOVERY RULE replica_ds (
-        STORAGE_UNITS(ds_0, ds_1, ds_2, ds_3),
-        TYPE(NAME='MySQL.MGR',PROPERTIES('group-name'='558edd3c-02ec-11ea-9bb3-080027e39bd2')),
-        HEARTBEAT(PROPERTIES('keep-alive-cron'='0/2 * * * * ?'))
-        );
+        <execute-sql>
+            CREATE DB_DISCOVERY RULE replica_ds (
+            STORAGE_UNITS(ds_0, ds_1, ds_2, ds_3),
+            TYPE(NAME='MySQL.MGR',PROPERTIES('group-name'='558edd3c-02ec-11ea-9bb3-080027e39bd2')),
+            HEARTBEAT(PROPERTIES('keep-alive-cron'='0/2 * * * * ?'))
+            );
+        </execute-sql>
+        <assertion-sql>
+            SHOW DB_DISCOVERY RULES replica_ds;
+        </assertion-sql>
     </create-discovery-rule>
 
     <create-readwrite-splitting-rule>
-        CREATE READWRITE_SPLITTING RULE readwrite_ds (
-        AUTO_AWARE_RESOURCE=replica_ds
-        );
+        <execute-sql>
+            CREATE READWRITE_SPLITTING RULE readwrite_ds (
+            AUTO_AWARE_RESOURCE=replica_ds
+            );
+        </execute-sql>
+        <assertion-sql>
+            SHOW READWRITE_SPLITTING RULES replica_ds;
+        </assertion-sql>
     </create-readwrite-splitting-rule>
 </command>