diff options
-rw-r--r-- | coverage/data.py | 9 | ||||
-rw-r--r-- | tests/test_data.py | 17 |
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'] |