Merge branch 'fix_chrome'
This commit is contained in:
@@ -298,34 +298,84 @@ def check_json(result: str, rules: Dict[str, List[Dict[str, Union[List[str], str
|
||||
"""
|
||||
|
||||
if result is None:
|
||||
logger.warning("Result file path is None, returning 0.0")
|
||||
return 0.
|
||||
|
||||
# Check if file exists
|
||||
if not os.path.exists(result):
|
||||
logger.warning(f"Result file does not exist: {result}, returning 0.0")
|
||||
return 0.
|
||||
|
||||
try:
|
||||
with open(result, 'r', encoding='utf-8') as f:
|
||||
if is_yaml:
|
||||
try:
|
||||
# Use SafeLoader instead of Loader for better security and error handling
|
||||
result_data: Dict[str, Any] = yaml.safe_load(f)
|
||||
if result_data is None:
|
||||
logger.warning(f"YAML file {result} is empty or contains only null values, returning 0.0")
|
||||
return 0.
|
||||
except yaml.YAMLError as e:
|
||||
logger.error(f"YAML parsing error in file {result}: {e}")
|
||||
logger.error(f"File content might be corrupted or have invalid YAML syntax")
|
||||
return 0.
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error parsing YAML file {result}: {e}")
|
||||
return 0.
|
||||
else:
|
||||
try:
|
||||
result_data: Dict[str, Any] = json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
logger.error(f"JSON parsing error in file {result}: {e}")
|
||||
return 0.
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error parsing JSON file {result}: {e}")
|
||||
return 0.
|
||||
except IOError as e:
|
||||
logger.error(f"IO error reading file {result}: {e}")
|
||||
return 0.
|
||||
except Exception as e:
|
||||
logger.error(f"Unexpected error reading file {result}: {e}")
|
||||
return 0.
|
||||
with open(result) as f:
|
||||
if is_yaml:
|
||||
result: Dict[str, Any] = yaml.load(f, Loader=yaml.Loader)
|
||||
else:
|
||||
result: Dict[str, Any] = json.load(f)
|
||||
|
||||
expect_rules = rules.get("expect", {})
|
||||
unexpect_rules = rules.get("unexpect", {})
|
||||
|
||||
metric = True
|
||||
for r in expect_rules:
|
||||
value = result
|
||||
for k in r["key"]:
|
||||
try:
|
||||
value = value[k]
|
||||
except KeyError:
|
||||
return 0.
|
||||
metric = metric and _match_value_to_rule(value, r)
|
||||
value = result_data
|
||||
try:
|
||||
for k in r["key"]:
|
||||
try:
|
||||
value = value[k]
|
||||
except KeyError:
|
||||
logger.debug(f"Key '{k}' not found in result data, returning 0.0")
|
||||
return 0.
|
||||
except TypeError:
|
||||
logger.debug(f"Cannot access key '{k}' - value is not a dictionary, returning 0.0")
|
||||
return 0.
|
||||
metric = metric and _match_value_to_rule(value, r)
|
||||
except Exception as e:
|
||||
logger.error(f"Error processing expect rule {r}: {e}")
|
||||
return 0.
|
||||
|
||||
for r in unexpect_rules:
|
||||
value = result
|
||||
for k in r["key"]:
|
||||
try:
|
||||
value = value[k]
|
||||
except KeyError:
|
||||
value = None
|
||||
break
|
||||
metric = metric and not _match_value_to_rule(value, r)
|
||||
value = result_data
|
||||
try:
|
||||
for k in r["key"]:
|
||||
try:
|
||||
value = value[k]
|
||||
except KeyError:
|
||||
value = None
|
||||
break
|
||||
except TypeError:
|
||||
value = None
|
||||
break
|
||||
metric = metric and not _match_value_to_rule(value, r)
|
||||
except Exception as e:
|
||||
logger.error(f"Error processing unexpect rule {r}: {e}")
|
||||
return 0.
|
||||
|
||||
return float(metric)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user