summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_api.py74
-rw-r--r--tests/test_cmdline.py14
-rw-r--r--tests/test_config.py5
-rw-r--r--tests/test_process.py36
4 files changed, 107 insertions, 22 deletions
diff --git a/tests/test_api.py b/tests/test_api.py
index 61cd9408..ad322224 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -251,7 +251,8 @@ class ApiTest(CoverageTest):
cov.erase()
self.assertRaises(CoverageException, cov.report)
- def test_start_stop_start_stop(self):
+ def make_code1_code2(self):
+ """Create the code1.py and code2.py files."""
self.make_file("code1.py", """\
code1 = 1
""")
@@ -259,10 +260,9 @@ class ApiTest(CoverageTest):
code2 = 1
code2 = 2
""")
- cov = coverage.Coverage()
- self.start_import_stop(cov, "code1")
- cov.save()
- self.start_import_stop(cov, "code2")
+
+ def check_code1_code2(self, cov):
+ """Check the analysis is correct for code1.py and code2.py."""
_, statements, missing, _ = cov.analysis("code1.py")
self.assertEqual(statements, [1])
self.assertEqual(missing, [])
@@ -270,16 +270,18 @@ class ApiTest(CoverageTest):
self.assertEqual(statements, [1, 2])
self.assertEqual(missing, [])
+ def test_start_stop_start_stop(self):
+ self.make_code1_code2()
+ cov = coverage.Coverage()
+ self.start_import_stop(cov, "code1")
+ cov.save()
+ self.start_import_stop(cov, "code2")
+ self.check_code1_code2(cov)
+
if 0: # expected failure
# for https://bitbucket.org/ned/coveragepy/issue/79
def test_start_save_stop(self):
- self.make_file("code1.py", """\
- code1 = 1
- """)
- self.make_file("code2.py", """\
- code2 = 1
- code2 = 2
- """)
+ self.make_code1_code2()
cov = coverage.Coverage()
cov.start()
self.import_local_file("code1")
@@ -287,13 +289,49 @@ class ApiTest(CoverageTest):
self.import_local_file("code2")
cov.stop()
- _, statements, missing, _ = cov.analysis("code1.py")
- self.assertEqual(statements, [1])
- self.assertEqual(missing, [])
- _, statements, missing, _ = cov.analysis("code2.py")
- self.assertEqual(statements, [1, 2])
- self.assertEqual(missing, [])
+ self.check_code1_code2(cov)
+
+ def make_corrupt_data_files(self):
+ """Make some good and some bad data files."""
+ self.make_code1_code2()
+ cov = coverage.Coverage(data_suffix=True)
+ self.start_import_stop(cov, "code1")
+ cov.save()
+
+ cov = coverage.Coverage(data_suffix=True)
+ self.start_import_stop(cov, "code2")
+ cov.save()
+
+ self.make_file(".coverage.foo", """La la la, this isn't coverage data!""")
+
+ def test_combining_corrupt_data(self):
+ self.make_corrupt_data_files()
+ cov = coverage.Coverage()
+
+ msg = r"Couldn't read data from '.*\.coverage\.foo'"
+ with self.assertRaisesRegex(CoverageException, msg):
+ cov.combine()
+
+ # The bad file still exists.
+ self.assert_exists(".coverage.foo")
+
+ def test_combining_corrupt_data_while_ignoring_errors(self):
+ # If you combine a corrupt data file with ignore_errors=True, then you
+ # will get a warning, and the file will remain.
+ self.make_corrupt_data_files()
+ cov = coverage.Coverage()
+ warning_regex = (
+ r"Couldn't read data from '.*\.coverage\.foo': "
+ r"CoverageException: Doesn't seem to be a coverage\.py data file"
+ )
+ with self.assert_warnings(cov, [warning_regex]):
+ cov.combine(ignore_errors=True)
+
+ # We got the results from code1 and code2 properly.
+ self.check_code1_code2(cov)
+ # The bad file still exists.
+ self.assert_exists(".coverage.foo")
class UsingModulesMixin(object):
diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py
index c78e3468..932c9ef9 100644
--- a/tests/test_cmdline.py
+++ b/tests/test_cmdline.py
@@ -190,14 +190,20 @@ class CmdLineTest(BaseCmdLineTest):
self.cmd_executes("combine datadir1", """\
.coverage()
.load()
- .combine(["datadir1"])
+ .combine(["datadir1"], ignore_errors=None)
.save()
""")
# coverage combine without args
self.cmd_executes("combine", """\
.coverage()
.load()
- .combine(None)
+ .combine(None, ignore_errors=None)
+ .save()
+ """)
+ self.cmd_executes("combine -i", """\
+ .coverage()
+ .load()
+ .combine(None, ignore_errors=True)
.save()
""")
@@ -206,13 +212,13 @@ class CmdLineTest(BaseCmdLineTest):
self.cmd_executes("combine --rcfile cov.ini", """\
.coverage(config_file='cov.ini')
.load()
- .combine(None)
+ .combine(None, ignore_errors=None)
.save()
""")
self.cmd_executes("combine --rcfile cov.ini data1 data2/more", """\
.coverage(config_file='cov.ini')
.load()
- .combine(["data1", "data2/more"])
+ .combine(["data1", "data2/more"], ignore_errors=None)
.save()
""")
diff --git a/tests/test_config.py b/tests/test_config.py
index 93a7bbf6..6d6c7f80 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -235,6 +235,9 @@ class ConfigFileTest(CoverageTest):
plugins.a_plugin
plugins.another
+ [{section}combine]
+ ignore_errors = True
+
[{section}report]
; these settings affect reporting.
exclude_lines =
@@ -301,6 +304,8 @@ class ConfigFileTest(CoverageTest):
self.assertTrue(cov.config.parallel)
self.assertEqual(cov.config.concurrency, "thread")
+ self.assertTrue(cov.config.ignore_combine_errors)
+
self.assertEqual(cov.get_exclude_list(), ["if 0:", r"pragma:?\s+no cover", "another_tab"])
self.assertTrue(cov.config.ignore_errors)
self.assertEqual(cov.config.include, ["a/", "b/"])
diff --git a/tests/test_process.py b/tests/test_process.py
index 3023a18c..b41472d6 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -94,6 +94,42 @@ class ProcessTest(CoverageTest):
data.read_file(".coverage")
self.assertEqual(data.line_counts()['b_or_c.py'], 7)
+ def test_combine_parallel_data_with_a_corrupt_file(self):
+ self.make_b_or_c_py()
+ out = self.run_command("coverage run -p b_or_c.py b")
+ self.assertEqual(out, 'done\n')
+ self.assert_doesnt_exist(".coverage")
+ self.assertEqual(self.number_of_data_files(), 1)
+
+ out = self.run_command("coverage run -p b_or_c.py c")
+ self.assertEqual(out, 'done\n')
+ self.assert_doesnt_exist(".coverage")
+
+ # After two -p runs, there should be two .coverage.machine.123 files.
+ self.assertEqual(self.number_of_data_files(), 2)
+
+ # Make a bogus data file.
+ self.make_file(".coverage.bad", "This isn't a coverage data file.")
+
+ # Combine the parallel coverage data files into .coverage .
+ out = self.run_command("coverage combine -i")
+ self.assert_exists(".coverage")
+ self.assert_exists(".coverage.bad")
+ warning_regex = (
+ r"Coverage.py warning: Couldn't read data from '.*\.coverage\.bad': "
+ r"CoverageException: Doesn't seem to be a coverage\.py data file"
+ )
+ self.assertRegex(out, warning_regex)
+
+ # After combining, those two should be the only data files.
+ self.assertEqual(self.number_of_data_files(), 2)
+
+ # Read the coverage file and see that b_or_c.py has all 7 lines
+ # executed.
+ data = coverage.CoverageData()
+ data.read_file(".coverage")
+ self.assertEqual(data.line_counts()['b_or_c.py'], 7)
+
def test_combine_parallel_data_in_two_steps(self):
self.make_b_or_c_py()