| #!/usr/bin/env python3 |
| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import datetime |
| import os.path |
| import sys |
| import tempfile |
| import unittest |
| |
| sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) |
| |
| from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi |
| from build.ios import presubmit_support |
| |
| _TEMP_FILELIST_CONTENTS = """# Copyright %d The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # NOTE: this file is generated by build/ios/update_bundle_filelist.py |
| # If it requires updating, you should get a presubmit error with |
| # instructions on how to regenerate. Otherwise, do not edit. |
| """ % (datetime.datetime.now().year) |
| |
| _TEMP_GLOBLIST_CONTENTS = """** |
| -*.globlist |
| -*.filelist |
| """ |
| |
| |
| class BundleDataPresubmit(unittest.TestCase): |
| def setUp(self): |
| self.mock_input_api = MockInputApi() |
| self.mock_input_api.change.RepositoryRoot = lambda: os.path.join( |
| os.path.dirname(__file__), '..', '..') |
| self.mock_input_api.PresubmitLocalPath = lambda: os.path.dirname(__file__) |
| self.mock_output_api = MockOutputApi() |
| |
| def testBasic(self): |
| """ |
| Checks that a glob can be expanded to build a file list and if it |
| matches the existing file list, we should see no error. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/basic', '.') |
| self.assertEqual([], results) |
| |
| def testExclusion(self): |
| """ |
| Check that globs can be used to exclude files from file lists. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/exclusions', '.') |
| self.assertEqual([], results) |
| |
| def testDifferentLocalPath(self): |
| """ |
| Checks the case where the presubmit directory is not the same as the |
| globroot, but it is still local (i.e., not relative to the repository |
| root) |
| """ |
| results = presubmit_support.CheckBundleData( |
| self.mock_input_api, self.mock_output_api, |
| 'test_data/different_local_path', 'test_data') |
| self.assertEqual([], results) |
| |
| def testRepositoryRelative(self): |
| """ |
| Checks the case where globs are relative to the repository root. |
| """ |
| results = presubmit_support.CheckBundleData( |
| self.mock_input_api, self.mock_output_api, |
| 'test_data/repository_relative') |
| self.assertEqual([], results) |
| |
| def testMissingFilesInFilelist(self): |
| """ |
| Checks that we do indeed return an error if the filelist is missing a |
| file. In this case, all of the test .filelist and .globlist files are |
| excluded. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/missing', '.') |
| self.assertEqual(1, len(results)) |
| |
| def testExtraFilesInFilelist(self): |
| """ |
| Checks the case where extra files have been included in the file list. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/extra', '.') |
| self.assertEqual(1, len(results)) |
| |
| def testOrderInsensitive(self): |
| """ |
| Checks that we do not trigger an error for cases where the file list is |
| correct, but in a different order than the globlist expansion. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/reorder', '.') |
| self.assertEqual([], results) |
| |
| def testUnexpectedHeader(self): |
| """ |
| Checks an unexpected header in a file list causes an error. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/comment', '.') |
| self.assertEqual(1, len(results)) |
| |
| def testUntrackedFiles(self): |
| """ |
| Checks that the untracked files are correctly ignored. |
| """ |
| with tempfile.TemporaryDirectory() as temp_dir: |
| with open(os.path.join(temp_dir, 'untracked.filelist'), 'w') as f: |
| f.write(_TEMP_FILELIST_CONTENTS) |
| with open(os.path.join(temp_dir, 'untracked.globlist'), 'w') as f: |
| f.write(_TEMP_GLOBLIST_CONTENTS) |
| with open(os.path.join(temp_dir, 'untracked.txt'), 'w') as f: |
| f.write('Hello, World!') |
| path = os.path.join(temp_dir, 'untracked') |
| self.mock_input_api.change.RepositoryRoot = lambda: temp_dir |
| self.mock_input_api.PresubmitLocalPath = lambda: temp_dir |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'untracked') |
| self.assertEqual([], results) |
| |
| def testExcludeDuplicates(self): |
| """ |
| Checks that duplicate filenames are not added to a filelist. |
| """ |
| results = presubmit_support.CheckBundleData(self.mock_input_api, |
| self.mock_output_api, |
| 'test_data/duplicates', '.') |
| self.assertEqual([], results) |
| |
| def testCheckOutsideGloblistDir(self): |
| """ |
| Checks that including files outside the globlist directory is an error. |
| """ |
| results = presubmit_support.CheckBundleData( |
| self.mock_input_api, self.mock_output_api, |
| 'test_data/outside_globlist_dir', '.') |
| self.assertEqual(1, len(results)) |
| |
| def testCheckIgnoreOutsideGloblistDir(self): |
| """ |
| Checks that files outside the globlist directory can be ignored. |
| """ |
| results = presubmit_support.CheckBundleData( |
| self.mock_input_api, self.mock_output_api, |
| 'test_data/ignore_outside_globlist_dir', '.') |
| self.assertEqual([], results) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |