summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2022-04-10 14:14:29 +0200
committerjonmv <venstad@gmail.com>2022-04-11 13:42:26 +0200
commitf07071f1113b9fdbe323f584f51d20e9d40c9f4a (patch)
tree2ed830b6460f4a603647559afff7bf755bbc668e /controller-server
parente4e448abbf8611f189a90e1ccc1348783005e983 (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.java52
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)));