Fix documentation
[nonrtric.git] / test / common / compare_json.py
index 7110f48..44477d9 100644 (file)
 #  ============LICENSE_END=================================================
 #
 
+# This script compare two jsons for eqaulity, taken into account that the parameter values
+# marked with '????' are not checked (only the parameter name need to exist)
+# Example of target json with '????'
+# [
+#   {
+#     "callbackUrl": "????",
+#     "keepAliveIntervalSeconds": "????",
+#     "serviceName": "serv2",
+#     "timeSinceLastActivitySeconds": "????"
+#   },
+#   {
+#     "callbackUrl": "????",
+#     "keepAliveIntervalSeconds": "????",
+#     "serviceName": "serv1",
+#     "timeSinceLastActivitySeconds": "????"
+#   }
+#]
+
+
 import os
 import json
 import sys
 
-# Deep compare of two json obects
-# If a parameter value in the target json is set to '????' then the result json value is not checked for the that parameter
-# Any included json array will be sorted before comparison
-# An optional array key can be given to sort array of objects containing that key
+# # Helper function to compare two json list.
+# # Returns true for equal, false for not equal
+def compare_json_list(list1, list2):
+    if (list1.__len__() != list2.__len__()):
+        return False
 
-def comparejson(jsonTarget,jsonResult,arrayKey):
+    for l in list1:
+        found = False
+        for m in list2:
+            res = compare_json_obj(l, m)
+            if (res):
+                found = True
+                break
 
-    if isinstance(jsonTarget, dict):
-        if (len(jsonTarget) != len(jsonResult)):
-            return 1
-        for key in jsonTarget.keys():
-            if (jsonResult.get(key) is None):
-                return 1
-            if (comparejson(jsonTarget.get(key), jsonResult.get(key), arrayKey) != 0):
-                return 1
-    elif isinstance(jsonTarget, list):
-        if (len(jsonTarget) != len(jsonResult)):
-            return 1
-        if (arrayKey is None):
-            jsonTarget.sort()
-            jsonResult.sort()
-        else:
-            jsonTarget.sort(key=lambda k: k[arrayKey])
-            jsonResult.sort(key=lambda k: k[arrayKey])
+        if (not found):
+            return False
 
-        for i in range(len(jsonTarget)):
-            if (comparejson(jsonTarget[i], jsonResult[i], arrayKey) != 0):
-                return 1
+    return True
+
+# Deep compare of two json obects
+# If a parameter value in the target json is set to '????' then the result json value is not checked for the that parameter
+# Return true for equal json, false for not equal json
+def compare_json_obj(obj1, obj2):
+    if isinstance(obj1, list):
+        if (not isinstance(obj2, list)):
+            return False
+        return compare_json_list(obj1, obj2)
+    elif (isinstance(obj1, dict)):
+        if (not isinstance(obj2, dict)):
+            return False
+        exp = set(obj2.keys()) == set(obj1.keys())
+        if (not exp):
+            return False
+        for k in obj1.keys():
+            val1 = obj1.get(k)
+            val2 = obj2.get(k)
+            if isinstance(val1, list):
+                if (not compare_json_list(val1, val2)):
+                    return False
+            elif isinstance(val1, dict):
+                if (not compare_json_obj(val1, val2)):
+                    return False
+            else:
+                #Do not check parameter values marked with '????'
+                if ((val1 != "????") and (val2 != val1)) and ((val2 != "????") and (val2 != val1)):
+                    return False
     else:
-        if (jsonTarget != "????") and (jsonTarget != jsonResult):
-            return 1
-    return 0
+        return obj1 == obj2
+
+    return True
+
 
 try:
+    #Read the input file and compare the two json (target->result)
     jsonTarget = json.loads(sys.argv[1])
     jsonResult = json.loads(sys.argv[2])
-    arrayKey = None
-    if (len(sys.argv) > 3):
-        arrayKey = sys.argv[3]
-    print(comparejson(jsonTarget,jsonResult,arrayKey))
+    res1=compare_json_obj(jsonTarget, jsonResult)
+
+    #Read the json again (in case the previous calls has re-arranged the jsons)
+    jsonTarget = json.loads(sys.argv[1])
+    jsonResult = json.loads(sys.argv[2])
+    #Compare the opposite order (result->target) to catch special duplicate json key cases
+    res2=compare_json_obj(jsonResult, jsonTarget)
+
+    if (res1 and res2):
+        print (0)
+    else:
+        print (1)
 
 except Exception as e:
     print (1)