#!/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()