Add grpc tri integration test
diff --git a/dubbo-samples-triple/README.MD b/dubbo-samples-triple/README.MD
index a427a13..736a402 100644
--- a/dubbo-samples-triple/README.MD
+++ b/dubbo-samples-triple/README.MD
@@ -17,10 +17,21 @@
 Code under `test` folder is a general interoperation test suite for both Dubbo/Dubbo and Dubbo/GRPC.
 
 #### Dubbo/Dubbo test
-1. Run `org.apache.dubbo.sample.tri.TestProvider`
-2. Run `org.apache.dubbo.sample.tri.PbTest` , `org.apache.dubbo.sample.tri.WrapConsumerTest`  and `org.apache.dubbo.sample.tri.GenericTest`
+1. Run `org.apache.dubbo.sample.tri.TriProvider`
+2. Run `org.apache.dubbo.sample.tri.TriPbConsumerTest` , `org.apache.dubbo.sample.tri.TriWrapConsumerTest`  and `org.apache.dubbo.sample.tri.TriGenericTest`
 
 #### DUbbo/GRPC test
-TBD
+
+##### GRPC --> Dubbo
+
+1. Run `org.apache.dubbo.sample.tri.TriProvider`
+2. Run `org.apache.dubbo.sample.tri.GrpcConsumerTest`
+
+##### Dubbo --> GRPC
+
+1. Run `org.apache.dubbo.sample.tri.GrpcProvider`
+2. Run `org.apache.dubbo.sample.tri.TriPbConsumerTest`
+
+
 
 
diff --git a/dubbo-samples-triple/pom.xml b/dubbo-samples-triple/pom.xml
index 0882567..ae8f9fc 100644
--- a/dubbo-samples-triple/pom.xml
+++ b/dubbo-samples-triple/pom.xml
@@ -39,6 +39,7 @@
         <maven-failsafe-plugin.version>2.21.0</maven-failsafe-plugin.version>
         <spring-boot.version>1.5.13.RELEASE</spring-boot.version>
         <protoc.version>3.7.1</protoc.version>
+        <dubbo.compiler.version>0.0.4-SNAPSHOT</dubbo.compiler.version>
     </properties>
 
     <dependencies>
@@ -62,7 +63,7 @@
             <groupId>io.grpc</groupId>
             <artifactId>grpc-all</artifactId>
             <version>${grpc.version}</version>
-            <scope>test</scope>
+<!--            <scope>test</scope>-->
         </dependency>
         <dependency>
             <groupId>junit</groupId>
@@ -119,6 +120,15 @@
                     <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
                     <pluginId>grpc-java</pluginId>
                     <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
+                    <protocPlugins>
+                        <protocPlugin>
+                            <id>dubbo</id>
+                            <groupId>org.apache.dubbo</groupId>
+                            <artifactId>dubbo-compiler</artifactId>
+                            <version>${dubbo.compiler.version}</version>
+                            <mainClass>org.apache.dubbo.gen.dubbo.Dubbo3Generator</mainClass>
+                        </protocPlugin>
+                    </protocPlugins>
                 </configuration>
                 <executions>
                     <execution>
diff --git a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/EchoStreamObserver.java b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/EchoStreamObserver.java
new file mode 100644
index 0000000..509a973
--- /dev/null
+++ b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/EchoStreamObserver.java
@@ -0,0 +1,36 @@
+package org.apache.dubbo.sample.tri;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+
+import java.util.function.Function;
+
+/**
+ * @author earthchen
+ * @date 2021/9/6
+ **/
+public class EchoStreamObserver<T, R> implements StreamObserver<T> {
+
+    private final Function<T, R> echoFunc;
+    private final StreamObserver<R> responseObserver;
+
+    public EchoStreamObserver(Function<T, R> echoFunc, StreamObserver<R> responseObserver) {
+        this.echoFunc = echoFunc;
+        this.responseObserver = responseObserver;
+    }
+
+    @Override
+    public void onNext(T data) {
+        responseObserver.onNext(echoFunc.apply(data));
+    }
+
+    @Override
+    public void onError(Throwable throwable) {
+        throwable.printStackTrace();
+        responseObserver.onError(new IllegalStateException("Stream err"));
+    }
+
+    @Override
+    public void onCompleted() {
+        responseObserver.onCompleted();
+    }
+}
diff --git a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/Helper.java b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/Helper.java
deleted file mode 100644
index a874c6a..0000000
--- a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/Helper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.apache.dubbo.sample.tri;
-
-import org.apache.dubbo.common.stream.StreamObserver;
-
-import java.util.function.Function;
-
-public class Helper {
-}
-
-
-class EchoStreamObserver<T, R> implements StreamObserver<T> {
-    private final Function<T, R> echoFunc;
-    private final StreamObserver<R> responseObserver;
-
-    EchoStreamObserver(Function<T, R> echoFunc, StreamObserver<R> responseObserver) {
-        this.echoFunc = echoFunc;
-        this.responseObserver = responseObserver;
-    }
-
-    @Override
-    public void onNext(T data) {
-        responseObserver.onNext(echoFunc.apply(data));
-    }
-
-    @Override
-    public void onError(Throwable throwable) {
-        throwable.printStackTrace();
-        responseObserver.onError(new IllegalStateException("Stream err"));
-    }
-
-    @Override
-    public void onCompleted() {
-        responseObserver.onCompleted();
-    }
-}
-
-class StdoutStreamObserver<T> implements StreamObserver<T> {
-    private final String name;
-
-    StdoutStreamObserver(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public void onNext(T data) {
-        System.out.println("[" + name + "] stream reply:" + data);
-    }
-
-    @Override
-    public void onError(Throwable throwable) {
-        System.err.println("[" + name + "] Error:");
-        throwable.printStackTrace();
-    }
-
-    @Override
-    public void onCompleted() {
-        System.out.println("[" + name + "] stream done");
-    }
-}
diff --git a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/StdoutStreamObserver.java b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/StdoutStreamObserver.java
new file mode 100644
index 0000000..232e0c5
--- /dev/null
+++ b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/StdoutStreamObserver.java
@@ -0,0 +1,33 @@
+package org.apache.dubbo.sample.tri;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+
+/**
+ * @author earthchen
+ * @date 2021/9/6
+ **/
+public class StdoutStreamObserver<T> implements StreamObserver<T>, io.grpc.stub.StreamObserver<T> {
+
+
+    private final String name;
+
+    StdoutStreamObserver(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public void onNext(T data) {
+        System.out.println("[" + name + "] stream reply:" + data);
+    }
+
+    @Override
+    public void onError(Throwable throwable) {
+        System.err.println("[" + name + "] Error:");
+        throwable.printStackTrace();
+    }
+
+    @Override
+    public void onCompleted() {
+        System.out.println("[" + name + "] stream done");
+    }
+}
\ No newline at end of file
diff --git a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java
index e86d6d3..0e64ef7 100644
--- a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java
+++ b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java
@@ -25,5 +25,7 @@
 
     public static final String ZK_ADDRESS = "zookeeper://127.0.0.1:2181";
 
-    public static final String DEFAULT_ADDRESS = "tri://127.0.0.1:" + SERVER_POINT;
+    public static final String HOST = "127.0.0.1";
+
+    public static final String DEFAULT_ADDRESS = "tri://" + HOST + ":" + SERVER_POINT;
 }
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcClient.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcClient.java
deleted file mode 100644
index 8a644f6..0000000
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcClient.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.apache.dubbo.sample.tri;
-
-import io.grpc.ManagedChannel;
-import io.grpc.ManagedChannelBuilder;
-import io.grpc.Metadata;
-import io.grpc.stub.MetadataUtils;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.util.concurrent.TimeUnit;
-
-public class GrpcClient {
-    private static PbGreeterGrpc.PbGreeterStub stub;
-
-    @BeforeClass
-    public static void init() {
-        final ManagedChannel channel = ManagedChannelBuilder.forAddress("127.0.0.1", 50051)
-                .usePlaintext()
-                .build();
-        stub = PbGreeterGrpc.newStub(channel);
-    }
-
-    @Test
-    public void clientSendLargeSizeHeader() throws InterruptedException {
-        final Metadata.Key<String> key = Metadata.Key.of("large_size", Metadata.ASCII_STRING_MARSHALLER);
-        StringBuilder sb = new StringBuilder("a");
-        for (int j = 0; j < 15; j++) {
-            sb.append(sb);
-        }
-        Metadata meta = new Metadata();
-        meta.put(key, sb.toString());
-        final PbGreeterGrpc.PbGreeterStub stub = MetadataUtils.attachHeaders(GrpcClient.stub, meta);
-        stub.greet(GreeterRequest.newBuilder().setName("metadata").build(),
-                new GrpcStreamObserverAdapter<>(new StdoutStreamObserver<>("meta")));
-        TimeUnit.SECONDS.sleep(1);
-    }
-}
-
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcConsumerTest.java
new file mode 100644
index 0000000..dd5af33
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcConsumerTest.java
@@ -0,0 +1,101 @@
+package org.apache.dubbo.sample.tri;
+
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.Metadata;
+import io.grpc.stub.MetadataUtils;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class GrpcConsumerTest {
+    private static PbGreeterGrpc.PbGreeterStub stub;
+    private static PbGreeterGrpc.PbGreeterBlockingStub blockingStub;
+
+    @BeforeClass
+    public static void init() {
+        final ManagedChannel channel = ManagedChannelBuilder.forAddress(TriSampleConstants.HOST, TriSampleConstants.SERVER_POINT)
+                .usePlaintext()
+                .build();
+        stub = PbGreeterGrpc.newStub(channel);
+        blockingStub = PbGreeterGrpc.newBlockingStub(channel);
+    }
+
+    @Test
+    public void clientSendLargeSizeHeader() throws InterruptedException {
+        final Metadata.Key<String> key = Metadata.Key.of("large_size", Metadata.ASCII_STRING_MARSHALLER);
+        StringBuilder sb = new StringBuilder("a");
+        for (int j = 0; j < 15; j++) {
+            sb.append(sb);
+        }
+        Metadata meta = new Metadata();
+        meta.put(key, sb.toString());
+        final PbGreeterGrpc.PbGreeterStub curStub = MetadataUtils.attachHeaders(GrpcConsumerTest.stub, meta);
+        curStub.greet(GreeterRequest.newBuilder().setName("metadata").build(), new StdoutStreamObserver<>("meta"));
+        TimeUnit.SECONDS.sleep(1);
+    }
+
+
+    @Test
+    public void serverStream() throws InterruptedException {
+        int n = 10;
+        CountDownLatch latch = new CountDownLatch(n);
+        final GreeterRequest request = GreeterRequest.newBuilder()
+                .setName("request")
+                .build();
+        stub.greetServerStream(request, new StdoutStreamObserver<GreeterReply>("grpc sayGreeterServerStream") {
+            @Override
+            public void onNext(GreeterReply data) {
+                super.onNext(data);
+                latch.countDown();
+            }
+        });
+        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+    }
+
+
+    @Test
+    public void stream() throws InterruptedException {
+        int n = 10;
+        CountDownLatch latch = new CountDownLatch(n);
+        final GreeterRequest request = GreeterRequest.newBuilder()
+                .setName("stream request")
+                .build();
+        final io.grpc.stub.StreamObserver<GreeterRequest> requestObserver = stub.greetStream(new StdoutStreamObserver<GreeterReply>("sayGreeterStream") {
+            @Override
+            public void onNext(GreeterReply data) {
+                super.onNext(data);
+                latch.countDown();
+            }
+        });
+        for (int i = 0; i < n; i++) {
+            requestObserver.onNext(request);
+        }
+        requestObserver.onCompleted();
+        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void unaryGreeter() {
+        final GreeterReply reply = blockingStub.greet(GreeterRequest.newBuilder()
+                .setName("name")
+                .build());
+        Assert.assertNotNull(reply);
+    }
+
+
+    @Test
+    public void attachmentTest() {
+        final Metadata.Key<String> key = Metadata.Key.of("large_size", Metadata.ASCII_STRING_MARSHALLER);
+        Metadata meta = new Metadata();
+        meta.put(key, "test");
+        final PbGreeterGrpc.PbGreeterBlockingStub curStub = MetadataUtils.attachHeaders(GrpcConsumerTest.blockingStub, meta);
+        GreeterReply reply = curStub.greetWithAttachment(GreeterRequest.newBuilder().setName("meta").build());
+        Assert.assertEquals("hello,meta", reply.getMessage());
+    }
+
+}
+
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java
index ae8bca4..fd4a62f 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java
@@ -1,5 +1,8 @@
 package org.apache.dubbo.sample.tri;
 
+import org.apache.dubbo.sample.tri.service.impl.GrpcPbGreeterImpl;
+import org.apache.dubbo.sample.tri.service.impl.PbGreeterImpl;
+
 import io.grpc.ForwardingServerCall;
 import io.grpc.Metadata;
 import io.grpc.Server;
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java
index b728e7b..af5985e 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java
@@ -4,6 +4,7 @@
 import io.grpc.stub.StreamObserver;
 
 public class GrpcStreamObserverAdapter<T> implements StreamObserver<T> {
+
     private final org.apache.dubbo.common.stream.StreamObserver<T> delegate;
 
     public GrpcStreamObserverAdapter(org.apache.dubbo.common.stream.StreamObserver<T> delegate) {
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbGreeter.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbGreeter.java
deleted file mode 100644
index 070d84d..0000000
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbGreeter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.apache.dubbo.sample.tri;
-
-import org.apache.dubbo.common.stream.StreamObserver;
-
-public interface PbGreeter {
-    GreeterReply greetWithAttachment(GreeterRequest request);
-
-    GreeterReply greet(GreeterRequest request);
-
-    GreeterReply methodNonExist(GreeterRequest request);
-
-    GreeterReply greetException(GreeterRequest request);
-
-    StreamObserver<GreeterRequest> greetStream(StreamObserver<GreeterReply> replyStream);
-
-    void greetServerStream(GreeterRequest request, StreamObserver<GreeterReply> replyStream);
-}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GenericTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriGenericTest.java
similarity index 95%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GenericTest.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriGenericTest.java
index 923bc5b..a9632af 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GenericTest.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriGenericTest.java
@@ -12,13 +12,13 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-public class GenericTest {
+public class TriGenericTest {
     private static GenericService generic;
 
     @BeforeClass
     public static void init() {
         ReferenceConfig<GenericService> ref = new ReferenceConfig<>();
-        ref.setInterface("org.apache.dubbo.sample.tri.WrapGreeter");
+        ref.setInterface("org.apache.dubbo.sample.tri.service.WrapGreeter");
         ref.setCheck(false);
         ref.setTimeout(30000);
         ref.setProtocol(CommonConstants.TRIPLE);
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java
similarity index 85%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbTest.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java
index 863c67d..1b03681 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbTest.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java
@@ -7,6 +7,7 @@
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
 
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -16,9 +17,12 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-public class PbTest {
+public class TriPbConsumerTest {
+
     private static PbGreeter delegate;
 
+    private static PbGreeterManual delegateManual;
+
     @BeforeClass
     public static void init() {
         ReferenceConfig<PbGreeter> ref = new ReferenceConfig<>();
@@ -29,6 +33,14 @@
         ref.setLazy(true);
         ref.setTimeout(10000);
 
+        ReferenceConfig<PbGreeterManual> ref2 = new ReferenceConfig<>();
+        ref2.setInterface(PbGreeterManual.class);
+        ref2.setCheck(false);
+        ref2.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+        ref2.setProtocol(CommonConstants.TRIPLE);
+        ref2.setLazy(true);
+        ref2.setTimeout(10000);
+
         DubboBootstrap bootstrap = DubboBootstrap.getInstance();
         bootstrap.application(new ApplicationConfig("demo-consumer"))
 //                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
@@ -36,6 +48,7 @@
                 .start();
 
         delegate = ref.get();
+        delegateManual = ref2.get();
     }
 
     @Test
@@ -108,12 +121,13 @@
         final String returned = (String) RpcContext.getServiceContext().getObjectAttachment(key);
         Assert.assertEquals(value, returned);
     }
+
     @Test
     public void methodNotFound() {
         try {
-            delegate.methodNonExist(GreeterRequest.newBuilder().setName("meta").build());
+            delegateManual.methodNonExist(GreeterRequest.newBuilder().setName("meta").build());
             TimeUnit.SECONDS.sleep(1);
-        }catch (RpcException | InterruptedException e){
+        } catch (RpcException | InterruptedException e) {
             Assert.assertTrue(e.getMessage().contains("not found"));
         }
     }
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TestProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java
similarity index 65%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TestProvider.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java
index 4b764dd..bda7395 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TestProvider.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java
@@ -6,13 +6,22 @@
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.service.impl.PbGreeterImpl;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+import org.apache.dubbo.sample.tri.service.impl.WrapGreeterImpl;
 
 
-public class TestProvider {
+public class TriProvider {
     public static void main(String[] args) {
         ServiceConfig<PbGreeter> pbService = new ServiceConfig<>();
         pbService.setInterface(PbGreeter.class);
-        pbService.setRef(new PbGreeterImpl());
+        PbGreeterImpl greeterImpl = new PbGreeterImpl();
+        pbService.setRef(greeterImpl);
+
+        ServiceConfig<PbGreeterManual> pbManualService = new ServiceConfig<>();
+        pbManualService.setInterface(PbGreeterManual.class);
+        pbManualService.setRef(new PbGreeterImpl());
 
         ServiceConfig<WrapGreeter> wrapService = new ServiceConfig<>();
         wrapService.setInterface(WrapGreeter.class);
@@ -24,6 +33,7 @@
                 .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS))
                 .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_POINT))
                 .service(pbService)
+                .service(pbManualService)
                 .service(wrapService)
                 .start()
                 .await();
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java
similarity index 97%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapConsumerTest.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java
index 639beb3..3893d68 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapConsumerTest.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java
@@ -6,6 +6,7 @@
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
 
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -14,7 +15,8 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-public class WrapConsumerTest {
+public class TriWrapConsumerTest {
+
     private static WrapGreeter delegate;
 
     @BeforeClass
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/PbGreeterManual.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/PbGreeterManual.java
new file mode 100644
index 0000000..8627e13
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/PbGreeterManual.java
@@ -0,0 +1,21 @@
+package org.apache.dubbo.sample.tri.service;
+
+import org.apache.dubbo.sample.tri.GreeterReply;
+import org.apache.dubbo.sample.tri.GreeterRequest;
+
+/**
+ * this is by manual and other by dubbo compiler
+ */
+public interface PbGreeterManual {
+//    GreeterReply greetWithAttachment(GreeterRequest request);
+//
+//    GreeterReply greet(GreeterRequest request);
+
+    GreeterReply methodNonExist(GreeterRequest request);
+//
+//    GreeterReply greetException(GreeterRequest request);
+//
+//    StreamObserver<GreeterRequest> greetStream(StreamObserver<GreeterReply> replyStream);
+//
+//    void greetServerStream(GreeterRequest request, StreamObserver<GreeterReply> replyStream);
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapGreeter.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/WrapGreeter.java
similarity index 93%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapGreeter.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/WrapGreeter.java
index cadde5a..7f28536 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapGreeter.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/WrapGreeter.java
@@ -1,4 +1,4 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.service;
 
 import org.apache.dubbo.common.stream.StreamObserver;
 
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcPbGreeterImpl.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java
similarity index 83%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcPbGreeterImpl.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java
index 17bb7c4..30f0c7b 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcPbGreeterImpl.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java
@@ -1,8 +1,16 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.service.impl;
+
+import org.apache.dubbo.sample.tri.GreeterReply;
+import org.apache.dubbo.sample.tri.GreeterRequest;
+import org.apache.dubbo.sample.tri.GrpcStreamObserverAdapter;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.PbGreeterGrpc;
+import org.apache.dubbo.sample.tri.StreamObserverAdapter;
 
 import io.grpc.stub.StreamObserver;
 
 public class GrpcPbGreeterImpl extends PbGreeterGrpc.PbGreeterImplBase {
+
     private final PbGreeter delegate;
 
     public GrpcPbGreeterImpl(PbGreeter delegate) {
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbGreeterImpl.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/PbGreeterImpl.java
similarity index 84%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbGreeterImpl.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/PbGreeterImpl.java
index 0424ac5..b9becff 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/PbGreeterImpl.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/PbGreeterImpl.java
@@ -1,9 +1,14 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.service.impl;
 
 import org.apache.dubbo.common.stream.StreamObserver;
 import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.sample.tri.GreeterReply;
+import org.apache.dubbo.sample.tri.GreeterRequest;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
 
-public class PbGreeterImpl implements PbGreeter {
+public class PbGreeterImpl implements PbGreeter, PbGreeterManual {
+
     @Override
     public GreeterReply greetWithAttachment(GreeterRequest request) {
         final String key = "user-attachment";
@@ -59,7 +64,7 @@
     public void greetServerStream(GreeterRequest request, StreamObserver<GreeterReply> replyStream) {
         for (int i = 0; i < 10; i++) {
             replyStream.onNext(GreeterReply.newBuilder()
-                    .setMessage(request.getName())
+                    .setMessage(request.getName() + "--" + i)
                     .build());
         }
         replyStream.onCompleted();
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapGreeterImpl.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/WrapGreeterImpl.java
similarity index 92%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapGreeterImpl.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/WrapGreeterImpl.java
index 723a727..808eea3 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/WrapGreeterImpl.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/WrapGreeterImpl.java
@@ -1,8 +1,9 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.service.impl;
 
 import org.apache.dubbo.common.stream.StreamObserver;
 import org.apache.dubbo.rpc.RpcContext;
-
+import org.apache.dubbo.sample.tri.EchoStreamObserver;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
 
 public class WrapGreeterImpl implements WrapGreeter {
     @Override
diff --git a/dubbo-samples-triple/src/test/proto/test.proto b/dubbo-samples-triple/src/test/proto/test.proto
index 13445b7..3fdf9c1 100644
--- a/dubbo-samples-triple/src/test/proto/test.proto
+++ b/dubbo-samples-triple/src/test/proto/test.proto
@@ -17,6 +17,8 @@
 // of unary/streaming requests/responses.
 syntax = "proto3";
 
+option java_multiple_files = true;
+
 import "empty.proto";
 import "messages.proto";