openvino/docs/scripts/tests/conftest.py

140 lines
4.9 KiB
Python

# Copyright (C) 2018-2024 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
"""
Configuration for tests.
Tests for documentation utilize pytest test framework for tests execution
and reports generation.
Documentation generation tests process Doxygen/Sphinx log to generate test
per documentation source file (.hpp, .md, etc. files). Source files
with errors can be skipped (--skip) or excluded temporary (--xfail).
"""
import pytest
from utils.log import LogParser
def pytest_addoption(parser):
""" Define extra options for pytest options
"""
parser.addoption('--doxygen', help='Doxygen log path to run tests for')
parser.addoption('--sphinx', help='Sphinx log path to run tests for')
parser.addoption(
'--doxygen-strip',
default='tmp_docs/',
help='Path to strip from paths found in doxygen log')
parser.addoption(
'--sphinx-strip',
default='tmp_docs/',
help='Path to strip from paths found in sphinx log')
parser.addoption(
'--suppress-warnings',
action='append',
default=[],
help='A list of warning patterns to suppress')
parser.addoption(
'--xfail',
action='append',
default=[],
help='A file with relative paths to a files with known failures')
parser.addoption(
'--skip',
action='append',
default=[],
help='A file with relative paths to a files to exclude from validation')
parser.addoption(
'--include_omz',
action="store_true",
default=False,
help='Include link check for omz docs')
parser.addoption(
'--include_ovms',
action="store_true",
default=False,
help='Include link check for ovms')
def read_lists(configs):
"""Read lines from files from configs. Return unique items.
"""
files = set()
for config_path in configs:
try:
with open(config_path, 'r', encoding='utf-8') as config:
files.update(map(str.strip, config.readlines()))
except OSError:
pass
return list(files)
def pytest_generate_tests(metafunc):
""" Generate tests depending on command line options
"""
exclude_links = {'open_model_zoo', 'omz', 'ovms'}
if metafunc.config.getoption('include_omz'):
exclude_links.remove('open_model_zoo')
exclude_links.remove('omz')
if metafunc.config.getoption('include_ovms'):
exclude_links.remove('ovms')
# warnings to ignore
suppress_warnings = read_lists(metafunc.config.getoption('suppress_warnings'))
for link in exclude_links:
doxy_ref_pattern = "unable to resolve reference to '{}".format(link)
sphinx_ref_pattern = "toctree contains reference to nonexisting document '{}".format(link)
sphinx_ref_pattern2 = "unknown document: {}".format(link)
suppress_warnings.append(doxy_ref_pattern)
suppress_warnings.append(sphinx_ref_pattern)
suppress_warnings.append(sphinx_ref_pattern2)
xfail_list = [xfail.lower() for xfail in read_lists(metafunc.config.getoption('xfail'))]
all_warnings = dict()
# read doxygen log
if metafunc.config.getoption('doxygen'):
doxy_parser = LogParser(metafunc.config.getoption('doxygen'),
strip=metafunc.config.getoption('doxygen_strip'),
xfail_list=xfail_list,
suppress_warnings=suppress_warnings)
doxy_parser.parse()
doxygen_warnings = doxy_parser.filter()
all_warnings.update(doxygen_warnings)
# read sphinx log
sphinx_parser = LogParser(metafunc.config.getoption('sphinx'),
strip=metafunc.config.getoption('sphinx_strip'),
xfail_list=xfail_list,
suppress_warnings=suppress_warnings
)
sphinx_parser.parse()
sphinx_warnings = sphinx_parser.filter()
all_warnings.update(sphinx_warnings)
filtered_keys = []
for file_path, warnings in all_warnings.items():
for warning in warnings:
if not any([repo in warning for repo in exclude_links]):
filtered_keys.append(file_path)
files_with_errors = {key: all_warnings[key] for key in filtered_keys}
# read mute lists
marks = dict()
marks.update(
(name, pytest.mark.xfail)
for name in read_lists(metafunc.config.getoption('xfail')))
marks.update(
(name, pytest.mark.skip)
for name in read_lists(metafunc.config.getoption('skip')))
# generate tests
if 'errors' in metafunc.fixturenames:
metafunc.parametrize(
'errors', [
pytest.param(errors, marks=marks[file])
if file in marks else errors for file, errors in files_with_errors.items()
],
ids=list(files_with_errors.keys()))