This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit ef972eb51a2f5c8e0f06a664b2b46c7a5215832f Author: liubao <[email protected]> AuthorDate: Sun Jan 19 15:20:52 2020 +0800 [SCB-1726]fix all TODOs in demos --- .../protobuf/definition/OperationProtobuf.java | 15 +- .../protobuf/definition/RequestRootSerializer.java | 8 +- demo/demo-jaxrs/jaxrs-client/pom.xml | 46 +++++ .../servicecomb/demo/jaxrs/client/JaxrsClient.java | 225 ++++++++++++--------- .../jaxrs/client/MultiErrorCodeServiceClient.java | 61 +++--- .../client/beanParam/BeanParamPojoClient.java | 22 +- .../beanParam/BeanParamRestTemplateClient.java | 25 ++- .../apache/servicecomb/demo/jaxrs/JaxrsIT.java} | 33 +-- demo/demo-pojo/pojo-client/pom.xml | 5 + .../demo/pojo/client/CodeFirstPojoClient.java | 3 +- .../servicecomb/demo/pojo/client/PojoClient.java | 67 +++--- .../servicecomb/demo/pojo/client/TestWeakPojo.java | 10 + .../demo/pojo/server/SmartCareImpl.java | 2 - .../servicecomb/demo/pojo/server/TestImpl.java | 1 - .../servicecomb/demo/CategorizedTestCase.java | 9 +- .../demo/CategorizedTestCaseRunner.java | 2 +- .../servicecomb/demo/CodeFirstRestTemplate.java | 24 +-- .../main/resources/microservices/pojo/server.yaml | 4 - demo/demo-springmvc/springmvc-client/pom.xml | 5 + .../client/CodeFirstRestTemplateSpringmvc.java | 6 +- .../demo/springmvc/client/SpringmvcClient.java | 164 ++++++++------- .../demo/springmvc/client/TestWeakSpringmvc.java | 10 + .../foundation/protobuf/ProtoMapper.java | 3 + .../serializer/scalar/Int32WriteSchemas.java | 3 + .../common/InvocationToHttpServletRequest.java | 13 +- .../common/TestInvocationToHttpServletRequest.java | 4 +- .../transport/highway/HighwayCodec.java | 4 +- .../transport/highway/TestHighwayCodec.java | 114 +++-------- 28 files changed, 494 insertions(+), 394 deletions(-) diff --git a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java index e475712..9d12a9b 100644 --- a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java +++ b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/OperationProtobuf.java @@ -27,6 +27,7 @@ import javax.ws.rs.core.Response.Status.Family; import org.apache.servicecomb.codec.protobuf.utils.ScopedProtobufSchemaManager; import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.foundation.protobuf.ProtoMapper; +import org.apache.servicecomb.foundation.protobuf.internal.ProtoConst; import org.apache.servicecomb.foundation.protobuf.internal.ProtoUtils; import com.fasterxml.jackson.databind.JavaType; @@ -45,6 +46,10 @@ public class OperationProtobuf { private ResponseRootDeserializer<Object> responseRootDeserializer; + private ResponseRootSerializer anyResponseRootSerializer; + + private ResponseRootDeserializer<Object> anyResponseRootDeserializer; + public OperationProtobuf(ScopedProtobufSchemaManager scopedProtobufSchemaManager, OperationMeta operationMeta) { this.operationMeta = operationMeta; initRequestCodec(scopedProtobufSchemaManager, operationMeta); @@ -63,16 +68,14 @@ public class OperationProtobuf { if (Family.SUCCESSFUL.equals(Family.familyOf(statusCode))) { return this.responseRootSerializer; } - // TODO : WEAK handles only one response type. - throw new IllegalStateException("not implemented now, statusCode = " + statusCode); + return anyResponseRootSerializer; } public ResponseRootDeserializer<Object> findResponseRootDeserializer(int statusCode) { if (Family.SUCCESSFUL.equals(Family.familyOf(statusCode))) { return this.responseRootDeserializer; } - // TODO : WEAK handles only one response type. - throw new IllegalStateException("not implemented now, statusCode = " + statusCode); + return anyResponseRootDeserializer; } public OperationMeta getOperationMeta() { @@ -159,5 +162,9 @@ public class OperationProtobuf { } } } + anyResponseRootSerializer = new ResponseRootSerializer(mapper.createRootSerializer(ProtoConst.ANY, + Object.class), false, true); + anyResponseRootDeserializer = new ResponseRootDeserializer<>( + mapper.createRootDeserializer(ProtoConst.ANY, Object.class), false); } } diff --git a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/RequestRootSerializer.java b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/RequestRootSerializer.java index 0dde46e..ab34445 100644 --- a/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/RequestRootSerializer.java +++ b/common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/definition/RequestRootSerializer.java @@ -21,6 +21,8 @@ import java.util.Map; import org.apache.servicecomb.foundation.protobuf.RootSerializer; +import io.vertx.core.json.JsonObject; + public class RequestRootSerializer { private RootSerializer rootSerializer; @@ -37,7 +39,11 @@ public class RequestRootSerializer { @SuppressWarnings("unchecked") public byte[] serialize(Object value) throws IOException { if (noTypesInfo && !isWrap) { - return this.rootSerializer.serialize(((Map<String, Object>) value).values().iterator().next()); + Object param = ((Map<String, Object>) value).values().iterator().next(); + if (param instanceof JsonObject) { + param = ((JsonObject) param).getMap(); + } + return this.rootSerializer.serialize(param); } else { return this.rootSerializer.serialize(value); } diff --git a/demo/demo-jaxrs/jaxrs-client/pom.xml b/demo/demo-jaxrs/jaxrs-client/pom.xml index 28ca8ff..e21c510 100644 --- a/demo/demo-jaxrs/jaxrs-client/pom.xml +++ b/demo/demo-jaxrs/jaxrs-client/pom.xml @@ -50,5 +50,51 @@ <properties> <demo.main>org.apache.servicecomb.demo.jaxrs.client.JaxrsClient</demo.main> </properties> + <build> + <plugins> + <!-- Because other demos depend on this module, if add classpath, the depended module will fail dual to spring configuration files duplication. + So, we remove maven-dependency-plugin to make all integration tests run. In your applications, still need to add this to make packaged jar files run. + --> + <!-- + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + </plugin> + --> + <plugin> + <groupId>com.github.odavid.maven.plugins</groupId> + <artifactId>mixin-maven-plugin</artifactId> + <configuration> + <mixins> + <mixin> + <groupId>org.apache.servicecomb.demo</groupId> + <artifactId>docker-run-config</artifactId> + <version>${project.version}</version> + </mixin> + </mixins> + </configuration> + </plugin> + </plugins> + </build> + <profiles> + <profile> + <id>docker</id> + <properties> + <demo.service.name>jaxrs-server</demo.service.name> + <demo.vm.options> + -Dcse.highway.address=0.0.0.0:7070 + -Dcse.rest.address=0.0.0.0:8080?sslEnabled=false + </demo.vm.options> + </properties> + <build> + <plugins> + <plugin> + <groupId>io.fabric8</groupId> + <artifactId>docker-maven-plugin</artifactId> + </plugin> + </plugins> + </build> + </profile> + </profiles> </project> diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java index 13fc4c9..9779b13 100644 --- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java @@ -26,14 +26,13 @@ import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory; import org.apache.servicecomb.core.Const; +import org.apache.servicecomb.demo.CategorizedTestCaseRunner; import org.apache.servicecomb.demo.CodeFirstRestTemplate; import org.apache.servicecomb.demo.DemoConst; import org.apache.servicecomb.demo.RestObjectMapperWithStringMapper; import org.apache.servicecomb.demo.RestObjectMapperWithStringMapperNotWriteNull; import org.apache.servicecomb.demo.TestMgr; import org.apache.servicecomb.demo.compute.Person; -import org.apache.servicecomb.demo.jaxrs.client.beanParam.BeanParamPojoClient; -import org.apache.servicecomb.demo.jaxrs.client.beanParam.BeanParamRestTemplateClient; import org.apache.servicecomb.demo.jaxrs.client.pojoDefault.DefaultModelServiceClient; import org.apache.servicecomb.demo.jaxrs.client.validation.ValidationServiceClient; import org.apache.servicecomb.demo.validator.Student; @@ -41,7 +40,10 @@ import org.apache.servicecomb.foundation.common.utils.BeanUtils; import org.apache.servicecomb.foundation.common.utils.Log4jUtils; import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils; import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder; +import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData; import org.apache.servicecomb.swagger.invocation.exception.InvocationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -51,12 +53,21 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; public class JaxrsClient { + private static final Logger LOGGER = LoggerFactory.getLogger(JaxrsClient.class); + private static RestTemplate templateNew = RestTemplateBuilder.create(); public static void main(String[] args) throws Exception { init(); - run(); + try { + run(); + } catch (Exception e) { + TestMgr.check("success", "failed"); + LOGGER.error("-------------- test failed -------------"); + LOGGER.error("", e); + LOGGER.error("-------------- test failed -------------"); + } TestMgr.summary(); } @@ -69,6 +80,8 @@ public class JaxrsClient { } public static void run() throws Exception { + CategorizedTestCaseRunner.runCategorizedTestCase("jaxrs"); + CodeFirstRestTemplate codeFirstClient = new CodeFirstRestTemplateJaxrs(); codeFirstClient.testCodeFirst(templateNew, "jaxrs", "/codeFirstJaxrs/"); testCompute(templateNew); @@ -76,18 +89,11 @@ public class JaxrsClient { testClientTimeOut(templateNew); testJaxRSDefaultValuesAllTransport(templateNew); testSpringMvcDefaultValuesJavaPrimitiveAllTransport(templateNew); - MultiErrorCodeServiceClient.runTest(); - BeanParamPojoClient beanParamPojoClient = new BeanParamPojoClient(); - beanParamPojoClient.testAllTransport(); - BeanParamRestTemplateClient beanParamRestTemplateClient = new BeanParamRestTemplateClient(); - beanParamRestTemplateClient.testAllTransport(); DefaultModelServiceClient.run(); ValidationServiceClient.run(); testOnlyRest(templateNew); - beanParamPojoClient.testRestOnly(); - beanParamRestTemplateClient.testRestOnly(); } private static void testOnlyRest(RestTemplate template) { @@ -129,11 +135,11 @@ public class JaxrsClient { testValidatorAddFail(template, cseUrlPrefix); testValidatorSayHiFail(template, cseUrlPrefix); testValidatorExchangeFail(template, cseUrlPrefix); + testJaxRSDefaultValuesRest(template); } else if ("highway".equals(transport)) { - // TODO : WEAK highway support InvocationException -// testValidatorAddFail(template, cseUrlPrefix); -// testValidatorSayHiFail(template, cseUrlPrefix); -// testValidatorExchangeFail(template, cseUrlPrefix); + testValidatorAddFail(template, cseUrlPrefix); + testValidatorSayHiFail(template, cseUrlPrefix); + testValidatorExchangeFail(template, cseUrlPrefix); } testValidatorSayHiSuccess(template, cseUrlPrefix); testValidatorExchangeSuccess(template, cseUrlPrefix); @@ -207,43 +213,42 @@ public class JaxrsClient { result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class); TestMgr.check("Hello 20bobo4010", result); boolean failed = false; - // TODO: WEAK invocationexception not support in HIGHWAY -// try { -// result = template.getForObject(cseUrlPrefix + "/query2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// -// failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// TestMgr.check(failed, true); -// -// failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// TestMgr.check(failed, true); -// -// result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); -// TestMgr.check("Hello 20bobo40302", result); -// -// failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// TestMgr.check(failed, true); + try { + result = template.getForObject(cseUrlPrefix + "/query2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); + + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); + + result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); + TestMgr.check("Hello 20bobo40302", result); + + failed = false; + try { + result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(failed, true); result = template.getForObject(cseUrlPrefix + "/query3?a=30&b=2", String.class); TestMgr.check("Hello 302", result); @@ -294,20 +299,19 @@ public class JaxrsClient { } private static void testGetAllTransport(RestTemplate template, String cseUrlPrefix) { - // TODO: WEAK highway not support HttpServletRequest -// Map<String, String> params = new HashMap<>(); -// params.put("a", "5"); -// params.put("b", "3"); -// int result = -// template.getForObject(cseUrlPrefix + "/compute/reduce?a={a}&b={b}", Integer.class, params); -// TestMgr.check(2, result); -// -// result = template.getForObject(cseUrlPrefix + "/compute/reduce?a={a}&b={b}", Integer.class, 5, 4); -// TestMgr.check(1, result); -// -// result = template.getForObject(cseUrlPrefix + "/compute/reduce?a=5&b=6", -// Integer.class); -// TestMgr.check(-1, result); + Map<String, String> params = new HashMap<>(); + params.put("a", "5"); + params.put("b", "3"); + int result = + template.getForObject(cseUrlPrefix + "/compute/reduce?a={a}&b={b}", Integer.class, params); + TestMgr.check(2, result); + + result = template.getForObject(cseUrlPrefix + "/compute/reduce?a={a}&b={b}", Integer.class, 5, 4); + TestMgr.check(1, result); + + result = template.getForObject(cseUrlPrefix + "/compute/reduce?a=5&b=6", + Integer.class); + TestMgr.check(-1, result); } private static void testPost(RestTemplate template, String cseUrlPrefix) { @@ -381,9 +385,17 @@ public class JaxrsClient { // Message dependends on locale, so just check the short part. // 'must be greater than or equal to 20', propertyPath=add.arg1, rootBeanClass=class org.apache.servicecomb.demo.jaxrs.server.Validator, messageTemplate='{javax.validation.constraints.Min.message}'}]] // ignored - Map data = (Map) e.getErrorData(); - TestMgr.check( - true, data.get("message").toString().contains("propertyPath=add.b")); + if (e.getErrorData() instanceof CommonExceptionData) { + // highway decode/encode 'Object' with special type information, got runtime type + CommonExceptionData data = (CommonExceptionData) e.getErrorData(); + TestMgr.check( + true, data.getMessage().contains("propertyPath=add.b")); + } else { + // rest decode/encode 'Object' using json without type information, got map. Users can got runtime type by adding @JsonTypeInfo to the model. + Map data = (Map) e.getErrorData(); + TestMgr.check( + true, data.get("message").toString().contains("propertyPath=add.b")); + } } TestMgr.check(true, isExcep); @@ -407,9 +419,16 @@ public class JaxrsClient { TestMgr.check(400, e.getStatus().getStatusCode()); TestMgr.check(Status.BAD_REQUEST, e.getReasonPhrase()); // Message dependends on locale, so just check the short part. - Map data = (Map) e.getErrorData(); - TestMgr.check( - true, data.get("message").toString().contains("propertyPath=sayHi.name")); + if (e.getErrorData() instanceof CommonExceptionData) { + // highway decode/encode 'Object' with special type information, got runtime type + CommonExceptionData data = (CommonExceptionData) e.getErrorData(); + TestMgr.check( + true, data.getMessage().contains("propertyPath=sayHi.name")); + } else { + Map data = (Map) e.getErrorData(); + TestMgr.check( + true, data.get("message").toString().contains("propertyPath=sayHi.name")); + } } TestMgr.check(true, isExcep); } @@ -440,9 +459,16 @@ public class JaxrsClient { TestMgr.check(400, e.getStatus().getStatusCode()); TestMgr.check(Status.BAD_REQUEST, e.getReasonPhrase()); // Message dependends on locale, so just check the short part. - Map data = (Map) e.getErrorData(); - TestMgr.check( - true, data.get("message").toString().contains("propertyPath=sayHello.student.age")); + if (e.getErrorData() instanceof CommonExceptionData) { + // highway decode/encode 'Object' with special type information, got runtime type + CommonExceptionData data = (CommonExceptionData) e.getErrorData(); + TestMgr.check( + true, data.getMessage().contains("propertyPath=sayHello.student.age")); + } else { + Map data = (Map) e.getErrorData(); + TestMgr.check( + true, data.get("message").toString().contains("propertyPath=sayHello.student.age")); + } } TestMgr.check(true, isExcep); } @@ -524,29 +550,32 @@ public class JaxrsClient { } private static void testSpringMvcDefaultValuesJavaPrimitiveAllTransport(RestTemplate template) { - // TODO : WEAK highway not support primitive default values -// String microserviceName = "jaxrs"; -// String cseUrlPrefix = "cse://" + microserviceName + "/JaxRSDefaultValues/"; -// -// HttpHeaders headers = new HttpHeaders(); -// headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED); -// MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); -// HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); -// -// //default values with primitive -// String result = template.postForObject(cseUrlPrefix + "/javaprimitiveint", request, String.class); -// TestMgr.check("Hello 0bobo", result); -// -// result = template.postForObject(cseUrlPrefix + "/javaprimitivenumber", request, String.class); -// TestMgr.check("Hello 0.0false", result); -// -// result = template.postForObject(cseUrlPrefix + "/javaprimitivestr", request, String.class); -// TestMgr.check("Hello", result); -// -// result = template.postForObject(cseUrlPrefix + "/javaprimitivecomb", request, String.class); -// TestMgr.check("Hello nullnull", result); -// -// result = template.postForObject(cseUrlPrefix + "/allprimitivetypes", null, String.class); -// TestMgr.check("Hello false,\0,0,0,0,0,0.0,0.0,null", result); + String microserviceName = "jaxrs"; + for (String transport : DemoConst.transports) { + CategorizedTestCaseRunner.changeTransport(microserviceName, transport); + + String cseUrlPrefix = "cse://" + microserviceName + "/JaxRSDefaultValues/"; + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED); + MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); + HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); + + //default values with primitive + String result = template.postForObject(cseUrlPrefix + "/javaprimitiveint", request, String.class); + TestMgr.check("Hello 0bobo", result); + + result = template.postForObject(cseUrlPrefix + "/javaprimitivenumber", request, String.class); + TestMgr.check("Hello 0.0false", result); + + result = template.postForObject(cseUrlPrefix + "/javaprimitivestr", request, String.class); + TestMgr.check("Hello", result); + + result = template.postForObject(cseUrlPrefix + "/javaprimitivecomb", request, String.class); + TestMgr.check("Hello nullnull", result); + + result = template.postForObject(cseUrlPrefix + "/allprimitivetypes", null, String.class); + TestMgr.check("Hello false,\0,0,0,0,0,0.0,0.0,null", result); + } } } diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java index f05604c..a58cbc5 100644 --- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java @@ -22,14 +22,13 @@ import java.util.Map; import javax.ws.rs.core.Response.Status; import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory; -import org.apache.servicecomb.demo.DemoConst; +import org.apache.servicecomb.demo.CategorizedTestCase; import org.apache.servicecomb.demo.TestMgr; import org.apache.servicecomb.demo.multiErrorCode.MultiRequest; import org.apache.servicecomb.demo.multiErrorCode.MultiResponse200; import org.apache.servicecomb.demo.multiErrorCode.MultiResponse400; import org.apache.servicecomb.demo.multiErrorCode.MultiResponse500; import org.apache.servicecomb.foundation.common.net.URIEndpointObject; -import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils; import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder; import org.apache.servicecomb.serviceregistry.RegistryUtils; import org.apache.servicecomb.serviceregistry.api.registry.Microservice; @@ -40,6 +39,7 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import org.springframework.web.client.UnknownHttpStatusCodeException; @@ -47,27 +47,33 @@ import org.springframework.web.client.UnknownHttpStatusCodeException; import io.vertx.core.json.Json; import io.vertx.core.json.JsonObject; -public class MultiErrorCodeServiceClient { +@Component +public class MultiErrorCodeServiceClient implements CategorizedTestCase { private static final String SERVER = "cse://jaxrs"; private static String serverDirectURL; private static RestTemplate template = RestTemplateBuilder.create(); - public static void runTest() { - for (String transport : DemoConst.transports) { - ArchaiusUtils.setProperty("servicecomb.references.transport.jaxrs", transport); - - // TODO fix this in SCB-1634 -// testErrorCode(); -// testErrorCodeWithHeader(); -// testErrorCodeWithHeaderJAXRS(); -// testErrorCodeWithHeaderJAXRSUsingRowType(); -// testNoClientErrorCode(); - } + @Override + public void testAllTransport() throws Exception { + testErrorCode(); + testErrorCodeWithHeader(); + testErrorCodeWithHeaderJAXRS(); + testErrorCodeWithHeaderJAXRSUsingRowType(); + testNoClientErrorCode(); + } + @Override + public void testRestTransport() throws Exception { prepareServerDirectURL(); testErrorCodeWrongType(); + testErrorCodeWithHeaderJAXRSUsingRowTypeRest(); + } + + @Override + public void testHighwayTransport() throws Exception { + } private static void prepareServerDirectURL() { @@ -220,6 +226,23 @@ public class MultiErrorCodeServiceClient { TestMgr.check(t500.getMessage(), "internal error"); } + private static void testErrorCodeWithHeaderJAXRSUsingRowTypeRest() { + // TODO recover this in SCB-1652 + // using string +// MultiRequest request = new MultiRequest(); +// request.setCode(200); +// request.setMessage("test message"); +// String stringRequest = Json.encode(request); +// +// ResponseEntity<MultiResponse200> result = template +// .postForEntity(SERVER + "/MultiErrorCodeService/errorCodeWithHeaderJAXRS", stringRequest, +// MultiResponse200.class); +// TestMgr.check(result.getStatusCodeValue(), 200); +// TestMgr.check(result.getBody().getMessage(), "test message"); +// TestMgr.check(result.getBody().getCode(), 200); +// TestMgr.check(result.getHeaders().getFirst("x-code"), 200); + } + private static void testErrorCodeWithHeaderJAXRSUsingRowType() { JsonObject requestJson = new JsonObject(); requestJson.put("code", 200); @@ -244,16 +267,6 @@ public class MultiErrorCodeServiceClient { TestMgr.check(result.getBody().getMessage(), "test message"); TestMgr.check(result.getBody().getCode(), 200); TestMgr.check(result.getHeaders().getFirst("x-code"), 200); - - // TODO recover this in SCB-1652 - // using string -// result = template -// .postForEntity(SERVER + "/MultiErrorCodeService/errorCodeWithHeaderJAXRS", stringRequest, -// MultiResponse200.class); -// TestMgr.check(result.getStatusCodeValue(), 200); -// TestMgr.check(result.getBody().getMessage(), "test message"); -// TestMgr.check(result.getBody().getCode(), 200); -// TestMgr.check(result.getHeaders().getFirst("x-code"), 200); } private static void testNoClientErrorCode() { diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamPojoClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamPojoClient.java index 2f384f4..9e09bc1 100644 --- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamPojoClient.java +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamPojoClient.java @@ -20,25 +20,33 @@ package org.apache.servicecomb.demo.jaxrs.client.beanParam; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; +import org.apache.servicecomb.demo.CategorizedTestCase; import org.apache.servicecomb.demo.TestMgr; import org.apache.servicecomb.provider.pojo.Invoker; +import org.springframework.stereotype.Component; -public class BeanParamPojoClient { +@Component +public class BeanParamPojoClient implements CategorizedTestCase { private BeanParamTestServiceIntf beanParamTestServiceIntf; public BeanParamPojoClient() { beanParamTestServiceIntf = Invoker.createProxy("jaxrs", "beanParamTest", BeanParamTestServiceIntf.class); } - public void testAllTransport() { - // TODO : WEAK highway not implement InvocationContext and BeanParam and Upload -// testBeanParam(); -// testUpload(); + @Override + public void testRestTransport() throws Exception { + testBeanParam(); + testUpload(); + } + + @Override + public void testHighwayTransport() throws Exception { + } - public void testRestOnly() { + @Override + public void testAllTransport() throws Exception { testBeanParam(); - testUpload(); } private void testBeanParam() { diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamRestTemplateClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamRestTemplateClient.java index 401d3a2..69c5057 100644 --- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamRestTemplateClient.java +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/beanParam/BeanParamRestTemplateClient.java @@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream; import java.util.HashMap; import java.util.Map; +import org.apache.servicecomb.demo.CategorizedTestCase; import org.apache.servicecomb.demo.TestMgr; import org.apache.servicecomb.provider.springmvc.reference.CseHttpEntity; import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder; @@ -30,9 +31,11 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; -public class BeanParamRestTemplateClient { +@Component +public class BeanParamRestTemplateClient implements CategorizedTestCase { RestTemplate restTemplate; public BeanParamRestTemplateClient() { @@ -40,17 +43,23 @@ public class BeanParamRestTemplateClient { } - public void testAllTransport() { -// testBeanParam(); -// testUpload(); + @Override + public void testRestTransport() throws Exception { + testBeanParam(); + testUpload(); + } + + @Override + public void testHighwayTransport() throws Exception { + } - public void testRestOnly() { + @Override + public void testAllTransport() throws Exception { testBeanParam(); - testUpload(); } - public void testBeanParam() { + private void testBeanParam() { HttpHeaders headers = new HttpHeaders(); headers.add("Cookie", "cookieSwaggerLong=11"); headers.add("headerSwaggerInt", "2"); @@ -66,7 +75,7 @@ public class BeanParamRestTemplateClient { result.getBody()); } - public void testUpload() { + private void testUpload() { BufferedInputStream bufferedInputStream0 = new BufferedInputStream(new ByteArrayInputStream("up0".getBytes())); BufferedInputStream bufferedInputStream1 = new BufferedInputStream(new ByteArrayInputStream("up1".getBytes())); BufferedInputStream bufferedInputStream2 = new BufferedInputStream(new ByteArrayInputStream("up2".getBytes())); diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java b/demo/demo-jaxrs/jaxrs-client/src/test/java/org/apache/servicecomb/demo/jaxrs/JaxrsIT.java similarity index 61% copy from demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java copy to demo/demo-jaxrs/jaxrs-client/src/test/java/org/apache/servicecomb/demo/jaxrs/JaxrsIT.java index 4db55c9..df4d1ab 100644 --- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java +++ b/demo/demo-jaxrs/jaxrs-client/src/test/java/org/apache/servicecomb/demo/jaxrs/JaxrsIT.java @@ -15,24 +15,27 @@ * limitations under the License. */ -package org.apache.servicecomb.demo; +package org.apache.servicecomb.demo.jaxrs; -public interface CategorizedTestCase { - /** - * test case which only successful in REST transport - */ - default void testRestTransport() throws Exception { - } +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import org.apache.servicecomb.demo.TestMgr; +import org.apache.servicecomb.demo.jaxrs.client.JaxrsClient; +import org.junit.Before; +import org.junit.Test; - /** - * test case which only successful in HIGHWAY transport - */ - default void testHighwayTransport() throws Exception { +public class JaxrsIT { + + @Before + public void setUp() { + TestMgr.errors().clear(); } - /** - * test case which successful in both REST and HIGHWAY transport - */ - default void testAllTransport() throws Exception { + @Test + public void clientGetsNoError() throws Exception { + JaxrsClient.main(new String[0]); + + assertThat(TestMgr.errors().isEmpty(), is(true)); } } diff --git a/demo/demo-pojo/pojo-client/pom.xml b/demo/demo-pojo/pojo-client/pom.xml index 34475b2..04ce19a 100644 --- a/demo/demo-pojo/pojo-client/pom.xml +++ b/demo/demo-pojo/pojo-client/pom.xml @@ -48,10 +48,15 @@ </properties> <build> <plugins> + <!-- Because other demos depend on this module, if add classpath, the depended module will fail dual to spring configuration files duplication. + So, we remove maven-dependency-plugin to make all integration tests run. In your applications, still need to add this to make packaged jar files run. + --> + <!-- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> </plugin> + --> <plugin> <groupId>com.github.odavid.maven.plugins</groupId> <artifactId>mixin-maven-plugin</artifactId> diff --git a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java index 147d17e..ee91f31 100644 --- a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java +++ b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/CodeFirstPojoClient.java @@ -71,8 +71,7 @@ public class CodeFirstPojoClient { private void testAll(CodeFirstPojoIntf codeFirst) { testCodeFirstUserMap(codeFirst); testCodeFirstUserArray(codeFirst); - // TODO: WEAK highway returns array -// testCodeFirstStrings(codeFirst); + testCodeFirstStrings(codeFirst); testCodeFirstBytes(codeFirst); testCodeFirstAddDate(codeFirst); testCodeFirstAddString(codeFirst); diff --git a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java index 1f3d012..a302b38 100644 --- a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java +++ b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/PojoClient.java @@ -23,6 +23,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ForkJoinPool; +import java.util.stream.IntStream; import javax.inject.Inject; @@ -86,32 +88,29 @@ public class PojoClient { TestMgr.check("success", "failed"); LOGGER.error("-------------- test failed -------------"); LOGGER.error("", e); - System.err.println("-------------- test failed -------------"); + LOGGER.error("-------------- test failed -------------"); } TestMgr.summary(); } - private static void testContextClassLoaderIsNull() { - // TODO: WEAK protostuff many classes use ContextClassLoader to load classes, if it is null, - // Will cause many components not work. -// IntStream.range(0, 100).parallel().forEach(item -> { -// if (Thread.currentThread().getName().equals("main")) { -// return; -// } -// // in web environment, this could be null, here we just mock a null class loader. -// Thread.currentThread().setContextClassLoader(null); -// TestMgr.check(null, test.postTestStatic(2)); -// }); + private static void testContextClassLoaderIsNull() throws Exception { + ForkJoinPool pool = new ForkJoinPool(4); + pool.submit(() -> + IntStream.range(0, 20).parallel().forEach(item -> { + if (Thread.currentThread().getName().equals("main")) { + return; + } + // in web environment, this could be null, here we just mock a null class loader. + Thread.currentThread().setContextClassLoader(null); + TestMgr.check(null, test.postTestStatic(2)); + })).get(); } public static void run() throws Exception { CategorizedTestCaseRunner.runCategorizedTestCase("pojo"); - testContextClassLoaderIsNull(); - smartcare = BeanUtils.getBean("smartcare"); - String microserviceName = "pojo"; codeFirstPojoClient.testCodeFirst(microserviceName); @@ -120,6 +119,7 @@ public class PojoClient { TestMgr.setMsg(microserviceName, transport); LOGGER.info("test {}, transport {}", microserviceName, transport); + testContextClassLoaderIsNull(); testNull(testFromXml); testNull(test); @@ -228,24 +228,23 @@ public class PojoClient { } private static void testException(Test test) { - // TODO : WEAK highway support error code -// try { -// test.testException(456); -// } catch (InvocationException e) { -// TestMgr.check("456 error", e.getErrorData()); -// } -// -// try { -// test.testException(556); -// } catch (InvocationException e) { -// TestMgr.check("[556 error]", e.getErrorData()); -// } - -// try { -// test.testException(557); -// } catch (InvocationException e) { -// TestMgr.check("[[557 error]]", e.getErrorData()); -// } + try { + test.testException(456); + } catch (InvocationException e) { + TestMgr.check("456 error", e.getErrorData()); + } + + try { + test.testException(556); + } catch (InvocationException e) { + TestMgr.check("[556 error]", e.getErrorData()); + } + + try { + test.testException(557); + } catch (InvocationException e) { + TestMgr.check("[[557 error]]", e.getErrorData()); + } } private static void testInputArray(Test test) { @@ -281,7 +280,6 @@ public class PojoClient { } private static void testEmptyHighway(Test test) { - // TODO : WEAK highway will never encoding empty string TestMgr.check("code is 'null'", test.getTestString("")); } @@ -294,7 +292,6 @@ public class PojoClient { } private static void testNullHighway(Test test) { - // TODO: WEAK highway will never have request with null. When new User, the default name is nameA TestMgr.check("nameA", test.wrapParam(null).getName()); } diff --git a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestWeakPojo.java b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestWeakPojo.java index d324463..1ab7f58 100644 --- a/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestWeakPojo.java +++ b/demo/demo-pojo/pojo-client/src/main/java/org/apache/servicecomb/demo/pojo/client/TestWeakPojo.java @@ -109,6 +109,16 @@ public class TestWeakPojo implements CategorizedTestCase { private ObjectInf objectInf; @Override + public void testRestTransport() throws Exception { + + } + + @Override + public void testHighwayTransport() throws Exception { + + } + + @Override public void testAllTransport() throws Exception { testDiffName(); diff --git a/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/SmartCareImpl.java b/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/SmartCareImpl.java index 69a4abd..7b34256 100644 --- a/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/SmartCareImpl.java +++ b/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/SmartCareImpl.java @@ -28,7 +28,6 @@ public class SmartCareImpl implements SmartCare { @Override public Response addApplication(Application application) { - // TODO: add application LOG.info(application.toString()); Response resp = new Response(); @@ -40,7 +39,6 @@ public class SmartCareImpl implements SmartCare { @SuppressWarnings("divzero") @Override public Response delApplication(String appName) { - // TODO: delete application LOG.info(appName); try { diff --git a/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/TestImpl.java b/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/TestImpl.java index 1d8fd4e..be1baca 100644 --- a/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/TestImpl.java +++ b/demo/demo-pojo/pojo-server/src/main/java/org/apache/servicecomb/demo/pojo/server/TestImpl.java @@ -88,7 +88,6 @@ public class TestImpl implements Test { @Override public User wrapParam(TestRequest request) { - // TODO: WEAK highway will never have request with null, so here check request.getUser() == null if (request == null || request.getUser() == null) { return null; } diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java index 4db55c9..51c733a 100644 --- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java +++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCase.java @@ -21,18 +21,15 @@ public interface CategorizedTestCase { /** * test case which only successful in REST transport */ - default void testRestTransport() throws Exception { - } + void testRestTransport() throws Exception; /** * test case which only successful in HIGHWAY transport */ - default void testHighwayTransport() throws Exception { - } + void testHighwayTransport() throws Exception; /** * test case which successful in both REST and HIGHWAY transport */ - default void testAllTransport() throws Exception { - } + void testAllTransport() throws Exception; } diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCaseRunner.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCaseRunner.java index 1bc637a..ee508cd 100644 --- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCaseRunner.java +++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CategorizedTestCaseRunner.java @@ -38,7 +38,7 @@ public class CategorizedTestCaseRunner { } } - private static void changeTransport(String microserviceName, String transport) { + public static void changeTransport(String microserviceName, String transport) { ArchaiusUtils.setProperty("servicecomb.references.transport." + microserviceName, transport); TestMgr.setMsg(microserviceName, transport); } diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java index 417c351..087d518 100644 --- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java +++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java @@ -57,30 +57,28 @@ public class CodeFirstRestTemplate { changeTransport(microserviceName, Const.RESTFUL); testOnlyRest(microserviceName, template, cseUrlPrefix); - for (String transport : DemoConst.transports) { + for (String transport : DemoConst.transports) { changeTransport(microserviceName, transport); testAllTransport(microserviceName, template, cseUrlPrefix); } } protected void testAllTransport(String microserviceName, RestTemplate template, String cseUrlPrefix) { - // TODO : WEAK not supported now in HIGHWAY -// testCodeFirstUserMap(template, cseUrlPrefix); -// testCodeFirstTextPlain(template, cseUrlPrefix); -// testCodeFirstAppXml(template, cseUrlPrefix); -// testCodeFirstBytes(template, cseUrlPrefix); -// testCseResponse(microserviceName, template, cseUrlPrefix); -// testCodeFirstAddDate(template, cseUrlPrefix); - -// testCodeFirstAdd(template, cseUrlPrefix); -// testCodeFirstAddString(template, cseUrlPrefix); + testCodeFirstUserMap(template, cseUrlPrefix); + testCodeFirstTextPlain(template, cseUrlPrefix); + testCodeFirstAppXml(template, cseUrlPrefix); + testCodeFirstBytes(template, cseUrlPrefix); + testCseResponse(microserviceName, template, cseUrlPrefix); + testCodeFirstAddDate(template, cseUrlPrefix); + + testCodeFirstAdd(template, cseUrlPrefix); + testCodeFirstAddString(template, cseUrlPrefix); testCodeFirstIsTrue(template, cseUrlPrefix); testCodeFirstSayHi2(template, cseUrlPrefix); testCodeFirstSayHi(template, cseUrlPrefix); testCodeFirstSaySomething(template, cseUrlPrefix); - // testCodeFirstRawJsonString(template, cseUrlPrefix); testCodeFirstSayHello(template, cseUrlPrefix); -// testCodeFirstReduce(template, cseUrlPrefix); + testCodeFirstReduce(template, cseUrlPrefix); testTraceIdOnContextContainsTraceId(template, cseUrlPrefix); diff --git a/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml b/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml index da06df5..9c8be9e 100644 --- a/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml +++ b/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml @@ -196,8 +196,6 @@ definitions: type: object properties: index: - # TODO WEAK highway do not support map number(which IDL type is double) to integer - # type: number type: integer format: int32 user: @@ -218,8 +216,6 @@ definitions: type: integer format: int32 index: - # TODO WEAK highway do not support map number(which IDL type is double) to integer - # type: number type: integer format: int32 x-java-class: "org.apache.servicecomb.demo.server.User" diff --git a/demo/demo-springmvc/springmvc-client/pom.xml b/demo/demo-springmvc/springmvc-client/pom.xml index 9f15f93..970463f 100644 --- a/demo/demo-springmvc/springmvc-client/pom.xml +++ b/demo/demo-springmvc/springmvc-client/pom.xml @@ -65,10 +65,15 @@ </properties> <build> <plugins> + <!-- Because other demos depend on this module, if add classpath, the depended module will fail dual to spring configuration files duplication. + So, we remove maven-dependency-plugin to make all integration tests run. In your applications, still need to add this to make packaged jar files run. + --> + <!-- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> </plugin> + --> <plugin> <groupId>com.github.odavid.maven.plugins</groupId> <artifactId>mixin-maven-plugin</artifactId> diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java index 563fcdf..8e88096 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java @@ -113,8 +113,7 @@ public class CodeFirstRestTemplateSpringmvc extends CodeFirstRestTemplate { testBizkeeper.runAllTest(); testResponseEntity("springmvc", template, cseUrlPrefix); testCodeFirstTestForm(template, cseUrlPrefix); - // TODO : WEAK not supported now in HIGHWAY -// testFallback(template, cseUrlPrefix); + testFallback(template, cseUrlPrefix); super.testAllTransport(microserviceName, template, cseUrlPrefix); } @@ -249,7 +248,8 @@ public class CodeFirstRestTemplateSpringmvc extends CodeFirstRestTemplate { TestMgr.check(code + "null", template.postForEntity(cseUrlPrefix + "/testform", formEntiry, String.class).getBody()); map.put("form2", "hello"); - TestMgr.check(code + "hello", template.postForEntity(cseUrlPrefix + "/testform", formEntiry, String.class).getBody()); + TestMgr + .check(code + "hello", template.postForEntity(cseUrlPrefix + "/testform", formEntiry, String.class).getBody()); } private void testCodeFirstTestFormHighway(RestTemplate template, String cseUrlPrefix) { diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java index 8ecfadf..1b299fe 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java @@ -243,26 +243,25 @@ public class SpringmvcClient { TestMgr.check(e.getStatusCode(), 400); } - // TODO: WEAK HttpServletRequest not supported in highway -// TestMgr.check("hi world [world]", -// template.getForObject(prefix + "/controller/sayhi?name=world", -// String.class)); -// -// TestMgr.check("hi world1 [world1]", -// template.getForObject(prefix + "/controller/sayhi?name={name}", -// String.class, -// "world1")); -// TestMgr.check("hi hi 中国 [hi 中国]", -// template.getForObject(prefix + "/controller/sayhi?name={name}", -// String.class, -// "hi 中国")); -// -// Map<String, String> params = new HashMap<>(); -// params.put("name", "world2"); -// TestMgr.check("hi world2 [world2]", -// template.getForObject(prefix + "/controller/sayhi?name={name}", -// String.class, -// params)); + TestMgr.check("hi world [world]", + template.getForObject(prefix + "/controller/sayhi?name=world", + String.class)); + + TestMgr.check("hi world1 [world1]", + template.getForObject(prefix + "/controller/sayhi?name={name}", + String.class, + "world1")); + TestMgr.check("hi hi 中国 [hi 中国]", + template.getForObject(prefix + "/controller/sayhi?name={name}", + String.class, + "hi 中国")); + + Map<String, String> params = new HashMap<>(); + params.put("name", "world2"); + TestMgr.check("hi world2 [world2]", + template.getForObject(prefix + "/controller/sayhi?name={name}", + String.class, + params)); TestMgr.check("hello world", template.postForObject(prefix + "/controller/sayhello/{name}", @@ -275,16 +274,15 @@ public class SpringmvcClient { String.class, "hello 中国")); - // TODO: WEAK throw InvocationiException not supported in highway -// try { -// template.postForObject(prefix + "/controller/sayhello/{name}", -// null, -// String.class, -// "exception"); -// TestMgr.check(true, false); -// } catch (InvocationException e) { -// TestMgr.check(e.getStatusCode(), 503); -// } + try { + template.postForObject(prefix + "/controller/sayhello/{name}", + null, + String.class, + "exception"); + TestMgr.check(true, false); + } catch (InvocationException e) { + TestMgr.check(e.getStatusCode(), 503); + } HttpHeaders headers = new HttpHeaders(); headers.add("name", "world"); @@ -306,8 +304,7 @@ public class SpringmvcClient { } private static void testController() { - // TODO: WEAK HttpServletRequest not supported in highway -// TestMgr.check("hi world [world]", controller.sayHi("world")); + TestMgr.check("hi world [world]", controller.sayHi("world")); Person user = new Person(); user.setName("world"); TestMgr.check("ha world", controller.saySomething("ha", user)); @@ -368,42 +365,51 @@ public class SpringmvcClient { String result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class); TestMgr.check("Hello 20bobo4010", result); boolean failed = false; + result = null; try { result = template.getForObject(cseUrlPrefix + "/query2", String.class); } catch (InvocationException e) { failed = true; TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); } + TestMgr.check(true, failed); + TestMgr.check(null, result); failed = false; + result = null; try { result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); } catch (InvocationException e) { failed = true; TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); } - TestMgr.check(failed, true); + TestMgr.check(true, failed); + TestMgr.check(null, result); failed = false; + result = null; try { result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); } catch (InvocationException e) { failed = true; TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); } - TestMgr.check(failed, true); + TestMgr.check(true, failed); + TestMgr.check(null, result); result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); TestMgr.check("Hello 20bobo40302", result); failed = false; + result = null; try { result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); } catch (InvocationException e) { failed = true; TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); } - TestMgr.check(failed, true); + TestMgr.check(true, failed); + TestMgr.check(null, result); } private static void testSpringMvcDefaultValuesAllTransport(RestTemplate template, String microserviceName) { @@ -421,46 +427,54 @@ public class SpringmvcClient { result = template.postForObject(cseUrlPrefix + "/header", entity, String.class); TestMgr.check("Hello 20bobo30", result); - // TODO: WEAK InvocationException not supported in highway -// result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class); -// TestMgr.check("Hello 20bobo4010", result); -// boolean failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// -// failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// TestMgr.check(failed, true); -// -// failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// TestMgr.check(failed, true); -// -// result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); -// TestMgr.check("Hello 20bobo40302", result); -// -// failed = false; -// try { -// result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); -// } catch (InvocationException e) { -// failed = true; -// TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); -// } -// TestMgr.check(failed, true); + result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class); + TestMgr.check("Hello 20bobo4010", result); + boolean failed = false; + result = null; + try { + result = template.getForObject(cseUrlPrefix + "/query2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(true, failed); + TestMgr.check(null, result); + + failed = false; + result = null; + try { + result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(true, failed); + TestMgr.check(null, result); + + failed = false; + result = null; + try { + result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(true, failed); + TestMgr.check(null, result); + + result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", String.class); + TestMgr.check("Hello 20bobo40302", result); + + failed = false; + result = null; + try { + result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", String.class); + } catch (InvocationException e) { + failed = true; + TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST); + } + TestMgr.check(true, failed); + TestMgr.check(null, result); result = template.getForObject(cseUrlPrefix + "/query3?a=30&b=2", String.class); TestMgr.check("Hello 302", result); diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestWeakSpringmvc.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestWeakSpringmvc.java index b7317c8..36d4c91 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestWeakSpringmvc.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestWeakSpringmvc.java @@ -106,6 +106,16 @@ public class TestWeakSpringmvc implements CategorizedTestCase { private RestTemplate restTemplate = RestTemplateBuilder.create(); @Override + public void testRestTransport() throws Exception { + + } + + @Override + public void testHighwayTransport() throws Exception { + + } + + @Override public void testAllTransport() throws Exception { getDiffName(); diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java index 1a86e9b..7a5e695 100644 --- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java +++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/ProtoMapper.java @@ -99,6 +99,9 @@ public class ProtoMapper { public Message getRequestMessage(String operationId) { Service service = proto.getServices().get(0); ServiceMethod serviceMethod = service.getMethod(operationId); + if (serviceMethod == null) { + throw new IllegalArgumentException("operation not found, operation id=" + operationId); + } return serviceMethod.getArgType(); } diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java index 42b2f55..615afb6 100644 --- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java +++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/serializer/scalar/Int32WriteSchemas.java @@ -62,6 +62,9 @@ public final class Int32WriteSchemas { } if (value instanceof String) { + if (((String) value).isEmpty()) { + return; + } int parsedValue = Integer.parseInt((String) value, 10); output.writeScalarInt32(tag, tagSize, parsedValue); return; diff --git a/providers/provider-rest-common/src/main/java/org/apache/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java b/providers/provider-rest-common/src/main/java/org/apache/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java index b98f799..be3cda5 100644 --- a/providers/provider-rest-common/src/main/java/org/apache/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java +++ b/providers/provider-rest-common/src/main/java/org/apache/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java @@ -36,16 +36,17 @@ import io.vertx.core.net.SocketAddress; public class InvocationToHttpServletRequest extends AbstractHttpServletRequest { private RestOperationMeta swaggerOperation; - private SocketAddress sockerAddress; - private Invocation invocation; public InvocationToHttpServletRequest(Invocation invocation) { this.swaggerOperation = invocation.getOperationMeta().getExtData(RestConst.SWAGGER_REST_OPERATION); - this.sockerAddress = (SocketAddress) invocation.getHandlerContext().get(Const.REMOTE_ADDRESS); this.invocation = invocation; } + private SocketAddress getSockerAddress() { + return (SocketAddress) invocation.getHandlerContext().get(Const.REMOTE_ADDRESS); + } + @Override public String getParameter(String name) { RestParam param = swaggerOperation.getParamByName(name); @@ -112,17 +113,17 @@ public class InvocationToHttpServletRequest extends AbstractHttpServletRequest { @Override public String getRemoteAddr() { - return this.sockerAddress == null ? "" : this.sockerAddress.host(); + return this.getSockerAddress() == null ? "" : this.getSockerAddress().host(); } @Override public String getRemoteHost() { - return this.sockerAddress == null ? "" : this.sockerAddress.host(); + return this.getSockerAddress() == null ? "" : this.getSockerAddress().host(); } @Override public int getRemotePort() { - return this.sockerAddress == null ? 0 : this.sockerAddress.port(); + return this.getSockerAddress() == null ? 0 : this.getSockerAddress().port(); } @Override diff --git a/providers/provider-rest-common/src/test/java/org/apache/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java b/providers/provider-rest-common/src/test/java/org/apache/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java index 13619f4..3faa31f 100644 --- a/providers/provider-rest-common/src/test/java/org/apache/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java +++ b/providers/provider-rest-common/src/test/java/org/apache/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java @@ -71,8 +71,6 @@ public class TestInvocationToHttpServletRequest { result = operationMeta; operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION); result = swaggerOperation; - invocation.getHandlerContext(); - result = handlerContext; } }; @@ -288,6 +286,8 @@ public class TestInvocationToHttpServletRequest { result = "127.0.0.2"; socketAddress.port(); result = 8088; + invocation.getHandlerContext(); + result = handlerContext; } }; String addr = request.getRemoteAddr(); diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java index 014f2b7..bb28651 100644 --- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java +++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayCodec.java @@ -84,8 +84,8 @@ public final class HighwayCodec { @SuppressWarnings({"rawtypes", "unchecked"}) public static void decodeRequest(Invocation invocation, RequestHeader header, OperationProtobuf operationProtobuf, Buffer bodyBuffer) throws Exception { - RequestRootDeserializer<Object> requestDesirializer = operationProtobuf.getRequestRootDeserializer(); - Map<String, Object> swaggerArguments = requestDesirializer.deserialize(bodyBuffer.getBytes()); + RequestRootDeserializer<Object> requestDeserializer = operationProtobuf.getRequestRootDeserializer(); + Map<String, Object> swaggerArguments = requestDeserializer.deserialize(bodyBuffer.getBytes()); addPrimitiveTypeDefaultValues(invocation, operationProtobuf.getOperationMeta(), swaggerArguments); invocation.setSwaggerArguments(swaggerArguments); invocation.mergeContext(header.getContext()); diff --git a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java index 7635139..e77d364 100644 --- a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java +++ b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java @@ -22,10 +22,12 @@ import java.util.HashMap; import java.util.Map; import org.apache.servicecomb.codec.protobuf.definition.OperationProtobuf; +import org.apache.servicecomb.codec.protobuf.definition.RequestRootDeserializer; import org.apache.servicecomb.codec.protobuf.definition.RequestRootSerializer; import org.apache.servicecomb.codec.protobuf.definition.ResponseRootSerializer; import org.apache.servicecomb.core.Endpoint; import org.apache.servicecomb.core.Invocation; +import org.apache.servicecomb.core.definition.MicroserviceMeta; import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.core.definition.SchemaMeta; import org.apache.servicecomb.foundation.vertx.server.TcpParser; @@ -46,19 +48,20 @@ import io.vertx.core.buffer.Buffer; import mockit.Mocked; public class TestHighwayCodec { - - private RequestHeader header = null; - private OperationProtobuf operationProtobuf = null; private Buffer bodyBuffer = null; private RequestRootSerializer requestSerializer = null; + private RequestRootDeserializer<Object> requestRootDeserializer = null; + private SchemaMeta schemaMeta = null; private OperationMeta operationMeta = null; + private MicroserviceMeta microserviceMeta = null; + private ByteBuf lByteBuf = null; private ByteBuffer nioBuffer = null; @@ -75,18 +78,20 @@ public class TestHighwayCodec { serviceRegistry.init(); RegistryUtils.setServiceRegistry(serviceRegistry); - header = Mockito.mock(RequestHeader.class); - operationProtobuf = Mockito.mock(OperationProtobuf.class); bodyBuffer = Mockito.mock(Buffer.class); requestSerializer = Mockito.mock(RequestRootSerializer.class); + requestRootDeserializer = Mockito.mock(RequestRootDeserializer.class); + schemaMeta = Mockito.mock(SchemaMeta.class); operationMeta = Mockito.mock(OperationMeta.class); + microserviceMeta = Mockito.mock(MicroserviceMeta.class); + lByteBuf = Mockito.mock(ByteBuf.class); nioBuffer = Mockito.mock(ByteBuffer.class); @@ -97,8 +102,6 @@ public class TestHighwayCodec { @After public void tearDown() { - header = null; - operationProtobuf = null; bodyBuffer = null; @@ -116,66 +119,25 @@ public class TestHighwayCodec { invocation = null; } - @Test - public void testDecodeRequest(@Mocked Endpoint endpoint) throws Exception { - // TODO : WK unit test -// commonMock(); -// Mockito.when(schemaMeta.getMicroserviceMeta().getProviderHandlerChain()).thenReturn(Collections.emptyList()); -// Object[] args = new Object[] {}; -// Mockito.when(schema.readObject(bodyBuffer)).thenReturn(args); -// -// Invocation invocation = new Invocation(endpoint, operationMeta, null); -// -// HighwayCodec.decodeRequest(invocation, header, operationProtobuf, bodyBuffer); -// -// Assert.assertSame(args, invocation.getSwaggerArguments()); - } - - @Test - public void testDecodeResponse() throws Exception { - // TODO : WK unit test - // Invocation invocation = Mockito.mock(Invocation.class); -// Mockito.when(operationProtobuf.findResponseSchema(200)).thenReturn(Mockito.mock(WrapSchema.class)); -// -// Map<String, String> context = new HashMap<>(); -// Mockito.when(invocation.getContext()).thenReturn(context); -// -// TcpData tcpData = Mockito.mock(TcpData.class); -// -// Mockito.when(tcpData.getHeaderBuffer()).thenReturn(bodyBuffer); -// commonMock(); -// -// ResponseHeader header = new ResponseHeader(); -// header.setStatusCode(200); -// header.setContext(new HashMap<>()); -// header.getContext().put("a", "10"); -// Buffer responseBuf = HighwayCodec.encodeResponse(0, header, null, null); -// -// TcpData tcp = new TcpData(responseBuf.slice(23, responseBuf.length()), null); -// Response response = HighwayCodec.decodeResponse(invocation, operationProtobuf, tcp); -// Assert.assertEquals("10", invocation.getContext().get("a")); -// Assert.assertEquals(200, response.getStatusCode()); - } @Test public void testDecodeRequestTraceId(@Mocked Endpoint endpoint) throws Exception { - // TODO : WK unit test - // commonMock(); -// -// Invocation invocation = new Invocation(endpoint, operationMeta, null); -// -// invocation.addContext("X-B3-traceId", "test1"); -// Assert.assertEquals("test1", invocation.getContext("X-B3-traceId")); -// -// RequestHeader headers = new RequestHeader(); -// Map<String, String> context = new HashMap<>(); -// headers.setContext(context); -// HighwayCodec.decodeRequest(invocation, headers, operationProtobuf, bodyBuffer); -// Assert.assertEquals("test1", invocation.getContext("X-B3-traceId")); -// -// context.put("X-B3-traceId", "test2"); -// HighwayCodec.decodeRequest(invocation, headers, operationProtobuf, bodyBuffer); -// Assert.assertEquals("test2", invocation.getContext("X-B3-traceId")); + commonMock(); + + Invocation invocation = new Invocation(endpoint, operationMeta, null); + + invocation.addContext("X-B3-traceId", "test1"); + Assert.assertEquals("test1", invocation.getContext("X-B3-traceId")); + + RequestHeader headers = new RequestHeader(); + Map<String, String> context = new HashMap<>(); + headers.setContext(context); + HighwayCodec.decodeRequest(invocation, headers, operationProtobuf, bodyBuffer); + Assert.assertEquals("test1", invocation.getContext("X-B3-traceId")); + + context.put("X-B3-traceId", "test2"); + HighwayCodec.decodeRequest(invocation, headers, operationProtobuf, bodyBuffer); + Assert.assertEquals("test2", invocation.getContext("X-B3-traceId")); } @Test @@ -212,32 +174,14 @@ public class TestHighwayCodec { Assert.assertTrue(status); } - @Test - public void testReadRequestHeader() { - // TODO : WK unit test - // boolean status = true; -// try { -// new MockUp<NotWrapSchema>() { -// @Mock -// public Object readObject(Input input) throws IOException { -// return new RequestHeader(); -// } -// }; -// bodyBuffer = Buffer.buffer("\"abc\""); -// RequestHeader requestHeader = HighwayCodec.readRequestHeader(bodyBuffer); -// Assert.assertNotNull(requestHeader); -// Assert.assertEquals(0, requestHeader.getFlags()); -// } catch (Exception e) { -// status = false; -// } -// Assert.assertTrue(status); - } - private void commonMock() { Mockito.when(operationProtobuf.getRequestRootSerializer()).thenReturn(requestSerializer); + Mockito.when(operationProtobuf.getRequestRootDeserializer()).thenReturn(requestRootDeserializer); Mockito.when(bodyBuffer.getByteBuf()).thenReturn(lByteBuf); + Mockito.when(bodyBuffer.getBytes()).thenReturn(new byte[0]); Mockito.when(lByteBuf.nioBuffer()).thenReturn(nioBuffer); Mockito.when(operationProtobuf.getOperationMeta()).thenReturn(operationMeta); Mockito.when(operationMeta.getSchemaMeta()).thenReturn(schemaMeta); + Mockito.when(schemaMeta.getMicroserviceMeta()).thenReturn(microserviceMeta); } }
