You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2021/05/05 16:41:09 UTC

[iotdb] branch test_container updated (5aaf387 -> 73eb4ea)

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

hxd pushed a change to branch test_container
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


    from 5aaf387  add new thrift service: ClusterInfoService
     new 5568154  add clusterinfo test
     new 73eb4ea  refactor testcontainer

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/iotdb/cluster/ClusterMain.java | 12 +++-
 .../iotdb/cluster/server/MetaClusterServer.java    | 11 +++
 ...sterInfoService.java => ClusterInfoServer.java} | 10 +--
 .../server/clusterInfo/ClusterInfoServerMBean.java |  3 +
 .../server/clusterInfo/ClusterInfoServiceImpl.java |  2 +-
 .../server/clusterinfo/ClusterInfoServerTest.java  | 80 ++++++++++++++++++++++
 .../clusterinfo/ClusterInfoServiceImplTest.java    | 71 ++++++++++++++++---
 .../server/clusterinfo/ClusterInfoServiceTest.java | 44 ------------
 .../cluster/server/member/MetaGroupMemberTest.java |  5 +-
 .../iotdb/db/sql/{ClusterIT.java => Cases.java}    | 57 ++-------------
 .../java/org/apache/iotdb/db/sql/ClusterIT.java    | 54 +++------------
 .../java/org/apache/iotdb/db/sql/SingleNodeIT.java | 40 +++--------
 .../iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java   |  4 ++
 .../iotdb/db/sql/nodes5/FiveNodeCluster2IT.java    |  4 ++
 .../iotdb/db/sql/nodes5/FiveNodeCluster4IT.java    |  4 ++
 15 files changed, 208 insertions(+), 193 deletions(-)
 rename cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/{ClusterInfoService.java => ClusterInfoServer.java} (91%)
 create mode 100644 cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java
 create mode 100644 cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
 delete mode 100644 cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java
 copy testcontainer/src/test/java/org/apache/iotdb/db/sql/{ClusterIT.java => Cases.java} (61%)

[iotdb] 02/02: refactor testcontainer

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch test_container
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 73eb4ead90cacc5b4d1a37e018c2a58128827fb3
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Thu May 6 00:38:43 2021 +0800

    refactor testcontainer
---
 .../java/org/apache/iotdb/cluster/ClusterMain.java |  2 +-
 .../server/clusterinfo/ClusterInfoServerTest.java  |  4 +-
 .../clusterinfo/ClusterInfoServiceImplTest.java    | 12 ++----
 .../test/java/org/apache/iotdb/db/sql/Cases.java   | 20 ++++++---
 .../java/org/apache/iotdb/db/sql/ClusterIT.java    | 50 ++--------------------
 .../java/org/apache/iotdb/db/sql/SingleNodeIT.java | 40 ++++-------------
 6 files changed, 32 insertions(+), 96 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
index 3518a8b..139bcd6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
@@ -36,8 +36,8 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
-
 import org.apache.iotdb.db.utils.TestOnly;
+
 import org.apache.thrift.TException;
 import org.apache.thrift.async.TAsyncClientManager;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
index c0574ea..35818f8 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
@@ -23,11 +23,9 @@ import org.apache.iotdb.cluster.rpc.thrift.ClusterInfoService;
 import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServer;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
-import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.rpc.RpcTransportFactory;
-import org.apache.iotdb.service.rpc.thrift.TSIService;
+
 import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TCompactProtocol;
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransport;
 import org.apache.thrift.transport.TTransportException;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
index 63eacc3..544bfcd 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
@@ -19,28 +19,24 @@
 
 package org.apache.iotdb.cluster.server.clusterinfo;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
 import org.apache.iotdb.cluster.ClusterMain;
-import org.apache.iotdb.cluster.partition.PartitionTable;
 import org.apache.iotdb.cluster.rpc.thrift.DataPartitionEntry;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.MetaClusterServer;
 import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServiceImpl;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
-
 import org.apache.iotdb.cluster.server.member.MetaGroupMemberTest;
-import org.apache.iotdb.db.engine.StorageEngine;
-import org.apache.iotdb.db.exception.metadata.IllegalPathException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.metadata.PartialPath;
+
 import org.apache.thrift.TException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.powermock.reflect.Whitebox;
+
+import java.util.Collections;
+import java.util.List;
 
 public class ClusterInfoServiceImplTest {
 
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
index 4cae584..bbb9e6a 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
@@ -18,21 +18,29 @@
  */
 package org.apache.iotdb.db.sql;
 
+import org.junit.Assert;
+import org.junit.Test;
+
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.HashSet;
 import java.util.Set;
-import org.junit.Assert;
-import org.junit.Test;
 
 public abstract class Cases {
 
-  private Statement writeStatement;
-  private Connection writeConnection;
-  private Statement readStatement;
-  private Connection readConnection;
+  protected Statement writeStatement;
+  protected Connection writeConnection;
+  protected Statement readStatement;
+  protected Connection readConnection;
+
+  public void tearDown() throws Exception {
+    writeStatement.close();
+    writeConnection.close();
+    readStatement.close();
+    readConnection.close();
+  }
 
   @Test
   public void testSimplePutAndGet() throws SQLException {
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
index 6dc6c76..c1ee5a7 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
@@ -22,22 +22,18 @@ package org.apache.iotdb.db.sql;
 import org.apache.iotdb.jdbc.Config;
 
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testcontainers.containers.DockerComposeContainer;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.HashSet;
-import java.util.Set;
 
-public abstract class ClusterIT {
+// do not add tests here.
+// add tests into Cases.java instead.
+public abstract class ClusterIT extends Cases {
 
   private static Logger logger = LoggerFactory.getLogger(ClusterIT.class);
 
@@ -87,44 +83,6 @@ public abstract class ClusterIT {
 
   @After
   public void tearDown() throws Exception {
-    writeStatement.close();
-    writeConnection.close();
-    readStatement.close();
-    readConnection.close();
-  }
-
-  @Test
-  public void testSimplePutAndGet() throws SQLException {
-
-    String[] timeSeriesArray = {"root.sg1.aa.bb", "root.sg1.aa.bb.cc", "root.sg1.aa"};
-
-    for (String timeSeries : timeSeriesArray) {
-      writeStatement.execute(
-          String.format(
-              "create timeseries %s with datatype=INT64, encoding=PLAIN, compression=SNAPPY",
-              timeSeries));
-    }
-    ResultSet resultSet = null;
-    resultSet = readStatement.executeQuery("show timeseries");
-    Set<String> result = new HashSet<>();
-    while (resultSet.next()) {
-      result.add(resultSet.getString(1));
-    }
-    Assert.assertEquals(3, result.size());
-    for (String timeseries : timeSeriesArray) {
-      Assert.assertTrue(result.contains(timeseries));
-    }
-    resultSet.close();
-
-    // test https://issues.apache.org/jira/browse/IOTDB-1331
-    writeStatement.execute("insert into root.ln.wf01.wt01(time, temperature) values(10, 1.0)");
-    resultSet = readStatement.executeQuery("select avg(temperature) from root.ln.wf01.wt01");
-    if (resultSet.next()) {
-      Assert.assertEquals(1.0, resultSet.getDouble(1), 0.01);
-    } else {
-      Assert.fail("expect 1 result, but get an empty resultSet.");
-    }
-    Assert.assertFalse(resultSet.next());
-    resultSet.close();
+    super.tearDown();
   }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/SingleNodeIT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/SingleNodeIT.java
index 65b32ec..3a042e9 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/SingleNodeIT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/SingleNodeIT.java
@@ -32,13 +32,11 @@ import org.testcontainers.utility.DockerImageName;
 
 import java.io.File;
 import java.sql.*;
-import java.util.HashSet;
-import java.util.Set;
 
-public class SingleNodeIT {
+// do not add tests here.
+// add tests into Cases.java instead.
+public class SingleNodeIT extends Cases {
   private static Logger logger = LoggerFactory.getLogger(SingleNodeIT.class);
-  private Statement statement;
-  private Connection connection;
 
   @Rule
   public GenericContainer dslContainer =
@@ -63,38 +61,16 @@ public class SingleNodeIT {
   @Before
   public void setUp() throws Exception {
     rpcPort = dslContainer.getMappedPort(6667);
-
     syncPort = dslContainer.getMappedPort(5555);
     Class.forName(Config.JDBC_DRIVER_NAME);
-    connection = DriverManager.getConnection("jdbc:iotdb://127.0.0.1:" + rpcPort, "root", "root");
-    statement = connection.createStatement();
+    writeConnection =
+        readConnection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:" + rpcPort, "root", "root");
+    writeStatement = readStatement = writeConnection.createStatement();
   }
 
   @After
   public void tearDown() throws Exception {
-    statement.close();
-    connection.close();
-  }
-
-  @Test
-  public void testSimplePutAndGet() throws SQLException {
-    String[] timeSeriesArray = {"root.sg1.aa.bb", "root.sg1.aa.bb.cc", "root.sg1.aa"};
-
-    for (String timeSeries : timeSeriesArray) {
-      statement.execute(
-          String.format(
-              "create timeseries %s with datatype=INT64, encoding=PLAIN, compression=SNAPPY",
-              timeSeries));
-    }
-    ResultSet resultSet = null;
-    resultSet = statement.executeQuery("show timeseries");
-    Set<String> result = new HashSet<>();
-    while (resultSet.next()) {
-      result.add(resultSet.getString(1));
-    }
-    Assert.assertEquals(3, result.size());
-    for (String timeseries : timeSeriesArray) {
-      Assert.assertTrue(result.contains(timeseries));
-    }
+    super.tearDown();
   }
 }

[iotdb] 01/02: add clusterinfo test

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch test_container
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5568154f9c451f1f16935cccd818b34e24a4f716
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Thu May 6 00:34:36 2021 +0800

    add clusterinfo test
---
 .../java/org/apache/iotdb/cluster/ClusterMain.java | 12 +++-
 .../iotdb/cluster/server/MetaClusterServer.java    | 11 +++
 ...sterInfoService.java => ClusterInfoServer.java} | 10 +--
 .../server/clusterInfo/ClusterInfoServerMBean.java |  3 +
 .../server/clusterInfo/ClusterInfoServiceImpl.java |  2 +-
 .../server/clusterinfo/ClusterInfoServerTest.java  | 82 ++++++++++++++++++++++
 .../clusterinfo/ClusterInfoServiceImplTest.java    | 75 +++++++++++++++++---
 .../server/clusterinfo/ClusterInfoServiceTest.java | 44 ------------
 .../cluster/server/member/MetaGroupMemberTest.java |  5 +-
 .../iotdb/db/sql/{ClusterIT.java => Cases.java}    | 61 +---------------
 .../java/org/apache/iotdb/db/sql/ClusterIT.java    |  4 ++
 .../iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java   |  4 ++
 .../iotdb/db/sql/nodes5/FiveNodeCluster2IT.java    |  4 ++
 .../iotdb/db/sql/nodes5/FiveNodeCluster4IT.java    |  4 ++
 14 files changed, 200 insertions(+), 121 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
index eb91d0c..3518a8b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterMain.java
@@ -29,7 +29,7 @@ import org.apache.iotdb.cluster.partition.slot.SlotStrategy;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.MetaClusterServer;
 import org.apache.iotdb.cluster.server.Response;
-import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoService;
+import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServer;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 
+import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.TAsyncClientManager;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -109,7 +110,7 @@ public class ClusterMain {
         metaServer.buildCluster();
         // Currently, we do not reigher ClusterInfoService as a JMX Bean,
         // so we use startService() rather than start()
-        ClusterInfoService.getInstance().startService();
+        ClusterInfoServer.getInstance().startService();
       } catch (TTransportException
           | StartupException
           | QueryProcessException
@@ -126,7 +127,7 @@ public class ClusterMain {
         metaServer.joinCluster();
         // Currently, we do not reigher ClusterInfoService as a JMX Bean,
         // so we use startService() rather than start()
-        ClusterInfoService.getInstance().startService();
+        ClusterInfoServer.getInstance().startService();
       } catch (TTransportException
           | StartupException
           | QueryProcessException
@@ -307,4 +308,9 @@ public class ClusterMain {
           }
         });
   }
+
+  @TestOnly
+  public static void setMetaClusterServer(MetaClusterServer metaClusterServer) {
+    metaServer = metaClusterServer;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
index 24331d7..61463a1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
@@ -36,6 +36,7 @@ import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.RegisterManager;
+import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 
 import org.apache.thrift.TException;
@@ -356,4 +357,14 @@ public class MetaClusterServer extends RaftServer
   public void handshake(Node sender, AsyncMethodCallback<Void> resultHandler) {
     asyncService.handshake(sender, resultHandler);
   }
+
+  @TestOnly
+  public void setMetaGroupMember(MetaGroupMember metaGroupMember) {
+    this.member = metaGroupMember;
+  }
+
+  @TestOnly
+  public IoTDB getIoTDB() {
+    return ioTDB;
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoService.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServer.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoService.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServer.java
index 1e84255..53dcb5e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServer.java
@@ -30,10 +30,10 @@ import org.apache.iotdb.db.service.ServiceType;
 import org.apache.iotdb.db.service.thrift.ThriftService;
 import org.apache.iotdb.db.service.thrift.ThriftServiceThread;
 
-public class ClusterInfoService extends ThriftService {
+public class ClusterInfoServer extends ThriftService implements ClusterInfoServerMBean {
   private ClusterInfoServiceImpl serviceImpl;
 
-  public static ClusterInfoService getInstance() {
+  public static ClusterInfoServer getInstance() {
     return ClusterMonitorServiceHolder.INSTANCE;
   }
 
@@ -64,7 +64,7 @@ public class ClusterInfoService extends ThriftService {
               getID().getName(),
               ThreadName.CLUSTER_INFO_SERVICE.getName(),
               nodeConfig.getRpcAddress(),
-              clusterConfig.getClusterRpcPort(),
+              clusterConfig.getClusterInfoRpcPort(),
               nodeConfig.getRpcMaxConcurrentClientNum(),
               nodeConfig.getThriftServerAwaitTimeForStopService(),
               new ClusterInfoServiceThriftHandler(serviceImpl),
@@ -82,12 +82,12 @@ public class ClusterInfoService extends ThriftService {
 
   @Override
   public int getBindPort() {
-    return ClusterDescriptor.getInstance().getConfig().getClusterRpcPort();
+    return ClusterDescriptor.getInstance().getConfig().getClusterInfoRpcPort();
   }
 
   private static class ClusterMonitorServiceHolder {
 
-    private static final ClusterInfoService INSTANCE = new ClusterInfoService();
+    private static final ClusterInfoServer INSTANCE = new ClusterInfoServer();
 
     private ClusterMonitorServiceHolder() {}
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java
new file mode 100644
index 0000000..aa3c00f
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServerMBean.java
@@ -0,0 +1,3 @@
+package org.apache.iotdb.cluster.server.clusterInfo;
+
+public interface ClusterInfoServerMBean {}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java
index 85974c8..b3e4908 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterInfo/ClusterInfoServiceImpl.java
@@ -45,7 +45,7 @@ public class ClusterInfoServiceImpl implements ClusterInfoService.Iface {
     List<DataPartitionEntry> result = new ArrayList<>(partitions.size());
     partitions.forEach(
         (multikey, nodes) ->
-            result.add(new DataPartitionEntry(multikey.getKey(1), multikey.getKey(2), nodes)));
+            result.add(new DataPartitionEntry(multikey.getKey(0), multikey.getKey(1), nodes)));
     return result;
   }
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
new file mode 100644
index 0000000..c0574ea
--- /dev/null
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.cluster.server.clusterinfo;
+
+import org.apache.iotdb.cluster.config.ClusterDescriptor;
+import org.apache.iotdb.cluster.rpc.thrift.ClusterInfoService;
+import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServer;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.RpcTransportFactory;
+import org.apache.iotdb.service.rpc.thrift.TSIService;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TCompactProtocol;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClusterInfoServerTest {
+  ClusterInfoServiceImplTest test;
+  ClusterInfoServer service;
+
+  @Before
+  public void setUp() throws Exception {
+    test = new ClusterInfoServiceImplTest();
+    test.setUp();
+    service = new ClusterInfoServer();
+    service.start();
+  }
+
+  @After
+  public void tearDown() throws MetadataException {
+    test.tearDown();
+    service.stop();
+  }
+
+  @Test
+  public void getID() {
+    System.out.println(service.getID());
+  }
+
+  @Test
+  public void testConnect() {
+    TTransport transport =
+        RpcTransportFactory.INSTANCE.getTransport(
+            new TSocket(
+                IoTDBDescriptor.getInstance().getConfig().getRpcAddress(),
+                ClusterDescriptor.getInstance().getConfig().getClusterRpcPort()));
+
+    try {
+      transport.open();
+    } catch (TTransportException e) {
+      Assert.fail(e.getMessage());
+    }
+    // connection success means OK.
+    ClusterInfoService.Client client =
+        new ClusterInfoService.Client(new TBinaryProtocol(transport));
+    Assert.assertNotNull(client);
+    // client's methods have been tested on ClusterInfoServiceImplTest
+    transport.close();
+  }
+}
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
index f8170ba..63eacc3 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
@@ -19,33 +19,90 @@
 
 package org.apache.iotdb.cluster.server.clusterinfo;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.apache.iotdb.cluster.ClusterMain;
+import org.apache.iotdb.cluster.partition.PartitionTable;
+import org.apache.iotdb.cluster.rpc.thrift.DataPartitionEntry;
+import org.apache.iotdb.cluster.rpc.thrift.Node;
+import org.apache.iotdb.cluster.server.MetaClusterServer;
 import org.apache.iotdb.cluster.server.clusterInfo.ClusterInfoServiceImpl;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 
+import org.apache.iotdb.cluster.server.member.MetaGroupMemberTest;
+import org.apache.iotdb.db.engine.StorageEngine;
+import org.apache.iotdb.db.exception.metadata.IllegalPathException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.db.metadata.PartialPath;
+import org.apache.thrift.TException;
+import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.powermock.reflect.Whitebox;
 
 public class ClusterInfoServiceImplTest {
 
+  ClusterInfoServiceImpl impl;
+
   @Before
-  public void setUp() {
-    ClusterInfoServiceImpl impl = new ClusterInfoServiceImpl();
-    MetaGroupMember metaGroupMember = new MetaGroupMember();
-    metaGroupMember.buildCluster();
+  public void setUp() throws Exception {
+    MetaGroupMemberTest metaGroupMemberTest = new MetaGroupMemberTest();
+    // will create a cluster with 10 nodes, ip: 0,10,20,...100
+    metaGroupMemberTest.setUp();
+    MetaGroupMember metaGroupMember = metaGroupMemberTest.getTestMetaGroupMember();
+
+    MetaClusterServer metaClusterServer = new MetaClusterServer();
+    metaClusterServer.getMember().stop();
+    metaClusterServer.setMetaGroupMember(metaGroupMember);
+
+    ClusterMain.setMetaClusterServer(metaClusterServer);
+
+    metaClusterServer.getIoTDB().metaManager.setStorageGroup(new PartialPath("root", "sg"));
+    // metaClusterServer.getMember()
+    impl = new ClusterInfoServiceImpl();
+  }
+
+  @After
+  public void tearDown() throws MetadataException {
+    ClusterMain.getMetaServer()
+        .getIoTDB()
+        .metaManager
+        .deleteStorageGroups(Collections.singletonList(new PartialPath("root", "sg")));
+    ClusterMain.getMetaServer().stop();
   }
 
   @Test
-  public void getRing() {}
+  public void getRing() throws TException {
+    List<Node> nodes = impl.getRing();
+    Assert.assertEquals(10, nodes.size());
+  }
 
   @Test
-  public void getDataPartition() {}
+  public void getDataPartition() {
+    List<DataPartitionEntry> entries = impl.getDataPartition("root.sg", 0, 100);
+    Assert.assertEquals(1, entries.size());
+    List<Node> nodes = entries.get(0).getNodes();
+    Assert.assertEquals(50, nodes.get(0).getNodeIdentifier());
+    Assert.assertEquals(60, nodes.get(1).getNodeIdentifier());
+  }
 
   @Test
-  public void getMetaPartition() {}
+  public void getMetaPartition() throws TException {
+    List<Node> nodes = impl.getMetaPartition("root.sg");
+    Assert.assertEquals(50, nodes.get(0).getNodeIdentifier());
+    Assert.assertEquals(60, nodes.get(1).getNodeIdentifier());
+  }
 
   @Test
-  public void getAllNodeStatus() {}
+  public void getAllNodeStatus() throws TException {
+    // TODO need to use mode to test getAllNodeStatus
+  }
 
   @Test
-  public void getInstrumentingInfo() {}
+  public void getInstrumentingInfo() throws TException {
+    // hard to test the content of the instrumentInfo.
+    Assert.assertNotNull(impl.getInstrumentingInfo());
+  }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java
deleted file mode 100644
index b51c2e0..0000000
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.iotdb.cluster.server.clusterinfo;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-public class ClusterInfoServiceTest {
-
-  @Test
-  public void getID() {}
-
-  @Test
-  public void getImplementation() {}
-
-  @Test
-  public void initTProcessor() {}
-
-  @Test
-  public void initThriftServiceThread() {}
-
-  @Test
-  public void getBindIP() {}
-
-  @Test
-  public void getBindPort() {}
-}
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
index 90cfeab..87cc093 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
@@ -187,7 +187,6 @@ public class MetaGroupMemberTest extends BaseMember {
     mockDataClusterServer = false;
     NodeStatusManager.getINSTANCE().setMetaGroupMember(testMetaMember);
     exiledNode = null;
-    System.out.println("Init term of metaGroupMember: " + testMetaMember.getTerm().get());
   }
 
   private DataGroupMember getDataGroupMember(PartitionGroup group, Node node) {
@@ -1370,4 +1369,8 @@ public class MetaGroupMemberTest extends BaseMember {
             });
     while (resultRef.get() == null) {}
   }
+
+  public MetaGroupMember getTestMetaGroupMember() {
+    return testMetaMember;
+  }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
similarity index 61%
copy from testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
copy to testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
index ce6a681..4cae584 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/Cases.java
@@ -16,79 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.iotdb.db.sql;
 
-import org.apache.iotdb.jdbc.Config;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.DockerComposeContainer;
-
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.HashSet;
 import java.util.Set;
+import org.junit.Assert;
+import org.junit.Test;
 
-public abstract class ClusterIT {
-
-  private static Logger logger = LoggerFactory.getLogger(ClusterIT.class);
+public abstract class Cases {
 
   private Statement writeStatement;
   private Connection writeConnection;
   private Statement readStatement;
   private Connection readConnection;
 
-  protected int getWriteRpcPort() {
-    return getContainer().getServicePort("iotdb-server_1", 6667);
-  }
-
-  protected String getWriteRpcIp() {
-    return getContainer().getServiceHost("iotdb-server_1", 6667);
-  }
-
-  protected int getReadRpcPort() {
-    return getContainer().getServicePort("iotdb-server_1", 6667);
-  }
-
-  protected String getReadRpcIp() {
-    return getContainer().getServiceHost("iotdb-server_1", 6667);
-  }
-
-  protected void startCluster() {}
-
-  protected abstract DockerComposeContainer getContainer();
-
-  @Before
-  public void setUp() throws Exception {
-    startCluster();
-
-    Class.forName(Config.JDBC_DRIVER_NAME);
-    writeConnection =
-        DriverManager.getConnection(
-            "jdbc:iotdb://" + getWriteRpcIp() + ":" + getWriteRpcPort(), "root", "root");
-    writeStatement = writeConnection.createStatement();
-    readConnection =
-        DriverManager.getConnection(
-            "jdbc:iotdb://" + getReadRpcIp() + ":" + getReadRpcPort(), "root", "root");
-    readStatement = readConnection.createStatement();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    writeStatement.close();
-    writeConnection.close();
-    readStatement.close();
-    readConnection.close();
-  }
-
   @Test
   public void testSimplePutAndGet() throws SQLException {
 
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
index ce6a681..6dc6c76 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/ClusterIT.java
@@ -46,6 +46,10 @@ public abstract class ClusterIT {
   private Statement readStatement;
   private Connection readConnection;
 
+  // "root.sg1" is a special storage for testing whether the read and write operations can be run
+  // correctly if the data is not on the connected node.
+  public String defaultSG = "root.sg1";
+
   protected int getWriteRpcPort() {
     return getContainer().getServicePort("iotdb-server_1", 6667);
   }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java
index 1a5134a..80ea301 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes3/ThreeNodeCluster2IT.java
@@ -6,4 +6,8 @@ public class ThreeNodeCluster2IT extends AbstractThreeNodeClusterIT {
   protected String getWriteRpcIp() {
     return getContainer().getServiceHost("iotdb-server_2", 6667);
   }
+
+  protected int getWriteRpcPort() {
+    return getContainer().getServicePort("iotdb-server_2", 6667);
+  }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java
index d3a0e70..555241a 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster2IT.java
@@ -6,4 +6,8 @@ public class FiveNodeCluster2IT extends AbstractFiveNodeClusterIT {
   protected String getWriteRpcIp() {
     return getContainer().getServiceHost("iotdb-server_2", 6667);
   }
+
+  protected int getWriteRpcPort() {
+    return getContainer().getServicePort("iotdb-server_2", 6667);
+  }
 }
diff --git a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java
index d3cfd82..945a198 100644
--- a/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java
+++ b/testcontainer/src/test/java/org/apache/iotdb/db/sql/nodes5/FiveNodeCluster4IT.java
@@ -6,4 +6,8 @@ public class FiveNodeCluster4IT extends AbstractFiveNodeClusterIT {
   protected String getWriteRpcIp() {
     return getContainer().getServiceHost("iotdb-server_4", 6667);
   }
+
+  protected int getWriteRpcPort() {
+    return getContainer().getServicePort("iotdb-server_4", 6667);
+  }
 }