Added IPV6 support and support for https
[sim/a1-interface.git] / near-rt-ric-simulator / test / common / compare_json.py
index 53bddb1..5766622 100644 (file)
 #  ============LICENSE_END=================================================
 #
 
-# 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 that parameter
-# Any included json array will be sorted before comparison
+# 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 sys
+
+import os
 import json
+import sys
+
+# # 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 compare_json(jsonTarget,jsonResult):
+    for l in list1:
+        found = False
+        for m in list2:
+            res = compare_json(l, m)
+            if (res):
+                found = True
+                break
 
+        if (not found):
+            return False
 
-    if isinstance(jsonTarget, dict):
-        if (len(jsonTarget) != len(jsonResult)):
-            return 1
-        for key in jsonTarget.keys():
-            if (jsonResult.get(key) is None):
-                return 1
-            res=compare_json(jsonTarget.get(key), jsonResult.get(key))
-            if (res != 0):
-                return 1
-    elif isinstance(jsonTarget, list):
-        if (len(jsonTarget) != len(jsonResult)):
-            return 1
-        jsonTarget.sort()
-        jsonResult.sort()
-        for i in range(len(jsonTarget)):
-            res=compare_json(jsonTarget[i], jsonResult[i])
-            if (res != 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(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(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])
+    res1=compare_json(jsonTarget, jsonResult)
 
-    print(compare_json(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(jsonResult, jsonTarget)
+
+    if (res1 and res2):
+        print (0)
+    else:
+        print (1)
 
 except Exception as e:
     print (1)
-sys.exit()
-
-
-
-
-
+sys.exit()
\ No newline at end of file