| # Copyright 2019 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing perepo_managerissions and |
| # limitations under the License. |
| """Test the functionality of bisection module: |
| 1) Test a known case where an error appears in a regression range. |
| 2) Bisect can handle incorrect inputs. |
| |
| IMPORTANT: This test needs to be run with root privileges. |
| """ |
| |
| import os |
| import unittest |
| |
| import bisector |
| import build_specified_commit |
| import test_repos |
| |
| # Necessary because __file__ changes with os.chdir |
| TEST_DIR_PATH = os.path.dirname(os.path.realpath(__file__)) |
| |
| |
| @unittest.skip('Test is too long to be run with presubmit.') |
| class BisectIntegrationTests(unittest.TestCase): |
| """Class to test the functionality of bisection method.""" |
| |
| BISECT_TYPE = 'regressed' |
| |
| def test_bisect_invalid_repo(self): |
| """Test the bisection method on a project that does not exist.""" |
| test_repo = test_repos.INVALID_REPO |
| build_data = build_specified_commit.BuildData( |
| project_name=test_repo.project_name, |
| engine='libfuzzer', |
| sanitizer='address', |
| architecture='x86_64') |
| with self.assertRaises(ValueError): |
| bisector.bisect(self.BISECT_TYPE, test_repo.old_commit, |
| test_repo.new_commit, test_repo.test_case_path, |
| test_repo.fuzz_target, build_data) |
| |
| def test_bisect(self): |
| """Test the bisect method on example projects.""" |
| for test_repo in test_repos.TEST_REPOS: |
| if test_repo.new_commit: |
| build_data = build_specified_commit.BuildData( |
| project_name=test_repo.project_name, |
| engine='libfuzzer', |
| sanitizer='address', |
| architecture='x86_64') |
| result = bisector.bisect(self.BISECT_TYPE, test_repo.old_commit, |
| test_repo.new_commit, test_repo.test_case_path, |
| test_repo.fuzz_target, build_data) |
| self.assertEqual(result.commit, test_repo.intro_commit) |
| |
| |
| if __name__ == '__main__': |
| # Change to oss-fuzz main directory so helper.py runs correctly. |
| if os.getcwd() != os.path.dirname(TEST_DIR_PATH): |
| os.chdir(os.path.dirname(TEST_DIR_PATH)) |
| unittest.main() |