X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=test%2Fcommon%2Fcompare_json.py;h=44477d9e80b58551b3bad86660c2771f8597ca05;hb=f81090f8f5f1fd1a76bb9feab1f41f03252297c3;hp=7110f4808d616c35c2ec5cd9438db5c4d95f2c13;hpb=7a7a13a47eeebf9a61fa84d14af59b1cbe1598bc;p=nonrtric.git diff --git a/test/common/compare_json.py b/test/common/compare_json.py index 7110f480..44477d9e 100644 --- a/test/common/compare_json.py +++ b/test/common/compare_json.py @@ -15,50 +15,97 @@ # ============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)