diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-03-06 13:13:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-06 13:13:44 +0100 |
commit | 15b30e6df3fbc615178b28f4531f065c8fa10694 (patch) | |
tree | ec78a06a8c096df41418f2750662901c8e711518 | |
parent | c226dccd4f2ddf4ce8c2add4a113a177188d2fee (diff) | |
parent | 976c7b88052cb1142ca5c8a1cebdf498f4fb4b95 (diff) |
Merge pull request #5222 from vespa-engine/mpolden/simplify-test-code
Simplify testing of responses with ignored fields
3 files changed, 21 insertions, 73 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 c3dc80c65df..b36fd41e56d 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 @@ -4,29 +4,21 @@ package com.yahoo.vespa.hosted.controller.restapi; import com.yahoo.application.container.JDisc; import com.yahoo.application.container.handler.Request; import com.yahoo.application.container.handler.Response; -import com.yahoo.collections.Pair; import com.yahoo.component.ComponentSpecification; import com.yahoo.component.Version; import com.yahoo.container.http.filter.FilterChainRepository; import com.yahoo.io.IOUtils; import com.yahoo.jdisc.http.filter.SecurityRequestFilter; import com.yahoo.jdisc.http.filter.SecurityRequestFilterChain; -import com.yahoo.slime.ArrayTraverser; -import com.yahoo.slime.Inspector; -import com.yahoo.slime.Slime; -import com.yahoo.vespa.config.SlimeUtils; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.versions.VersionStatus; +import org.junit.ComparisonFailure; import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.function.Supplier; +import java.util.regex.Pattern; import static org.junit.Assert.assertEquals; @@ -74,19 +66,24 @@ public class ContainerTester { public void assertResponse(Request request, File responseFile, int expectedStatusCode) throws IOException { String expectedResponse = IOUtils.readFile(new File(responseFilePath + responseFile.toString())); expectedResponse = include(expectedResponse); + expectedResponse = expectedResponse.replaceAll("(\"[^\"]*\")|\\s*", "$1"); // Remove whitespace FilterResult filterResult = invokeSecurityFilters(request); request = filterResult.request; Response response = filterResult.response != null ? filterResult.response : container.handleRequest(request); - Slime expectedSlime = SlimeUtils.jsonToSlime(expectedResponse.getBytes(StandardCharsets.UTF_8)); - Set<String> fieldsToCensor = fieldsToCensor(null, expectedSlime.get(), new HashSet<>()); - Slime responseSlime = SlimeUtils.jsonToSlime(response.getBody()); - List<Pair<String,String>> replaceStrings = new ArrayList<>(); - buildReplaceStrings(null, responseSlime.get(), fieldsToCensor, replaceStrings); - - String body = response.getBodyAsString(); - assertEquals("Status code. Response body was: " + body, expectedStatusCode, response.getStatus()); - assertEquals(responseFile.toString(), new String(SlimeUtils.toJsonBytes(expectedSlime), StandardCharsets.UTF_8), - replace(new String(SlimeUtils.toJsonBytes(responseSlime), StandardCharsets.UTF_8), replaceStrings)); + String responseString = response.getBodyAsString(); + if (expectedResponse.contains("(ignore)")) { + // Convert expected response to a literal pattern and replace any ignored field with a pattern that matches + // anything + String expectedResponsePattern = Pattern.quote(expectedResponse) + .replaceAll("\"?\\(ignore\\)\"?", "\\\\E.*\\\\Q"); + if (!Pattern.matches(expectedResponsePattern, responseString)) { + throw new ComparisonFailure(responseFile.toString() + " (with ignored fields)", + expectedResponsePattern, responseString); + } + } else { + assertEquals(responseFile.toString(), expectedResponse, responseString); + } + assertEquals("Status code", expectedStatusCode, response.getStatus()); } public void assertResponse(Supplier<Request> request, String expectedResponse) throws IOException { @@ -127,53 +124,6 @@ public class ContainerTester { return new FilterResult(request, null); } - private Set<String> fieldsToCensor(String fieldNameOrNull, Inspector value, Set<String> fieldsToCensor) { - switch (value.type()) { - case ARRAY: value.traverse((ArrayTraverser)(int index, Inspector element) -> fieldsToCensor(null, element, fieldsToCensor)); break; - case OBJECT: value.traverse((String fieldName, Inspector fieldValue) -> fieldsToCensor(fieldName, fieldValue, fieldsToCensor)); break; - case STRING: if (fieldNameOrNull != null && "(ignore)".equals(value.asString())) fieldsToCensor.add(fieldNameOrNull); break; - } - return fieldsToCensor; - } - - private void buildReplaceStrings(String fieldNameOrNull, Inspector value, Set<String> fieldsToCensor, - List<Pair<String,String>> replaceStrings) { - switch (value.type()) { - case ARRAY: value.traverse((ArrayTraverser)(int index, Inspector element) -> buildReplaceStrings(null, element, fieldsToCensor, replaceStrings)); break; - case OBJECT: value.traverse((String fieldName, Inspector fieldValue) -> buildReplaceStrings(fieldName, fieldValue, fieldsToCensor, replaceStrings)); break; - default: replaceString(fieldNameOrNull, value, fieldsToCensor, replaceStrings); - } - } - - private void replaceString(String fieldName, Inspector fieldValue, - Set<String> fieldsToCensor, List<Pair<String,String>> replaceStrings) { - if (fieldName == null) return; - if ( ! fieldsToCensor.contains(fieldName)) return; - - String fromString; - switch (fieldValue.type()) { - case STRING: - fromString = "\"" + fieldName + "\":\"" + fieldValue.asString() + "\""; - break; - case LONG: - fromString = "\"" + fieldName + "\":" + fieldValue.asLong(); - break; - case BOOL: - fromString = "\"" + fieldName + "\":" + fieldValue.asBool(); - break; - default: - throw new IllegalArgumentException("Can only censor strings, longs and booleans"); - } - String toString = "\"" + fieldName + "\":\"(ignore)\""; - replaceStrings.add(new Pair<>(fromString, toString)); - } - - private String replace(String json, List<Pair<String,String>> replaceStrings) { - for (Pair<String,String> replaceString : replaceStrings) - json = json.replace(replaceString.getFirst(), replaceString.getSecond()); - return json; - } - /** Replaces @include(localFile) with the content of the file */ private String include(String response) throws IOException { // Please don't look at this code diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java index 19ded95a764..49aeb334380 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java @@ -123,10 +123,6 @@ public class ControllerContainerTest { return addIdentityToRequest(new Request(uri), USER); } - protected static Request authenticatedRequest(String uri, String body, Request.Method method) { - return addIdentityToRequest(new Request(uri, body, method), USER); - } - protected static Request authenticatedRequest(String uri, byte[] body, Request.Method method) { return addIdentityToRequest(new Request(uri, body, method), USER); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index 0e9e3464c02..9a0856f5afa 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -583,11 +583,13 @@ public class RestApiTest { private void assertFile(Request request, String responseFile) throws IOException { String expectedResponse = IOUtils.readFile(new File(responsesPath + responseFile)); expectedResponse = include(expectedResponse); - expectedResponse = expectedResponse.replaceAll("\\s", ""); + expectedResponse = expectedResponse.replaceAll("(\"[^\"]*\")|\\s*", "$1"); // Remove whitespace String responseString = container.handleRequest(request).getBodyAsString(); if (expectedResponse.contains("(ignore)")) { + // Convert expected response to a literal pattern and replace any ignored field with a pattern that matches + // anything String expectedResponsePattern = Pattern.quote(expectedResponse) - .replaceAll("\\(ignore\\)", "\\\\E.*\\\\Q"); + .replaceAll("\"?\\(ignore\\)\"?", "\\\\E.*\\\\Q"); if (!Pattern.matches(expectedResponsePattern, responseString)) { throw new ComparisonFailure(responseFile + " (with ignored fields)", expectedResponsePattern, responseString); |