openvino/tests/e2e_tests/common/hook_utils.py

118 lines
3.9 KiB
Python

# Copyright (C) 2018-2024 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
from _pytest.python import Function
from . import config
from .config import bug_ids, components_ids, req_ids
from .logger import get_logger
from .marks import MarkGeneral, MarkRunType
logger = get_logger(__name__)
_current_test_run = ""
test_run_reporters = {}
def get_required_marker_ids_for_test_run():
required_marker_ids = []
if bug_ids is not None:
required_marker_ids.append(bug_ids)
if req_ids is not None:
required_marker_ids.append(req_ids)
if components_ids is not None:
required_marker_ids.append(components_ids)
if len(required_marker_ids) == 0:
return None
return required_marker_ids
def update_components(item):
components = item.get_closest_marker(MarkGeneral.COMPONENTS.mark)
if components is not None:
current_components = next(
(component for component in item.own_markers if component.name == MarkGeneral.COMPONENTS.mark), None)
if current_components is None:
item.own_markers.append(components)
def update_markers(item, test_type, markers, marker_type):
marker = item.get_closest_marker(marker_type)
if marker is not None:
if test_type not in markers:
markers[test_type] = set()
markers[test_type].update(set(marker.args))
def deselect_items(items, config, deselected):
config.hook.pytest_deselected(items=deselected)
for item in deselected:
test_name = item.parent.nodeid
# nodeid comes in a way:
# 1) test.py::TestClass::()
# 2) test.py::
if test_name[-2:] == "()":
test_name = test_name[:-2]
else:
test_name += "::"
test_name += item.name
logger.info("Deselecting test: " + test_name)
items.remove(item)
def deselect(item, test_type, required_marker_ids):
if isinstance(item, Function):
if test_type is None:
logger.warning(f"Test type for item={item} is None")
return True
if required_marker_ids is not None:
for marker_id in required_marker_ids:
if _is_test_marker_id_is_matched_with_id(item, marker_id):
return False
return True
else:
if _test_deselected(item):
return True
return False
def _test_deselected(item):
result = any([
MarkRunType.get_test_type_mark(item) == MarkRunType.TEST_MARK_ON_COMMIT and not config.run_on_commit_tests,
MarkRunType.get_test_type_mark(item) == MarkRunType.TEST_MARK_REGRESSION and not config.run_regression_tests,
MarkRunType.get_test_type_mark(item) == MarkRunType.TEST_MARK_ENABLING and not config.run_enabling_tests,
])
return result
def _is_test_marker_id_is_matched_with_id(test, id_to_check: str):
for marker in test.own_markers:
if marker.name is MarkGeneral.BUGS.value or marker.name is MarkGeneral.REQIDS.value or \
marker.name is MarkGeneral.COMPONENTS.value:
marker_arg = marker.args[0]
if isinstance(marker_arg, dict):
for param in marker_arg:
if param is None:
if id_to_check in str(marker_arg.values):
return True
else:
if param in test.name:
if id_to_check in str(marker_arg.values()):
return True
elif isinstance(marker_arg, str):
if id_to_check in marker_arg:
return True
else:
raise RuntimeError(f"Test {test.name} do not have mark in correct form. Form: {type(marker_arg)} ")
return False
def _get_current_test_run():
return _current_test_run
def _set_current_test_run(test_run):
_current_test_run = test_run
return _current_test_run