#!/usr/bin/env python # Copyright (c) 2021 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.path import subprocess import unittest from presubmit_canned_checks_test_mocks import MockFile, MockAffectedFile from presubmit_canned_checks_test_mocks import MockInputApi, MockOutputApi from presubmit_canned_checks_test_mocks import MockChange import presubmit_canned_checks class InclusiveLanguageCheckTest(unittest.TestCase): def testBlockedTerms(self): input_api = MockInputApi() input_api.change.RepositoryRoot = lambda: '' input_api.presubmit_local_path = '' input_api.files = [ MockFile('infra/inclusive_language_presubmit_exempt_dirs.txt', [ 'some/dir 2 1', 'some/other/dir 2 1', ]), MockFile('some/ios/file.mm', ['TEST(SomeClassTest, SomeInteraction, blacklist) {', # nocheck '}']), MockFile('some/mac/file.mm', ['TEST(SomeClassTest, SomeInteraction, BlackList) {', # nocheck '}']), MockFile('another/ios_file.mm', ['class SomeTest : public testing::Test blocklist {};']), MockFile('some/ios/file_egtest.mm', ['- (void)testSomething { V(whitelist); }']), # nocheck MockFile('some/ios/file_unittest.mm', ['TEST_F(SomeTest, Whitelist) { V(allowlist); }']), # nocheck MockFile('some/doc/file.md', ['# Title', 'Some markdown text includes master.', # nocheck ]), MockFile('some/doc/ok_file.md', ['# Title', # This link contains a '//' which the matcher thinks is a # C-style comment, and the 'master' term appears after the # '//' in the URL, so it gets ignored as a side-effect. '[Ignored](https://git/project.git/+/master/foo)', # nocheck ]), MockFile('some/doc/branch_name_file.md', ['# Title', # Matches appearing before `//` still trigger the check. '[src/master](https://git/p.git/+/master/foo)', # nocheck ]), MockFile('some/java/file/TestJavaDoc.java', ['/**', ' * This line contains the word master,', # nocheck '* ignored because this is a comment. See {@link', ' * https://s/src/+/master:tools/README.md}', # nocheck ' */']), MockFile('some/java/file/TestJava.java', ['class TestJava {', ' public String master;', # nocheck '}']), MockFile('some/html/file.html', ['<-- an existing html multiline comment', 'says "master" here', # nocheck 'in the comment -->']) ] errors = presubmit_canned_checks.CheckInclusiveLanguage(input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertTrue('some/ios/file.mm' in errors[0].message) self.assertTrue('another/ios_file.mm' not in errors[0].message) self.assertTrue('some/mac/file.mm' in errors[0].message) self.assertTrue('some/ios/file_egtest.mm' in errors[0].message) self.assertTrue('some/ios/file_unittest.mm' in errors[0].message) self.assertTrue('some/doc/file.md' not in errors[0].message) self.assertTrue('some/doc/ok_file.md' not in errors[0].message) self.assertTrue('some/doc/branch_name_file.md' not in errors[0].message) self.assertTrue('some/java/file/TestJavaDoc.java' not in errors[0].message) self.assertTrue('some/java/file/TestJava.java' not in errors[0].message) self.assertTrue('some/html/file.html' not in errors[0].message) def testBlockedTermsWithLegacy(self): input_api = MockInputApi() input_api.change.RepositoryRoot = lambda: '' input_api.presubmit_local_path = '' input_api.files = [ MockFile('infra/inclusive_language_presubmit_exempt_dirs.txt', [ 'some/ios 2 1', 'some/other/dir 2 1', ]), MockFile('some/ios/file.mm', ['TEST(SomeClassTest, SomeInteraction, blacklist) {', # nocheck '}']), MockFile('some/ios/subdir/file.mm', ['TEST(SomeClassTest, SomeInteraction, blacklist) {', # nocheck '}']), MockFile('some/mac/file.mm', ['TEST(SomeClassTest, SomeInteraction, BlackList) {', # nocheck '}']), MockFile('another/ios_file.mm', ['class SomeTest : public testing::Test blocklist {};']), MockFile('some/ios/file_egtest.mm', ['- (void)testSomething { V(whitelist); }']), # nocheck MockFile('some/ios/file_unittest.mm', ['TEST_F(SomeTest, Whitelist) { V(allowlist); }']), # nocheck ] errors = presubmit_canned_checks.CheckInclusiveLanguage(input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertTrue('some/ios/file.mm' not in errors[0].message) self.assertTrue('some/ios/subdir/file.mm' in errors[0].message) self.assertTrue('another/ios_file.mm' not in errors[0].message) self.assertTrue('some/mac/file.mm' in errors[0].message) self.assertTrue('some/ios/file_egtest.mm' not in errors[0].message) self.assertTrue('some/ios/file_unittest.mm' not in errors[0].message) def testBlockedTermsWithNocheck(self): input_api = MockInputApi() input_api.change.RepositoryRoot = lambda: '' input_api.presubmit_local_path = '' input_api.files = [ MockFile('infra/inclusive_language_presubmit_exempt_dirs.txt', [ 'some/dir 2 1', 'some/other/dir 2 1', ]), MockFile('some/ios/file.mm', ['TEST(SomeClassTest, SomeInteraction, ', ' blacklist) { // nocheck', # nocheck '}']), MockFile('some/mac/file.mm', ['TEST(SomeClassTest, SomeInteraction, ', 'BlackList) { // nocheck', # nocheck '}']), MockFile('another/ios_file.mm', ['class SomeTest : public testing::Test blocklist {};']), MockFile('some/ios/file_egtest.mm', ['- (void)testSomething { ', 'V(whitelist); } // nocheck']), # nocheck MockFile('some/ios/file_unittest.mm', ['TEST_F(SomeTest, Whitelist) // nocheck', # nocheck ' { V(allowlist); }']), MockFile('some/doc/file.md', ['Master in markdown ', # nocheck '## Subheading is okay']), MockFile('some/java/file/TestJava.java', ['class TestJava {', ' public String master; // nocheck', # nocheck '}']), MockFile('some/html/file.html', ['<-- an existing html multiline comment', 'says "master" here -->', # nocheck '']) ] errors = presubmit_canned_checks.CheckInclusiveLanguage(input_api, MockOutputApi()) self.assertEqual(0, len(errors)) def testTopLevelDirExcempt(self): input_api = MockInputApi() input_api.change.RepositoryRoot = lambda: '' input_api.presubmit_local_path = '' input_api.files = [ MockFile('infra/inclusive_language_presubmit_exempt_dirs.txt', [ '. 2 1', 'some/other/dir 2 1', ]), MockFile('presubmit_canned_checks_test.py', ['TEST(SomeClassTest, SomeInteraction, blacklist) {', # nocheck '}']), MockFile('presubmit_canned_checks.py', ['- (void)testSth { V(whitelist); } // nocheck']), # nocheck ] errors = presubmit_canned_checks.CheckInclusiveLanguage(input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertTrue('presubmit_canned_checks_test.py' in errors[0].message) self.assertTrue('presubmit_canned_checks.py' not in errors[0].message) def testChangeIsForSomeOtherRepo(self): input_api = MockInputApi() input_api.change.RepositoryRoot = lambda: 'v8' input_api.presubmit_local_path = '' input_api.files = [ MockFile('some_file', [ '# this is a blacklist', # nocheck ]), ] errors = presubmit_canned_checks.CheckInclusiveLanguage(input_api, MockOutputApi()) self.assertEqual([], errors) class DescriptionChecksTest(unittest.TestCase): def testCheckDescriptionUsesColonInsteadOfEquals(self): input_api = MockInputApi() input_api.change.RepositoryRoot = lambda: '' input_api.presubmit_local_path = '' # Verify error in case of the attempt to use "Bug=". input_api.change = MockChange([], 'Broken description\nBug=123') errors = presubmit_canned_checks.CheckDescriptionUsesColonInsteadOfEquals( input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertTrue('Bug=' in errors[0].message) # Verify error in case of the attempt to use "Fixed=". input_api.change = MockChange([], 'Broken description\nFixed=123') errors = presubmit_canned_checks.CheckDescriptionUsesColonInsteadOfEquals( input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertTrue('Fixed=' in errors[0].message) # Verify error in case of the attempt to use the lower case "bug=". input_api.change = MockChange([], 'Broken description lowercase\nbug=123') errors = presubmit_canned_checks.CheckDescriptionUsesColonInsteadOfEquals( input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertTrue('Bug=' in errors[0].message) # Verify no error in case of "Bug:" input_api.change = MockChange([], 'Correct description\nBug: 123') errors = presubmit_canned_checks.CheckDescriptionUsesColonInsteadOfEquals( input_api, MockOutputApi()) self.assertEqual(0, len(errors)) # Verify no error in case of "Fixed:" input_api.change = MockChange([], 'Correct description\nFixed: 123') errors = presubmit_canned_checks.CheckDescriptionUsesColonInsteadOfEquals( input_api, MockOutputApi()) self.assertEqual(0, len(errors)) if __name__ == '__main__': unittest.main()