diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml
index 9c07faa..267edf8 100644
--- a/.github/workflows/e2e.yaml
+++ b/.github/workflows/e2e.yaml
@@ -42,6 +42,6 @@
           maven-version: 3.6.1
       - name: Set environment
         run: export MAVEN_OPTS='-Dmaven.repo.local=~/.m2/repository -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit -Xmx3g'
-      - name: Compile & Install Test Codes
+      - name: Compile & E2E Test
         run: |
-          mvn -f ./test/e2e/validator/pom.xml clean verify
+          mvn -f ./test/e2e/pom.xml package verify
diff --git a/.gitignore b/.gitignore
index e072784..c09bccb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,5 @@
 .vscode
 .checkstyle
 .externalToolBuilders
-/test/plugin/dist
-/test/plugin/workspace
+/test/e2e/agent-test-tools/dist
 /t/servroot/
diff --git a/test/e2e/agent-test-tools/bin/fetch-code.sh b/test/e2e/agent-test-tools/bin/fetch-code.sh
new file mode 100644
index 0000000..5189a45
--- /dev/null
+++ b/test/e2e/agent-test-tools/bin/fetch-code.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+# 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.
+
+WORK_DIRECTORY=$1
+RESPOSITORY=$2
+COMMIT_ID=$3
+DIST_DIRECTORY=$4
+
+HOME_DIR="$(cd "$(dirname $0)"; pwd)"
+
+git clone $RESPOSITORY $WORK_DIRECTORY
+
+cd $WORK_DIRECTORY
+
+git checkout $COMMIT_ID
+
+mvn -B package -DskipTests
+
+[[ -d $DIST_DIRECTORY ]] || mkdir -p $DIST_DIRECTORY
+
+cp $WORK_DIRECTORY/dist/* $DIST_DIRECTORY/
\ No newline at end of file
diff --git a/test/e2e/agent-test-tools/docker/Dockerfile b/test/e2e/agent-test-tools/docker/Dockerfile
new file mode 100644
index 0000000..ec78c24
--- /dev/null
+++ b/test/e2e/agent-test-tools/docker/Dockerfile
@@ -0,0 +1,29 @@
+# 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.
+
+FROM openjdk:8
+
+WORKDIR /usr/local/skywalking-nginx-lua
+
+COPY run.sh /
+RUN chmod +x /run.sh
+
+COPY skywalking-validator.jar ./agent-test-tools/skywalking-validator-tool.jar
+ADD skywalking-mock-collector.tar.gz agent-test-tools/
+RUN chmod +x ./agent-test-tools/skywalking-mock-collector/bin/collector-startup.sh
+
+CMD ["./agent-test-tools/skywalking-mock-collector/bin/collector-startup.sh"]
\ No newline at end of file
diff --git a/test/e2e/agent-test-tools/docker/run.sh b/test/e2e/agent-test-tools/docker/run.sh
new file mode 100644
index 0000000..de08a66
--- /dev/null
+++ b/test/e2e/agent-test-tools/docker/run.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+
+# 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.
+
+# The variable names in UPPERCASE ltter represent that they are injected from outside.
+
+base_home="$(cd "$(dirname $0)"; pwd)"
+
+function exitOnError() {
+    echo -e "\033[31m[ERROR] $1\033[0m">&2
+    exitAndClean 1
+}
+
+function healthCheck() {
+    HEALTH_CHECK_URL=$1
+
+    STATUS_CODE="-1"
+    TIMES=${TIMES:-150}
+    for ((i=1; i<=${TIMES}; i++));
+    do
+        STATUS_CODE="$(curl --max-time 3 -Is ${HEALTH_CHECK_URL} | head -n 1)"
+        if [[ $STATUS_CODE == *"200"* ]]; then
+          echo "${HEALTH_CHECK_URL}: ${STATUS_CODE}"
+          return 0
+        fi
+        sleep 2
+    done
+
+    exitOnError "$2 url=${HEALTH_CHECK_URL}, status=${STATUS_CODE} health check failed!"
+}
+
+if [[ -z "${TESTCASE_STARTUP_SCRIPT}" ]]; then
+    exitOnError "The name of startup script cannot be empty!"
+fi
+
+tools_home=/usr/local/skywalking-nginx-lua/agent-test-tools
+testcase_home=/usr/local/skywalking-nginx-lua/testcase
+
+echo "To start mock collector"
+${tools_home}/skywalking-mock-collector/bin/collector-startup.sh 1>/dev/null &
+healthCheck http://localhost:12800/receiveData
+
+healthCheck http://localhost:12800/status
+
+echo "To visit entry service"
+curl -s --max-time 3 ${TESTCASE_SERVICE_ENTRY}
+sleep 5
+
+echo "To receive actual data"
+curl -s --max-time 3 http://localhost:12800/receiveData > ${testcase_home}/data/actualData.yaml
+[[ ! -f ${testcase_home}/data/actualData.yaml ]] && exitOnError "${TESTCASE_NAME}, 'actualData.yaml' Not Found!"
+
+echo "To validate"
+java -jar \
+    -Xmx256m -Xms256m \
+    -DcaseName="${TESTCASE_NAME}" \
+    -DtestCasePath=${testcase_home}/data/ \
+    ${tools_home}/skywalking-validator-tool.jar 1>/dev/null
+status=$?
+
+if [[ $status -eq 0 ]]; then
+  echo "Scenario[${TESTCASE_NAME}] passed!" >&2
+else
+  cat ${testcase_home}/data/actualData.yaml >&2
+  exitOnError "Scenario[${TESTCASE_NAME}] failed!"
+fi
+exitAndClean $status
diff --git a/test/e2e/agent-test-tools/pom.xml b/test/e2e/agent-test-tools/pom.xml
new file mode 100644
index 0000000..09e6280
--- /dev/null
+++ b/test/e2e/agent-test-tools/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.skywalking.plugin.nginx-lua</groupId>
+        <artifactId>e2e-tests</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>agent-test-tools</artifactId>
+
+    <name>SkyWalking Agent Test Tools</name>
+    <packaging>jar</packaging>
+
+    <properties>
+        <docker.image.name>skywalking-collector</docker.image.name>
+        <docker-maven-plugin.version>0.4.13</docker-maven-plugin.version>
+        <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
+        <agent-test-tools.version>14b1499e65788d570ce5914b2ca7320cd36f961e</agent-test-tools.version>
+        <agent-test-tools.workingDirectory>${project.basedir}/target/agent-test-tools</agent-test-tools.workingDirectory>
+        <agent-test-tools.repos>https://github.com/apache/skywalking-agent-test-tool.git</agent-test-tools.repos>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>${exec-maven-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <phase>initialize</phase>
+                        <goals>
+                            <goal>exec</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <executable>bash</executable>
+                    <arguments>
+                        <argument>${project.basedir}/bin/fetch-code.sh</argument>
+                        <argument>${agent-test-tools.workingDirectory}</argument>
+                        <argument>${agent-test-tools.repos}</argument>
+                        <argument>${agent-test-tools.version}</argument>
+                        <argument>${project.basedir}/dist</argument>
+                    </arguments>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>${docker-maven-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <imageName>${docker.image.name}:${project.version}</imageName>
+                    <dockerDirectory>${project.basedir}/docker</dockerDirectory>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.basedir}/../agent-test-tools/dist</directory>
+                            <include>skywalking-mock-collector.tar.gz</include>
+                            <include>skywalking-validator.jar</include>
+                        </resource>
+                    </resources>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/test/e2e/e2e-with-mock-collector/docker/bin/startup.sh b/test/e2e/e2e-with-mock-collector/docker/bin/startup.sh
new file mode 100644
index 0000000..abb4561
--- /dev/null
+++ b/test/e2e/e2e-with-mock-collector/docker/bin/startup.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# 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.
+
+COLLECTOR=$(grep "skywalking-collector" /etc/hosts |awk -F" " '{print $1}')
+sed -e "s%\${collector}%${COLLECTOR}%g" /var/nginx/conf.d/nginx.conf > /var/run/nginx.conf
+
+/usr/bin/openresty -c /var/run/nginx.conf
\ No newline at end of file
diff --git a/test/e2e/e2e-with-mock-collector/docker/conf.d/nginx.conf b/test/e2e/e2e-with-mock-collector/docker/conf.d/nginx.conf
new file mode 100644
index 0000000..16b4427
--- /dev/null
+++ b/test/e2e/e2e-with-mock-collector/docker/conf.d/nginx.conf
@@ -0,0 +1,87 @@
+# 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.
+
+# This nginx.conf is designed and written for local dev environments
+# It will use the blocking startup mode and console logging
+worker_processes  1;
+daemon off;
+error_log /dev/stdout debug;
+
+events {
+    worker_connections 1024;
+}
+http {
+    lua_package_path "/usr/local/skywalking-nginx-lua/lib/skywalking/?.lua;;";
+    # Buffer represents the register inform and the queue of the finished segment
+    lua_shared_dict tracing_buffer 100m;
+
+    # Init is the timer setter and keeper
+    # Setup an infinite loop timer to do register and trace report.
+    init_worker_by_lua_block {
+        local metadata_buffer = ngx.shared.tracing_buffer
+
+        metadata_buffer:set('serviceName', 'e2e-test-with-mock-collector')
+        -- Instance means the number of Nginx deployment, does not mean the worker instances
+        metadata_buffer:set('serviceInstanceName', 'e2e-test-with-mock-collector-instanceA')
+
+        require("client"):startBackendTimer("http://${collector}:12800")
+    }
+
+    server {
+        listen 8080;
+
+        location /ingress {
+            default_type text/html;
+
+            rewrite_by_lua_block {
+                require("tracer"):start("e2e-test-with-mock-collector:upstream_ip:port")
+            }
+
+            proxy_pass http://127.0.0.1:8080/tier2/lb;
+
+            body_filter_by_lua_block {
+                require("tracer"):finish()
+            }
+
+            log_by_lua_block {
+                require("tracer"):prepareForReport()
+            }
+        }
+
+        location /tier2/lb {
+            default_type text/html;
+
+            rewrite_by_lua_block {
+                require("tracer"):start("e2e-test-with-mock-collector:upstream_ip2:port2")
+            }
+
+            proxy_pass http://127.0.0.1:8080/backend;
+
+            body_filter_by_lua_block {
+                require("tracer"):finish()
+            }
+
+            log_by_lua_block {
+                require("tracer"):prepareForReport()
+            }
+        }
+
+        location /backend {
+            proxy_pass http://${collector}:12800/receiveData;
+        }
+    }
+}
diff --git a/test/e2e/e2e-with-mock-collector/pom.xml b/test/e2e/e2e-with-mock-collector/pom.xml
new file mode 100644
index 0000000..1286e15
--- /dev/null
+++ b/test/e2e/e2e-with-mock-collector/pom.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  ~
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.skywalking.plugin.nginx-lua</groupId>
+        <artifactId>e2e-tests</artifactId>
+        <version>1.0.0</version>
+    </parent>
+    <artifactId>e2e-with-mock-collector</artifactId>
+    <packaging>jar</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.fabric8</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <configuration>
+                    <containerNamePattern>%a-%t-%i</containerNamePattern>
+                    <images>
+                        <image>
+                            <name>openresty/openresty</name>
+                            <alias>openresty-with-skywalking</alias>
+                            <run>
+                                <dependsOn>
+                                    <container>skywalking-collector</container>
+                                </dependsOn>
+                                <ports>
+                                    <port>+nginx.host:nginx.port:8080</port>
+                                </ports>
+                                <volumes>
+                                    <bind>
+                                        <volume>${project.basedir}/docker/conf.d:/var/nginx/conf.d</volume>
+                                        <volume>${project.basedir}/docker/bin:/opt/bin</volume>
+                                        <volume>
+                                            ${project.basedir}/../../../lib:/usr/local/skywalking-nginx-lua/lib
+                                        </volume>
+                                    </bind>
+                                </volumes>
+                                <links>
+                                    <link>skywalking-collector</link>
+                                </links>
+                                <wait>
+                                    <http>
+                                        <url>
+                                            http://${docker.host.address}:${nginx.port}
+                                        </url>
+                                    </http>
+                                    <time>30000</time>
+                                </wait>
+                                <cmd>bash /opt/bin/startup.sh</cmd>
+                            </run>
+                        </image>
+                        <image>
+                            <name>skywalking-collector:${project.version}</name>
+                            <alias>skywalking-collector</alias>
+                            <run>
+                                <ports>
+                                    <port>+collector.host:collector.port:12800</port>
+                                </ports>
+                                <wait>
+                                    <http>
+                                        <url>http://${docker.host.address}:${collector.port}/receiveData</url>
+                                    </http>
+                                    <time>30000</time>
+                                </wait>
+                            </run>
+                        </image>
+                    </images>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <version>${maven-failsafe-plugin.version}</version>
+                <configuration>
+                    <systemPropertyVariables>
+                        <service.entry>http://${nginx.host}:${nginx.port}/ingress</service.entry>
+                        <validation.entry>http://${collector.host}:${collector.port}/dataValidate</validation.entry>
+                        <healthcheck.entry>http://${collector.host}:${collector.port}/status</healthcheck.entry>
+                    </systemPropertyVariables>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>verify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/test/e2e/e2e-with-mock-collector/src/test/java/org/apache/skywalking/e2e/DataAssertITCase.java b/test/e2e/e2e-with-mock-collector/src/test/java/org/apache/skywalking/e2e/DataAssertITCase.java
new file mode 100644
index 0000000..cdfe112
--- /dev/null
+++ b/test/e2e/e2e-with-mock-collector/src/test/java/org/apache/skywalking/e2e/DataAssertITCase.java
@@ -0,0 +1,91 @@
+/*
+ * 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.skywalking.e2e;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.TimeUnit;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DataAssertITCase {
+    private CloseableHttpClient client = HttpClientBuilder.create().build();
+    private static final int MAX_RETRY_TIMES = 5;
+    private String validationEntry;
+    private String serviceEntry;
+    private String healthCheckEntry;
+
+    @Before
+    public void setup() throws IOException {
+        serviceEntry = System.getProperty("service.entry");
+        validationEntry = System.getProperty("validation.entry");
+        healthCheckEntry = System.getProperty("healthcheck.entry");
+    }
+
+    @Test(timeout = 180_000)
+    public void verify() throws IOException, InterruptedException {
+        int times = 0;
+
+        do {
+            TimeUnit.SECONDS.sleep(2L); // Wait Nginx Lua Agent available.
+
+            try (CloseableHttpResponse response = client.execute(new HttpGet(healthCheckEntry))) {
+                if (response.getStatusLine().getStatusCode() == 200) {
+                    break;
+                }
+            }
+        } while (++times <= MAX_RETRY_TIMES);
+
+        try (CloseableHttpResponse response = client.execute(new HttpGet(serviceEntry))) {
+            Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+        }
+
+        times = 0;
+        do {
+            TimeUnit.SECONDS.sleep(5L); // Wait Agent reported TraceSegment.
+
+            HttpPost post = new HttpPost(validationEntry);
+            InputStream input = DataAssertITCase.class.getResourceAsStream("/expectedData.yaml");
+            post.setEntity(new InputStreamEntity(input));
+            try (CloseableHttpResponse response = client.execute(post)) {
+                System.out.println(response.getStatusLine().getStatusCode());
+                if (response.getStatusLine().getStatusCode() == 200) {
+                    break;
+                }
+            }
+            post.abort();
+        }
+        while (++times <= MAX_RETRY_TIMES);
+
+        Assert.assertTrue("Test failed.", times <= MAX_RETRY_TIMES);
+    }
+
+    @After
+    public void cleanup() throws IOException {
+        client.close();
+    }
+}
diff --git a/test/e2e/e2e-with-mock-collector/src/test/resources/expectedData.yaml b/test/e2e/e2e-with-mock-collector/src/test/resources/expectedData.yaml
new file mode 100644
index 0000000..a03ec9d
--- /dev/null
+++ b/test/e2e/e2e-with-mock-collector/src/test/resources/expectedData.yaml
@@ -0,0 +1,79 @@
+# 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.
+
+registryItems:
+  applications:
+    - {'e2e-test-with-mock-collector': 2}
+  instances:
+    - {'e2e-test-with-mock-collector': 1}
+  operationNames:
+    - e2e-test-with-mock-collector: [/tier2/lb, /ingress]
+segmentItems:
+  - serviceName: e2e-test-with-mock-collector
+    segmentSize: eq 2
+    segments:
+      - segmentId: not null
+        spans:
+          - operationName: /tier2/lb
+            startTime: gt 0
+            endTime: gt 0
+            spanType: Exit
+            spanId: 1
+            isError: false
+            parentSpanId: 0
+            componentId: 6000
+            peer: 'e2e-test-with-mock-collector:upstream_ip2:port2'
+            spanLayer: Http
+          - operationName: /tier2/lb
+            startTime: gt 0
+            tags:
+              - {key: http.method, value: GET}
+              - {key: http.params, value: 'http://127.0.0.1/tier2/lb'}
+            endTime: gt 0
+            spanType: Entry
+            spanId: 0
+            isError: false
+            parentSpanId: -1
+            componentId: 6000
+            refs:
+              - {parentEndpointId: 0, entryEndpointId: 0, parentServiceInstanceId: 1, parentEndpoint: /ingress, parentTraceSegmentId: not null,
+                 networkAddress: 'e2e-test-with-mock-collector:upstream_ip:port', parentSpanId: 1,
+                 entryServiceInstanceId: 1, networkAddressId: 0, entryEndpoint: /ingress}
+            spanLayer: Http
+      - segmentId: not null
+        spans:
+          - operationName: /ingress
+            startTime: gt 0
+            endTime: gt 0
+            spanType: Exit
+            spanId: 1
+            isError: false
+            parentSpanId: 0
+            componentId: 6000
+            peer: 'e2e-test-with-mock-collector:upstream_ip:port'
+            spanLayer: Http
+          - operationName: /ingress
+            startTime: gt 0
+            tags:
+              - {key: http.method, value: GET}
+              - {key: http.params, value: 'not null'}
+            endTime: gt 0
+            spanType: Entry
+            spanId: 0
+            parentSpanId: -1
+            isError: false
+            spanLayer: Http
+            componentId: 6000
diff --git a/test/e2e/validator/pom.xml b/test/e2e/pom.xml
similarity index 64%
rename from test/e2e/validator/pom.xml
rename to test/e2e/pom.xml
index 868b886..bc30b91 100644
--- a/test/e2e/validator/pom.xml
+++ b/test/e2e/pom.xml
@@ -16,29 +16,36 @@
   ~ limitations under the License.
   ~
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
     <modelVersion>4.0.0</modelVersion>
 
-    <groupId>org.apache.skywalking.plugin</groupId>
-    <artifactId>validator</artifactId>
-    <version>0.0.1</version>
-    <packaging>jar</packaging>
+    <groupId>org.apache.skywalking.plugin.nginx-lua</groupId>
+    <artifactId>e2e-tests</artifactId>
+    <version>1.0.0</version>
 
-    <name>skywalking-validator-tools</name>
-    <url>http://maven.apache.org</url>
+    <name>SkyWalking Nginx Lua E2E Tests</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>agent-test-tools</module>
+        <module>e2e-with-mock-collector</module>
+    </modules>
 
     <properties>
         <java.version>1.8</java.version>
 
         <junit.version>4.11</junit.version>
-        <gson.version>2.8.5</gson.version>
         <slf4j.version>1.7.25</slf4j.version>
         <log4j.version>2.9.0</log4j.version>
-        <guava.version>28.1-jre</guava.version>
-        <snakeyaml.version>1.18</snakeyaml.version>
         <gson.version>2.8.6</gson.version>
+        <guava.version>28.1-jre</guava.version>
         <lombok.version>1.18.10</lombok.version>
+        <snakeyaml.version>1.18</snakeyaml.version>
+        <httpclient.version>4.5.6</httpclient.version>
 
         <maven.compiler.source>${java.version}</maven.compiler.source>
         <maven.compiler.target>${java.version}</maven.compiler.target>
@@ -52,66 +59,108 @@
         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
         <docker-maven-plugin.version>0.30.0</docker-maven-plugin.version>
         <surefire.version>3.0.0-M4</surefire.version>
-
-        <skipSurefire>false</skipSurefire>
     </properties>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpclient.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.yaml</groupId>
+                <artifactId>snakeyaml</artifactId>
+                <version>${snakeyaml.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>provided</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>log4j-over-slf4j</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.logging.log4j</groupId>
+                <artifactId>log4j-core</artifactId>
+                <version>${log4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.logging.log4j</groupId>
+                <artifactId>log4j-slf4j-impl</artifactId>
+                <version>${log4j.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.logging.log4j</groupId>
+                        <artifactId>log4j-core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <dependencies>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>${junit.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>${guava.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.yaml</groupId>
             <artifactId>snakeyaml</artifactId>
-            <version>${snakeyaml.version}</version>
         </dependency>
-
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
-            <version>${gson.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
             <scope>provided</scope>
         </dependency>
-
-        <dependency>
-            <groupId>org.freemarker</groupId>
-            <artifactId>freemarker</artifactId>
-            <version>2.3.23</version>
-        </dependency>
-
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <version>${slf4j.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>log4j-over-slf4j</artifactId>
-            <version>${slf4j.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-core</artifactId>
-            <version>${log4j.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-slf4j-impl</artifactId>
@@ -124,9 +173,7 @@
             </exclusions>
         </dependency>
     </dependencies>
-
     <build>
-        <finalName>skywalking-validator-tools</finalName>
         <pluginManagement>
             <plugins>
                 <plugin>
@@ -152,7 +199,7 @@
                                     <exclude>none</exclude>
                                 </excludes>
                                 <includes>
-                                    <include>**/*IT.java</include>
+                                    <include>**/*ITCase.java</include>
                                 </includes>
                             </configuration>
                         </execution>
@@ -185,6 +232,11 @@
                         </execution>
                     </executions>
                 </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${surefire.version}</version>
+                </plugin>
             </plugins>
         </pluginManagement>
         <plugins>
@@ -198,71 +250,11 @@
                     <encoding>${project.build.sourceEncoding}</encoding>
                 </configuration>
             </plugin>
-
-            <plugin>
-                <groupId>io.fabric8</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-                <configuration>
-                    <containerNamePattern>%a-%t-%i</containerNamePattern>
-                    <images>
-                        <image>
-                            <name>openresty/openresty</name>
-                            <alias>openresty-with-skywalking</alias>
-                            <run>
-                                <ports>
-                                    <port>+nginx.host:nginx.port:8080</port>
-                                </ports>
-                                <volumes>
-                                    <bind>
-                                        <volume>${project.build.testOutputDirectory}/logs:/var/log/nginx</volume>
-                                        <volume>${project.basedir}/docker/conf.d:/var/nginx/conf.d</volume>
-                                        <volume>
-                                            ${project.basedir}/../../../lib/skywalking:/skywalking-nginx-lua/lib/skywalking
-                                        </volume>
-                                    </bind>
-                                </volumes>
-                                <wait>
-                                    <http>
-                                        <url>
-                                            http://${docker.host.address}:${nginx.port}
-                                        </url>
-                                    </http>
-                                    <time>30000</time>
-                                </wait>
-                                <cmd>/usr/bin/openresty -c /var/nginx/conf.d/nginx.conf</cmd>
-                            </run>
-                        </image>
-                    </images>
-                </configuration>
-            </plugin>
-
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <version>${surefire.version}</version>
-                <configuration>
-                    <skip>${skipSurefire}</skip>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-failsafe-plugin</artifactId>
-                <version>${maven-failsafe-plugin.version}</version>
-                <configuration>
-                    <systemPropertyVariables>
-                        <ping.url>
-                            http://${nginx.host}:${nginx.port}/ingress
-                        </ping.url>
-                    </systemPropertyVariables>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>verify</goal>
-                        </goals>
-                    </execution>
-                </executions>
             </plugin>
         </plugins>
     </build>
-</project>
+</project>
\ No newline at end of file
diff --git a/test/e2e/validator/docker/conf.d/nginx.conf b/test/e2e/validator/docker/conf.d/nginx.conf
deleted file mode 100644
index 3f4d847..0000000
--- a/test/e2e/validator/docker/conf.d/nginx.conf
+++ /dev/null
@@ -1,158 +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.
-
-# This nginx.conf is designed and written for local dev environments
-# It will use the blocking startup mode and console logging
-worker_processes  1;
-daemon off;
-error_log /dev/stdout error;
-
-events {
-    worker_connections 1024;
-}
-http {
-    lua_package_path "/skywalking-nginx-lua/lib/skywalking/?.lua;;";
-    # Buffer represents the register inform and the queue of the finished segment
-    lua_shared_dict tracing_buffer 100m;
-
-    # Init is the timer setter and keeper
-    # Setup an infinite loop timer to do register and trace report.
-    init_worker_by_lua_block {
-        local metadata_buffer = ngx.shared.tracing_buffer
-
-        metadata_buffer:set('serviceName', 'User_Service_Name')
-        -- Instance means the number of Nginx deloyment, does not mean the worker instances
-        metadata_buffer:set('serviceInstanceName', 'User_Service_Instance_Name')
-
-        require("client"):startBackendTimer("http://127.0.0.1:8080")
-    }
-    log_format sw_trace escape=json "$uri $request_body";
-
-    server {
-        listen 8080;
-
-        # This is for local dev only, please do not add this in any production env.
-        lua_code_cache off;
-
-        location /ingress {
-            default_type text/html;
-
-            rewrite_by_lua_block {
-                require("tracer"):start("User_Service_Name-nginx:upstream_ip:port")
-            }
-
-            proxy_pass http://127.0.0.1:8080/tier2/lb;
-
-            body_filter_by_lua_block {
-                require("tracer"):finish()
-            }
-
-            log_by_lua_block {
-                require("tracer"):prepareForReport()
-            }
-        }
-
-        location /tier2/lb {
-            default_type text/html;
-
-            rewrite_by_lua_block {
-                require("tracer"):start("User_Service_Name-nginx:upstream_ip2:port2")
-            }
-
-            proxy_pass http://127.0.0.1:8080/backend;
-
-            body_filter_by_lua_block {
-                require("tracer"):finish()
-            }
-
-            log_by_lua_block {
-                require("tracer"):prepareForReport()
-            }
-        }
-
-        # ------------------------------------------------------
-        # -- Mock backend business service as the upsteeam
-        # ------------------------------------------------------
-        location /backend {
-            default_type text/html;
-            content_by_lua_block {
-                ngx.say("<p>Backend service for testing only.</p>")
-                ngx.say("<p>Backend sw6 received headers: " .. ngx.req.get_headers()["sw6"] .. "</p>")
-            }
-        }
-
-
-        # ------------------------------------------------------
-        # -- Mock OAP server to provide register and trace collection
-        # ------------------------------------------------------
-        location /v2/service/register {
-            default_type text/html;
-            lua_need_request_body on;
-            access_log /var/log/nginx/trace.log sw_trace;
-
-            content_by_lua_block {
-                local cjson = require('cjson')
-
-                ngx.log(ngx.DEBUG, 'Service register request = ', ngx.req.get_body_data())
-                local param = cjson.decode(ngx.req.get_body_data())
-
-                local registeredInfo = {}
-                registeredInfo[1] = {key=param.services[1].serviceName, value=1}
-                ngx.say(cjson.encode(registeredInfo))
-            }
-        }
-
-        location /v2/instance/register {
-            default_type text/html;
-	        access_log /var/log/nginx/trace.log sw_trace;
-            lua_need_request_body on;
-
-            content_by_lua_block {
-                local cjson = require('cjson')
-                ngx.log(ngx.DEBUG, 'Service instance register request = ', ngx.req.get_body_data())
-                local param = cjson.decode(ngx.req.get_body_data())
-
-                local registeredInfo = {}
-
-                registeredInfo[1] = {key=param.instances[1].instanceUUID, value=1}
-                ngx.say(cjson.encode(registeredInfo))
-            }
-        }
-
-        location /v2/instance/heartbeat {
-            default_type text/html;
-            lua_need_request_body on;
-            access_log /var/log/nginx/trace.log sw_trace;
-
-            content_by_lua_block {
-                local cjson = require('cjson')
-                --ngx.log(ngx.DEBUG, 'Service instance ping request = ', ngx.req.get_body_data())
-            }
-        }
-
-        location /v2/segments {
-            default_type text/html;
-            lua_need_request_body on;
-            access_log /var/log/nginx/trace.log sw_trace;
-
-            content_by_lua_block {
-                local cjson = require('cjson')
-                ngx.log(ngx.DEBUG, 'Received segment = ', ngx.req.get_body_data())
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ApplicationAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ApplicationAssert.java
deleted file mode 100644
index c59bd6c..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ApplicationAssert.java
+++ /dev/null
@@ -1,53 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RegistryApplicationNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RegistryApplicationSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryApplication;
-
-public class ApplicationAssert {
-    public static void assertEquals(List<RegistryApplication> expected, List<RegistryApplication> actual) {
-
-        if (expected == null) {
-            return;
-        }
-
-        for (RegistryApplication application : expected) {
-            RegistryApplication actualApplication = getMatchApplication(actual, application);
-            try {
-                ExpressParser.parse(application.expressValue())
-                             .assertValue("registry application", actualApplication.expressValue());
-            } catch (ValueAssertFailedException e) {
-                throw new RegistryApplicationSizeNotEqualsException(application.applicationCode(), e);
-            }
-        }
-    }
-
-    private static RegistryApplication getMatchApplication(List<RegistryApplication> actual,
-        RegistryApplication application) {
-        for (RegistryApplication registryApplication : actual) {
-            if (registryApplication.applicationCode().equals(application.applicationCode())) {
-                return registryApplication;
-            }
-        }
-        throw new RegistryApplicationNotFoundException(application.applicationCode());
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java
deleted file mode 100644
index 59a4124..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/DataAssert.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import com.google.gson.GsonBuilder;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Data;
-
-public class DataAssert {
-    private static Logger logger = LogManager.getLogger(DataAssert.class);
-
-    public static void assertEquals(Data excepted, Data actual) {
-        logger.info("excepted data:\n{}", new GsonBuilder().setPrettyPrinting().create().toJson(excepted));
-        logger.info("actual data:\n{}", new GsonBuilder().setPrettyPrinting().create().toJson(actual));
-        RegistryItemsAssert.assertEquals(excepted.registryItems(), actual.registryItems());
-        SegmentItemsAssert.assertEquals(excepted.segmentItems(), actual.segmentItems());
-        logger.info("{} assert successful.", "segment items");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ExpressParser.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ExpressParser.java
deleted file mode 100644
index 84ff2d0..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ExpressParser.java
+++ /dev/null
@@ -1,63 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.ElementAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.EqualsAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.GreatThanAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.GreetEqualAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.NoopAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.NotEqualsAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.NotNullAssertor;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.element.NullAssertor;
-
-public class ExpressParser {
-    public static ElementAssertor parse(String express) {
-        if (express == null) {
-            return new NoopAssertor();
-        }
-
-        String expressTrim = express.trim();
-        if (expressTrim.equals("not null")) {
-            return new NotNullAssertor();
-        }
-
-        if (expressTrim.equals("null")) {
-            return new NullAssertor();
-        }
-
-        String[] expressSegment = expressTrim.split(" ");
-        if (expressSegment.length == 1) {
-            return new EqualsAssertor(expressSegment[0]);
-        } else if (expressSegment.length == 2) {
-            String exceptedValue = expressSegment[1];
-            switch (expressSegment[0].trim()) {
-                case "nq":
-                    return new NotEqualsAssertor(exceptedValue);
-                case "eq":
-                    return new EqualsAssertor(exceptedValue);
-                case "gt":
-                    return new GreatThanAssertor(exceptedValue);
-                case "ge":
-                    return new GreetEqualAssertor(exceptedValue);
-            }
-        }
-
-        return new EqualsAssertor(express);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/InstanceAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/InstanceAssert.java
deleted file mode 100644
index c4af5e6..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/InstanceAssert.java
+++ /dev/null
@@ -1,53 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RegistryInstanceOfApplicationNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RegistryInstanceSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryInstance;
-
-public class InstanceAssert {
-    public static void assertEquals(List<RegistryInstance> expected, List<RegistryInstance> actual) {
-
-        if (expected == null) {
-            return;
-        }
-
-        for (RegistryInstance instance : expected) {
-            RegistryInstance actualInstance = getMatchApplication(actual, instance);
-            try {
-                ExpressParser.parse(actualInstance.expressValue())
-                             .assertValue(String.format("The registry instance of %s", instance.applicationCode()), actualInstance
-                                 .expressValue());
-            } catch (ValueAssertFailedException e) {
-                throw new RegistryInstanceSizeNotEqualsException(instance.applicationCode(), e);
-            }
-        }
-    }
-
-    private static RegistryInstance getMatchApplication(List<RegistryInstance> actual, RegistryInstance application) {
-        for (RegistryInstance registryApplication : actual) {
-            if (registryApplication.applicationCode().equals(application.applicationCode())) {
-                return registryApplication;
-            }
-        }
-        throw new RegistryInstanceOfApplicationNotFoundException(application.applicationCode());
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/OperationNameAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/OperationNameAssert.java
deleted file mode 100644
index 91974cb..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/OperationNameAssert.java
+++ /dev/null
@@ -1,62 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ActualRegistryOperationNameEmptyException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RegistryOperationNameNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RegistryOperationNamesOfApplicationNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryOperationName;
-
-public class OperationNameAssert {
-    public static void assertEquals(List<RegistryOperationName> expected, List<RegistryOperationName> actual) {
-        if (expected == null) {
-            return;
-        }
-
-        for (RegistryOperationName operationName : expected) {
-            RegistryOperationName actualOperationName = findActualRegistryOperationName(actual, operationName);
-            assertOperationEquals(actualOperationName.serviceName(), operationName.operationName(), actualOperationName
-                .operationName());
-        }
-    }
-
-    private static void assertOperationEquals(String applicationCode, List<String> expectedOperationName,
-        List<String> actualOperationName) {
-        for (String operationName : expectedOperationName) {
-            if (!actualOperationName.contains(operationName)) {
-                throw new RegistryOperationNameNotFoundException(applicationCode, operationName);
-            }
-        }
-    }
-
-    private static RegistryOperationName findActualRegistryOperationName(List<RegistryOperationName> actual,
-        RegistryOperationName registryOperationName) {
-        if (actual == null) {
-            throw new ActualRegistryOperationNameEmptyException(registryOperationName);
-        }
-
-        for (RegistryOperationName operationName : actual) {
-            if (operationName.serviceName().equals(registryOperationName.serviceName())) {
-                return operationName;
-            }
-        }
-
-        throw new RegistryOperationNamesOfApplicationNotFoundException(registryOperationName);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ParentSegmentIdExpressParser.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ParentSegmentIdExpressParser.java
deleted file mode 100644
index 0284e95..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/ParentSegmentIdExpressParser.java
+++ /dev/null
@@ -1,47 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ParentSegmentNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentItem;
-
-public class ParentSegmentIdExpressParser {
-    public static String parse(String express, List<SegmentItem> actual) {
-        if (!express.trim().startsWith("${") && !express.trim().endsWith("}")) {
-            return express;
-        }
-
-        String parentSegmentExpress = express.trim().substring(2, express.trim().length() - 1);
-
-        int startIndexOfIndex = parentSegmentExpress.indexOf("[");
-        String applicationCode = parentSegmentExpress.substring(0, startIndexOfIndex);
-        int endIndexOfIndex = parentSegmentExpress.indexOf("]", startIndexOfIndex);
-        int expectedSize = Integer.parseInt(parentSegmentExpress.substring(startIndexOfIndex + 1, endIndexOfIndex));
-        for (SegmentItem segmentItem : actual) {
-            if (segmentItem.serviceName().equals(applicationCode)) {
-                if (segmentItem.segments().size() <= expectedSize) {
-                    throw new ParentSegmentNotFoundException(parentSegmentExpress);
-                }
-
-                return segmentItem.segments().get(expectedSize).segmentId();
-            }
-        }
-        return express;
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java
deleted file mode 100644
index 5c5e791..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/RegistryItemsAssert.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryItems;
-
-public class RegistryItemsAssert {
-    private static Logger logger = LogManager.getLogger(RegistryItemsAssert.class);
-
-    public static void assertEquals(RegistryItems excepted, RegistryItems actual) {
-        ApplicationAssert.assertEquals(excepted.applications(), actual.applications());
-        logger.info("{} assert successful.", "registry applications");
-        InstanceAssert.assertEquals(excepted.instances(), actual.instances());
-        logger.info("{} assert successful.", "registry instances");
-        OperationNameAssert.assertEquals(excepted.operationNames(), actual.operationNames());
-        logger.info("{} assert successful.", "registry operation name");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentAssert.java
deleted file mode 100644
index 1c50b58..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentAssert.java
+++ /dev/null
@@ -1,224 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ActualSegmentRefIsEmptyException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.KeyValueNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.LogEventKeyNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.LogEventSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.LogEventValueNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.LogSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.RefSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentRefAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentRefNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SpanAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SpanSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.TagKeyNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.TagSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.TagValueNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.KeyValuePair;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.LogEvent;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Segment;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentItem;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Span;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentAssert {
-    public static void assertEquals(SegmentItem expected, SegmentItem actual) {
-        if (expected.segments() == null) {
-            return;
-        }
-
-        for (Segment segment : expected.segments()) {
-            Segment actualSegment = findSegment(actual, segment);
-            segment.setSegmentId(actualSegment.segmentId());
-        }
-    }
-
-    private static Segment findSegment(SegmentItem actual, Segment expectedSegment) {
-        List<SegmentPredictionFailedCause> exceptions = new ArrayList<>();
-        for (Segment actualSegment : actual.segments()) {
-            try {
-                if (spansEquals(expectedSegment.spans(), actualSegment.spans())) {
-                    return actualSegment;
-                }
-            } catch (SpanSizeNotEqualsException e) {
-            } catch (SpanAssertFailedException e) {
-                exceptions.add(new SegmentPredictionFailedCause(e, actualSegment));
-            }
-        }
-
-        throw new SegmentNotFoundException(expectedSegment, exceptions);
-    }
-
-    private static boolean spansEquals(List<Span> excepted, List<Span> actual) {
-        if (excepted == null) {
-            return true;
-        }
-
-        if (actual == null || excepted.size() != actual.size()) {
-            throw new SpanSizeNotEqualsException(excepted.size(), (actual != null) ? actual.size() : 0);
-        }
-
-        int equalSpans = 0;
-        for (int index = 0; index < excepted.size(); index++, equalSpans++) {
-            Span exceptedSpan = excepted.get(index);
-            Span actualSpan = actual.get(index);
-            try {
-                spanEquals(exceptedSpan, actualSpan);
-            } catch (AssertFailedException e) {
-                throw new SpanAssertFailedException(e, exceptedSpan, actualSpan);
-            }
-        }
-
-        return true;
-    }
-
-    private static void spanEquals(Span excepted, Span actualSpan) {
-        ExpressParser.parse(excepted.operationName()).assertValue("operation name", actualSpan.operationName());
-        ExpressParser.parse(excepted.componentId()).assertValue("component id", actualSpan.componentId());
-        ExpressParser.parse(excepted.componentName()).assertValue("component name", actualSpan.componentName());
-        ExpressParser.parse(excepted.startTime()).assertValue("start time", actualSpan.startTime());
-        ExpressParser.parse(excepted.endTime()).assertValue("end time", actualSpan.endTime());
-        ExpressParser.parse(excepted.parentSpanId()).assertValue("parent span id", actualSpan.parentSpanId());
-        ExpressParser.parse(excepted.spanId()).assertValue("span id", actualSpan.spanId());
-        ExpressParser.parse(excepted.operationId()).assertValue("operation id", actualSpan.operationId());
-        ExpressParser.parse(excepted.peer()).assertValue("peer", actualSpan.peer());
-        ExpressParser.parse(excepted.spanLayer()).assertValue("span layer", actualSpan.spanLayer());
-        ExpressParser.parse(excepted.peerId()).assertValue("peer id", actualSpan.peerId());
-        ExpressParser.parse(excepted.error()).assertValue("is error", actualSpan.error());
-        ExpressParser.parse(excepted.spanType()).assertValue("span type", actualSpan.spanType());
-        tagsEquals(excepted.tags(), actualSpan.tags());
-        logsEquals(excepted.logs(), actualSpan.logs());
-        refEquals(excepted.refs(), actualSpan.refs());
-        excepted.setActualRefs(actualSpan.refs());
-
-    }
-
-    private static void refEquals(List<SegmentRef> excepted, List<SegmentRef> actual) {
-        if (excepted == null) {
-            return;
-        }
-
-        if (actual == null) {
-            throw new ActualSegmentRefIsEmptyException(excepted.size());
-        }
-
-        if (excepted.size() != actual.size()) {
-            throw new RefSizeNotEqualsException(excepted.size(), actual.size());
-        }
-
-        for (SegmentRef ref : excepted) {
-            findSegmentRef(actual, ref);
-        }
-    }
-
-    private static void tagsEquals(List<KeyValuePair> excepted, List<KeyValuePair> actual) {
-        if (excepted.size() != actual.size()) {
-            throw new TagSizeNotEqualsException(excepted.size(), actual.size());
-        }
-
-        for (int index = 0; index < excepted.size(); index++) {
-            tagEquals(excepted.get(index), actual.get(index));
-        }
-    }
-
-    private static void logsEquals(List<LogEvent> excepted, List<LogEvent> actual) {
-        if (excepted.size() != actual.size()) {
-            throw new LogSizeNotEqualsException(excepted.size(), actual.size());
-        }
-
-        for (int index = 0; index < excepted.size(); index++) {
-            logEventEquals(excepted.get(index), actual.get(index));
-        }
-
-    }
-
-    private static void logEventEquals(LogEvent exceptedEvent, LogEvent actualEvent) {
-        List<KeyValuePair> exceptedKey = exceptedEvent.events();
-        List<KeyValuePair> actualKey = actualEvent.events();
-
-        if (exceptedKey.size() != actualKey.size()) {
-            throw new LogEventSizeNotEqualsException(exceptedKey.size(), actualKey.size());
-        }
-
-        for (int index = 0; index < exceptedKey.size(); index++) {
-            logEventPairEquals(exceptedKey.get(index), actualKey.get(index));
-        }
-    }
-
-    private static void keyValuePairEquals(KeyValuePair excepted, KeyValuePair actual) {
-        if (!excepted.key().equals(actual.key())) {
-            throw new KeyValueNotEqualsException();
-        }
-
-        ExpressParser.parse(excepted.value()).assertValue("", actual.value());
-    }
-
-    private static void logEventPairEquals(KeyValuePair excepted, KeyValuePair actual) {
-        try {
-            keyValuePairEquals(excepted, actual);
-        } catch (KeyValueNotEqualsException e) {
-            throw new LogEventKeyNotEqualsException(excepted.key(), actual.key());
-        } catch (ValueAssertFailedException e) {
-            throw new LogEventValueNotEqualsException(excepted.key(), excepted.value(), actual.value());
-        }
-    }
-
-    private static void tagEquals(KeyValuePair excepted, KeyValuePair actual) {
-        try {
-            keyValuePairEquals(excepted, actual);
-        } catch (KeyValueNotEqualsException e) {
-            throw new TagKeyNotEqualsException(excepted.key(), actual.key());
-        } catch (ValueAssertFailedException e) {
-            throw new TagValueNotEqualsException(excepted.key(), excepted.value(), actual.value());
-        }
-    }
-
-    private static SegmentRef findSegmentRef(List<SegmentRef> actual, SegmentRef expected) {
-        List<SegmentRefAssertFailedCause> causes = new ArrayList<>();
-        for (SegmentRef segmentRef : actual) {
-            try {
-                if (simpleSegmentRefEquals(expected, segmentRef)) {
-                    return segmentRef;
-                }
-            } catch (SegmentRefAssertFailedException e) {
-                causes.add(new SegmentRefAssertFailedCause(e, segmentRef));
-            }
-        }
-        throw new SegmentRefNotFoundException(expected, causes);
-    }
-
-    private static boolean simpleSegmentRefEquals(SegmentRef expected, SegmentRef actual) {
-        try {
-            ExpressParser.parse(expected.entryEndpointName())
-                         .assertValue("entry service name", actual.entryEndpointName());
-            ExpressParser.parse(expected.parentEndpointName())
-                         .assertValue("parent service name", actual.parentEndpointName());
-            ExpressParser.parse(expected.refType()).assertValue("ref type", actual.refType());
-            return true;
-        } catch (ValueAssertFailedException e) {
-            throw new SegmentRefAssertFailedException(e, expected, actual);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java
deleted file mode 100644
index e834ff6..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentItemsAssert.java
+++ /dev/null
@@ -1,102 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.List;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ActualSegmentItemEmptyException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentItemNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Segment;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentItem;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Span;
-
-public class SegmentItemsAssert {
-    private static Logger logger = LogManager.getLogger(SegmentItemsAssert.class);
-
-    public static void assertEquals(List<SegmentItem> expected, List<SegmentItem> actual) {
-        if (expected == null) {
-            logger.info("ignore segment items. because expected segment item is null.");
-            return;
-        }
-
-        for (SegmentItem item : expected) {
-            SegmentItem actualSegmentItem = findSegmentItem(actual, item);
-            try {
-                assertSegmentSize(item.segmentSize(), actualSegmentItem.segmentSize());
-            } catch (ValueAssertFailedException e) {
-                throw new SegmentSizeNotEqualsException(item.serviceName(), item.segmentSize(), actualSegmentItem.segmentSize());
-            }
-            SegmentAssert.assertEquals(item, actualSegmentItem);
-        }
-
-        for (SegmentItem item : expected) {
-            if (item.segments() == null) {
-                continue;
-            }
-
-            for (Segment segment : item.segments()) {
-                convertParentSegmentId(segment, expected);
-
-                for (Span span : segment.spans()) {
-                    if (span.refs() == null || span.refs().size() == 0) {
-                        continue;
-                    }
-                    SegmentRefAssert.assertEquals(span.refs(), span.actualRefs());
-                }
-            }
-        }
-    }
-
-    private static void convertParentSegmentId(Segment segment, List<SegmentItem> actual) {
-        for (Span span : segment.spans()) {
-            if (span.refs() == null || span.refs().size() == 0) {
-                continue;
-            }
-
-            for (SegmentRef ref : span.refs()) {
-                String actualParentSegmentId = ParentSegmentIdExpressParser.parse(ref.parentTraceSegmentId(), actual);
-                ref.parentTraceSegmentId(actualParentSegmentId);
-            }
-        }
-    }
-
-    private static void assertSegmentSize(String expected, String actual) {
-        if (expected == null) {
-            return;
-        }
-        ExpressParser.parse(expected).assertValue("segment size", actual);
-    }
-
-    private static SegmentItem findSegmentItem(List<SegmentItem> actual, SegmentItem expected) {
-        if (actual == null) {
-            throw new ActualSegmentItemEmptyException(expected);
-        }
-
-        for (SegmentItem segmentItem : actual) {
-            if (expected.serviceName().equals(segmentItem.serviceName())) {
-                return segmentItem;
-            }
-        }
-
-        throw new SegmentItemNotFoundException(expected.serviceName());
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentPredictionFailedCause.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentPredictionFailedCause.java
deleted file mode 100644
index 9fa3efd..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentPredictionFailedCause.java
+++ /dev/null
@@ -1,39 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SpanAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Segment;
-
-public class SegmentPredictionFailedCause {
-    private final Segment actualSegment;
-    private final SpanAssertFailedException spanAssertFailedCause;
-
-    public SegmentPredictionFailedCause(SpanAssertFailedException spanAssertFailedCause, Segment actualSegment) {
-        this.spanAssertFailedCause = spanAssertFailedCause;
-        this.actualSegment = actualSegment;
-    }
-
-    public Segment getActualSegment() {
-        return actualSegment;
-    }
-
-    public SpanAssertFailedException getSpanAssertFailedCause() {
-        return spanAssertFailedCause;
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentRefAssert.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentRefAssert.java
deleted file mode 100644
index 7e6b2d6..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentRefAssert.java
+++ /dev/null
@@ -1,83 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentRefAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentRefNotFoundException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentRefSizeNotEqualsException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
-
-public class SegmentRefAssert {
-
-    public static void assertEquals(List<SegmentRef> excepted, List<SegmentRef> actual) {
-        if (excepted == null) {
-            return;
-        }
-
-        if (actual == null || excepted.size() != actual.size()) {
-            throw new SegmentRefSizeNotEqualsException(excepted.size(), actual.size());
-        }
-
-        for (SegmentRef ref : excepted) {
-            findSegmentRef(actual, ref);
-        }
-    }
-
-    private static SegmentRef findSegmentRef(List<SegmentRef> actual, SegmentRef expected) {
-        List<SegmentRefAssertFailedCause> causes = new ArrayList<>();
-        for (SegmentRef segmentRef : actual) {
-            try {
-                if (segmentRefEquals(expected, segmentRef)) {
-                    return segmentRef;
-                }
-            } catch (SegmentRefAssertFailedException e) {
-                causes.add(new SegmentRefAssertFailedCause(e, segmentRef));
-            }
-        }
-        throw new SegmentRefNotFoundException(expected, causes);
-    }
-
-    private static boolean segmentRefEquals(SegmentRef expected, SegmentRef actual) {
-        try {
-            ExpressParser.parse(expected.entryEndpointName())
-                         .assertValue("entry endpoint name", actual.entryEndpointName());
-            ExpressParser.parse(expected.networkAddress()).assertValue("network address", actual.networkAddress());
-            ExpressParser.parse(expected.parentTraceSegmentId())
-                         .assertValue("parent segment id", actual.parentTraceSegmentId());
-            ExpressParser.parse(expected.parentSpanId()).assertValue("span id", actual.parentSpanId());
-            ExpressParser.parse(expected.entryEndpointId()).assertValue("entry endpoint id", actual.entryEndpointId());
-            ExpressParser.parse(expected.networkAddressId())
-                         .assertValue("network address id", actual.networkAddressId());
-            ExpressParser.parse(expected.parentServiceInstanceId())
-                         .assertValue("parent application instance id", actual.parentServiceInstanceId());
-            ExpressParser.parse(expected.parentEndpointId())
-                         .assertValue("parent endpoint id", actual.parentEndpointId());
-            ExpressParser.parse(expected.parentEndpointName())
-                         .assertValue("parent endpoint name", actual.parentEndpointName());
-            ExpressParser.parse(expected.refType()).assertValue("ref type", actual.refType());
-            ExpressParser.parse(expected.entryServiceInstanceId())
-                         .assertValue("entry application instance id", actual.entryServiceInstanceId());
-            return true;
-        } catch (ValueAssertFailedException e) {
-            throw new SegmentRefAssertFailedException(e, expected, actual);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentRefAssertFailedCause.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentRefAssertFailedCause.java
deleted file mode 100644
index 571a4c8..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/SegmentRefAssertFailedCause.java
+++ /dev/null
@@ -1,39 +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.skywalking.plugin.test.agent.tool.validator.assertor;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.SegmentRefAssertFailedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
-
-public class SegmentRefAssertFailedCause {
-    private final SegmentRefAssertFailedException failedCause;
-    private final SegmentRef actual;
-
-    public SegmentRefAssertFailedCause(SegmentRefAssertFailedException failedCause, SegmentRef actual) {
-        this.failedCause = failedCause;
-        this.actual = actual;
-    }
-
-    public SegmentRefAssertFailedException getFailedCause() {
-        return failedCause;
-    }
-
-    public SegmentRef getActual() {
-        return actual;
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/ElementAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/ElementAssertor.java
deleted file mode 100644
index 452fe8f..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/ElementAssertor.java
+++ /dev/null
@@ -1,31 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-public abstract class ElementAssertor {
-
-    public ElementAssertor(String exceptedValue) {
-        if (exceptedValue != null) {
-            this.exceptedValue = exceptedValue.trim();
-        }
-    }
-
-    protected String exceptedValue;
-
-    public abstract void assertValue(String desc, String actualValue);
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/EqualsAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/EqualsAssertor.java
deleted file mode 100644
index c7cd568..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/EqualsAssertor.java
+++ /dev/null
@@ -1,34 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-
-public class EqualsAssertor extends ElementAssertor {
-
-    public EqualsAssertor(String exceptedValue) {
-        super(exceptedValue);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-        if (!exceptedValue.equals(actualValue)) {
-            throw new ValueAssertFailedException(desc, exceptedValue, actualValue);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/GreatThanAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/GreatThanAssertor.java
deleted file mode 100644
index ca2fecd..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/GreatThanAssertor.java
+++ /dev/null
@@ -1,34 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-
-public class GreatThanAssertor extends ElementAssertor {
-
-    public GreatThanAssertor(String exceptedValue) {
-        super(exceptedValue);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-        if (Long.parseLong(actualValue) <= Long.parseLong(exceptedValue)) {
-            throw new ValueAssertFailedException(desc, " gt " + exceptedValue, actualValue);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/GreetEqualAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/GreetEqualAssertor.java
deleted file mode 100644
index 8c97fd6..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/GreetEqualAssertor.java
+++ /dev/null
@@ -1,34 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-
-public class GreetEqualAssertor extends ElementAssertor {
-    public GreetEqualAssertor(String exceptedValue) {
-        super(exceptedValue);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-        if (Long.parseLong(actualValue) < Long.parseLong(exceptedValue)) {
-            throw new ValueAssertFailedException(desc, " ge " + exceptedValue, actualValue);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NoopAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NoopAssertor.java
deleted file mode 100644
index bcec8f6..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NoopAssertor.java
+++ /dev/null
@@ -1,29 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-public class NoopAssertor extends ElementAssertor {
-    public NoopAssertor() {
-        super(null);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NotEqualsAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NotEqualsAssertor.java
deleted file mode 100644
index 9f85d76..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NotEqualsAssertor.java
+++ /dev/null
@@ -1,34 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-
-public class NotEqualsAssertor extends ElementAssertor {
-
-    public NotEqualsAssertor(String exceptedValue) {
-        super(exceptedValue);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-        if (exceptedValue.equals(actualValue.trim())) {
-            throw new ValueAssertFailedException(desc, " not eq " + exceptedValue, actualValue);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NotNullAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NotNullAssertor.java
deleted file mode 100644
index dcc5f2d..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NotNullAssertor.java
+++ /dev/null
@@ -1,33 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-
-public class NotNullAssertor extends ElementAssertor {
-    public NotNullAssertor() {
-        super(null);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-        if (actualValue == null) {
-            throw new ValueAssertFailedException(desc, "not null", actualValue);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NullAssertor.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NullAssertor.java
deleted file mode 100644
index b30c3fa..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/element/NullAssertor.java
+++ /dev/null
@@ -1,33 +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.skywalking.plugin.test.agent.tool.validator.assertor.element;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.ValueAssertFailedException;
-
-public class NullAssertor extends ElementAssertor {
-    public NullAssertor() {
-        super(null);
-    }
-
-    @Override
-    public void assertValue(String desc, String actualValue) {
-        if (actualValue != null && actualValue.length() > 0) {
-            throw new ValueAssertFailedException(desc, "null", actualValue);
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualRegistryOperationNameEmptyException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualRegistryOperationNameEmptyException.java
deleted file mode 100644
index 6600b63..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualRegistryOperationNameEmptyException.java
+++ /dev/null
@@ -1,36 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryOperationName;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class ActualRegistryOperationNameEmptyException extends AssertFailedException {
-
-    private final RegistryOperationName registryOperationName;
-
-    public ActualRegistryOperationNameEmptyException(RegistryOperationName registryOperationName) {
-        this.registryOperationName = registryOperationName;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("ActualRegistryOperationNameEmptyException\nexpected:%s\nactual:%s\n", registryOperationName
-            .operationName(), "Empty");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualSegmentItemEmptyException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualSegmentItemEmptyException.java
deleted file mode 100644
index 4ce4c53..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualSegmentItemEmptyException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentItem;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class ActualSegmentItemEmptyException extends AssertFailedException {
-
-    private final SegmentItem expected;
-
-    public ActualSegmentItemEmptyException(SegmentItem expected) {
-        this.expected = expected;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("ActualSegmentItemEmptyException\nexpected: %s\nactual: %s", expected, "Empty");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualSegmentRefIsEmptyException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualSegmentRefIsEmptyException.java
deleted file mode 100644
index 23a5566..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ActualSegmentRefIsEmptyException.java
+++ /dev/null
@@ -1,33 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class ActualSegmentRefIsEmptyException extends AssertFailedException {
-    private final int expectedSize;
-
-    public ActualSegmentRefIsEmptyException(int expectedSize) {
-        this.expectedSize = expectedSize;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("ActualSegmentRefIsEmptyException\nexpected: %d\nactual: %s\n", expectedSize, "Not found");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/KeyValueNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/KeyValueNotEqualsException.java
deleted file mode 100644
index e3eb65f..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/KeyValueNotEqualsException.java
+++ /dev/null
@@ -1,21 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-public class KeyValueNotEqualsException extends RuntimeException {
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventKeyNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventKeyNotEqualsException.java
deleted file mode 100644
index c649c96..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventKeyNotEqualsException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class LogEventKeyNotEqualsException extends AssertFailedException {
-    private final String expected;
-    private final String actual;
-
-    public LogEventKeyNotEqualsException(String expected, String actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[log event key]: expected=>{%s}, actual=>{%s}\n", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventSizeNotEqualsException.java
deleted file mode 100644
index e79bb89..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventSizeNotEqualsException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class LogEventSizeNotEqualsException extends AssertFailedException {
-    private final int expected;
-    private final int actual;
-
-    public LogEventSizeNotEqualsException(int expected, int actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[log event size]: expected=>{%d}, actual=>{%d}\n", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventValueNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventValueNotEqualsException.java
deleted file mode 100644
index 407b27c..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogEventValueNotEqualsException.java
+++ /dev/null
@@ -1,37 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class LogEventValueNotEqualsException extends AssertFailedException {
-    private final String eventKey;
-    private final String expected;
-    private final String actual;
-
-    public LogEventValueNotEqualsException(String eventKey, String expected, String actual) {
-        this.eventKey = eventKey;
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[log(%s} value]: expected=>{%s}, actual=>{%s}\n", eventKey, expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogSizeNotEqualsException.java
deleted file mode 100644
index 73f1573..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/LogSizeNotEqualsException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class LogSizeNotEqualsException extends AssertFailedException {
-    private final int expected;
-    private final int actual;
-
-    public LogSizeNotEqualsException(int expected, int actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[log size]: expected=>{%d}, actual=>{%d}", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ParentSegmentNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ParentSegmentNotFoundException.java
deleted file mode 100644
index dc59c13..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ParentSegmentNotFoundException.java
+++ /dev/null
@@ -1,34 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class ParentSegmentNotFoundException extends AssertFailedException {
-
-    private final String express;
-
-    public ParentSegmentNotFoundException(String express) {
-        this.express = express;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("ParentSegmentNotFoundException\nexpected: %s\nactual: %s\n", express, "NOT FOUND");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RefSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RefSizeNotEqualsException.java
deleted file mode 100644
index c7a2c7b..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RefSizeNotEqualsException.java
+++ /dev/null
@@ -1,36 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RefSizeNotEqualsException extends AssertFailedException {
-
-    private final int expected;
-    private final int actual;
-
-    public RefSizeNotEqualsException(int expected, int actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[segment ref size]: expected=>{%s}, actual=>{%s}", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryApplicationNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryApplicationNotFoundException.java
deleted file mode 100644
index 449207c..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryApplicationNotFoundException.java
+++ /dev/null
@@ -1,33 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RegistryApplicationNotFoundException extends AssertFailedException {
-    private final String applicationCode;
-
-    public RegistryApplicationNotFoundException(String applicationCode) {
-        this.applicationCode = applicationCode;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("RegistryApplicationNotFoundException\nexpected: %s\nactual: %s\n", applicationCode, "Not Found");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryApplicationSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryApplicationSizeNotEqualsException.java
deleted file mode 100644
index b6e17ee..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryApplicationSizeNotEqualsException.java
+++ /dev/null
@@ -1,36 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RegistryApplicationSizeNotEqualsException extends AssertFailedException {
-    private final String applicationCode;
-    private final ValueAssertFailedException cause;
-
-    public RegistryApplicationSizeNotEqualsException(String applicationCode, ValueAssertFailedException cause) {
-        this.applicationCode = applicationCode;
-        this.cause = cause;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("RegistryApplicationSizeNotEqualsException: %s\nexpected: %s\nactual: %s\n", applicationCode, cause
-            .getExpected(), cause.getActual());
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryInstanceOfApplicationNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryInstanceOfApplicationNotFoundException.java
deleted file mode 100644
index ba41bd1..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryInstanceOfApplicationNotFoundException.java
+++ /dev/null
@@ -1,34 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RegistryInstanceOfApplicationNotFoundException extends AssertFailedException {
-
-    private final String applicationCode;
-
-    public RegistryInstanceOfApplicationNotFoundException(String applicationCode) {
-        this.applicationCode = applicationCode;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("RegistryInstanceOfApplicationNotFoundException\nexpected: Instances of Service(%s)" + "\nactual: %s\n", applicationCode, "NOT FOUND");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryInstanceSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryInstanceSizeNotEqualsException.java
deleted file mode 100644
index 283e72a..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryInstanceSizeNotEqualsException.java
+++ /dev/null
@@ -1,37 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RegistryInstanceSizeNotEqualsException extends AssertFailedException {
-
-    private final String applicationCode;
-    private final ValueAssertFailedException cause;
-
-    public RegistryInstanceSizeNotEqualsException(String applicationCode, ValueAssertFailedException cause) {
-        this.applicationCode = applicationCode;
-        this.cause = cause;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("RegistryInstanceSizeNotEqualsException %s\nexpected: %s\nactual: %s\n", applicationCode, cause
-            .getExpected(), cause.getActual());
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryOperationNameNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryOperationNameNotFoundException.java
deleted file mode 100644
index 1cf2ec7..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryOperationNameNotFoundException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RegistryOperationNameNotFoundException extends AssertFailedException {
-    private final String applicationCode;
-    private final String operationName;
-
-    public RegistryOperationNameNotFoundException(String applicationCode, String operationName) {
-        this.applicationCode = applicationCode;
-        this.operationName = operationName;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("RegistryOperationNameNotFoundException %s\nexpected: %s\nactual: %s\n", applicationCode, operationName, "NOT FOUND");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryOperationNamesOfApplicationNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryOperationNamesOfApplicationNotFoundException.java
deleted file mode 100644
index c416841..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/RegistryOperationNamesOfApplicationNotFoundException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.RegistryOperationName;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class RegistryOperationNamesOfApplicationNotFoundException extends AssertFailedException {
-    private final RegistryOperationName applicationCode;
-
-    public RegistryOperationNamesOfApplicationNotFoundException(RegistryOperationName applicationCode) {
-        this.applicationCode = applicationCode;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("RegistryOperationNamesOfApplicationNotFoundException %s\nexpected: %s\nactual: %s\n", applicationCode
-            .serviceName(), applicationCode.operationName(), "NOT FOUND");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentItemNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentItemNotFoundException.java
deleted file mode 100644
index 038fd41..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentItemNotFoundException.java
+++ /dev/null
@@ -1,33 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentItemNotFoundException extends AssertFailedException {
-    private final String applicationCode;
-
-    public SegmentItemNotFoundException(String applicationCode) {
-        this.applicationCode = applicationCode;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("SegmentItemNotFoundException\nexpected: %s\nactual: %s", applicationCode, "Not Found");
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentNotFoundException.java
deleted file mode 100644
index 28ba9db..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentNotFoundException.java
+++ /dev/null
@@ -1,56 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.SegmentPredictionFailedCause;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Segment;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Span;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentNotFoundException extends AssertFailedException {
-    private final Segment expectedSegment;
-    private final List<SegmentPredictionFailedCause> failedCauses;
-
-    public SegmentNotFoundException(Segment expectedSegment, List<SegmentPredictionFailedCause> failedCauses) {
-        this.expectedSegment = expectedSegment;
-        this.failedCauses = failedCauses;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        StringBuilder expectedMessage = new StringBuilder("\n  Segment:\n");
-        for (Span span : expectedSegment.spans()) {
-            expectedMessage.append(String.format("  - span[%s, %s] %s\n", span.parentSpanId(), span.spanId(), span.operationName()));
-        }
-
-        StringBuilder causeMessage = new StringBuilder();
-        for (SegmentPredictionFailedCause cause : failedCauses) {
-            Segment actualSegment = cause.getActualSegment();
-            Span actualSpan = cause.getSpanAssertFailedCause().getActualSpan();
-            Span expectedSpan = cause.getSpanAssertFailedCause().getExceptedSpan();
-
-            causeMessage.append(String.format("\n  Segment[%s] e\n  expected:\tSpan[%s, %s] %s\n  " + "actual:" + "\tspan[%s, %s] %s\n  reason:\t%s\n", actualSegment
-                .segmentId(), expectedSpan.parentSpanId(), expectedSpan.spanId(), expectedSpan.operationName(), actualSpan
-                .parentSpanId(), actualSpan.spanId(), actualSpan.operationName(), cause.getSpanAssertFailedCause()
-                                                                                       .getCauseMessage()));
-        }
-
-        return String.format("SegmentNotFoundException:\nexpected: %s\nactual: %s\n", expectedMessage, causeMessage);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefAssertFailedException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefAssertFailedException.java
deleted file mode 100644
index f616190..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefAssertFailedException.java
+++ /dev/null
@@ -1,38 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentRefAssertFailedException extends AssertFailedException {
-    private final ValueAssertFailedException e;
-    private final SegmentRef expected;
-    private final SegmentRef actual;
-
-    public SegmentRefAssertFailedException(ValueAssertFailedException e, SegmentRef expected, SegmentRef actual) {
-        this.e = e;
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return e.getCauseMessage();
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefNotFoundException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefNotFoundException.java
deleted file mode 100644
index 49f4e1f..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefNotFoundException.java
+++ /dev/null
@@ -1,56 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.SegmentRefAssertFailedCause;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.SegmentRef;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentRefNotFoundException extends AssertFailedException {
-    private final SegmentRef expected;
-    private final List<SegmentRefAssertFailedCause> causes;
-
-    public SegmentRefNotFoundException(SegmentRef expected, List<SegmentRefAssertFailedCause> causes) {
-        this.expected = expected;
-        this.causes = causes;
-    }
-
-    @Override
-    public String getCauseMessage() {
-
-        StringBuilder actualMessage = new StringBuilder();
-        for (SegmentRefAssertFailedCause cause : causes) {
-            SegmentRef actual = cause.getActual();
-            String reason = cause.getFailedCause().getCauseMessage();
-
-            StringBuilder actualSegmentRef = new StringBuilder(String.format("\nSegmentRef:\t%s\n", reason));
-            actualSegmentRef.append(String.format(" - entryServiceName:\t\t%s\n", actual.entryEndpointName()))
-                            .append(String.format(" - networkAddress:\t\t\t%s\n", actual.networkAddress()))
-                            .append(String.format(" - parentServiceName:\t\t%s\n", actual.parentEndpointName()))
-                            .append(String.format(" - parentSpanId:\t\t\t%s\n", actual.parentSpanId()))
-                            .append(String.format(" - parentTraceSegmentId:\t%s\n", actual.parentTraceSegmentId()))
-                            .append(String.format(" - refType:\t\t\t\t\t%s", actual.refType()))
-                            .toString();
-
-            actualMessage.append(String.format("%s\n", actualSegmentRef));
-        }
-
-        return String.format("SegmentRefNotFoundException\nexpected: %s\nactual: %s\n", expected, actualMessage);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefSizeNotEqualsException.java
deleted file mode 100644
index fa57496..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentRefSizeNotEqualsException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentRefSizeNotEqualsException extends AssertFailedException {
-    private final int expected;
-    private final int actual;
-
-    public SegmentRefSizeNotEqualsException(int expected, int actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("SegmentRefSizeNotEqualsException\nexpected:\t%s\nactual:\t%s\n", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentSizeNotEqualsException.java
deleted file mode 100644
index 6ec8e56..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SegmentSizeNotEqualsException.java
+++ /dev/null
@@ -1,37 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SegmentSizeNotEqualsException extends AssertFailedException {
-    private final String applicationCode;
-    private final String expected;
-    private final String actual;
-
-    public SegmentSizeNotEqualsException(String applicationCode, String expected, String actual) {
-        this.applicationCode = applicationCode;
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("SegmentSizeNotEqualsException:\t%s\nexpected:\t%s\nactual:\t\t%s\n", applicationCode, expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SpanAssertFailedException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SpanAssertFailedException.java
deleted file mode 100644
index e5ae437..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SpanAssertFailedException.java
+++ /dev/null
@@ -1,46 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Span;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SpanAssertFailedException extends AssertFailedException {
-    private final AssertFailedException failedCause;
-    private final Span exceptedSpan;
-    private final Span actualSpan;
-
-    public SpanAssertFailedException(AssertFailedException failedCause, Span exceptedSpan, Span actualSpan) {
-        this.failedCause = failedCause;
-        this.exceptedSpan = exceptedSpan;
-        this.actualSpan = actualSpan;
-    }
-
-    public Span getExceptedSpan() {
-        return exceptedSpan;
-    }
-
-    public Span getActualSpan() {
-        return actualSpan;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return failedCause.getCauseMessage();
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SpanSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SpanSizeNotEqualsException.java
deleted file mode 100644
index 702ab45..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/SpanSizeNotEqualsException.java
+++ /dev/null
@@ -1,36 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class SpanSizeNotEqualsException extends AssertFailedException {
-
-    private final int expected;
-    private final int actual;
-
-    public SpanSizeNotEqualsException(int expected, int actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[span size]: expected=>{%s}, actual=>{%s}\n", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagKeyNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagKeyNotEqualsException.java
deleted file mode 100644
index 8eef92d..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagKeyNotEqualsException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class TagKeyNotEqualsException extends AssertFailedException {
-    private final String expected;
-    private final String actual;
-
-    public TagKeyNotEqualsException(String expected, String actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[tag key]: expected=>{%s}, actual=>{%s}\n", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagSizeNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagSizeNotEqualsException.java
deleted file mode 100644
index b09e6bf..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagSizeNotEqualsException.java
+++ /dev/null
@@ -1,35 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class TagSizeNotEqualsException extends AssertFailedException {
-    private final int expected;
-    private final int actual;
-
-    public TagSizeNotEqualsException(int expected, int actual) {
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[tag size]: expected=>{%s}, actual=>{%s}\n", expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagValueNotEqualsException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagValueNotEqualsException.java
deleted file mode 100644
index 6c8d41f..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TagValueNotEqualsException.java
+++ /dev/null
@@ -1,37 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class TagValueNotEqualsException extends AssertFailedException {
-    private final String tagKey;
-    private final String expected;
-    private final String actual;
-
-    public TagValueNotEqualsException(String tagKey, String expected, String actual) {
-        this.tagKey = tagKey;
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[tag(%s) value]: expected=>{}, actual=>{%s}\n", tagKey, expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TypeUndefinedException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TypeUndefinedException.java
deleted file mode 100644
index aef9b1a..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/TypeUndefinedException.java
+++ /dev/null
@@ -1,27 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-public class TypeUndefinedException extends Exception {
-
-    public TypeUndefinedException(String message) {
-        super(message);
-    }
-
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ValueAssertFailedException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ValueAssertFailedException.java
deleted file mode 100644
index 7f7d120..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/assertor/exception/ValueAssertFailedException.java
+++ /dev/null
@@ -1,49 +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.skywalking.plugin.test.agent.tool.validator.assertor.exception;
-
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;
-
-public class ValueAssertFailedException extends AssertFailedException {
-    private final String desc;
-    private final String expected;
-    private final String actual;
-
-    public ValueAssertFailedException(String desc, String expected, String actual) {
-        this.desc = desc;
-        this.expected = expected;
-        this.actual = actual;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public String getExpected() {
-        return expected;
-    }
-
-    public String getActual() {
-        return actual;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("[%s]: expected=>{%s}, actual=>{%s}", desc, expected, actual);
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Data.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Data.java
deleted file mode 100644
index fa45668..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Data.java
+++ /dev/null
@@ -1,76 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.List;
-import org.apache.skywalking.plugin.test.agent.tool.validator.exception.IllegalDataFileException;
-import org.yaml.snakeyaml.TypeDescription;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.representer.Representer;
-
-public interface Data {
-    RegistryItems registryItems();
-
-    List<SegmentItem> segmentItems();
-
-    class Loader {
-        public static Data loadData(String fileName, File file) {
-            try {
-                return loadData(new FileInputStream(file));
-            } catch (Exception e) {
-                throw new IllegalDataFileException(fileName);
-            }
-        }
-
-        public static Data loadData(InputStream inputStream) {
-            Constructor constructor = new Constructor(DataForRead.class);
-            TypeDescription configDescription = new TypeDescription(DataForRead.class);
-            configDescription.putListPropertyType("data", DataForRead.class);
-
-            Representer representer = new Representer();
-            representer.getPropertyUtils().setSkipMissingProperties(true);
-            Yaml yaml = new Yaml(constructor, representer);
-            Data result = yaml.loadAs(inputStream, DataForRead.class);
-            if (result == null) {
-                throw new RuntimeException();
-            } else {
-                return result;
-            }
-        }
-
-        public static Data loadData(String data) {
-            Constructor constructor = new Constructor(DataForRead.class);
-            TypeDescription configDescription = new TypeDescription(DataForRead.class);
-            configDescription.putListPropertyType("data", DataForRead.class);
-
-            Representer representer = new Representer();
-            representer.getPropertyUtils().setSkipMissingProperties(true);
-            Yaml yaml = new Yaml(constructor, representer);
-            Data result = yaml.loadAs(data, DataForRead.class);
-            if (result == null) {
-                throw new RuntimeException();
-            } else {
-                return result;
-            }
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/DataForRead.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/DataForRead.java
deleted file mode 100644
index c206f9f..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/DataForRead.java
+++ /dev/null
@@ -1,42 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@lombok.Data
-public class DataForRead implements Data {
-    private RegistryItemsForRead registryItems;
-    private List<SegmentItemForRead> segmentItems;
-
-    @Override
-    public RegistryItemsForRead registryItems() {
-        return registryItems;
-    }
-
-    @Override
-    public List<SegmentItem> segmentItems() {
-        if (this.segmentItems == null) {
-            return null;
-        }
-
-        return new ArrayList<>(this.segmentItems);
-    }
-
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/KeyValuePair.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/KeyValuePair.java
deleted file mode 100644
index 8032baa..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/KeyValuePair.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.skywalking.plugin.test.agent.tool.validator.entity;
-
-public interface KeyValuePair {
-    String key();
-
-    String value();
-
-    class Impl implements KeyValuePair {
-        private String key;
-        private String value;
-
-        public Impl(String key, String value) {
-            this.key = key;
-            this.value = value;
-        }
-
-        @Override
-        public String key() {
-            return key;
-        }
-
-        @Override
-        public String value() {
-            return value;
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/LogEvent.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/LogEvent.java
deleted file mode 100644
index f4158f7..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/LogEvent.java
+++ /dev/null
@@ -1,42 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public interface LogEvent {
-    List<KeyValuePair> events();
-
-    class Impl implements LogEvent {
-        private List<KeyValuePair> keyValuePairs;
-
-        Impl() {
-            keyValuePairs = new ArrayList<>();
-        }
-
-        void add(String key, String value) {
-            keyValuePairs.add(new KeyValuePair.Impl(key, value));
-        }
-
-        @Override
-        public List<KeyValuePair> events() {
-            return keyValuePairs;
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryApplication.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryApplication.java
deleted file mode 100644
index 760fa70..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryApplication.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.skywalking.plugin.test.agent.tool.validator.entity;
-
-public interface RegistryApplication {
-    String applicationCode();
-
-    String expressValue();
-
-    class Impl implements RegistryApplication {
-        private String applicationCode;
-        private String express;
-
-        Impl(String code, String express) {
-            this.applicationCode = code;
-            this.express = express;
-        }
-
-        @Override
-        public String applicationCode() {
-            return applicationCode;
-        }
-
-        @Override
-        public String expressValue() {
-            return express;
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryInstance.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryInstance.java
deleted file mode 100644
index 766fdf0..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryInstance.java
+++ /dev/null
@@ -1,46 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-public interface RegistryInstance {
-
-    String applicationCode();
-
-    String expressValue();
-
-    class Impl implements RegistryInstance {
-
-        private final String code;
-        private final String express;
-
-        Impl(String code, String express) {
-            this.code = code;
-            this.express = express;
-        }
-
-        @Override
-        public String applicationCode() {
-            return code;
-        }
-
-        @Override
-        public String expressValue() {
-            return express;
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryItems.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryItems.java
deleted file mode 100644
index 279f41a..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryItems.java
+++ /dev/null
@@ -1,28 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.List;
-
-public interface RegistryItems {
-    List<RegistryApplication> applications();
-
-    List<RegistryInstance> instances();
-
-    List<RegistryOperationName> operationNames();
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryItemsForRead.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryItemsForRead.java
deleted file mode 100644
index 071a1af..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryItemsForRead.java
+++ /dev/null
@@ -1,75 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import lombok.Data;
-
-@Data
-public class RegistryItemsForRead implements RegistryItems {
-    private List<Map<String, String>> applications;
-    private List<Map<String, String>> instances;
-    private List<Map<String, List<String>>> operationNames;
-
-    @Override
-    public List<RegistryApplication> applications() {
-        if (this.applications == null) {
-            return null;
-        }
-
-        List<RegistryApplication> registryApplications = new ArrayList<>();
-        for (Map<String, String> registryApplication : applications) {
-            String applicationCode = new ArrayList<String>(registryApplication.keySet()).get(0);
-            String express = String.valueOf(registryApplication.get(applicationCode));
-            registryApplications.add(new RegistryApplication.Impl(applicationCode, express));
-        }
-        return registryApplications;
-    }
-
-    @Override
-    public List<RegistryInstance> instances() {
-        if (this.instances == null) {
-            return null;
-        }
-
-        List<RegistryInstance> registryInstances = new ArrayList<>();
-        instances.forEach((registryInstance) -> {
-            String applicationCode = new ArrayList<String>(registryInstance.keySet()).get(0);
-            String express = String.valueOf(registryInstance.get(applicationCode));
-            registryInstances.add(new RegistryInstance.Impl(applicationCode, express));
-        });
-        return registryInstances;
-    }
-
-    @Override
-    public List<RegistryOperationName> operationNames() {
-        if (this.operationNames == null) {
-            return null;
-        }
-
-        List<RegistryOperationName> registryOperationNames = new ArrayList<>();
-        operationNames.forEach((registryInstance) -> {
-            String applicationCode = new ArrayList<String>(registryInstance.keySet()).get(0);
-            List<String> express = registryInstance.get(applicationCode);
-            registryOperationNames.add(new RegistryOperationName.Impl(applicationCode, express));
-        });
-        return registryOperationNames;
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryOperationName.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryOperationName.java
deleted file mode 100644
index bcff123..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/RegistryOperationName.java
+++ /dev/null
@@ -1,46 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.List;
-
-public interface RegistryOperationName {
-    String serviceName();
-
-    List<String> operationName();
-
-    class Impl implements RegistryOperationName {
-        private final String code;
-        private final List<String> express;
-
-        Impl(String code, List<String> express) {
-            this.code = code;
-            this.express = express;
-        }
-
-        @Override
-        public String serviceName() {
-            return code;
-        }
-
-        @Override
-        public List<String> operationName() {
-            return express;
-        }
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Segment.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Segment.java
deleted file mode 100644
index 6f42e22..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Segment.java
+++ /dev/null
@@ -1,28 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.List;
-
-public interface Segment {
-    String segmentId();
-
-    List<Span> spans();
-
-    void setSegmentId(String segmentId);
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentForRead.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentForRead.java
deleted file mode 100644
index 36e5fdc..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentForRead.java
+++ /dev/null
@@ -1,378 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import lombok.Data;
-
-public class SegmentForRead implements Segment {
-    private String segmentId;
-    private List<SpanForRead> spans;
-
-    @Override
-    public String segmentId() {
-        return segmentId;
-    }
-
-    @Override
-    public List<Span> spans() {
-        if (spans == null) {
-            return null;
-        }
-        return new ArrayList<>(spans);
-    }
-
-    @Data
-    public static class SegmentRefForRead implements SegmentRef {
-        private String parentEndpointId;
-        private String parentEndpoint;
-        private String networkAddressId;
-        private String entryEndpointId;
-        private String refType;
-        private String parentSpanId;
-        private String parentTraceSegmentId;
-        private String parentServiceInstanceId;
-        private String networkAddress;
-        private String entryEndpoint;
-        private String entryServiceInstanceId;
-
-        public SegmentRefForRead() {
-        }
-
-        public SegmentRefForRead(Map<String, Object> ref) {
-            this.networkAddress = ref.get("networkAddress").toString();
-            this.entryEndpoint = ref.get("entryEndpoint").toString();
-            this.parentEndpoint = ref.get("parentEndpoint").toString();
-            this.parentTraceSegmentId = ref.get("parentTraceSegmentId").toString();
-            this.entryServiceInstanceId = ref.get("entryServiceInstanceId").toString();
-            this.refType = ref.get("refType") == null ? null : ref.get("refType").toString();
-            this.parentSpanId = ref.get("parentSpanId") == null ? null : ref.get("parentSpanId").toString();
-            this.entryEndpointId = ref.get("entryEndpointId") == null ? null : ref.get("entryEndpointId").toString();
-            this.parentEndpointId = ref.get("parentEndpointId") == null ? null : ref.get("parentEndpointId").toString();
-            this.networkAddressId = ref.get("networkAddressId") == null ? null : ref.get("networkAddressId").toString();
-            this.parentServiceInstanceId = ref.get("parentServiceInstanceId") == null ? null : ref.get("parentServiceInstanceId")
-                                                                                                  .toString();
-        }
-
-        @Override
-        public String parentEndpointId() {
-            return parentEndpointId;
-        }
-
-        @Override
-        public String parentEndpointName() {
-            return parentEndpoint;
-        }
-
-        @Override
-        public String networkAddressId() {
-            return networkAddressId;
-        }
-
-        @Override
-        public String entryEndpointId() {
-            return entryEndpointId;
-        }
-
-        @Override
-        public String refType() {
-            return refType;
-        }
-
-        @Override
-        public String parentSpanId() {
-            return parentSpanId;
-        }
-
-        @Override
-        public String parentTraceSegmentId() {
-            return parentTraceSegmentId;
-        }
-
-        @Override
-        public String parentServiceInstanceId() {
-            return parentServiceInstanceId;
-        }
-
-        @Override
-        public String networkAddress() {
-            return networkAddress;
-        }
-
-        @Override
-        public String entryEndpointName() {
-            return entryEndpoint;
-        }
-
-        @Override
-        public void parentTraceSegmentId(String parentTraceSegmentId) {
-            this.parentTraceSegmentId = parentTraceSegmentId;
-        }
-
-        @Override
-        public String entryServiceInstanceId() {
-            return entryServiceInstanceId;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder actualSegmentRef = new StringBuilder("\nSegmentRef:\n");
-            return actualSegmentRef.append(String.format(" - entryServiceName:\t\t%s\n", entryEndpointName()))
-                                   .append(String.format(" - networkAddress:\t\t\t%s\n", networkAddress()))
-                                   .append(String.format(" - parentServiceName:\t\t%s\n", parentEndpointName()))
-                                   .append(String.format(" - parentSpanId:\t\t\t%s\n", parentSpanId()))
-                                   .append(String.format(" - parentTraceSegmentId:\t%s\n", parentTraceSegmentId()))
-                                   .append(String.format(" - refType:\t\t\t\t\t%s", refType()))
-                                   .toString();
-        }
-    }
-
-    public static class SpanForRead implements Span {
-        private String operationName;
-        private String operationId;
-        private String parentSpanId;
-        private String spanId;
-        private String spanLayer;
-        private List<Map<String, String>> tags;
-        private List<Map<String, List<Map<String, String>>>> logs;
-        private List<Map<String, Object>> refs;
-        private List<SegmentRef> formatedRefs;
-        private List<SegmentRef> actualRefs;
-        private String startTime;
-        private String endTime;
-        private String componentId;
-        private String componentName;
-        private String isError;
-        private String spanType;
-        private String peer;
-        private String peerId;
-
-        public void setOperationName(String operationName) {
-            this.operationName = operationName;
-        }
-
-        public void setOperationId(String operationId) {
-            this.operationId = operationId;
-        }
-
-        public void setParentSpanId(String parentSpanId) {
-            this.parentSpanId = parentSpanId;
-        }
-
-        public void setSpanId(String spanId) {
-            this.spanId = spanId;
-        }
-
-        public void setSpanLayer(String spanLayer) {
-            this.spanLayer = spanLayer;
-        }
-
-        public void setTags(List<Map<String, String>> tags) {
-            this.tags = tags;
-        }
-
-        public void setLogs(List<Map<String, List<Map<String, String>>>> logs) {
-            this.logs = logs;
-        }
-
-        public void setStartTime(String startTime) {
-            this.startTime = startTime;
-        }
-
-        public void setEndTime(String endTime) {
-            this.endTime = endTime;
-        }
-
-        public void setComponentId(String componentId) {
-            this.componentId = componentId;
-        }
-
-        public void setComponentName(String componentName) {
-            this.componentName = componentName;
-        }
-
-        public void setError(String error) {
-            isError = error;
-        }
-
-        public void setSpanType(String spanType) {
-            this.spanType = spanType;
-        }
-
-        public void setPeer(String peer) {
-            this.peer = peer;
-        }
-
-        public void setPeerId(String peerId) {
-            this.peerId = peerId;
-        }
-
-        public void setRefs(List<Map<String, Object>> refs) {
-            this.refs = refs;
-        }
-
-        @Override
-        public String operationName() {
-            return operationName;
-        }
-
-        @Override
-        public String operationId() {
-            return operationId;
-        }
-
-        @Override
-        public String parentSpanId() {
-            return parentSpanId;
-        }
-
-        @Override
-        public String spanId() {
-            return spanId;
-        }
-
-        @Override
-        public String spanLayer() {
-            return spanLayer;
-        }
-
-        @Override
-        public List<KeyValuePair> tags() {
-            if (tags == null) {
-                return new ArrayList<>();
-            }
-            List<KeyValuePair> result = new ArrayList<>();
-            for (Map<String, String> tag : tags) {
-                result.add(new KeyValuePair.Impl(tag.get("key"), tag.get("value")));
-            }
-            return result;
-        }
-
-        @Override
-        public List<LogEvent> logs() {
-            if (logs == null) {
-                return new ArrayList<>();
-            }
-            List<LogEvent> result = new ArrayList<>();
-            for (Map<String, List<Map<String, String>>> log : logs) {
-                List<Map<String, String>> events = log.get("logEvent");
-                LogEvent.Impl logEvent = new LogEvent.Impl();
-                for (Map<String, String> event : events) {
-                    logEvent.add(event.get("key"), event.get("value"));
-                }
-                result.add(logEvent);
-            }
-
-            return result;
-        }
-
-        @Override
-        public String startTime() {
-            return startTime;
-        }
-
-        @Override
-        public String endTime() {
-            return endTime;
-        }
-
-        @Override
-        public String componentId() {
-            return componentId;
-        }
-
-        @Override
-        public String componentName() {
-            return componentName;
-        }
-
-        @Override
-        public String error() {
-            return isError;
-        }
-
-        @Override
-        public String spanType() {
-            return spanType;
-        }
-
-        @Override
-        public String peer() {
-            return peer;
-        }
-
-        @Override
-        public String peerId() {
-            return peerId;
-        }
-
-        @Override
-        public List<SegmentRef> refs() {
-            if (formatedRefs == null && refs != null) {
-                List<SegmentRef> segmentRefs = new ArrayList<>();
-                for (Map<String, Object> ref : refs) {
-                    segmentRefs.add(new SegmentRefForRead(ref));
-                }
-
-                this.formatedRefs = segmentRefs;
-            }
-            return formatedRefs;
-        }
-
-        @Override
-        public void setActualRefs(List<SegmentRef> refs) {
-            this.actualRefs = refs;
-        }
-
-        @Override
-        public List<SegmentRef> actualRefs() {
-            return actualRefs;
-        }
-    }
-
-    public static class LogEventForRead {
-        private List<Map<String, String>> logEvent;
-
-        public List<Map<String, String>> getLogEvent() {
-            return logEvent;
-        }
-
-        public void setLogEvent(List<Map<String, String>> logEvent) {
-            this.logEvent = logEvent;
-        }
-    }
-
-    public String getSegmentId() {
-        return segmentId;
-    }
-
-    public List<SpanForRead> getSpans() {
-        return spans;
-    }
-
-    @Override
-    public void setSegmentId(String segmentId) {
-        this.segmentId = segmentId;
-    }
-
-    public void setSpans(List<SpanForRead> spans) {
-        this.spans = spans;
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentItem.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentItem.java
deleted file mode 100644
index 7b0bc67..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentItem.java
+++ /dev/null
@@ -1,28 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.List;
-
-public interface SegmentItem {
-    String serviceName();
-
-    String segmentSize();
-
-    List<Segment> segments();
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentItemForRead.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentItemForRead.java
deleted file mode 100644
index ab4b3c6..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentItemForRead.java
+++ /dev/null
@@ -1,54 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-import lombok.Data;
-
-@Data
-public class SegmentItemForRead implements SegmentItem {
-    private String serviceName;
-    private String segmentSize;
-    private List<SegmentForRead> segments;
-
-    @Override
-    public String serviceName() {
-        return serviceName;
-    }
-
-    @Override
-    public String segmentSize() {
-        return segmentSize;
-    }
-
-    @Override
-    public List<Segment> segments() {
-        if (segments == null) {
-            return null;
-        }
-        return new ArrayList<>(segments);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder message = new StringBuilder(String.format("\nSegment Item[%s]", serviceName));
-        message.append(String.format(" - segment size:\t\t%s\n", segmentSize));
-        return message.toString();
-    }
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentRef.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentRef.java
deleted file mode 100644
index 77cf0b7..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/SegmentRef.java
+++ /dev/null
@@ -1,45 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-public interface SegmentRef {
-
-    String parentEndpointId();
-
-    String parentEndpointName();
-
-    String networkAddressId();
-
-    String entryEndpointId();
-
-    String refType();
-
-    String parentSpanId();
-
-    String parentTraceSegmentId();
-
-    String parentServiceInstanceId();
-
-    String networkAddress();
-
-    String entryEndpointName();
-
-    void parentTraceSegmentId(String parentTraceSegmentId);
-
-    String entryServiceInstanceId();
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Span.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Span.java
deleted file mode 100644
index ea1bc99..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/entity/Span.java
+++ /dev/null
@@ -1,58 +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.skywalking.plugin.test.agent.tool.validator.entity;
-
-import java.util.List;
-
-public interface Span {
-    String operationName();
-
-    String operationId();
-
-    String parentSpanId();
-
-    String spanId();
-
-    String spanLayer();
-
-    List<KeyValuePair> tags();
-
-    List<LogEvent> logs();
-
-    String startTime();
-
-    String endTime();
-
-    String componentId();
-
-    String componentName();
-
-    String error();
-
-    String spanType();
-
-    String peer();
-
-    String peerId();
-
-    List<SegmentRef> refs();
-
-    void setActualRefs(List<SegmentRef> refs);
-
-    List<SegmentRef> actualRefs();
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/exception/AssertFailedException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/exception/AssertFailedException.java
deleted file mode 100644
index 902c346..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/exception/AssertFailedException.java
+++ /dev/null
@@ -1,29 +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.skywalking.plugin.test.agent.tool.validator.exception;
-
-public abstract class AssertFailedException extends RuntimeException {
-    protected AssertFailedException(String message) {
-        super(message);
-    }
-
-    protected AssertFailedException() {
-    }
-
-    public abstract String getCauseMessage();
-}
diff --git a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/exception/IllegalDataFileException.java b/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/exception/IllegalDataFileException.java
deleted file mode 100644
index a80fa67..0000000
--- a/test/e2e/validator/src/main/java/org/apache/skywalking/plugin/test/agent/tool/validator/exception/IllegalDataFileException.java
+++ /dev/null
@@ -1,31 +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.skywalking.plugin.test.agent.tool.validator.exception;
-
-public class IllegalDataFileException extends AssertFailedException {
-    private final String fileName;
-
-    public IllegalDataFileException(String fileName) {
-        this.fileName = fileName;
-    }
-
-    @Override
-    public String getCauseMessage() {
-        return String.format("IllegalDataFileException %s ", fileName);
-    }
-}
diff --git a/test/e2e/validator/src/main/resources/log4j2.xml b/test/e2e/validator/src/main/resources/log4j2.xml
deleted file mode 100644
index 342bd6d..0000000
--- a/test/e2e/validator/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-       ~ 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.
-  ~
-  -->
-<Configuration status="INFO">
-    <Appenders>
-        <Console name="console_out" target="SYSTEM_OUT">
-            <ThresholdFilter level="INFO"/>
-            <PatternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
-        </Console>
-
-        <Console name="console_err" target="SYSTEM_ERR">
-            <ThresholdFilter level="ERROR"/>
-            <PatternLayout charset="UTF-8" pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <Root level="INFO">
-            <AppenderRef ref="console_err"/>
-            <AppenderRef ref="console_out"/>
-        </Root>
-    </Loggers>
-</Configuration>
\ No newline at end of file
diff --git a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/DataAssertIT.java b/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/DataAssertIT.java
deleted file mode 100644
index 4b7377c..0000000
--- a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/DataAssertIT.java
+++ /dev/null
@@ -1,114 +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.skywalking.plugin.test.validator.validator.assertor;
-
-import com.google.common.io.ByteStreams;
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.file.Files;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.DataAssert;
-import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception.TypeUndefinedException;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Data;
-import org.apache.skywalking.plugin.test.agent.tool.validator.entity.DataForRead;
-import org.junit.Test;
-import org.yaml.snakeyaml.Yaml;
-
-@Slf4j
-public class DataAssertIT {
-    private static final Gson gson = new Gson();
-
-    @Test
-    public void testAssertFunction() throws InterruptedException, IOException, TypeUndefinedException {
-        TimeUnit.SECONDS.sleep(10L); // wait for agent registry
-
-        URLConnection connection = new URL(System.getProperty("ping.url")).openConnection();
-        connection.connect();
-        log.info("Http Response: {}", new String(ByteStreams.toByteArray(connection.getInputStream())));
-
-        TimeUnit.SECONDS.sleep(6L);
-
-        for (int times = 0; times < 30; times++) { // retry 30 times, that will spend 60s in the worst case.
-            final DataCollector collector = new DataCollector();
-            URL url = DataAssertIT.class.getResource("/logs/trace.log");
-            List<String> lines = Files.readAllLines(new File(url.getFile()).toPath());
-            log.info("lines : {}", lines.size());
-
-            for (int i = 0; i < lines.size() - 1; i++) {
-                String[] pair = lines.get(i).split(" ", 2);
-
-                JsonElement element = new JsonParser().parse(pair[1].replaceAll("\\\\", "").trim());
-                switch (pair[0]) {
-                    case Type.HEART_BEAT:
-                        break;
-                    case Type.SERVICE_REGISTER: {
-                        element.getAsJsonObject().get("services").getAsJsonArray().forEach(e -> {
-                            collector.serviceRegistry(e.getAsJsonObject().get("serviceName").getAsString());
-                        });
-                        break;
-                    }
-                    case Type.INSTANCE_REGISTER: {
-                        JsonArray instances = element.getAsJsonObject().getAsJsonArray("instances");
-                        instances.forEach(el -> {
-                            collector.instanceRegistry(el.getAsJsonObject().get("serviceId").getAsInt());
-                        });
-                        break;
-                    }
-                    case Type.SEGMENTS: {
-                        collector.addSegmentItem(element);
-                        break;
-                    }
-                    default: {
-                        throw new TypeUndefinedException("Type " + pair[0] + " undefined.");
-                    }
-                }
-            }
-
-            try {
-                if (!collector.hasSegments()) {
-                    throw new NullPointerException();
-                }
-
-                DataAssert.assertEquals(
-                    Data.Loader.loadData(DataCollector.class.getResourceAsStream("/expectedData.yaml")),
-                    Data.Loader.loadData(gson.toJson(collector.collect()))
-                );
-                return;
-            } catch (Exception e) {
-                TimeUnit.SECONDS.sleep(2L);
-                log.error(e.getMessage(), e);
-            }
-        }
-    }
-
-    static interface Type {
-        String HEART_BEAT = "/v2/instance/heartbeat";
-        String SEGMENTS = "/v2/segments";
-        String INSTANCE_REGISTER = "/v2/instance/register";
-        String SERVICE_REGISTER = "/v2/service/register";
-    }
-
-}
\ No newline at end of file
diff --git a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/DataCollector.java b/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/DataCollector.java
deleted file mode 100644
index 7eb2669..0000000
--- a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/DataCollector.java
+++ /dev/null
@@ -1,167 +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.skywalking.plugin.test.validator.validator.assertor;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.skywalking.plugin.test.validator.validator.assertor.entity.ExpectedDataEntity;
-import org.apache.skywalking.plugin.test.validator.validator.assertor.entity.RegistryItemsEntity;
-
-@Slf4j
-public class DataCollector {
-    // For SegmentItems
-    private Map<String, List<JsonObject>> serviceAndSegments = Maps.newHashMap();
-
-    // For RegistryItems
-    private final Map<String, Integer> instanceMap = Maps.newHashMap();
-    private final Map<Integer, String> serviceMap = Maps.newHashMap();
-    private Map<String, List<String>> serviceAndOperations = Maps.newHashMap();
-    private int serviceIdGenerator = 0;
-
-    public DataCollector serviceRegistry(String serviceName) {
-        if (!serviceMap.containsValue(serviceName)) {
-            serviceMap.put(++serviceIdGenerator, serviceName);
-        }
-        return this;
-    }
-
-    public DataCollector instanceRegistry(int serviceId) {
-        String serviceName = serviceMap.get(serviceId);
-        instanceMap.put(serviceName, instanceMap.getOrDefault(serviceName, 0) + 1);
-        return this;
-    }
-
-    public DataCollector addSegmentItem(JsonElement element) {
-        final JsonElement spans = element.getAsJsonObject().get("spans");
-        if (spans.getAsJsonArray().size() == 0) {
-            return this;
-        }
-
-        try {
-            JsonObject segment = new JsonObject();
-            segment.addProperty("segmentId", "1.159.00000000000000000");
-            segment.add("spans", spans);
-
-            final int serviceId = element.getAsJsonObject().get("serviceId").getAsInt();
-            final String serviceName = serviceMap.get(serviceId);
-
-            spans.getAsJsonArray().forEach(span -> {
-                JsonObject jsonObject = span.getAsJsonObject();
-
-                // extract operation name
-                List<String> operations = serviceAndOperations.getOrDefault(serviceName, Lists.newArrayList());
-                operations.add(jsonObject.get("operationName").getAsString());
-                serviceAndOperations.put(serviceName, operations);
-
-                // remove unless properties
-                JsonElement refs = jsonObject.get("refs");
-                if (refs != null) {
-                    if (refs.isJsonObject()) {
-                        jsonObject.remove("refs");
-                    } else {
-                        refs.getAsJsonArray().forEach(el -> {
-                            el.getAsJsonObject().addProperty("parentTraceSegmentId", "parentTraceSegmentId");
-                        });
-                    }
-                }
-                JsonElement logs = jsonObject.get("logs");
-                if (logs != null) {
-                    if (logs.isJsonObject()) {
-                        jsonObject.remove("logs");
-                    }
-                }
-                JsonElement tags = jsonObject.get("tags");
-                if (tags != null) {
-                    if (tags.isJsonObject()) {
-                        jsonObject.remove("tags");
-                    }
-                }
-            });
-
-            List<JsonObject> segments = serviceAndSegments.getOrDefault(serviceName, Lists.newArrayList());
-            segments.add(segment);
-
-            serviceAndSegments.put(serviceName, segments);
-        } catch (Exception e) {
-            log.error(element.toString(), e);
-        }
-        return this;
-    }
-
-    public boolean hasSegments() {
-        return !serviceAndOperations.isEmpty();
-    }
-
-    public ExpectedDataEntity collect() {
-        RegistryItemsEntity registryItems = new RegistryItemsEntity();
-        registryItems.setInstances(getInstances());
-        registryItems.setApplications(getApplications());
-        registryItems.setOperationNames(getOperationNames());
-
-        ExpectedDataEntity entity = new ExpectedDataEntity();
-        entity.setRegistryItems(registryItems);
-        entity.setSegmentItems(getSegmentItems());
-        return entity;
-    }
-
-    private List<JsonObject> getSegmentItems() {
-        return serviceAndSegments.entrySet().stream().map(e -> {
-            JsonObject item = new JsonObject();
-            item.addProperty("serviceName", e.getKey());
-            item.addProperty("segmentSize", e.getValue().size());
-
-            List<JsonObject> values = e.getValue();
-            JsonArray elements = new JsonArray();
-            values.forEach(elements::add);
-            item.add("segments", elements);
-            return item;
-        }).collect(Collectors.toList());
-    }
-
-    private List<Map<String, List<String>>> getOperationNames() {
-        return serviceAndOperations.entrySet().stream().map(e -> {
-            Map<String, List<String>> instance = Maps.newHashMap();
-            instance.put(e.getKey(), e.getValue());
-            return instance;
-        }).collect(Collectors.toList());
-    }
-
-    private List<Map<String, Integer>> getInstances() {
-        return instanceMap.entrySet().stream().map(entry -> {
-            Map<String, Integer> instance = Maps.newHashMap();
-            instance.put(entry.getKey(), entry.getValue());
-            return instance;
-        }).collect(Collectors.toList());
-    }
-
-    private List<Map<String, Integer>> getApplications() {
-        return serviceMap.entrySet().stream().map(entry -> {
-            Map<String, Integer> instance = Maps.newHashMap();
-            instance.put(entry.getValue(), entry.getKey() + 1);
-            return instance;
-        }).collect(Collectors.toList());
-    }
-}
diff --git a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/entity/ExpectedDataEntity.java b/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/entity/ExpectedDataEntity.java
deleted file mode 100644
index c01a559..0000000
--- a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/entity/ExpectedDataEntity.java
+++ /dev/null
@@ -1,29 +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.skywalking.plugin.test.validator.validator.assertor.entity;
-
-import com.google.gson.JsonObject;
-import java.util.List;
-import lombok.Data;
-
-@Data
-public class ExpectedDataEntity {
-    private RegistryItemsEntity registryItems;
-    private List<JsonObject> segmentItems;
-}
diff --git a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/entity/RegistryItemsEntity.java b/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/entity/RegistryItemsEntity.java
deleted file mode 100644
index aeb3948..0000000
--- a/test/e2e/validator/src/test/java/org/apache/skywalking/plugin/test/validator/validator/assertor/entity/RegistryItemsEntity.java
+++ /dev/null
@@ -1,30 +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.skywalking.plugin.test.validator.validator.assertor.entity;
-
-import java.util.List;
-import java.util.Map;
-import lombok.Data;
-
-@Data
-public class RegistryItemsEntity {
-    private List<Map<String, Integer>> applications;
-    private List<Map<String, Integer>> instances;
-    private List<Map<String, List<String>>> operationNames;
-}
diff --git a/test/e2e/validator/src/test/resources/expectedData.yaml b/test/e2e/validator/src/test/resources/expectedData.yaml
deleted file mode 100644
index 226676d..0000000
--- a/test/e2e/validator/src/test/resources/expectedData.yaml
+++ /dev/null
@@ -1,63 +0,0 @@
-registryItems:
-  applications:
-    - {'User_Service_Name': 2}
-  instances:
-    - {'User_Service_Name': 1}
-  operationNames:
-    - User_Service_Name: [/tier2/lb, /tier2/lb, /ingress, /ingress]
-segmentItems:
-  - serviceName: User_Service_Name
-    segmentSize: eq 2
-    segments:
-      - segmentId: not null
-        spans:
-          - operationName: /tier2/lb
-            startTime: gt 0
-            endTime: gt 0
-            spanType: Exit
-            spanId: 1
-            isError: false
-            parentSpanId: 0
-            componentId: 6000
-            peer: 'User_Service_Name-nginx:upstream_ip2:port2'
-            spanLayer: Http
-          - operationName: /tier2/lb
-            startTime: gt 0
-            tags:
-              - {key: http.method, value: GET}
-              - {key: http.params, value: 'http://127.0.0.1/tier2/lb'}
-            endTime: gt 0
-            spanType: Entry
-            spanId: 0
-            isError: false
-            parentSpanId: -1
-            componentId: 6000
-            refs:
-              - {parentEndpointId: 0, entryEndpointId: 0, parentServiceInstanceId: 1, parentEndpoint: /ingress, parentTraceSegmentId: parentTraceSegmentId,
-                 networkAddress: '#User_Service_Name-nginx:upstream_ip:port', parentSpanId: 1,
-                 entryServiceInstanceId: 1, networkAddressId: 0, entryEndpoint: /ingress}
-            spanLayer: Http
-      - segmentId: not null
-        spans:
-          - operationName: /ingress
-            startTime: gt 0
-            endTime: gt 0
-            spanType: Exit
-            spanId: 1
-            isError: false
-            parentSpanId: 0
-            componentId: 6000
-            peer: 'User_Service_Name-nginx:upstream_ip:port'
-            spanLayer: Http
-          - operationName: /ingress
-            startTime: gt 0
-            tags:
-              - {key: http.method, value: GET}
-              - {key: http.params, value: 'not null'}
-            endTime: gt 0
-            spanType: Entry
-            spanId: 0
-            parentSpanId: -1
-            isError: false
-            spanLayer: Http
-            componentId: 6000
