diff options
author | jonmv <venstad@gmail.com> | 2022-04-10 14:14:29 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-04-11 13:42:26 +0200 |
commit | f07071f1113b9fdbe323f584f51d20e9d40c9f4a (patch) | |
tree | 2ed830b6460f4a603647559afff7bf755bbc668e /controller-server | |
parent | e4e448abbf8611f189a90e1ccc1348783005e983 (diff) |
Compare JSON structured, and allow writing expected data
Diffstat (limited to 'controller-server')
-rw-r--r-- | controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerTester.java | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerTester.java index ca27e9d23cd..467a69c05f4 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ContainerTester.java @@ -9,6 +9,9 @@ import com.yahoo.config.provision.ApplicationName; import com.yahoo.container.http.filter.FilterChainRepository; import com.yahoo.jdisc.http.filter.SecurityRequestFilter; import com.yahoo.jdisc.http.filter.SecurityRequestFilterChain; +import com.yahoo.slime.JsonFormat; +import com.yahoo.slime.JsonParseException; +import com.yahoo.slime.SlimeUtils; import com.yahoo.test.json.JsonTestHelper; import com.yahoo.vespa.athenz.api.AthenzDomain; import com.yahoo.vespa.athenz.api.AthenzIdentity; @@ -19,6 +22,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.athenz.AthenzClientFact import com.yahoo.vespa.hosted.controller.integration.ServiceRegistryMock; import org.junit.ComparisonFailure; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; @@ -30,7 +34,9 @@ import java.util.Optional; import java.util.function.Supplier; import java.util.regex.Pattern; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; /** * Provides testing of JSON container responses @@ -39,6 +45,9 @@ import static org.junit.Assert.assertEquals; */ public class ContainerTester { + private static final boolean writeResponses = true; + + private final JDisc container; private final String responseFilePath; @@ -97,34 +106,33 @@ public class ContainerTester { private void assertResponse(Request request, File responseFile, int expectedStatusCode, boolean removeWhitespace, boolean compareJson) { String expectedResponse = readTestFile(responseFile.toString()); expectedResponse = include(expectedResponse); - if (removeWhitespace) expectedResponse = expectedResponse.replaceAll("(\"[^\"]*\")|\\s*", "$1"); // Remove whitespace FilterResult filterResult = invokeSecurityFilters(request); request = filterResult.request; Response response = filterResult.response != null ? filterResult.response : container.handleRequest(request); String responseString; try { responseString = response.getBodyAsString(); - } catch (CharacterCodingException e) { + } + catch (CharacterCodingException e) { throw new UncheckedIOException(e); } - if (expectedResponse.contains("(ignore)")) { - // Convert expected response to a literal pattern and replace any ignored field with a pattern that matches - // until the first stop character - String stopCharacters = "[^,:\\\\[\\\\]{}]"; - String expectedResponsePattern = Pattern.quote(expectedResponse) - .replaceAll("\"?\\(ignore\\)\"?", "\\\\E" + - stopCharacters + "*\\\\Q"); - if (!Pattern.matches(expectedResponsePattern, responseString)) { - throw new ComparisonFailure(responseFile + " (with ignored fields)", - expectedResponsePattern, responseString); + try { + if (responseFilePath.endsWith(".json")) { + ByteArrayOutputStream expected = new ByteArrayOutputStream(); + ByteArrayOutputStream actual = new ByteArrayOutputStream(); + new JsonFormat(false).encode(expected, SlimeUtils.jsonToSlimeOrThrow(expectedResponse)); + new JsonFormat(false).encode(actual, SlimeUtils.jsonToSlimeOrThrow(responseString)); + if (writeResponses) writeTestFile(responseFilePath, expected.toByteArray()); + else assertEquals(expected.toString(UTF_8), actual.toString(UTF_8)); } - } else { - if (compareJson) { - JsonTestHelper.assertJsonEquals(expectedResponse, responseString); - } else { - assertEquals(responseFile.toString(), expectedResponse, responseString); + else{ // Not JSON? Let's do a verbatim comparison, then ... + if (writeResponses) writeTestFile(responseFilePath, expectedResponse.getBytes(UTF_8)); + else assertEquals(expectedResponse, responseString); } } + catch (IOException e) { + fail("failed writing JSON: " + e); + } assertEquals("Status code", expectedStatusCode, response.getStatus()); } @@ -142,7 +150,7 @@ public class ContainerTester { public void assertResponse(Supplier<Request> request, String expectedResponse, int expectedStatusCode) { assertResponse(request, - (response) -> assertEquals(expectedResponse, new String(response.getBody(), StandardCharsets.UTF_8)), + (response) -> assertEquals(expectedResponse, new String(response.getBody(), UTF_8)), expectedStatusCode); } @@ -193,6 +201,14 @@ public class ContainerTester { return prefix + includedContent + postFix; } + private String writeTestFile(String name, byte[] content) { + try { + Files.write(Paths.get(responseFilePath, name), content); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + private String readTestFile(String name) { try { return new String(Files.readAllBytes(Paths.get(responseFilePath, name))); |