#!/usr/bin/env python3 # Copyright 2024 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import os import sys import unittest import PRESUBMIT # Append chrome source root to import `PRESUBMIT_test_mocks.py`. sys.path.append( os.path.dirname( os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) from PRESUBMIT_test_mocks import MockAffectedFile, MockInputApi, MockOutputApi _PARTITION_ALLOC_BASE_PATH = 'base/allocator/partition_allocator/src/' class PartitionAllocIncludeGuardsTest(unittest.TestCase): def _CheckForIncludeGuardsWithMock(self, filename, lines): mock_input_api = MockInputApi() mock_input_api.files = [MockAffectedFile(filename, lines)] mock_output_api = MockOutputApi() return PRESUBMIT.CheckForIncludeGuards(mock_input_api, mock_output_api) def testExpectedGuardNameDoesNotError(self): lines = [ '#ifndef PARTITION_ALLOC_RANDOM_H_', '#define PARTITION_ALLOC_RANDOM_H_', '#endif // PARTITION_ALLOC_RANDOM_H_' ] errors = self._CheckForIncludeGuardsWithMock( _PARTITION_ALLOC_BASE_PATH + 'partition_alloc/random.h', lines) self.assertEqual(0, len(errors)) def testMissingGuardErrors(self): lines = [] errors = self._CheckForIncludeGuardsWithMock( _PARTITION_ALLOC_BASE_PATH + 'partition_alloc/random.h', lines) self.assertEqual(1, len(errors)) self.assertIn('Missing include guard', errors[0].message) self.assertIn('Recommended name: PARTITION_ALLOC_RANDOM_H_', errors[0].message) def testMissingGuardInNonHeaderFileDoesNotError(self): lines = [] errors = self._CheckForIncludeGuardsWithMock( _PARTITION_ALLOC_BASE_PATH + 'partition_alloc/random.cc', lines) self.assertEqual(0, len(errors)) def testGuardNotCoveringWholeFileErrors(self): lines = [ '#ifndef PARTITION_ALLOC_RANDOM_H_', '#define PARTITION_ALLOC_RANDOM_H_', '#endif // PARTITION_ALLOC_RANDOM_H_', 'int oh_i_forgot_to_guard_this;' ] errors = self._CheckForIncludeGuardsWithMock( _PARTITION_ALLOC_BASE_PATH + 'partition_alloc/random.h', lines) self.assertEqual(1, len(errors)) self.assertIn('not covering the whole file', errors[0].message) def testMissingDefineInGuardErrors(self): lines = [ '#ifndef PARTITION_ALLOC_RANDOM_H_', 'int somehow_put_here;' '#define PARTITION_ALLOC_RANDOM_H_', '#endif // PARTITION_ALLOC_RANDOM_H_', ] errors = self._CheckForIncludeGuardsWithMock( _PARTITION_ALLOC_BASE_PATH + 'partition_alloc/random.h', lines) self.assertEqual(1, len(errors)) self.assertIn( 'Missing "#define PARTITION_ALLOC_RANDOM_H_" for include guard', errors[0].message) if __name__ == '__main__': unittest.main()