summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/modules/process_test/try_execfile.py11
-rw-r--r--tests/test_api.py3
-rw-r--r--tests/test_arcs.py4
-rw-r--r--tests/test_cmdline.py2
-rw-r--r--tests/test_concurrency.py28
-rw-r--r--tests/test_config.py15
-rw-r--r--tests/test_coverage.py13
-rw-r--r--tests/test_debug.py4
-rw-r--r--tests/test_farm.py4
-rw-r--r--tests/test_oddball.py11
-rw-r--r--tests/test_parser.py20
-rw-r--r--tests/test_process.py50
12 files changed, 92 insertions, 73 deletions
diff --git a/tests/modules/process_test/try_execfile.py b/tests/modules/process_test/try_execfile.py
index ec7dcbe5..3068327e 100644
--- a/tests/modules/process_test/try_execfile.py
+++ b/tests/modules/process_test/try_execfile.py
@@ -68,10 +68,15 @@ FN_VAL = my_function("fooey")
loader = globals().get('__loader__')
fullname = getattr(loader, 'fullname', None) or getattr(loader, 'name', None)
-# A more compact grouped-by-first-letter list of builtins.
+# A more compact ad-hoc grouped-by-first-letter list of builtins.
+CLUMPS = "ABC,DEF,GHI,JKLMN,OPQR,ST,U,VWXYZ_,ab,cd,efg,hij,lmno,pqr,stuvwxyz".split(",")
+
def word_group(w):
- """Clump AB, CD, EF, etc."""
- return chr((ord(w[0]) + 1) & 0xFE)
+ """Figure out which CLUMP the first letter of w is in."""
+ for i, clump in enumerate(CLUMPS):
+ if w[0] in clump:
+ return i
+ return 99
builtin_dir = [" ".join(s) for _, s in itertools.groupby(dir(__builtins__), key=word_group)]
diff --git a/tests/test_api.py b/tests/test_api.py
index b461c503..feb8b2e6 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -5,6 +5,7 @@
import fnmatch
import os
+import os.path
import sys
import textwrap
import warnings
@@ -581,7 +582,7 @@ class SourceOmitIncludeTest(OmitIncludeTestsMixin, CoverageTest):
cov = coverage.Coverage(source=["pkg1"], include=["pkg2"])
with self.assert_warnings(cov, ["--include is ignored because --source is set"]):
cov.start()
- cov.stop()
+ cov.stop() # pragma: nested
def test_source_package_as_dir(self):
# pkg1 is a directory, since we cd'd into tests/modules in setUp.
diff --git a/tests/test_arcs.py b/tests/test_arcs.py
index ef71ea16..4bd804ba 100644
--- a/tests/test_arcs.py
+++ b/tests/test_arcs.py
@@ -407,8 +407,6 @@ class LoopArcTest(CoverageTest):
)
def test_other_comprehensions(self):
- if env.PYVERSION < (2, 7):
- self.skipTest("No set or dict comprehensions before 2.7")
# Set comprehension:
self.check_coverage("""\
o = ((1,2), (3,4))
@@ -431,8 +429,6 @@ class LoopArcTest(CoverageTest):
)
def test_multiline_dict_comp(self):
- if env.PYVERSION < (2, 7):
- self.skipTest("No set or dict comprehensions before 2.7")
if env.PYVERSION < (3, 5):
arcz = "-42 2B B-4 2-4"
else:
diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py
index 1b7c6653..66fcec3a 100644
--- a/tests/test_cmdline.py
+++ b/tests/test_cmdline.py
@@ -33,7 +33,7 @@ class BaseCmdLineTest(CoverageTest):
defaults.Coverage(
cover_pylib=None, data_suffix=None, timid=None, branch=None,
config_file=True, source=None, include=None, omit=None, debug=None,
- concurrency=None,
+ concurrency=None, check_preimported=True,
)
defaults.annotate(
directory=None, ignore_errors=None, include=None, omit=None, morfs=[],
diff --git a/tests/test_concurrency.py b/tests/test_concurrency.py
index 71006042..88f2b50d 100644
--- a/tests/test_concurrency.py
+++ b/tests/test_concurrency.py
@@ -335,7 +335,7 @@ MULTI_CODE = """
import sys
def process_worker_main(args):
- # Need to pause, or the tasks go too quick, and some processes
+ # Need to pause, or the tasks go too quickly, and some processes
# in the pool don't get any work, and then don't record data.
time.sleep(0.02)
ret = work(*args)
@@ -359,7 +359,7 @@ MULTI_CODE = """
"""
-@flaky(max_runs=10) # Sometimes a test fails due to inherent randomness. Try one more time.
+@flaky(max_runs=10) # Sometimes a test fails due to inherent randomness. Try more times.
class MultiprocessingTest(CoverageTest):
"""Test support of the multiprocessing module."""
@@ -403,7 +403,7 @@ class MultiprocessingTest(CoverageTest):
last_line = self.squeezed_lines(out)[-1]
self.assertRegex(last_line, r"multi.py \d+ 0 100%")
- def test_multiprocessing(self):
+ def test_multiprocessing_simple(self):
nprocs = 3
upto = 30
code = (SQUARE_OR_CUBE_WORK + MULTI_CODE).format(NPROCS=nprocs, UPTO=upto)
@@ -464,7 +464,7 @@ def test_coverage_stop_in_threads():
has_started_coverage = []
has_stopped_coverage = []
- def run_thread():
+ def run_thread(): # pragma: nested
"""Check that coverage is stopping properly in threads."""
deadline = time.time() + 5
ident = threading.currentThread().ident
@@ -480,11 +480,11 @@ def test_coverage_stop_in_threads():
cov = coverage.coverage()
cov.start()
- t = threading.Thread(target=run_thread)
- t.start()
+ t = threading.Thread(target=run_thread) # pragma: nested
+ t.start() # pragma: nested
- time.sleep(0.1)
- cov.stop()
+ time.sleep(0.1) # pragma: nested
+ cov.stop() # pragma: nested
time.sleep(0.1)
assert has_started_coverage == [t.ident]
@@ -513,7 +513,7 @@ def test_thread_safe_save_data(tmpdir):
for module_name in module_names:
import_local_file(module_name)
- def random_load():
+ def random_load(): # pragma: nested
"""Import modules randomly to stress coverage."""
while should_run[0]:
module_name = random.choice(module_names)
@@ -529,12 +529,12 @@ def test_thread_safe_save_data(tmpdir):
cov = coverage.coverage()
cov.start()
- threads = [threading.Thread(target=random_load) for _ in range(10)]
- should_run[0] = True
- for t in threads:
+ threads = [threading.Thread(target=random_load) for _ in range(10)] # pragma: nested
+ should_run[0] = True # pragma: nested
+ for t in threads: # pragma: nested
t.start()
- time.sleep(duration)
+ time.sleep(duration) # pragma: nested
cov.stop()
@@ -546,7 +546,7 @@ def test_thread_safe_save_data(tmpdir):
for t in threads:
t.join()
- if (not imported) and duration < 10:
+ if (not imported) and duration < 10: # pragma: only failure
duration *= 2
finally:
diff --git a/tests/test_config.py b/tests/test_config.py
index 0b4d40b6..bbfa4677 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -103,6 +103,21 @@ class ConfigTest(CoverageTest):
cov = coverage.Coverage()
self.assertEqual(cov.config.debug, ["dataio", "pids", "callers", "fooey"])
+ def test_rcfile_from_environment(self):
+ self.make_file("here.ini", """\
+ [run]
+ data_file = overthere.dat
+ """)
+ self.set_environ("COVERAGE_RCFILE", "here.ini")
+ cov = coverage.Coverage()
+ self.assertEqual(cov.config.data_file, "overthere.dat")
+
+ def test_missing_rcfile_from_environment(self):
+ self.set_environ("COVERAGE_RCFILE", "nowhere.ini")
+ msg = "Couldn't read 'nowhere.ini' as a config file"
+ with self.assertRaisesRegex(CoverageException, msg):
+ coverage.Coverage()
+
def test_parse_errors(self):
# Im-parsable values raise CoverageException, with details.
bad_configs_and_msgs = [
diff --git a/tests/test_coverage.py b/tests/test_coverage.py
index 45abb2be..c8ac55df 100644
--- a/tests/test_coverage.py
+++ b/tests/test_coverage.py
@@ -582,12 +582,7 @@ class SimpleStatementTest(CoverageTest):
""",
[2, 3]
)
- if env.PYVERSION < (3, 7):
- # Before 3.7, module docstrings were included in the lnotab table,
- # unless they were the first line in the file?
- lines = [2, 3, 4]
- else:
- lines = [3, 4]
+ lines = [2, 3, 4]
self.check_coverage("""\
# Start with a comment, because it changes the behavior(!?)
'''I am a module docstring.'''
@@ -1147,11 +1142,7 @@ class CompoundStatementTest(CoverageTest):
[1,10,12,13], "")
def test_class_def(self):
- if env.PYVERSION < (3, 7):
- arcz="-22 2D DE E-2 23 36 6A A-2 -68 8-6 -AB B-A"
- else:
- # Python 3.7 no longer includes class docstrings in the lnotab table.
- arcz="-22 2D DE E-2 26 6A A-2 -68 8-6 -AB B-A"
+ arcz="-22 2D DE E-2 23 36 6A A-2 -68 8-6 -AB B-A"
self.check_coverage("""\
# A comment.
class theClass:
diff --git a/tests/test_debug.py b/tests/test_debug.py
index 38f31f58..c81ca24d 100644
--- a/tests/test_debug.py
+++ b/tests/test_debug.py
@@ -145,7 +145,7 @@ class DebugTraceTest(CoverageTest):
out_lines = self.f1_debug_output(["config"])
labels = """
- attempted_config_files branch config_files cover_pylib data_file
+ attempted_config_files branch config_files_read config_file cover_pylib data_file
debug exclude_list extra_css html_dir html_title ignore_errors
run_include run_omit parallel partial_always_list partial_list paths
precision show_missing source timid xml_output
@@ -162,7 +162,7 @@ class DebugTraceTest(CoverageTest):
out_lines = self.f1_debug_output(["sys"])
labels = """
- version coverage cover_paths pylib_paths tracer config_files
+ version coverage cover_paths pylib_paths tracer configs_attempted config_file
configs_read data_path python platform implementation executable
cwd path environment command_line cover_match pylib_match
""".split()
diff --git a/tests/test_farm.py b/tests/test_farm.py
index 1b52bc29..4fc0ea5a 100644
--- a/tests/test_farm.py
+++ b/tests/test_farm.py
@@ -36,7 +36,7 @@ def test_farm(filename):
# "rU" was deprecated in 3.4
-READ_MODE = "rU" if sys.version_info < (3, 4) else "r"
+READ_MODE = "rU" if env.PYVERSION < (3, 4) else "r"
class FarmTestCase(ModuleAwareMixin, SysPathAwareMixin, unittest.TestCase):
@@ -103,7 +103,7 @@ class FarmTestCase(ModuleAwareMixin, SysPathAwareMixin, unittest.TestCase):
"""Here to make unittest.TestCase happy, but will never be invoked."""
raise Exception("runTest isn't used in this class!")
- def __call__(self):
+ def __call__(self): # pylint: disable=arguments-differ
"""Execute the test from the run.py file."""
if _TEST_NAME_FILE: # pragma: debugging
with open(_TEST_NAME_FILE, "w") as f:
diff --git a/tests/test_oddball.py b/tests/test_oddball.py
index aa2f333c..5bd204d9 100644
--- a/tests/test_oddball.py
+++ b/tests/test_oddball.py
@@ -118,7 +118,7 @@ class RecursionTest(CoverageTest):
cov = coverage.Coverage()
self.start_import_stop(cov, "recur")
- pytrace = (cov.collector.tracer_name() == "PyTracer")
+ pytrace = (cov._collector.tracer_name() == "PyTracer")
expected_missing = [3]
if pytrace: # pragma: no metacov
expected_missing += [9, 10, 11]
@@ -398,15 +398,6 @@ class ExceptionTest(CoverageTest):
class DoctestTest(CoverageTest):
"""Tests invoked with doctest should measure properly."""
- def setUp(self):
- super(DoctestTest, self).setUp()
-
- # This test case exists because Python 2.4's doctest module didn't play
- # well with coverage. Nose fixes the problem by monkeypatching doctest.
- # I want to be sure there's no monkeypatch and that I'm getting the
- # doctest module that users of coverage will get.
- assert 'doctest' not in sys.modules
-
def test_doctest(self):
self.check_coverage('''\
def return_arg_or_void(arg):
diff --git a/tests/test_parser.py b/tests/test_parser.py
index afb87716..169319f5 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -165,11 +165,7 @@ class PythonParserTest(CoverageTest):
def func(x=25):
return 26
""")
- if env.PYVERSION < (3, 7):
- raw_statements = set([3, 4, 5, 6, 8, 9, 10, 13, 15, 16, 17, 20, 22, 23, 25, 26])
- else:
- # Python 3.7 no longer includes class docstrings in the lnotab table.
- raw_statements = set([3, 4, 5, 6, 8, 10, 13, 15, 16, 17, 20, 22, 23, 25, 26])
+ raw_statements = set([3, 4, 5, 6, 8, 9, 10, 13, 15, 16, 17, 20, 22, 23, 25, 26])
self.assertEqual(parser.raw_statements, raw_statements)
self.assertEqual(parser.statements, set([8]))
@@ -201,8 +197,14 @@ class PythonParserTest(CoverageTest):
pass
""")
self.assertEqual(parser.statements, set([1, 2, 4, 8, 10]))
- self.assertEqual(parser.arcs(), set(self.arcz_to_arcs(".1 14 48 8. .2 2. -8A A-8")))
- self.assertEqual(parser.exit_counts(), {1: 1, 2: 1, 4: 1, 8: 1, 10: 1})
+ expected_arcs = set(self.arcz_to_arcs(".1 14 48 8. .2 2. -8A A-8"))
+ expected_exits = {1: 1, 2: 1, 4: 1, 8: 1, 10: 1}
+ if env.PYVERSION >= (3, 7, 0, 'beta', 5):
+ # 3.7 changed how functions with only docstrings are numbered.
+ expected_arcs.update(set(self.arcz_to_arcs("-46 6-4")))
+ expected_exits.update({6: 1})
+ self.assertEqual(parser.arcs(), expected_arcs)
+ self.assertEqual(parser.exit_counts(), expected_exits)
class ParserMissingArcDescriptionTest(CoverageTest):
@@ -260,10 +262,6 @@ class ParserMissingArcDescriptionTest(CoverageTest):
)
def test_missing_arc_descriptions_for_small_callables(self):
- # We use 2.7 features here, so just skip this test on 2.6
- if env.PYVERSION < (2, 7):
- self.skipTest("No dict or set comps in 2.6")
-
parser = self.parse_text(u"""\
callables = [
lambda: 2,
diff --git a/tests/test_process.py b/tests/test_process.py
index 18564cb8..68262a57 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -585,8 +585,32 @@ class ProcessTest(CoverageTest):
self.assertIn("Trace function changed", out)
+ def test_warn_preimported(self):
+ self.make_file("hello.py", """\
+ import goodbye
+ import coverage
+ cov = coverage.Coverage(include=["good*"], check_preimported=True)
+ cov.start()
+ print(goodbye.f())
+ cov.stop()
+ """)
+ self.make_file("goodbye.py", """\
+ def f():
+ return "Goodbye!"
+ """)
+ goodbye_path = os.path.abspath("goodbye.py")
+
+ out = self.run_command("python hello.py")
+ self.assertIn("Goodbye!", out)
+
+ msg = (
+ "Coverage.py warning: "
+ "Already imported a file that will be measured: {0} "
+ "(already-imported)").format(goodbye_path)
+ self.assertIn(msg, out)
+
def test_note(self):
- if env.PYPY and env.PY3 and env.PYPYVERSION[:3] == (5, 10, 0):
+ if env.PYPY and env.PY3 and env.PYPYVERSION[:3] == (5, 10, 0): # pragma: obscure
# https://bitbucket.org/pypy/pypy/issues/2729/pypy3-510-incorrectly-decodes-astral-plane
self.skipTest("Avoid incorrect decoding astral plane JSON chars")
self.make_file(".coveragerc", """\
@@ -635,9 +659,6 @@ class ProcessTest(CoverageTest):
self.assertGreater(data.line_counts()['os.py'], 50)
def test_lang_c(self):
- if env.PY3 and sys.version_info < (3, 4):
- # Python 3.3 can't compile the non-ascii characters in the file name.
- self.skipTest("3.3 can't handle this test")
if env.JYTHON:
# Jython as of 2.7.1rc3 won't compile a filename that isn't utf8.
self.skipTest("Jython can't handle this test")
@@ -666,6 +687,11 @@ class ProcessTest(CoverageTest):
import coverage
print("No warnings!")
""")
+
+ # Some of our testing infrastructure can issue warnings.
+ # Turn it all off for the sub-process.
+ self.del_environ("COVERAGE_TESTING")
+
out = self.run_command("python allok.py")
self.assertEqual(out, "No warnings!\n")
@@ -676,9 +702,11 @@ class ProcessTest(CoverageTest):
pass
""")
self.make_file("run_twice.py", """\
+ import sys
import coverage
- for _ in [1, 2]:
+ for i in [1, 2]:
+ sys.stderr.write("Run %s\\n" % i)
inst = coverage.Coverage(source=['foo'])
inst.load()
inst.start()
@@ -689,15 +717,13 @@ class ProcessTest(CoverageTest):
out = self.run_command("python run_twice.py")
self.assertEqual(
out,
+ "Run 1\n"
+ "Run 2\n"
"Coverage.py warning: Module foo was previously imported, but not measured "
"(module-not-measured)\n"
)
def test_module_name(self):
- if sys.version_info < (2, 7):
- # Python 2.6 thinks that coverage is a package that can't be
- # executed
- self.skipTest("-m doesn't work the same < Python 2.7")
# https://bitbucket.org/ned/coveragepy/issues/478/help-shows-silly-program-name-when-running
out = self.run_command("python -m coverage")
self.assertIn("Use 'coverage help' for help", out)
@@ -739,7 +765,7 @@ class EnvironmentTest(CoverageTest):
self.assert_tryexecfile_output(out_cov, out_py)
def test_coverage_run_dir_is_like_python_dir(self):
- if sys.version_info == (3, 5, 4, 'final', 0):
+ if env.PYVERSION == (3, 5, 4, 'final', 0): # pragma: obscure
self.skipTest("3.5.4 broke this: https://bugs.python.org/issue32551")
with open(TRY_EXECFILE) as f:
self.make_file("with_main/__main__.py", f.read())
@@ -819,10 +845,6 @@ class EnvironmentTest(CoverageTest):
self.assert_tryexecfile_output(out_cov, out_py)
def test_coverage_run_dashm_is_like_python_dashm_with__main__207(self):
- if sys.version_info < (2, 7):
- # Coverage.py isn't bug-for-bug compatible in the behavior
- # of -m for Pythons < 2.7
- self.skipTest("-m doesn't work the same < Python 2.7")
# https://bitbucket.org/ned/coveragepy/issue/207
self.make_file("package/__init__.py", "print('init')")
self.make_file("package/__main__.py", "print('main')")