|
@@ -0,0 +1,204 @@
|
|
|
+#!/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
|
|
|
+
|
|
|
+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 -->', # 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 -->', # nocheck
|
|
|
+ '<!-- in the comment -->'])
|
|
|
+ ]
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ unittest.main()
|