You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2021/03/26 11:10:45 UTC

[asterixdb] 02/09: [NO ISSUE][TEST] Add flag to ignore extra regexjson fields

This is an automated email from the ASF dual-hosted git repository.

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit 62bdc7ecf11e9a3fe1f6264f0f83012aa4b90ba3
Author: Michael Blow <mb...@apache.org>
AuthorDate: Tue Mar 9 11:05:56 2021 -0500

    [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 <mb...@apache.org>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
---
 .../asterix/test/common/ComparisonException.java   |  4 ++++
 .../apache/asterix/test/common/TestExecutor.java   | 21 +++++++++++++++------
 .../org/apache/asterix/test/common/TestHelper.java | 22 ++++++++++++----------
 .../asterix/test/runtime/SqlppRQGTestBase.java     |  2 +-
 4 files changed, 32 insertions(+), 17 deletions(-)

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 class ComparisonException extends Exception {
     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 @@ public class TestExecutor {
     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 @@ public class TestExecutor {
                 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 @@ public class TestExecutor {
     }
 
     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 @@ public class TestExecutor {
         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 @@ public final class TestHelper {
         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 @@ public final class TestHelper {
             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 @@ public final class TestHelper {
             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 @@ public final class TestHelper {
         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 @@ public final class TestHelper {
         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 @@ public abstract class SqlppRQGTestBase {
                     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);