Skip to content

Commit f2e4048

Browse files
committed
refactor: move core tests to their own file
1 parent bf48489 commit f2e4048

File tree

2 files changed

+151
-137
lines changed

2 files changed

+151
-137
lines changed

tests/test_core.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2+
# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
3+
4+
"""Tests for core selection of coverage.py."""
5+
6+
from __future__ import annotations
7+
8+
import pytest
9+
10+
import coverage
11+
from coverage import env
12+
from coverage.exceptions import ConfigError
13+
14+
from tests.coveragetest import CoverageTest
15+
from tests.helpers import re_line, re_lines
16+
17+
18+
class CoverageCoreTest(CoverageTest):
19+
"""Test that cores are chosen correctly."""
20+
21+
# This doesn't test failure modes, only successful requests.
22+
try:
23+
from coverage.tracer import CTracer
24+
25+
has_ctracer = True
26+
except ImportError:
27+
has_ctracer = False
28+
29+
def setUp(self) -> None:
30+
super().setUp()
31+
# Clean out the environment variable the test suite uses to control the
32+
# core it cares about.
33+
self.del_environ("COVERAGE_CORE")
34+
self.make_file("numbers.py", "print(123, 456)")
35+
36+
def test_core_default(self) -> None:
37+
out = self.run_command("coverage run --debug=sys numbers.py")
38+
assert out.endswith("123 456\n")
39+
core = re_line(r" core:", out).strip()
40+
warns = re_lines(r"\(no-ctracer\)", out)
41+
if env.SYSMON_DEFAULT:
42+
assert core == "core: SysMonitor"
43+
assert not warns
44+
elif self.has_ctracer:
45+
assert core == "core: CTracer"
46+
assert not warns
47+
else:
48+
assert core == "core: PyTracer"
49+
assert bool(warns) == env.CPYTHON
50+
51+
@pytest.mark.skipif(not has_ctracer, reason="No CTracer to request")
52+
def test_core_request_ctrace(self) -> None:
53+
self.set_environ("COVERAGE_CORE", "ctrace")
54+
out = self.run_command("coverage run --debug=sys numbers.py")
55+
assert out.endswith("123 456\n")
56+
core = re_line(r" core:", out).strip()
57+
assert core == "core: CTracer"
58+
59+
@pytest.mark.skipif(has_ctracer, reason="CTracer needs to be missing")
60+
def test_core_request_ctrace_but_missing(self) -> None:
61+
self.make_file(".coveragerc", "[run]\ncore = ctrace\n")
62+
out = self.run_command("coverage run --debug=sys,pybehave numbers.py")
63+
assert out.endswith("123 456\n")
64+
core = re_line(r" core:", out).strip()
65+
assert core == "core: PyTracer"
66+
warns = re_lines(r"\(no-ctracer\)", out)
67+
assert bool(warns) == env.SHIPPING_WHEELS
68+
69+
def test_core_request_pytrace(self) -> None:
70+
self.set_environ("COVERAGE_CORE", "pytrace")
71+
out = self.run_command("coverage run --debug=sys numbers.py")
72+
assert out.endswith("123 456\n")
73+
core = re_line(r" core:", out).strip()
74+
assert core == "core: PyTracer"
75+
76+
def test_core_request_sysmon(self) -> None:
77+
self.set_environ("COVERAGE_CORE", "sysmon")
78+
out = self.run_command("coverage run --debug=sys numbers.py")
79+
assert out.endswith("123 456\n")
80+
core = re_line(r" core:", out).strip()
81+
warns = re_lines(r"\(no-sysmon\)", out)
82+
if env.PYBEHAVIOR.pep669:
83+
assert core == "core: SysMonitor"
84+
assert not warns
85+
else:
86+
assert core in ["core: CTracer", "core: PyTracer"]
87+
assert warns
88+
89+
def test_core_request_sysmon_no_dyncontext(self) -> None:
90+
# Use config core= for this test just to be different.
91+
self.make_file(
92+
".coveragerc",
93+
"""\
94+
[run]
95+
core = sysmon
96+
dynamic_context = test_function
97+
""",
98+
)
99+
out = self.run_command("coverage run --debug=sys numbers.py")
100+
assert out.endswith("123 456\n")
101+
core = re_line(r" core:", out).strip()
102+
assert core in ["core: CTracer", "core: PyTracer"]
103+
warns = re_lines(r"\(no-sysmon\)", out)
104+
assert len(warns) == 1
105+
if env.PYBEHAVIOR.pep669:
106+
assert (
107+
"sys.monitoring doesn't yet support dynamic contexts, using default core"
108+
in warns[0]
109+
)
110+
else:
111+
assert "sys.monitoring isn't available in this version, using default core" in warns[0]
112+
113+
def test_core_request_sysmon_no_branches(self) -> None:
114+
# Use config core= for this test just to be different.
115+
self.make_file(
116+
".coveragerc",
117+
"""\
118+
[run]
119+
core = sysmon
120+
branch = True
121+
""",
122+
)
123+
out = self.run_command("coverage run --debug=sys numbers.py")
124+
assert out.endswith("123 456\n")
125+
core = re_line(r" core:", out).strip()
126+
warns = re_lines(r"\(no-sysmon\)", out)
127+
if env.PYBEHAVIOR.branch_right_left:
128+
assert core == "core: SysMonitor"
129+
assert not warns
130+
else:
131+
assert core in ["core: CTracer", "core: PyTracer"]
132+
assert len(warns) == 1
133+
if env.PYBEHAVIOR.pep669:
134+
assert (
135+
"sys.monitoring can't measure branches in this version, using default core"
136+
in warns[0]
137+
)
138+
else:
139+
assert (
140+
"sys.monitoring isn't available in this version, using default core" in warns[0]
141+
)
142+
143+
def test_core_request_nosuchcore(self) -> None:
144+
# Test the coverage misconfigurations in-process with pytest. Running a
145+
# subprocess doesn't capture the metacov in the subprocess because
146+
# coverage is misconfigured.
147+
self.set_environ("COVERAGE_CORE", "nosuchcore")
148+
cov = coverage.Coverage()
149+
with pytest.raises(ConfigError, match=r"Unknown core value: 'nosuchcore'"):
150+
self.start_import_stop(cov, "numbers")

tests/test_process.py

Lines changed: 1 addition & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,11 @@
2626
import coverage
2727
from coverage import env
2828
from coverage.data import line_counts
29-
from coverage.exceptions import ConfigError
3029
from coverage.files import abs_file, python_reported_file
3130

3231
from tests import testenv
3332
from tests.coveragetest import CoverageTest, TESTS_DIR
34-
from tests.helpers import change_dir, re_line, re_lines, re_lines_text
33+
from tests.helpers import change_dir, re_lines, re_lines_text
3534

3635

3736
class ProcessTest(CoverageTest):
@@ -1316,141 +1315,6 @@ def test_report_99p9_is_not_ok(self) -> None:
13161315
assert expected == self.last_line_squeezed(out)
13171316

13181317

1319-
class CoverageCoreTest(CoverageTest):
1320-
"""Test that cores are chosen correctly."""
1321-
1322-
# This doesn't test failure modes, only successful requests.
1323-
try:
1324-
from coverage.tracer import CTracer
1325-
1326-
has_ctracer = True
1327-
except ImportError:
1328-
has_ctracer = False
1329-
1330-
def setUp(self) -> None:
1331-
super().setUp()
1332-
# Clean out the environment variable the test suite uses to control the
1333-
# core it cares about.
1334-
self.del_environ("COVERAGE_CORE")
1335-
self.make_file("numbers.py", "print(123, 456)")
1336-
1337-
def test_core_default(self) -> None:
1338-
out = self.run_command("coverage run --debug=sys numbers.py")
1339-
assert out.endswith("123 456\n")
1340-
core = re_line(r" core:", out).strip()
1341-
warns = re_lines(r"\(no-ctracer\)", out)
1342-
if env.SYSMON_DEFAULT:
1343-
assert core == "core: SysMonitor"
1344-
assert not warns
1345-
elif self.has_ctracer:
1346-
assert core == "core: CTracer"
1347-
assert not warns
1348-
else:
1349-
assert core == "core: PyTracer"
1350-
assert bool(warns) == env.CPYTHON
1351-
1352-
@pytest.mark.skipif(not has_ctracer, reason="No CTracer to request")
1353-
def test_core_request_ctrace(self) -> None:
1354-
self.set_environ("COVERAGE_CORE", "ctrace")
1355-
out = self.run_command("coverage run --debug=sys numbers.py")
1356-
assert out.endswith("123 456\n")
1357-
core = re_line(r" core:", out).strip()
1358-
assert core == "core: CTracer"
1359-
1360-
@pytest.mark.skipif(has_ctracer, reason="CTracer needs to be missing")
1361-
def test_core_request_ctrace_but_missing(self) -> None:
1362-
self.make_file(".coveragerc", "[run]\ncore = ctrace\n")
1363-
out = self.run_command("coverage run --debug=sys,pybehave numbers.py")
1364-
assert out.endswith("123 456\n")
1365-
core = re_line(r" core:", out).strip()
1366-
assert core == "core: PyTracer"
1367-
warns = re_lines(r"\(no-ctracer\)", out)
1368-
assert bool(warns) == env.SHIPPING_WHEELS
1369-
1370-
def test_core_request_pytrace(self) -> None:
1371-
self.set_environ("COVERAGE_CORE", "pytrace")
1372-
out = self.run_command("coverage run --debug=sys numbers.py")
1373-
assert out.endswith("123 456\n")
1374-
core = re_line(r" core:", out).strip()
1375-
assert core == "core: PyTracer"
1376-
1377-
def test_core_request_sysmon(self) -> None:
1378-
self.set_environ("COVERAGE_CORE", "sysmon")
1379-
out = self.run_command("coverage run --debug=sys numbers.py")
1380-
assert out.endswith("123 456\n")
1381-
core = re_line(r" core:", out).strip()
1382-
warns = re_lines(r"\(no-sysmon\)", out)
1383-
if env.PYBEHAVIOR.pep669:
1384-
assert core == "core: SysMonitor"
1385-
assert not warns
1386-
else:
1387-
assert core in ["core: CTracer", "core: PyTracer"]
1388-
assert warns
1389-
1390-
def test_core_request_sysmon_no_dyncontext(self) -> None:
1391-
# Use config core= for this test just to be different.
1392-
self.make_file(
1393-
".coveragerc",
1394-
"""\
1395-
[run]
1396-
core = sysmon
1397-
dynamic_context = test_function
1398-
""",
1399-
)
1400-
out = self.run_command("coverage run --debug=sys numbers.py")
1401-
assert out.endswith("123 456\n")
1402-
core = re_line(r" core:", out).strip()
1403-
assert core in ["core: CTracer", "core: PyTracer"]
1404-
warns = re_lines(r"\(no-sysmon\)", out)
1405-
assert len(warns) == 1
1406-
if env.PYBEHAVIOR.pep669:
1407-
assert (
1408-
"sys.monitoring doesn't yet support dynamic contexts, using default core"
1409-
in warns[0]
1410-
)
1411-
else:
1412-
assert "sys.monitoring isn't available in this version, using default core" in warns[0]
1413-
1414-
def test_core_request_sysmon_no_branches(self) -> None:
1415-
# Use config core= for this test just to be different.
1416-
self.make_file(
1417-
".coveragerc",
1418-
"""\
1419-
[run]
1420-
core = sysmon
1421-
branch = True
1422-
""",
1423-
)
1424-
out = self.run_command("coverage run --debug=sys numbers.py")
1425-
assert out.endswith("123 456\n")
1426-
core = re_line(r" core:", out).strip()
1427-
warns = re_lines(r"\(no-sysmon\)", out)
1428-
if env.PYBEHAVIOR.branch_right_left:
1429-
assert core == "core: SysMonitor"
1430-
assert not warns
1431-
else:
1432-
assert core in ["core: CTracer", "core: PyTracer"]
1433-
assert len(warns) == 1
1434-
if env.PYBEHAVIOR.pep669:
1435-
assert (
1436-
"sys.monitoring can't measure branches in this version, using default core"
1437-
in warns[0]
1438-
)
1439-
else:
1440-
assert (
1441-
"sys.monitoring isn't available in this version, using default core" in warns[0]
1442-
)
1443-
1444-
def test_core_request_nosuchcore(self) -> None:
1445-
# Test the coverage misconfigurations in-process with pytest. Running a
1446-
# subprocess doesn't capture the metacov in the subprocess because
1447-
# coverage is misconfigured.
1448-
self.set_environ("COVERAGE_CORE", "nosuchcore")
1449-
cov = coverage.Coverage()
1450-
with pytest.raises(ConfigError, match=r"Unknown core value: 'nosuchcore'"):
1451-
self.start_import_stop(cov, "numbers")
1452-
1453-
14541318
class FailUnderNoFilesTest(CoverageTest):
14551319
"""Test that nothing to report results in an error exit status."""
14561320

0 commit comments

Comments
 (0)