From 098e62878cb91aa6cd960d57cace1ae4dfd73b89 Mon Sep 17 00:00:00 2001 From: Man Zhang Date: Wed, 28 May 2025 10:32:43 +0800 Subject: [PATCH 1/2] it is able to handle error json input --- .../rpc/schema/params/NamedTypedValue.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/client-java/controller/src/main/java/org/evomaster/client/java/controller/problem/rpc/schema/params/NamedTypedValue.java b/client-java/controller/src/main/java/org/evomaster/client/java/controller/problem/rpc/schema/params/NamedTypedValue.java index 665805474f..25477c3437 100644 --- a/client-java/controller/src/main/java/org/evomaster/client/java/controller/problem/rpc/schema/params/NamedTypedValue.java +++ b/client-java/controller/src/main/java/org/evomaster/client/java/controller/problem/rpc/schema/params/NamedTypedValue.java @@ -1,11 +1,13 @@ package org.evomaster.client.java.controller.problem.rpc.schema.params; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.evomaster.client.java.controller.api.dto.problem.rpc.ParamDto; import org.evomaster.client.java.controller.problem.rpc.schema.types.AccessibleSchema; import org.evomaster.client.java.controller.problem.rpc.schema.types.PrimitiveOrWrapperType; import org.evomaster.client.java.controller.problem.rpc.schema.types.TypeSchema; +import org.evomaster.client.java.utils.SimpleLogger; import java.util.ArrayList; import java.util.List; @@ -21,6 +23,9 @@ public abstract class NamedTypedValue { protected final static ObjectMapper objectMaper = new ObjectMapper(); + protected final static ObjectMapper mapperAllowUnkownFields = new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + /** * name of the instance, eg param name */ @@ -225,7 +230,27 @@ else if (PrimitiveOrWrapperType.isPrimitiveOrTypes(json.getClass())){ } public Object parseValueWithJson(String json) throws JsonProcessingException { - return objectMaper.readValue(json, getType().getClazz()); + try{ + return objectMaper.readValue(json, getType().getClazz()); + }catch (JsonProcessingException e) { + /* + In the seeded tests of the industrial case study, there are cases where + unrecognized fields appear in the JSON input, such as: + { + "setType": true // Note: there is no corresponding 'setType' field in the target class + } + + To handle such cases while still capturing the error message, + attempt to parse the JSON again with a configuration that allows unknown fields. + */ + if (e.getMessage().contains("Unrecognized field")) { + SimpleLogger.recordErrorMessage( + String.format("Try once to fix issues in json: %s", e.getMessage())); + return mapperAllowUnkownFields.readValue(json, getType().getClazz()); + } + throw e; + } + } /** From 85e66b664ebf3f46e8c7b5b3cd8a967d97dbb63b Mon Sep 17 00:00:00 2001 From: Man Zhang Date: Wed, 28 May 2025 10:51:11 +0800 Subject: [PATCH 2/2] add a seeded test which has unknown field --- .../FakeMockObjectController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/e2e-tests/spring-rpc/spring-rpc-thrift/src/test/java/com/foo/rpc/examples/spring/fakemockobject/FakeMockObjectController.java b/e2e-tests/spring-rpc/spring-rpc-thrift/src/test/java/com/foo/rpc/examples/spring/fakemockobject/FakeMockObjectController.java index c5a074451e..66fa8f0f6a 100644 --- a/e2e-tests/spring-rpc/spring-rpc-thrift/src/test/java/com/foo/rpc/examples/spring/fakemockobject/FakeMockObjectController.java +++ b/e2e-tests/spring-rpc/spring-rpc-thrift/src/test/java/com/foo/rpc/examples/spring/fakemockobject/FakeMockObjectController.java @@ -181,7 +181,30 @@ public List seedRPCTests() { descriptiveInfo = "a scheduled task for invoking executeFlag"; }} ); + }}, + new SeededRPCTestDto() {{ + testName = "test_7"; + rpcFunctions = Arrays.asList( + new SeededRPCActionDto() {{ + interfaceName = FakeMockObjectService.Iface.class.getName(); + functionName = "getFooFromExternalService"; + inputParams = Arrays.asList("0"); + inputParamTypes = Arrays.asList(int.class.getName()); + mockRPCExternalServiceDtos = Arrays.asList( + new MockRPCExternalServiceDto() {{ + appKey = "fake.app"; + interfaceFullName = "com.foo.rpc.examples.spring.fakemockobject.external.fake.api.GetApiData"; + functionName = "one"; + responses = Arrays.asList("{\"exName\":\"abc\",\"exId\":0,\"exInfo\":[\"2025-05-28\"],\"unknownField\":\"unknown\"}"); + responseTypes = Arrays.asList( + "com.foo.rpc.examples.spring.fakemockobject.external.fake.api.ExApiDto" + ); + }} + ); + }} + ); }} + ); }