blob: 5245b68bb2a4841c09ef6b144e3b28d661d9e64e [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# 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
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from PRESUBMIT_test_mocks import MockFile
from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi
_SDK_BUILD_FILE = 'mojo/public/some/path/BUILD.gn'
_EDK_BUILD_FILE = 'mojo/edk/some/path/BUILD.gn'
_IRRELEVANT_BUILD_FILE = 'mojo/foo/some/path/BUILD.gn'
class AbsoluteReferencesInBuildFilesTest(unittest.TestCase):
"""Tests the checking for illegal absolute paths within SDK/EDK buildfiles.
"""
def setUp(self):
self.sdk_absolute_path = '//mojo/public/some/absolute/path'
self.sdk_relative_path = 'mojo/public/some/relative/path'
self.edk_absolute_path = '//mojo/edk/some/absolute/path'
self.edk_relative_path = 'mojo/edk/some/relative/path'
self.whitelisted_external_path = '//testing/gtest'
self.non_whitelisted_external_path = '//base'
def inputApiContainingFileWithPaths(self, filename, paths):
"""Returns a MockInputApi object with a single file having |filename| as
its name and |paths| as its contents, with each path being wrapped in a
pair of double-quotes to match the syntax for strings within BUILD.gn
files."""
contents = [ '"%s"' % path for path in paths ]
mock_file = MockFile(filename, contents)
mock_input_api = MockInputApi()
mock_input_api.files.append(mock_file)
return mock_input_api
def checkWarningWithSingleItem(self,
warning,
expected_message,
build_file,
line_num,
referenced_path):
"""Checks that |warning| has a message of |expected_message| and a single
item whose contents are the absolute path warning item for
(build_file, line_num, referenced_path)."""
self.assertEqual(expected_message, warning.message)
self.assertEqual(1, len(warning.items))
expected_item = PRESUBMIT._PathReferenceInBuildFileWarningItem(
build_file, line_num, referenced_path)
self.assertEqual(expected_item, warning.items[0])
def checkSDKAbsolutePathWarningWithSingleItem(self,
warning,
package,
build_file,
line_num,
referenced_path):
"""Checks that |warning| has the message for an absolute SDK path within
|package| and a single item whose contents are the absolute path warning
item for (build_file, line_num, referenced_path)."""
expected_message = \
PRESUBMIT._ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGES[package]
self.checkWarningWithSingleItem(warning,
expected_message,
build_file,
line_num,
referenced_path)
def testAbsoluteSDKReferenceInSDKBuildFile(self):
"""Tests that an absolute SDK path within an SDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithPaths(
_SDK_BUILD_FILE,
[ self.sdk_relative_path, self.sdk_absolute_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
self.checkSDKAbsolutePathWarningWithSingleItem(warnings[0],
'SDK',
_SDK_BUILD_FILE,
2,
self.sdk_absolute_path)
def testExternalReferenceInSDKBuildFile(self):
"""Tests that an illegal external path in an SDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithPaths(
_SDK_BUILD_FILE,
[ self.non_whitelisted_external_path, self.whitelisted_external_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
expected_message = PRESUBMIT._ILLEGAL_EXTERNAL_PATH_WARNING_MESSAGE
self.checkWarningWithSingleItem(warnings[0],
expected_message,
_SDK_BUILD_FILE,
1,
self.non_whitelisted_external_path)
def testAbsoluteEDKReferenceInSDKBuildFile(self):
"""Tests that an absolute EDK path in an SDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithPaths(
_SDK_BUILD_FILE,
[ self.edk_absolute_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
expected_message = PRESUBMIT._ILLEGAL_EXTERNAL_PATH_WARNING_MESSAGE
self.checkWarningWithSingleItem(warnings[0],
expected_message,
_SDK_BUILD_FILE,
1,
self.edk_absolute_path)
def testAbsoluteSDKReferenceInEDKBuildFile(self):
"""Tests that an absolute SDK path within an EDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithPaths(
_EDK_BUILD_FILE,
[ self.sdk_relative_path, self.sdk_absolute_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
self.checkSDKAbsolutePathWarningWithSingleItem(warnings[0],
'EDK',
_EDK_BUILD_FILE,
2,
self.sdk_absolute_path)
def testAbsoluteEDKReferenceInEDKBuildFile(self):
"""Tests that an absolute EDK path in an EDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithPaths(
_EDK_BUILD_FILE,
[ self.edk_absolute_path, self.edk_relative_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
expected_message = PRESUBMIT._ILLEGAL_EDK_ABSOLUTE_PATH_WARNING_MESSAGE
self.checkWarningWithSingleItem(warnings[0],
expected_message,
_EDK_BUILD_FILE,
1,
self.edk_absolute_path)
def testExternalReferenceInEDKBuildFile(self):
"""Tests that an external path in an EDK buildfile is not flagged."""
mock_input_api = self.inputApiContainingFileWithPaths(
_EDK_BUILD_FILE,
[ self.non_whitelisted_external_path, self.whitelisted_external_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(0, len(warnings))
def testIrrelevantBuildFile(self):
"""Tests that nothing is flagged in a non SDK/EDK buildfile."""
mock_input_api = self.inputApiContainingFileWithPaths(
_IRRELEVANT_BUILD_FILE,
[ self.sdk_absolute_path,
self.sdk_relative_path,
self.edk_absolute_path,
self.edk_relative_path,
self.non_whitelisted_external_path,
self.whitelisted_external_path ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(0, len(warnings))
class SourceSetTypesInBuildFilesTest(unittest.TestCase):
"""Tests checking of correct source set types within SDK/EDK buildfiles."""
def inputApiContainingFileWithSourceSets(self, filename, source_sets):
"""Returns a MockInputApi object containing a single file having |filename|
as its name and |source_sets| as its contents."""
mock_file = MockFile(filename, source_sets)
mock_input_api = MockInputApi()
mock_input_api.files.append(mock_file)
return mock_input_api
def checkWarningWithSingleItem(self,
warning,
package,
build_file,
line_num):
"""Checks that warning has the expected incorrect source set type message
for |package| and a single item whose contents are the incorrect source
set type item for (build_file, line_num)."""
expected_message = \
PRESUBMIT._INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGES[package]
self.assertEqual(expected_message, warning.message)
self.assertEqual(1, len(warning.items))
expected_item = PRESUBMIT._IncorrectSourceSetTypeWarningItem(
build_file, line_num)
self.assertEqual(expected_item, warning.items[0])
def testNakedSourceSetInSDKBuildFile(self):
"""Tests that a source_set within an SDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithSourceSets(
_SDK_BUILD_FILE,
[ 'mojo_sdk_source_set(', 'source_set(' ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
self.checkWarningWithSingleItem(warnings[0], 'SDK', _SDK_BUILD_FILE, 2)
def testEDKSourceSetInSDKBuildFile(self):
"""Tests that a mojo_edk_source_set within an SDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithSourceSets(
_SDK_BUILD_FILE,
[ 'mojo_sdk_source_set(', 'mojo_edk_source_set(' ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
self.checkWarningWithSingleItem(warnings[0], 'SDK', _SDK_BUILD_FILE, 2)
def testNakedSourceSetInEDKBuildFile(self):
"""Tests that a source_set within an EDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithSourceSets(
_EDK_BUILD_FILE,
[ 'source_set(', 'mojo_edk_source_set(' ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
self.checkWarningWithSingleItem(warnings[0], 'EDK', _EDK_BUILD_FILE, 1)
def testSDKSourceSetInEDKBuildFile(self):
"""Tests that a mojo_sdk_source_set within an EDK buildfile is flagged."""
mock_input_api = self.inputApiContainingFileWithSourceSets(
_EDK_BUILD_FILE,
[ 'mojo_sdk_source_set(', 'mojo_edk_source_set(' ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(1, len(warnings))
self.checkWarningWithSingleItem(warnings[0], 'EDK', _EDK_BUILD_FILE, 1)
def testIrrelevantBuildFile(self):
"""Tests that a source_set in a non-SDK/EDK buildfile isn't flagged."""
mock_input_api = self.inputApiContainingFileWithSourceSets(
_IRRELEVANT_BUILD_FILE,
[ 'source_set(' ])
warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
self.assertEqual(0, len(warnings))
if __name__ == '__main__':
unittest.main()