freeipa/ipatests/test_ipatests_plugins/test_ipa_run_tests.py
Stanislav Levin 902821e8aa ipatests: Allow zero-length arguments
Currently, such arguments are eaten by 'ipa-run-tests' script as they
are not quoted.

For example, running ipa-run-tests -k ''
results in the actual invocation would be like as:
['/bin/sh',
 '--norc',
 '--noprofile',
 '-c',
 '--',
 "/usr/bin/python3 -c 'import sys,pytest;sys.exit(pytest.main())' -o "
 'cache_dir=/tmp/pytest-of-root/pytest-12/test_ipa_run_tests_empty_expression0/.pytest_cache '
 '--confcutdir=/usr/lib64/python3/site-packages/ipatests -k ']

Note: expressions or marks could be empty as a result of the building
of command line args by more high-level tools, scripts, etc.

So, a short-termed solution is the quotting of zero-length arguments.

Fixes: https://pagure.io/freeipa/issue/8173
Signed-off-by: Stanislav Levin <slev@altlinux.org>
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
2020-02-14 09:29:20 +02:00

177 lines
5.5 KiB
Python

#
# Copyright (C) 2019 FreeIPA Contributors see COPYING for license
#
import os
import pytest
MOD_NAME = "test_module_{}"
FUNC_NAME = "test_func_{}"
MODS_NUM = 5
@pytest.fixture
def ipatestdir(testdir, monkeypatch):
"""
Create MODS_NUM test modules within testdir/ipatests.
Each module contains 1 test function.
Patch PYTHONPATH with created package path to override the system's
ipatests
"""
ipatests_dir = testdir.mkpydir("ipatests")
for i in range(MODS_NUM):
ipatests_dir.join("{}.py".format(MOD_NAME.format(i))).write(
"def {}(): pass".format(FUNC_NAME.format(i)))
python_path = os.pathsep.join(
filter(None, [str(testdir.tmpdir), os.environ.get("PYTHONPATH", "")]))
monkeypatch.setenv("PYTHONPATH", python_path)
def run_ipa_tests(*args):
cmdargs = ["ipa-run-tests", "-v"] + list(args)
return testdir.run(*cmdargs, timeout=60)
testdir.run_ipa_tests = run_ipa_tests
return testdir
def test_ipa_run_tests_basic(ipatestdir):
"""
Run ipa-run-tests with default arguments
"""
result = ipatestdir.run_ipa_tests()
assert result.ret == 0
result.assert_outcomes(passed=MODS_NUM)
for mod_num in range(MODS_NUM):
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
def test_ipa_run_tests_glob1(ipatestdir):
"""
Run ipa-run-tests using glob patterns to collect tests
"""
result = ipatestdir.run_ipa_tests("{mod}".format(
mod="test_modul[!E]?[0-5]*"))
assert result.ret == 0
result.assert_outcomes(passed=MODS_NUM)
for mod_num in range(MODS_NUM):
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
def test_ipa_run_tests_glob2(ipatestdir):
"""
Run ipa-run-tests using glob patterns to collect tests
"""
result = ipatestdir.run_ipa_tests("{mod}".format(
mod="test_module_{0,1}*"))
assert result.ret == 0
result.assert_outcomes(passed=2)
for mod_num in range(2):
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
def test_ipa_run_tests_specific_nodeid(ipatestdir):
"""
Run ipa-run-tests using nodeid to collect test
"""
mod_num = 0
result = ipatestdir.run_ipa_tests("{mod}.py::{func}".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num)))
assert result.ret == 0
result.assert_outcomes(passed=1)
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
@pytest.mark.parametrize(
"expr",
[["-k", "not {func}".format(func=FUNC_NAME.format(0))],
["-k not {func}".format(func=FUNC_NAME.format(0))]])
def test_ipa_run_tests_expression(ipatestdir, expr):
"""
Run ipa-run-tests using expression
"""
result = ipatestdir.run_ipa_tests(*expr)
assert result.ret == 0
result.assert_outcomes(passed=4)
for mod_num in range(1, MODS_NUM):
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
def test_ipa_run_tests_empty_expression(ipatestdir):
"""
Run ipa-run-tests using an empty expression.
Expected result: all tests should pass.
"""
result = ipatestdir.run_ipa_tests('-k', '')
assert result.ret == 0
result.assert_outcomes(passed=5)
for mod_num in range(0, MODS_NUM):
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
def test_ipa_run_tests_ignore_basic(ipatestdir):
"""
Run ipa-run-tests ignoring one test module
"""
result = ipatestdir.run_ipa_tests(
"--ignore", "{mod}.py".format(mod=MOD_NAME.format(0)),
"--ignore", "{mod}.py".format(mod=MOD_NAME.format(1)),
)
assert result.ret == 0
result.assert_outcomes(passed=MODS_NUM - 2)
for mod_num in range(2, MODS_NUM):
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])
def test_ipa_run_tests_defaultargs(ipatestdir):
"""
Checking the ipa-run-tests defaults:
* cachedir
* rootdir
"""
mod_num = 0
result = ipatestdir.run_ipa_tests("{mod}.py::{func}".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num)))
assert result.ret == 0
result.assert_outcomes(passed=1)
result.stdout.re_match_lines([
"^cachedir: {cachedir}$".format(
cachedir=os.path.join(os.getcwd(), ".pytest_cache")),
"^rootdir: {rootdir}([,].*)?$".format(
rootdir=os.path.join(str(ipatestdir.tmpdir), "ipatests"))
])
def test_ipa_run_tests_confcutdir(ipatestdir):
"""
Checking the ipa-run-tests defaults:
* confcutdir
"""
mod_num = 0
ipatestdir.makeconftest("import somenotexistedpackage")
result = ipatestdir.run_ipa_tests("{mod}.py::{func}".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num)))
assert result.ret == 0
result.assert_outcomes(passed=1)
result.stdout.fnmatch_lines(["*{mod}.py::{func} PASSED*".format(
mod=MOD_NAME.format(mod_num),
func=FUNC_NAME.format(mod_num))])