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

spacewander pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/apisix-java-plugin-runner.git


The following commit(s) were added to refs/heads/main by this push:
     new 88c0c26  test: add test cases about filter (#15)
88c0c26 is described below

commit 88c0c267f0593d7c8ce17533b2917f8768e99ad2
Author: tzssangglass <[email protected]>
AuthorDate: Thu May 27 20:32:40 2021 +0800

    test: add test cases about filter (#15)
---
 .../runner/codec/impl/FlatBuffersDecoder.java      |   6 +-
 .../plugin/runner/handler/A6ConfigHandler.java     |   7 +-
 .../runner/handler/A6HandlerConfiguration.java     |   4 +-
 .../plugin/runner/handler/A6HttpCallHandler.java   |   2 +-
 .../plugin/runner/handler/A6ConfigHandlerTest.java | 197 ++++++++++++++++
 .../runner/handler/A6HttpCallHandlerTest.java      | 251 +++++++++++++++++++++
 .../apache/apisix/plugin/runner/HttpRequest.java   |   2 +-
 .../apache/apisix/plugin/runner/HttpResponse.java  |   4 +
 .../apisix/plugin/runner/filter/PluginFilter.java  |   2 +
 9 files changed, 466 insertions(+), 9 deletions(-)

diff --git 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
index 8b199e8..acbfac7 100644
--- 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
+++ 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
@@ -39,7 +39,7 @@ public class FlatBuffersDecoder implements 
PluginRunnerDecoder {
         try {
             type = buffer.get();
         } catch (BufferUnderflowException e) {
-            logger.error("receive empty data");
+            logger.warn("receive empty data");
             return new A6ErrRequest(Code.BAD_REQUEST);
         }
 
@@ -51,7 +51,7 @@ public class FlatBuffersDecoder implements 
PluginRunnerDecoder {
                     body = getBody(buffer);
                     a6ConfigRequest = A6ConfigRequest.from(body);
                 } catch (BufferUnderflowException | IndexOutOfBoundsException 
e) {
-                    logger.error("receive error data length");
+                    logger.warn("receive error data length");
                     return new A6ErrRequest(Code.BAD_REQUEST);
                 }
                 return a6ConfigRequest;
@@ -68,7 +68,7 @@ public class FlatBuffersDecoder implements 
PluginRunnerDecoder {
                 break;
         }
 
-        logger.error("receive unsupported type: {}", type);
+        logger.warn("receive unsupported type: {}", type);
         return new A6ErrRequest(Code.BAD_REQUEST);
     }
 
diff --git 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
index 7022363..c69e4b3 100644
--- 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
+++ 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
@@ -53,7 +53,6 @@ public class A6ConfigHandler implements Handler {
         PluginFilterChain chain = createFilterChain(req);
         A6Conf config = new A6Conf(req, chain);
         cache.put(token, config);
-
     }
 
     private PluginFilterChain createFilterChain(Req req) {
@@ -62,7 +61,11 @@ public class A6ConfigHandler implements Handler {
             TextEntry conf = req.conf(i);
             PluginFilter filter = filters.get(conf.name());
             if (Objects.isNull(filter)) {
-                logger.error("receive undefined filter: {}, skip it", 
conf.name());
+                logger.warn("receive undefined filter: {}, skip it", 
conf.name());
+                continue;
+            }
+            if (chainFilters.contains(filter)) {
+                logger.warn("skip the same filter: {}", conf.name());
                 continue;
             }
             chainFilters.add(filter);
diff --git 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
index 9497e43..761400b 100644
--- 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
+++ 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
@@ -48,7 +48,7 @@ public class A6HandlerConfiguration {
         List<PluginFilter> pluginFilterList = 
beanProvider.orderedStream().collect(Collectors.toList());
         Map<String, PluginFilter> filterMap = new HashMap<>();
         for (PluginFilter filter : pluginFilterList) {
-            filterMap.put(filter.getClass().getSimpleName(), filter);
+            filterMap.put(filter.name(), filter);
         }
         return new A6ConfigHandler(cache, filterMap);
     }
@@ -76,7 +76,7 @@ public class A6HandlerConfiguration {
                     httpCallHandler.handle(request, response);
                     return response;
                 default:
-                    logger.error("can not dispatch type: {}", 
request.getType());
+                    logger.warn("can not dispatch type: {}", 
request.getType());
                     response = new A6ErrResponse(Code.SERVICE_UNAVAILABLE);
                     return response;
             }
diff --git 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
index 8cb6523..1b410ec 100644
--- 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
+++ 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
@@ -46,7 +46,7 @@ public class A6HttpCallHandler implements Handler {
         long confToken = ((HttpRequest) request).getConfToken();
         A6Conf conf = cache.getIfPresent(confToken);
         if (Objects.isNull(conf)) {
-            logger.error("cannot find conf-token: {}", confToken);
+            logger.warn("cannot find conf token: {}", confToken);
             A6ErrResponse errResponse = new 
A6ErrResponse(Code.CONF_TOKEN_NOT_FOUND);
             rsp.setErrResponse(errResponse);
             return;
diff --git 
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
new file mode 100644
index 0000000..1f0d982
--- /dev/null
+++ 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
@@ -0,0 +1,197 @@
+/*
+ * 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.apisix.plugin.runner.handler;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.flatbuffers.FlatBufferBuilder;
+import io.github.api7.A6.PrepareConf.Req;
+import io.github.api7.A6.TextEntry;
+import org.apache.apisix.plugin.runner.A6Conf;
+import org.apache.apisix.plugin.runner.A6ConfigRequest;
+import org.apache.apisix.plugin.runner.A6ConfigResponse;
+import org.apache.apisix.plugin.runner.HttpRequest;
+import org.apache.apisix.plugin.runner.HttpResponse;
+import org.apache.apisix.plugin.runner.filter.PluginFilter;
+import org.apache.apisix.plugin.runner.filter.PluginFilterChain;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.boot.test.system.CapturedOutput;
+import org.springframework.boot.test.system.OutputCaptureExtension;
+import reactor.core.publisher.Mono;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@ExtendWith(OutputCaptureExtension.class)
+@DisplayName("test add filter")
+class A6ConfigHandlerTest {
+
+    Cache<Long, A6Conf> cache;
+
+    Map<String, PluginFilter> filters;
+
+    A6ConfigHandler a6ConfigHandler;
+
+    @BeforeEach
+    void setUp() {
+        filters = new HashMap<>();
+        filters.put("FooFilter", new PluginFilter() {
+            @Override
+            public String name() {
+                return "FooFilter";
+            }
+
+            @Override
+            public Mono<Void> filter(HttpRequest request, HttpResponse 
response, PluginFilterChain chain) {
+                return chain.filter(request, response);
+            }
+
+            @Override
+            public int getOrder() {
+                return 0;
+            }
+        });
+
+        filters.put("CatFilter", new PluginFilter() {
+            @Override
+            public String name() {
+                return "CatFilter";
+            }
+
+            @Override
+            public Mono<Void> filter(HttpRequest request, HttpResponse 
response, PluginFilterChain chain) {
+                return chain.filter(request, response);
+            }
+
+            @Override
+            public int getOrder() {
+                return 1;
+            }
+        });
+        cache = CacheBuilder.newBuilder().expireAfterWrite(3600, 
TimeUnit.SECONDS).maximumSize(1000).build();
+        a6ConfigHandler = new A6ConfigHandler(cache, filters);
+    }
+
+    @Test
+    @DisplayName("test add filter by prepare conf")
+    void testAddFilter1() {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int name = builder.createString("FooFilter");
+        int value = builder.createString("Bar");
+        int conf = TextEntry.createTextEntry(builder, name, value);
+        int confVector = Req.createConfVector(builder, new int[]{conf});
+        Req.startReq(builder);
+        Req.addConf(builder, confVector);
+        builder.finish(Req.endReq(builder));
+        Req req = Req.getRootAsReq(builder.dataBuffer());
+
+        A6ConfigRequest request = new A6ConfigRequest(req);
+        A6ConfigResponse response = new A6ConfigResponse(0L);
+        a6ConfigHandler.handle(request, response);
+
+        A6Conf config = cache.getIfPresent(0L);
+        Assertions.assertNotNull(config.getChain());
+        Assertions.assertEquals(config.getChain().getFilters().size(), 1);
+        
Assertions.assertEquals(config.getChain().getFilters().get(0).getOrder(), 0);
+        Assertions.assertEquals(config.get("FooFilter"), "Bar");
+
+    }
+
+    @Test
+    @DisplayName("test filter sort by it's order")
+    void testAddFilter2() {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int cat = builder.createString("CatFilter");
+        int dog = builder.createString("Dog");
+        int filter2 = TextEntry.createTextEntry(builder, cat, dog);
+
+        int foo = builder.createString("FooFilter");
+        int bar = builder.createString("Bar");
+        int filter1 = TextEntry.createTextEntry(builder, foo, bar);
+
+        int confVector = Req.createConfVector(builder, new int[]{filter1, 
filter2});
+        Req.startReq(builder);
+        Req.addConf(builder, confVector);
+        builder.finish(Req.endReq(builder));
+        Req req = Req.getRootAsReq(builder.dataBuffer());
+
+        A6ConfigRequest request = new A6ConfigRequest(req);
+        A6ConfigResponse response = new A6ConfigResponse(0L);
+        a6ConfigHandler.handle(request, response);
+
+        A6Conf config = cache.getIfPresent(0L);
+        Assertions.assertEquals(config.getChain().getFilters().size(), 2);
+        
Assertions.assertEquals(config.getChain().getFilters().get(0).getOrder(), 0);
+        
Assertions.assertEquals(config.getChain().getFilters().get(1).getOrder(), 1);
+    }
+
+    @Test
+    @DisplayName("test skip the same name filter")
+    void testAddFilter3(CapturedOutput capturedOutput) {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int foo1 = builder.createString("FooFilter");
+        int bar1 = builder.createString("Bar1");
+        int filter1 = TextEntry.createTextEntry(builder, foo1, bar1);
+
+        int foo2 = builder.createString("FooFilter");
+        int bar2 = builder.createString("Bar2");
+        int filter2 = TextEntry.createTextEntry(builder, foo2, bar2);
+
+        int confVector = Req.createConfVector(builder, new int[]{filter1, 
filter2});
+        Req.startReq(builder);
+        Req.addConf(builder, confVector);
+        builder.finish(Req.endReq(builder));
+        Req req = Req.getRootAsReq(builder.dataBuffer());
+
+        A6ConfigRequest request = new A6ConfigRequest(req);
+        A6ConfigResponse response = new A6ConfigResponse(0L);
+        a6ConfigHandler.handle(request, response);
+
+        A6Conf config = cache.getIfPresent(0L);
+        Assertions.assertEquals(config.getChain().getFilters().size(), 1);
+        Assertions.assertTrue(capturedOutput.getOut().contains("skip the same 
filter: FooFilter"));
+    }
+
+    @Test
+    @DisplayName("test receive undefined filter")
+    void testAddFilter4(CapturedOutput capturedOutput) {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int foo = builder.createString("UndefinedFilter");
+        int bar = builder.createString("Bar");
+        int filter = TextEntry.createTextEntry(builder, foo, bar);
+
+        int confVector = Req.createConfVector(builder, new int[]{filter});
+        Req.startReq(builder);
+        Req.addConf(builder, confVector);
+        builder.finish(Req.endReq(builder));
+        Req req = Req.getRootAsReq(builder.dataBuffer());
+
+        A6ConfigRequest request = new A6ConfigRequest(req);
+        A6ConfigResponse response = new A6ConfigResponse(0L);
+        a6ConfigHandler.handle(request, response);
+
+        A6Conf config = cache.getIfPresent(0L);
+        Assertions.assertEquals(config.getChain().getFilters().size(), 0);
+        Assertions.assertTrue(capturedOutput.getOut().contains("receive 
undefined filter: UndefinedFilter, skip it"));
+    }
+}
diff --git 
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandlerTest.java
 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandlerTest.java
new file mode 100644
index 0000000..e9604ec
--- /dev/null
+++ 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandlerTest.java
@@ -0,0 +1,251 @@
+/*
+ * 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.apisix.plugin.runner.handler;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.flatbuffers.FlatBufferBuilder;
+import io.github.api7.A6.Err.Code;
+import io.github.api7.A6.HTTPReqCall.Action;
+import io.github.api7.A6.TextEntry;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import org.apache.apisix.plugin.runner.A6Conf;
+import org.apache.apisix.plugin.runner.A6ConfigRequest;
+import org.apache.apisix.plugin.runner.A6ConfigResponse;
+import org.apache.apisix.plugin.runner.HttpRequest;
+import org.apache.apisix.plugin.runner.HttpResponse;
+import org.apache.apisix.plugin.runner.filter.PluginFilter;
+import org.apache.apisix.plugin.runner.filter.PluginFilterChain;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.system.CapturedOutput;
+import org.springframework.boot.test.system.OutputCaptureExtension;
+import reactor.core.publisher.Mono;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+@ExtendWith(OutputCaptureExtension.class)
+@DisplayName("test filter handle")
+class A6HttpCallHandlerTest {
+    private final Logger logger = 
LoggerFactory.getLogger(A6HttpCallHandlerTest.class);
+
+    A6HttpCallHandler a6HttpCallHandler;
+
+    Cache<Long, A6Conf> cache;
+
+    Map<String, PluginFilter> filters;
+
+    @BeforeEach
+    void setUp() {
+        filters = new HashMap<>();
+        filters.put("FooFilter", new PluginFilter() {
+            @Override
+            public String name() {
+                return "FooFilter";
+            }
+
+            @Override
+            public Mono<Void> filter(HttpRequest request, HttpResponse 
response, PluginFilterChain chain) {
+                logger.info("do filter: FooFilter, order: {}", getOrder());
+                logger.info("do filter: FooFilter, config: {}", 
request.getConfig(this));
+
+                if (!Objects.isNull(request.getPath())) {
+                    logger.info("do filter: path: {}", request.getPath());
+                }
+
+                if (!Objects.isNull(request.getArgs())) {
+                    for (Map.Entry<String, String> arg : 
request.getArgs().entrySet()) {
+                        logger.info("do filter: arg key: {}", arg.getKey());
+                        logger.info("do filter: arg value: {}", 
arg.getValue());
+                    }
+                }
+
+                if (!Objects.isNull(request.getHeaders())) {
+                    for (Map.Entry<String, String> header : 
request.getHeaders().entrySet()) {
+                        logger.info("do filter: header key: {}", 
header.getKey());
+                        logger.info("do filter: header value: {}", 
header.getValue());
+                    }
+                }
+
+                if (!Objects.isNull(request.getMethod())) {
+                    logger.info("do filter: method: {}", request.getMethod());
+                }
+
+                return chain.filter(request, response);
+            }
+
+            @Override
+            public int getOrder() {
+                return 0;
+            }
+        });
+
+        filters.put("CatFilter", new PluginFilter() {
+            @Override
+            public String name() {
+                return "CatFilter";
+            }
+
+            @Override
+            public Mono<Void> filter(HttpRequest request, HttpResponse 
response, PluginFilterChain chain) {
+                logger.info("do filter: CatFilter, order: {}", getOrder());
+                logger.info("do filter: CatFilter, config: {}", 
request.getConfig(this));
+
+                response.setStatus(HttpResponseStatus.UNAUTHORIZED);
+                return chain.filter(request, response);
+            }
+
+            @Override
+            public int getOrder() {
+                return 1;
+            }
+        });
+        cache = CacheBuilder.newBuilder().expireAfterWrite(3600, 
TimeUnit.SECONDS).maximumSize(1000).build();
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int cat = builder.createString("CatFilter");
+        int dog = builder.createString("Dog");
+        int filter2 = TextEntry.createTextEntry(builder, cat, dog);
+
+        int foo = builder.createString("FooFilter");
+        int bar = builder.createString("Bar");
+        int filter1 = TextEntry.createTextEntry(builder, foo, bar);
+
+        int confVector = 
io.github.api7.A6.PrepareConf.Req.createConfVector(builder, new int[]{filter1, 
filter2});
+        io.github.api7.A6.PrepareConf.Req.startReq(builder);
+        io.github.api7.A6.PrepareConf.Req.addConf(builder, confVector);
+        builder.finish(io.github.api7.A6.PrepareConf.Req.endReq(builder));
+        io.github.api7.A6.PrepareConf.Req req = 
io.github.api7.A6.PrepareConf.Req.getRootAsReq(builder.dataBuffer());
+
+        A6ConfigRequest request = new A6ConfigRequest(req);
+        A6ConfigResponse response = new A6ConfigResponse(0L);
+
+        A6ConfigHandler a6ConfigHandler = new A6ConfigHandler(cache, filters);
+        a6ConfigHandler.handle(request, response);
+
+        a6HttpCallHandler = new A6HttpCallHandler(cache);
+    }
+
+    @Test
+    @DisplayName("test cannot find conf token")
+    void testCannotFindConfToken(CapturedOutput capturedOutput) {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+
+        io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+        io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 9999L);
+        builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+
+        io.github.api7.A6.HTTPReqCall.Req req = 
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+        HttpRequest request = new HttpRequest(req);
+        HttpResponse response = new HttpResponse(1L);
+        a6HttpCallHandler.handle(request, response);
+        Assertions.assertTrue(capturedOutput.getOut().contains("cannot find 
conf token: 9999"));
+        io.github.api7.A6.Err.Resp err = 
io.github.api7.A6.Err.Resp.getRootAsResp(response.getErrResponse().encode());
+        Assertions.assertEquals(err.code(), Code.CONF_TOKEN_NOT_FOUND);
+    }
+
+    @Test
+    @DisplayName("test do filter and get config")
+    void testDoFilter1(CapturedOutput capturedOutput) {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+
+        io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+        io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 0L);
+        builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+
+        io.github.api7.A6.HTTPReqCall.Req req = 
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+        HttpRequest request = new HttpRequest(req);
+        HttpResponse response = new HttpResponse(1L);
+        a6HttpCallHandler.handle(request, response);
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
FooFilter, order: 0"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
FooFilter, config: Bar"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
CatFilter, order: 1"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
CatFilter, config: Dog"));
+    }
+
+    @Test
+    @DisplayName("test get request params")
+    void testDoFilter2(CapturedOutput capturedOutput) {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int argKey = builder.createString("argKey");
+        int argValue = builder.createString("argValue");
+        int arg = TextEntry.createTextEntry(builder, argKey, argValue);
+        int argsVector = 
io.github.api7.A6.HTTPReqCall.Req.createArgsVector(builder, new int[]{arg});
+
+        int headerKey = builder.createString("headerKey");
+        int headerValue = builder.createString("headerValue");
+
+        int header = TextEntry.createTextEntry(builder, headerKey, 
headerValue);
+        int headerVector =
+                io.github.api7.A6.HTTPReqCall.Req.createHeadersVector(builder, 
new int[]{header});
+
+        int path = builder.createString("/path");
+
+        io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+        io.github.api7.A6.HTTPReqCall.Req.addId(builder, 8888L);
+        io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 0L);
+        io.github.api7.A6.HTTPReqCall.Req.addMethod(builder, 
io.github.api7.A6.Method.GET);
+        io.github.api7.A6.HTTPReqCall.Req.addHeaders(builder, headerVector);
+        io.github.api7.A6.HTTPReqCall.Req.addPath(builder, path);
+        io.github.api7.A6.HTTPReqCall.Req.addArgs(builder, argsVector);
+        builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+        io.github.api7.A6.HTTPReqCall.Req req = 
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+
+        HttpRequest request = new HttpRequest(req);
+        HttpResponse response = new HttpResponse(1L);
+        a6HttpCallHandler.handle(request, response);
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
FooFilter, order: 0"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
FooFilter, config: Bar"));
+
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
path: /path"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: arg 
key: argKey"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: arg 
value: argValue"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
header key: headerKey"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
header value: headerValue"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
method: GET"));
+
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
CatFilter, order: 1"));
+        Assertions.assertTrue(capturedOutput.getOut().contains("do filter: 
CatFilter, config: Dog"));
+    }
+
+    @Test
+    @DisplayName("test stop the request")
+    void testDoFilter3() {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+
+        io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+        io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 0L);
+        builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+
+        io.github.api7.A6.HTTPReqCall.Req req = 
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+        HttpRequest request = new HttpRequest(req);
+        HttpResponse response = new HttpResponse(1L);
+        a6HttpCallHandler.handle(request, response);
+
+        io.github.api7.A6.HTTPReqCall.Resp resp =
+                
io.github.api7.A6.HTTPReqCall.Resp.getRootAsResp(response.encode());
+        Assertions.assertEquals(resp.actionType(), Action.Stop);
+    }
+}
diff --git 
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
 
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
index 06440ef..1255507 100644
--- 
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
+++ 
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
@@ -54,7 +54,7 @@ public class HttpRequest implements A6Request {
     public String getConfig(PluginFilter filter) {
         for (int i = 0; i < config.confLength(); i++) {
             TextEntry conf = config.conf(i);
-            if (conf.name().equals(filter.getClass().getSimpleName())) {
+            if (conf.name().equals(filter.name())) {
                 return conf.value();
             }
         }
diff --git 
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
 
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
index bee6636..651e8e0 100644
--- 
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
+++ 
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
@@ -109,6 +109,10 @@ public class HttpResponse implements A6Response {
         this.errResponse = errResponse;
     }
 
+    public A6ErrResponse getErrResponse() {
+        return this.errResponse;
+    }
+
     @Override
     public ByteBuffer encode() {
         if (!Objects.isNull(errResponse)) {
diff --git 
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
 
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
index a8a9b20..a7109a6 100644
--- 
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
+++ 
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
@@ -24,6 +24,8 @@ import reactor.core.publisher.Mono;
 
 public interface PluginFilter extends Ordered {
 
+    String name();
+
     Mono<Void> filter(HttpRequest request, HttpResponse response, 
PluginFilterChain chain);
 
 }

Reply via email to