[CIFuzz][coverage] Fix bug in getting coverage reports (#5284)

Also add tests.
This commit is contained in:
jonathanmetzman 2021-03-03 14:46:51 -08:00 committed by GitHub
parent 08448d8866
commit c8ca07752f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 3 deletions

View File

@ -115,7 +115,7 @@ def _get_latest_cov_report_info(project_name):
LATEST_REPORT_INFO_PATH,
project_name + '.json')
latest_cov_info = get_json_from_url(latest_report_info_url)
if not latest_cov_info is None:
if latest_cov_info is None:
logging.error('Could not get the coverage report json from url: %s.',
latest_report_info_url)
return None

View File

@ -39,19 +39,28 @@ with open(os.path.join(TEST_FILES_PATH,
class GetFuzzerStatsDirUrlTest(unittest.TestCase):
"""Tests _get_fuzzer_stats_dir_url."""
@mock.patch('coverage.get_json_from_url', return_value={})
@mock.patch('coverage.get_json_from_url',
return_value={
'fuzzer_stats_dir':
'gs://oss-fuzz-coverage/systemd/fuzzer_stats/20210303'
})
def test_get_valid_project(self, mocked_get_json_from_url):
"""Tests that a project's coverage report can be downloaded and parsed.
NOTE: This test relies on the PROJECT_NAME repo's coverage report.
The "example" project was not used because it has no coverage reports.
"""
coverage._get_fuzzer_stats_dir_url(PROJECT_NAME)
result = coverage._get_fuzzer_stats_dir_url(PROJECT_NAME)
(url,), _ = mocked_get_json_from_url.call_args
self.assertEqual(
'https://storage.googleapis.com/oss-fuzz-coverage/'
'latest_report_info/curl.json', url)
expected_result = (
'https://storage.googleapis.com/oss-fuzz-coverage/systemd/fuzzer_stats/'
'20210303')
self.assertEqual(result, expected_result)
def test_get_invalid_project(self):
"""Tests that passing a bad project returns None."""
self.assertIsNone(coverage._get_fuzzer_stats_dir_url('not-a-proj'))
@ -152,5 +161,34 @@ class IsFileCoveredTest(unittest.TestCase):
self.assertFalse(coverage.is_file_covered(file_coverage))
class GetLatestCovReportInfo(unittest.TestCase):
"""Tests that _get_latest_cov_report_info works as intended."""
PROJECT = 'project'
LATEST_REPORT_INFO_URL = ('https://storage.googleapis.com/oss-fuzz-coverage/'
'latest_report_info/project.json')
@mock.patch('logging.error')
@mock.patch('coverage.get_json_from_url', return_value={'coverage': 1})
def test_get_latest_cov_report_info(self, mocked_get_json_from_url,
mocked_error):
"""Tests that _get_latest_cov_report_info works as intended."""
result = coverage._get_latest_cov_report_info(self.PROJECT)
self.assertEqual(result, {'coverage': 1})
mocked_error.assert_not_called()
mocked_get_json_from_url.assert_called_with(self.LATEST_REPORT_INFO_URL)
@mock.patch('logging.error')
@mock.patch('coverage.get_json_from_url', return_value=None)
def test_get_latest_cov_report_info_fail(self, _, mocked_error):
"""Tests that _get_latest_cov_report_info works as intended when we can't
get latest report info."""
result = coverage._get_latest_cov_report_info('project')
self.assertIsNone(result)
mocked_error.assert_called_with(
'Could not get the coverage report json from url: %s.',
self.LATEST_REPORT_INFO_URL)
if __name__ == '__main__':
unittest.main()