[NO ISSUE][TEST] Add flag to ignore extra regexjson fields
- If 'ignoreextrafields=true' is present in test file, extra fields in
the actual result are ignored
Change-Id: I78e89f174d50359565803e279a3bc917818d1a75
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/10443
Reviewed-by: Michael Blow <mblow@apache.org>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ComparisonException.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ComparisonException.java
index da5c8f6..cb437f0 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ComparisonException.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ComparisonException.java
@@ -24,4 +24,8 @@
public ComparisonException(String message) {
super(message);
}
+
+ public ComparisonException(String message, Throwable cause) {
+ super(message, cause);
+ }
}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index b8524c0..e1d81a4 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -163,6 +163,7 @@
private static final Pattern HANDLE_VARIABLE_PATTERN = Pattern.compile("handlevariable=(\\w+)");
private static final Pattern RESULT_VARIABLE_PATTERN = Pattern.compile("resultvariable=(\\w+)");
private static final Pattern COMPARE_UNORDERED_ARRAY_PATTERN = Pattern.compile("compareunorderedarray=(\\w+)");
+ private static final Pattern IGNORE_EXTRA_FIELDS_PATTERN = Pattern.compile("ignoreextrafields=(\\w+)");
private static final Pattern BODY_REF_PATTERN = Pattern.compile("bodyref=(.*)", Pattern.MULTILINE);
private static final Pattern MACRO_PARAM_PATTERN =
Pattern.compile("macro (?<name>[\\w-$]+)=(?<value>.*)", Pattern.MULTILINE);
@@ -291,8 +292,7 @@
runScriptAndCompareWithResultRegexAdm(scriptFile, readerExpected, readerActual);
return;
} else if (actualFile.toString().endsWith(".regexjson")) {
- boolean compareUnorderedArray = statement != null && getCompareUnorderedArray(statement);
- runScriptAndCompareWithResultRegexJson(scriptFile, readerExpected, readerActual, compareUnorderedArray);
+ runScriptAndCompareWithResultRegexJson(scriptFile, readerExpected, readerActual, statement);
return;
} else if (actualFile.toString().endsWith(".unorderedtxt")) {
runScriptAndCompareWithResultUnorderedLinesText(scriptFile, readerExpected, readerActual);
@@ -546,24 +546,28 @@
}
private static void runScriptAndCompareWithResultRegexJson(File scriptFile, BufferedReader readerExpected,
- BufferedReader readerActual, boolean compareUnorderedArray) throws ComparisonException, IOException {
+ BufferedReader readerActual, String statement) throws ComparisonException, IOException {
+
+ boolean compareUnorderedArray = statement != null && getCompareUnorderedArray(statement);
+ boolean ignoreExtraFields = statement != null && getIgnoreExtraFields(statement);
+
JsonNode expectedJson, actualJson;
try {
expectedJson = SINGLE_JSON_NODE_READER.readTree(readerExpected);
} catch (JsonProcessingException e) {
- throw new ComparisonException("Invalid expected JSON for: " + scriptFile);
+ throw new ComparisonException("Invalid expected JSON for: " + scriptFile, e);
}
try {
actualJson = SINGLE_JSON_NODE_READER.readTree(readerActual);
} catch (JsonProcessingException e) {
- throw new ComparisonException("Invalid actual JSON for: " + scriptFile);
+ throw new ComparisonException("Invalid actual JSON for: " + scriptFile, e);
}
if (expectedJson == null) {
throw new ComparisonException("No expected result for: " + scriptFile);
} else if (actualJson == null) {
throw new ComparisonException("No actual result for: " + scriptFile);
}
- if (!TestHelper.equalJson(expectedJson, actualJson, compareUnorderedArray)) {
+ if (!TestHelper.equalJson(expectedJson, actualJson, compareUnorderedArray, ignoreExtraFields)) {
throw new ComparisonException("Result for " + scriptFile + " didn't match the expected JSON"
+ "\nexpected result:\n" + expectedJson + "\nactual result:\n" + actualJson);
}
@@ -1756,6 +1760,11 @@
return matcher.find() && Boolean.parseBoolean(matcher.group(1));
}
+ protected static boolean getIgnoreExtraFields(String statement) {
+ final Matcher matcher = IGNORE_EXTRA_FIELDS_PATTERN.matcher(statement);
+ return matcher.find() && Boolean.parseBoolean(matcher.group(1));
+ }
+
protected static String replaceVarRef(String statement, Map<String, Object> variableCtx) {
String tmpStmt = statement;
Matcher variableReferenceMatcher = VARIABLE_REF_PATTERN.matcher(tmpStmt);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
index 137efdb..939acd3 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
@@ -141,7 +141,8 @@
return RequestParameters.deserializeParameterValues(RequestParameters.serializeParameterValues(stmtParams));
}
- public static boolean equalJson(JsonNode expectedJson, JsonNode actualJson, boolean compareUnorderedArray) {
+ public static boolean equalJson(JsonNode expectedJson, JsonNode actualJson, boolean compareUnorderedArray,
+ boolean ignoreExtraFields) {
if (expectedJson == actualJson) {
return true;
}
@@ -167,13 +168,14 @@
if (expectedArray.size() != actualArray.size()) {
return false;
}
- return compareUnorderedArray ? compareUnordered(expectedArray, actualArray)
- : compareOrdered(expectedArray, actualArray);
+ return compareUnorderedArray ? compareUnordered(expectedArray, actualArray, ignoreExtraFields)
+ : compareOrdered(expectedArray, actualArray, ignoreExtraFields);
} else if (expectedJson.isObject() && actualJson.isObject()) {
// assumes no duplicates in field names
ObjectNode expectedObject = (ObjectNode) expectedJson;
ObjectNode actualObject = (ObjectNode) actualJson;
- if (expectedObject.size() != actualObject.size()) {
+ if (!ignoreExtraFields && expectedObject.size() != actualObject.size()
+ || (ignoreExtraFields && expectedObject.size() > actualObject.size())) {
return false;
}
Iterator<Map.Entry<String, JsonNode>> expectedFields = expectedObject.fields();
@@ -182,8 +184,8 @@
while (expectedFields.hasNext()) {
expectedField = expectedFields.next();
actualFieldValue = actualObject.get(expectedField.getKey());
- if (actualFieldValue == null
- || !equalJson(expectedField.getValue(), actualFieldValue, compareUnorderedArray)) {
+ if (actualFieldValue == null || !equalJson(expectedField.getValue(), actualFieldValue,
+ compareUnorderedArray, ignoreExtraFields)) {
return false;
}
}
@@ -195,13 +197,13 @@
return expectedAsString.equals(actualAsString);
}
- private static boolean compareUnordered(ArrayNode expectedArray, ArrayNode actualArray) {
+ private static boolean compareUnordered(ArrayNode expectedArray, ArrayNode actualArray, boolean ignoreExtraFields) {
BitSet alreadyMatched = new BitSet(actualArray.size());
for (int i = 0; i < expectedArray.size(); i++) {
boolean found = false;
JsonNode expectedElement = expectedArray.get(i);
for (int k = 0; k < actualArray.size(); k++) {
- if (!alreadyMatched.get(k) && equalJson(expectedElement, actualArray.get(k), true)) {
+ if (!alreadyMatched.get(k) && equalJson(expectedElement, actualArray.get(k), true, ignoreExtraFields)) {
alreadyMatched.set(k);
found = true;
break;
@@ -214,9 +216,9 @@
return true;
}
- private static boolean compareOrdered(ArrayNode expectedArray, ArrayNode actualArray) {
+ private static boolean compareOrdered(ArrayNode expectedArray, ArrayNode actualArray, boolean ignoreExtraFields) {
for (int i = 0, size = expectedArray.size(); i < size; i++) {
- if (!equalJson(expectedArray.get(i), actualArray.get(i), false)) {
+ if (!equalJson(expectedArray.get(i), actualArray.get(i), false, ignoreExtraFields)) {
return false;
}
}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppRQGTestBase.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppRQGTestBase.java
index 0c13cdf..c03d23b 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppRQGTestBase.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppRQGTestBase.java
@@ -164,7 +164,7 @@
ResultExtractor.extract(resultStream, StandardCharsets.UTF_8, TestCaseContext.OutputFormat.ADM));
}
- boolean eq = TestHelper.equalJson(sqlResult, sqlppResult, false);
+ boolean eq = TestHelper.equalJson(sqlResult, sqlppResult, false, false);
File sqlResultFile = writeResult(sqlResult, testcaseId, "sql", testcaseDescription);
File sqlppResultFile = writeResult(sqlppResult, testcaseId, "sqlpp", testcaseDescription);