summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coverage/data.py9
-rw-r--r--tests/test_data.py17
2 files changed, 21 insertions, 5 deletions
diff --git a/coverage/data.py b/coverage/data.py
index 71f915d6..26fee484 100644
--- a/coverage/data.py
+++ b/coverage/data.py
@@ -232,10 +232,16 @@ class CoverageData(object):
)
)
+ GO_AWAY = "!coverage.py: This is a private format, don't read it directly!"
+
@classmethod
def _open_for_reading(cls, filename):
"""Open a file appropriately for reading data."""
- return open(filename, "r")
+ f = open(filename, "r")
+ go_away = f.read(len(cls.GO_AWAY))
+ if go_away != cls.GO_AWAY:
+ raise CoverageException("Doesn't seem to be a coverage.py data file")
+ return f
@classmethod
def _read_raw_data(cls, file_obj):
@@ -331,6 +337,7 @@ class CoverageData(object):
file_data['plugins'] = self._plugins
# Write the data to the file.
+ file_obj.write(self.GO_AWAY)
json.dump(file_data, file_obj)
def write_file(self, filename):
diff --git a/tests/test_data.py b/tests/test_data.py
index 045aaa2e..451b6f43 100644
--- a/tests/test_data.py
+++ b/tests/test_data.py
@@ -360,6 +360,10 @@ class CoverageDataTestInTempDir(DataTestHelpers, CoverageTest):
with self.assertRaisesRegex(CoverageException, msg.format("nonexistent.dat")):
covdata.read_file("nonexistent.dat")
+ self.make_file("misleading.dat", CoverageData.GO_AWAY + " this isn't JSON")
+ with self.assertRaisesRegex(CoverageException, msg.format("misleading.dat")):
+ covdata.read_file("misleading.dat")
+
# After all that, no data should be in our CoverageData.
self.assertFalse(covdata)
@@ -530,14 +534,20 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
self.data_files.read(covdata2)
self.assert_line_counts(covdata2, {})
+ def read_json_data_file(self, fname):
+ """Read a JSON data file for testing the JSON directly."""
+ with open(fname, 'r') as fdata:
+ go_away = fdata.read(len(CoverageData.GO_AWAY))
+ self.assertEqual(go_away, CoverageData.GO_AWAY)
+ return json.load(fdata)
+
def test_file_format(self):
# Write with CoverageData, then read the JSON explicitly.
covdata = CoverageData()
covdata.set_lines(LINES_1)
self.data_files.write(covdata)
- with open(".coverage", 'r') as fdata:
- data = json.load(fdata)
+ data = self.read_json_data_file(".coverage")
lines = data['lines']
self.assertCountEqual(lines.keys(), MEASURED_FILES_1)
@@ -554,8 +564,7 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest):
covdata.set_arcs(ARCS_3)
self.data_files.write(covdata)
- with open(".coverage", 'r') as fdata:
- data = json.load(fdata)
+ data = self.read_json_data_file(".coverage")
self.assertNotIn('lines', data)
arcs = data['arcs']