| #!/usr/bin/env python |
| # Copyright 2019 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.path |
| import sys |
| import unittest |
| |
| import PRESUBMIT |
| |
| file_dir_path = os.path.dirname(os.path.abspath(__file__)) |
| sys.path.insert(0, os.path.join(file_dir_path, '..', '..')) |
| from PRESUBMIT_test_mocks import MockAffectedFile |
| from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi |
| |
| _VALID_DEP = "+third_party/blink/public/platform/web_something.h," |
| _INVALID_DEP = "+third_party/blink/public/web/web_something.h," |
| _INVALID_DEP2 = "+third_party/blink/public/web/web_nothing.h," |
| |
| |
| class BlinkPublicWebUnwantedDependenciesTest(unittest.TestCase): |
| def makeInputApi(self, files): |
| input_api = MockInputApi() |
| input_api.InitFiles(files) |
| return input_api |
| |
| INVALID_DEPS_MESSAGE = ('chrome/browser cannot depend on ' |
| 'blink/public/web interfaces. Use' |
| ' blink/public/common instead.') |
| |
| def testAdditionOfUnwantedDependency(self): |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', [_INVALID_DEP], [], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual(1, len(warnings)) |
| self.assertEqual(self.INVALID_DEPS_MESSAGE, warnings[0].message) |
| self.assertEqual(1, len(warnings[0].items)) |
| |
| def testAdditionOfUnwantedDependencyInComment(self): |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', ["#" + _INVALID_DEP], [], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual([], warnings) |
| |
| def testAdditionOfValidDependency(self): |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', [_VALID_DEP], [], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual([], warnings) |
| |
| def testAdditionOfMultipleUnwantedDependency(self): |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', [_INVALID_DEP, _INVALID_DEP2], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual(1, len(warnings)) |
| self.assertEqual(self.INVALID_DEPS_MESSAGE, warnings[0].message) |
| self.assertEqual(2, len(warnings[0].items)) |
| |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', [_INVALID_DEP, _VALID_DEP], [], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual(1, len(warnings)) |
| self.assertEqual(self.INVALID_DEPS_MESSAGE, warnings[0].message) |
| self.assertEqual(1, len(warnings[0].items)) |
| |
| def testRemovalOfUnwantedDependency(self): |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', [], [_INVALID_DEP], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual([], warnings) |
| |
| def testRemovalOfValidDependency(self): |
| input_api = self.makeInputApi([ |
| MockAffectedFile('DEPS', [], [_VALID_DEP], action='M')]) |
| warnings = PRESUBMIT._CheckUnwantedDependencies(input_api, MockOutputApi()) |
| self.assertEqual([], warnings) |
| |
| |
| class InteractiveUiTestLibIncludeTest(unittest.TestCase): |
| def testAdditionOfUnwantedDependency(self): |
| lines = ['#include "ui/base/test/ui_controls.h"', |
| '#include "ui/base/test/foo.h"', |
| '#include "chrome/test/base/interactive_test_utils.h"'] |
| mock_input_api = MockInputApi() |
| mock_input_api.files = [ |
| MockAffectedFile('foo_interactive_uitest.cc', lines), |
| MockAffectedFile('foo_browsertest.cc', lines), |
| MockAffectedFile('foo_interactive_browsertest.cc', lines), |
| MockAffectedFile('foo_unittest.cc', lines) ] |
| mock_output_api = MockOutputApi() |
| errors = PRESUBMIT._CheckNoInteractiveUiTestLibInNonInteractiveUiTest( |
| mock_input_api, mock_output_api) |
| self.assertEqual(1, len(errors)) |
| # 2 lines from 2 files. |
| self.assertEqual(4, len(errors[0].items)) |
| |
| |
| class CheckBuildFilesForIndirectAshSourcesTest(unittest.TestCase): |
| MESSAGE = "Indirect sources detected." |
| |
| def testScope(self): |
| """We only complain for changes to BUILD.gn under certain directories.""" |
| |
| new_contents = [ |
| 'source_set("foo") {', |
| ' sources = [ "a/b.cc" ]', |
| '}', |
| ] |
| |
| mock_output_api = MockOutputApi() |
| mock_input_api = MockInputApi() |
| mock_input_api.files = [ |
| MockAffectedFile('BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/ash/build.cc', new_contents), |
| MockAffectedFile('chrome/browser/ash/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/ashley/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/chromeos/a/b/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/resources/ash/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/ui/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/ui/ash/foo/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/ui/chromeos/BUILD.gn', new_contents), |
| MockAffectedFile('chrome/browser/ui/webui/ash/BUILD.gn', new_contents), |
| ] |
| |
| results = PRESUBMIT._CheckBuildFilesForIndirectAshSources(mock_input_api, |
| mock_output_api) |
| |
| for result in results: |
| self.assertEqual(result.message, self.MESSAGE) |
| |
| self.assertCountEqual( |
| [r.items for r in results], |
| [["chrome/browser/ash/BUILD.gn"], |
| ["chrome/browser/chromeos/a/b/BUILD.gn"], |
| ["chrome/browser/ui/ash/foo/BUILD.gn"], |
| ["chrome/browser/ui/chromeos/BUILD.gn"], |
| ["chrome/browser/ui/webui/ash/BUILD.gn"]]) |
| |
| def testComplexFormatting(self): |
| new_contents = [ |
| 'source_set("foo") {', |
| ' sources = [ "../0", "a/1",]', |
| '\tsources += ["a/2" ]', |
| 'sources += [ # bla', |
| ' "a/3",', |
| ' ]', |
| ' # sources = ["a/b"]', |
| 'sources += # bla', |
| ' ["a/4"]#bla', |
| '}', |
| 'static_library("bar"){', |
| ' deps = []', |
| ' sources = []', |
| ' if (something) {', |
| ' sources += [', |
| '', |
| ' "a/5", "ab", "a/6","a/7",# "a/b"', |
| ' "a/8"]', |
| ' sources', |
| ' += [ "a/9" ]}', |
| '}', |
| ] |
| |
| mock_output_api = MockOutputApi() |
| mock_input_api = MockInputApi() |
| mock_input_api.files = [ |
| MockAffectedFile('chrome/browser/ash/BUILD.gn', new_contents), |
| ] |
| |
| results = PRESUBMIT._CheckBuildFilesForIndirectAshSources(mock_input_api, |
| mock_output_api) |
| |
| self.assertEqual(len(results), 1) |
| self.assertEqual(results[0].message, self.MESSAGE) |
| self.assertEqual(results[0].items, ["chrome/browser/ash/BUILD.gn"]) |
| self.assertEqual( |
| [s.lstrip() for s in results[0].long_text.splitlines()[1:]], |
| ['../0', 'a/1', 'a/2', 'a/3', 'a/4', 'a/5', 'a/6', 'a/7', 'a/8', 'a/9']) |
| |
| def testModifications(self): |
| old_contents = [ |
| 'source_set("foo") {', |
| ' sources = ["x/y", "a/b"]', |
| '}', |
| ] |
| new_contents_good = [ |
| 'source_set("foo") {', |
| ' sources = ["x/y", "ab"]', |
| '}', |
| ] |
| new_contents_bad = [ |
| 'source_set("foo") {', |
| ' sources = ["x/y", "a/b", "a/c"]', |
| '}', |
| ] |
| |
| mock_output_api = MockOutputApi() |
| mock_input_api = MockInputApi() |
| mock_input_api.files = [ |
| MockAffectedFile('chrome/browser/ash/BUILD.gn', |
| new_contents_bad, old_contents), |
| MockAffectedFile('chrome/browser/chromeos/BUILD.gn', |
| new_contents_good, old_contents), |
| ] |
| |
| results = PRESUBMIT._CheckBuildFilesForIndirectAshSources(mock_input_api, |
| mock_output_api) |
| |
| self.assertEqual(len(results), 1) |
| self.assertEqual(results[0].message, self.MESSAGE) |
| self.assertEqual(results[0].items, ["chrome/browser/ash/BUILD.gn"]) |
| self.assertEqual( |
| [s.lstrip() for s in results[0].long_text.splitlines()[1:]], |
| ['a/c']) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |