diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:20:33 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:28:57 +0000 |
commit | d17ea114e5ef69ad5d5d7413280a13e6428098aa (patch) | |
tree | 2c01a75df69f30d27b1432467cfe7c1467a498da /chromium/PRESUBMIT_test.py | |
parent | 8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (diff) | |
download | qtwebengine-chromium-d17ea114e5ef69ad5d5d7413280a13e6428098aa.tar.gz |
BASELINE: Update Chromium to 67.0.3396.47
Change-Id: Idcb1341782e417561a2473eeecc82642dafda5b7
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/PRESUBMIT_test.py')
-rwxr-xr-x | chromium/PRESUBMIT_test.py | 391 |
1 files changed, 382 insertions, 9 deletions
diff --git a/chromium/PRESUBMIT_test.py b/chromium/PRESUBMIT_test.py index 4f33a1d2a3d..997625b7789 100755 --- a/chromium/PRESUBMIT_test.py +++ b/chromium/PRESUBMIT_test.py @@ -41,10 +41,13 @@ class VersionControlConflictsTest(unittest.TestCase): class UmaHistogramChangeMatchedOrNotTest(unittest.TestCase): def testTypicalCorrectlyMatchedChange(self): diff_cc = ['UMA_HISTOGRAM_BOOL("Bla.Foo.Dummy", true)'] + diff_java = [ + 'RecordHistogram.recordBooleanHistogram("Bla.Foo.Dummy", true)'] diff_xml = ['<histogram name="Bla.Foo.Dummy"> </histogram>'] mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), MockFile('tools/metrics/histograms/histograms.xml', diff_xml), ] warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, @@ -53,15 +56,24 @@ class UmaHistogramChangeMatchedOrNotTest(unittest.TestCase): def testTypicalNotMatchedChange(self): diff_cc = ['UMA_HISTOGRAM_BOOL("Bla.Foo.Dummy", true)'] + diff_java = [ + 'RecordHistogram.recordBooleanHistogram("Bla.Foo.Dummy", true)'] mock_input_api = MockInputApi() - mock_input_api.files = [MockFile('some/path/foo.cc', diff_cc)] + mock_input_api.files = [ + MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), + ] warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, MockOutputApi()) self.assertEqual(1, len(warnings)) self.assertEqual('warning', warnings[0].type) + self.assertTrue('foo.cc' in warnings[0].items[0]) + self.assertTrue('foo.java' in warnings[0].items[1]) def testTypicalNotMatchedChangeViaSuffixes(self): diff_cc = ['UMA_HISTOGRAM_BOOL("Bla.Foo.Dummy", true)'] + diff_java = [ + 'RecordHistogram.recordBooleanHistogram("Bla.Foo.Dummy", true)'] diff_xml = ['<histogram_suffixes name="SuperHistogram">', ' <suffix name="Dummy"/>', ' <affected-histogram name="Snafu.Dummy"/>', @@ -69,15 +81,20 @@ class UmaHistogramChangeMatchedOrNotTest(unittest.TestCase): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), MockFile('tools/metrics/histograms/histograms.xml', diff_xml), ] warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, MockOutputApi()) self.assertEqual(1, len(warnings)) self.assertEqual('warning', warnings[0].type) + self.assertTrue('foo.cc' in warnings[0].items[0]) + self.assertTrue('foo.java' in warnings[0].items[1]) def testTypicalCorrectlyMatchedChangeViaSuffixes(self): diff_cc = ['UMA_HISTOGRAM_BOOL("Bla.Foo.Dummy", true)'] + diff_java = [ + 'RecordHistogram.recordBooleanHistogram("Bla.Foo.Dummy", true)'] diff_xml = ['<histogram_suffixes name="SuperHistogram">', ' <suffix name="Dummy"/>', ' <affected-histogram name="Bla.Foo"/>', @@ -85,6 +102,7 @@ class UmaHistogramChangeMatchedOrNotTest(unittest.TestCase): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), MockFile('tools/metrics/histograms/histograms.xml', diff_xml), ] warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, @@ -93,6 +111,7 @@ class UmaHistogramChangeMatchedOrNotTest(unittest.TestCase): def testTypicalCorrectlyMatchedChangeViaSuffixesWithSeparator(self): diff_cc = ['UMA_HISTOGRAM_BOOL("Snafu_Dummy", true)'] + diff_java = ['RecordHistogram.recordBooleanHistogram("Snafu_Dummy", true)'] diff_xml = ['<histogram_suffixes name="SuperHistogram" separator="_">', ' <suffix name="Dummy"/>', ' <affected-histogram name="Snafu"/>', @@ -100,12 +119,64 @@ class UmaHistogramChangeMatchedOrNotTest(unittest.TestCase): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), MockFile('tools/metrics/histograms/histograms.xml', diff_xml), ] warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, MockOutputApi()) self.assertEqual(0, len(warnings)) + def testNameMatch(self): + # Check that the detected histogram name is "Dummy" and not, e.g., + # "Dummy\", true); // The \"correct" + diff_cc = ['UMA_HISTOGRAM_BOOL("Dummy", true); // The "correct" histogram'] + diff_java = [ + 'RecordHistogram.recordBooleanHistogram("Dummy", true);' + + ' // The "correct" histogram'] + diff_xml = ['<histogram name="Dummy"> </histogram>'] + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), + MockFile('tools/metrics/histograms/histograms.xml', diff_xml), + ] + warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, + MockOutputApi()) + self.assertEqual(0, len(warnings)) + + def testSimilarMacroNames(self): + diff_cc = ['PUMA_HISTOGRAM_COOL("Mountain Lion", 42)'] + diff_java = [ + 'FakeRecordHistogram.recordFakeHistogram("Mountain Lion", 42)'] + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo.java', diff_java), + ] + warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, + MockOutputApi()) + self.assertEqual(0, len(warnings)) + + def testMultiLine(self): + diff_cc = ['UMA_HISTOGRAM_BOOLEAN(', ' "Multi.Line", true)'] + diff_cc2 = ['UMA_HISTOGRAM_BOOLEAN(', ' "Multi.Line"', ' , true)'] + diff_java = [ + 'RecordHistogram.recordBooleanHistogram(', + ' "Multi.Line", true);', + ] + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('some/path/foo.cc', diff_cc), + MockFile('some/path/foo2.cc', diff_cc2), + MockFile('some/path/foo.java', diff_java), + ] + warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, + MockOutputApi()) + self.assertEqual(1, len(warnings)) + self.assertEqual('warning', warnings[0].type) + self.assertTrue('foo.cc' in warnings[0].items[0]) + self.assertTrue('foo2.cc' in warnings[0].items[1]) + class BadExtensionsTest(unittest.TestCase): def testBadRejFile(self): mock_input_api = MockInputApi() @@ -503,7 +574,6 @@ class TryServerMasterTest(unittest.TestCase): 'android_chromium_variable_nexus4', 'android_clang_dbg_recipe', 'android_compile_dbg', - 'android_compile_mips_dbg', 'android_compile_x64_dbg', 'android_compile_x86_dbg', 'android_coverage', @@ -656,10 +726,21 @@ class PydepsNeedsUpdatingTest(unittest.TestCase): MockAffectedFile('new.pydeps', [], action='A'), ] + self.mock_input_api.CreateMockFileInPath( + [x.LocalPath() for x in self.mock_input_api.AffectedFiles( + include_deletes=True)]) results = self._RunCheck() self.assertEqual(1, len(results)) self.assertTrue('PYDEPS_FILES' in str(results[0])) + def testPydepNotInSrc(self): + self.mock_input_api.files = [ + MockAffectedFile('new.pydeps', [], action='A'), + ] + self.mock_input_api.CreateMockFileInPath([]) + results = self._RunCheck() + self.assertEqual(0, len(results)) + def testRemovedPydep(self): # PRESUBMIT._CheckPydepsNeedsUpdating is only implemented for Android. if self.mock_input_api.platform != 'linux2': @@ -668,7 +749,9 @@ class PydepsNeedsUpdatingTest(unittest.TestCase): self.mock_input_api.files = [ MockAffectedFile(PRESUBMIT._ALL_PYDEPS_FILES[0], [], action='D'), ] - + self.mock_input_api.CreateMockFileInPath( + [x.LocalPath() for x in self.mock_input_api.AffectedFiles( + include_deletes=True)]) results = self._RunCheck() self.assertEqual(1, len(results)) self.assertTrue('PYDEPS_FILES' in str(results[0])) @@ -741,6 +824,152 @@ class PydepsNeedsUpdatingTest(unittest.TestCase): self.assertTrue('File is stale' in str(results[0])) self.assertTrue('File is stale' in str(results[1])) +class IncludeGuardTest(unittest.TestCase): + def testIncludeGuardChecks(self): + mock_input_api = MockInputApi() + mock_output_api = MockOutputApi() + mock_input_api.files = [ + MockAffectedFile('content/browser/thing/foo.h', [ + '// Comment', + '#ifndef CONTENT_BROWSER_THING_FOO_H_', + '#define CONTENT_BROWSER_THING_FOO_H_', + 'struct McBoatFace;', + '#endif // CONTENT_BROWSER_THING_FOO_H_', + ]), + MockAffectedFile('content/browser/thing/bar.h', [ + '#ifndef CONTENT_BROWSER_THING_BAR_H_', + '#define CONTENT_BROWSER_THING_BAR_H_', + 'namespace content {', + '#endif // CONTENT_BROWSER_THING_BAR_H_', + '} // namespace content', + ]), + MockAffectedFile('content/browser/test1.h', [ + 'namespace content {', + '} // namespace content', + ]), + MockAffectedFile('content\\browser\\win.h', [ + '#ifndef CONTENT_BROWSER_WIN_H_', + '#define CONTENT_BROWSER_WIN_H_', + 'struct McBoatFace;', + '#endif // CONTENT_BROWSER_WIN_H_', + ]), + MockAffectedFile('content/browser/test2.h', [ + '// Comment', + '#ifndef CONTENT_BROWSER_TEST2_H_', + 'struct McBoatFace;', + '#endif // CONTENT_BROWSER_TEST2_H_', + ]), + MockAffectedFile('content/browser/internal.h', [ + '// Comment', + '#ifndef CONTENT_BROWSER_INTERNAL_H_', + '#define CONTENT_BROWSER_INTERNAL_H_', + '// Comment', + '#ifndef INTERNAL_CONTENT_BROWSER_INTERNAL_H_', + '#define INTERNAL_CONTENT_BROWSER_INTERNAL_H_', + 'namespace internal {', + '} // namespace internal', + '#endif // INTERNAL_CONTENT_BROWSER_THING_BAR_H_', + 'namespace content {', + '} // namespace content', + '#endif // CONTENT_BROWSER_THING_BAR_H_', + ]), + MockAffectedFile('content/browser/thing/foo.cc', [ + '// This is a non-header.', + ]), + MockAffectedFile('content/browser/disabled.h', [ + '// no-include-guard-because-multiply-included', + 'struct McBoatFace;', + ]), + # New files don't allow misspelled include guards. + MockAffectedFile('content/browser/spleling.h', [ + '#ifndef CONTENT_BROWSER_SPLLEING_H_', + '#define CONTENT_BROWSER_SPLLEING_H_', + 'struct McBoatFace;', + '#endif // CONTENT_BROWSER_SPLLEING_H_', + ]), + # Old files allow misspelled include guards (for now). + MockAffectedFile('chrome/old.h', [ + '// New contents', + '#ifndef CHROME_ODL_H_', + '#define CHROME_ODL_H_', + '#endif // CHROME_ODL_H_', + ], [ + '// Old contents', + '#ifndef CHROME_ODL_H_', + '#define CHROME_ODL_H_', + '#endif // CHROME_ODL_H_', + ]), + # Using a Blink style include guard outside Blink is wrong. + MockAffectedFile('content/NotInBlink.h', [ + '#ifndef NotInBlink_h', + '#define NotInBlink_h', + 'struct McBoatFace;', + '#endif // NotInBlink_h', + ]), + # Using a Blink style include guard in Blink is ok for now. + MockAffectedFile('third_party/WebKit/InBlink.h', [ + '#ifndef InBlink_h', + '#define InBlink_h', + 'struct McBoatFace;', + '#endif // InBlink_h', + ]), + # Using a bad include guard in Blink is not ok. + MockAffectedFile('third_party/WebKit/AlsoInBlink.h', [ + '#ifndef WrongInBlink_h', + '#define WrongInBlink_h', + 'struct McBoatFace;', + '#endif // WrongInBlink_h', + ]), + # Using a bad include guard in Blink is accepted if it's an old file. + MockAffectedFile('third_party/WebKit/StillInBlink.h', [ + '// New contents', + '#ifndef AcceptedInBlink_h', + '#define AcceptedInBlink_h', + 'struct McBoatFace;', + '#endif // AcceptedInBlink_h', + ], [ + '// Old contents', + '#ifndef AcceptedInBlink_h', + '#define AcceptedInBlink_h', + 'struct McBoatFace;', + '#endif // AcceptedInBlink_h', + ]), + ] + msgs = PRESUBMIT._CheckForIncludeGuards( + mock_input_api, mock_output_api) + expected_fail_count = 6 + self.assertEqual(expected_fail_count, len(msgs), + 'Expected %d items, found %d: %s' + % (expected_fail_count, len(msgs), msgs)) + self.assertEqual(msgs[0].items, [ 'content/browser/thing/bar.h' ]) + self.assertEqual(msgs[0].message, + 'Include guard CONTENT_BROWSER_THING_BAR_H_ ' + 'not covering the whole file') + + self.assertEqual(msgs[1].items, [ 'content/browser/test1.h' ]) + self.assertEqual(msgs[1].message, + 'Missing include guard CONTENT_BROWSER_TEST1_H_') + + self.assertEqual(msgs[2].items, [ 'content/browser/test2.h:3' ]) + self.assertEqual(msgs[2].message, + 'Missing "#define CONTENT_BROWSER_TEST2_H_" for ' + 'include guard') + + self.assertEqual(msgs[3].items, [ 'content/browser/spleling.h:1' ]) + self.assertEqual(msgs[3].message, + 'Header using the wrong include guard name ' + 'CONTENT_BROWSER_SPLLEING_H_') + + self.assertEqual(msgs[4].items, [ 'content/NotInBlink.h:1' ]) + self.assertEqual(msgs[4].message, + 'Header using the wrong include guard name ' + 'NotInBlink_h') + + self.assertEqual(msgs[5].items, [ 'third_party/WebKit/AlsoInBlink.h:1' ]) + self.assertEqual(msgs[5].message, + 'Header using the wrong include guard name ' + 'WrongInBlink_h') + class AndroidDeprecatedTestAnnotationTest(unittest.TestCase): def testCheckAndroidTestAnnotationUsage(self): mock_input_api = MockInputApi() @@ -850,11 +1079,11 @@ class AndroidJUnitBaseClass(unittest.TestCase): 'public class IncorrectTest extends TestCase {', '}', ]), - MockAffectedFile('IncorrectTestWithInterface.java', [ + MockAffectedFile('IncorrectWithInterfaceTest.java', [ 'public class Test implements X extends BaseClass {', '}', ]), - MockAffectedFile('IncorrectTestMultiLine.java', [ + MockAffectedFile('IncorrectMultiLineTest.java', [ 'public class Test implements X, Y, Z', ' extends TestBase {', '}', @@ -870,11 +1099,11 @@ class AndroidJUnitBaseClass(unittest.TestCase): % (3, len(msgs[0].items), msgs[0].items)) self.assertTrue('IncorrectTest.java:1' in msgs[0].items, 'IncorrectTest not found in errors') - self.assertTrue('IncorrectTestWithInterface.java:1' + self.assertTrue('IncorrectWithInterfaceTest.java:1' in msgs[0].items, - 'IncorrectTestWithInterface not found in errors') - self.assertTrue('IncorrectTestMultiLine.java:2' in msgs[0].items, - 'IncorrectTestMultiLine not found in errors') + 'IncorrectWithInterfaceTest not found in errors') + self.assertTrue('IncorrectMultiLineTest.java:2' in msgs[0].items, + 'IncorrectMultiLineTest not found in errors') class LogUsageTest(unittest.TestCase): @@ -1329,5 +1558,149 @@ class BannedFunctionCheckTest(unittest.TestCase): self.assertTrue('some/mac/file.mm' not in errors[0].message) +class NoProductionCodeUsingTestOnlyFunctions(unittest.TestCase): + def testTruePositives(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('some/path/foo.cc', ['foo_for_testing();']), + MockFile('some/path/foo.mm', ['FooForTesting();']), + MockFile('some/path/foo.cxx', ['FooForTests();']), + MockFile('some/path/foo.cpp', ['foo_for_test();']), + ] + + results = PRESUBMIT._CheckNoProductionCodeUsingTestOnlyFunctions( + mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results)) + self.assertEqual(4, len(results[0].items)) + self.assertTrue('foo.cc' in results[0].items[0]) + self.assertTrue('foo.mm' in results[0].items[1]) + self.assertTrue('foo.cxx' in results[0].items[2]) + self.assertTrue('foo.cpp' in results[0].items[3]) + + def testFalsePositives(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('some/path/foo.h', ['foo_for_testing();']), + MockFile('some/path/foo.mm', ['FooForTesting() {']), + MockFile('some/path/foo.cc', ['::FooForTests();']), + MockFile('some/path/foo.cpp', ['// foo_for_test();']), + ] + + results = PRESUBMIT._CheckNoProductionCodeUsingTestOnlyFunctions( + mock_input_api, MockOutputApi()) + self.assertEqual(0, len(results)) + + +class NoProductionJavaCodeUsingTestOnlyFunctions(unittest.TestCase): + def testTruePositives(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('dir/java/src/foo.java', ['FooForTesting();']), + MockFile('dir/java/src/bar.java', ['FooForTests(x);']), + MockFile('dir/java/src/baz.java', ['FooForTest(','y',');']), + MockFile('dir/java/src/mult.java', [ + 'int x = SomethingLongHere()', + ' * SomethingLongHereForTesting();' + ]), + ] + + results = PRESUBMIT._CheckNoProductionCodeUsingTestOnlyFunctionsJava( + mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results)) + self.assertEqual(4, len(results[0].items)) + self.assertTrue('foo.java' in results[0].items[0]) + self.assertTrue('bar.java' in results[0].items[1]) + self.assertTrue('baz.java' in results[0].items[2]) + self.assertTrue('mult.java' in results[0].items[3]) + + def testFalsePositives(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('dir/java/src/foo.xml', ['FooForTesting();']), + MockFile('dir/java/src/foo.java', ['FooForTests() {']), + MockFile('dir/java/src/bar.java', ['// FooForTest();']), + MockFile('dir/java/src/bar2.java', ['x = 1; // FooForTest();']), + MockFile('dir/javatests/src/baz.java', ['FooForTest(','y',');']), + MockFile('dir/junit/src/baz.java', ['FooForTest(','y',');']), + MockFile('dir/junit/src/javadoc.java', [ + '/** Use FooForTest(); to obtain foo in tests.' + ' */' + ]), + MockFile('dir/junit/src/javadoc2.java', [ + '/** ', + ' * Use FooForTest(); to obtain foo in tests.' + ' */' + ]), + ] + + results = PRESUBMIT._CheckNoProductionCodeUsingTestOnlyFunctionsJava( + mock_input_api, MockOutputApi()) + self.assertEqual(0, len(results)) + + +class CheckUniquePtr(unittest.TestCase): + def testTruePositivesNullptr(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('dir/baz.cc', ['std::unique_ptr<T>()']), + MockFile('dir/baz-p.cc', ['std::unique_ptr<T<P>>()']), + ] + + results = PRESUBMIT._CheckUniquePtr(mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results)) + self.assertTrue('nullptr' in results[0].message) + self.assertEqual(2, len(results[0].items)) + self.assertTrue('baz.cc' in results[0].items[0]) + self.assertTrue('baz-p.cc' in results[0].items[1]) + + def testTruePositivesConstructor(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('dir/foo.cc', ['return std::unique_ptr<T>(foo);']), + MockFile('dir/bar.mm', ['bar = std::unique_ptr<T>(foo)']), + MockFile('dir/mult.cc', [ + 'return', + ' std::unique_ptr<T>(barVeryVeryLongFooSoThatItWouldNotFitAbove);' + ]), + MockFile('dir/mult2.cc', [ + 'barVeryVeryLongLongBaaaaaarSoThatTheLineLimitIsAlmostReached =', + ' std::unique_ptr<T>(foo);' + ]), + MockFile('dir/mult3.cc', [ + 'bar = std::unique_ptr<T>(', + ' fooVeryVeryVeryLongStillGoingWellThisWillTakeAWhileFinallyThere);' + ]), + ] + + results = PRESUBMIT._CheckUniquePtr(mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results)) + self.assertTrue('std::make_unique' in results[0].message) + self.assertEqual(5, len(results[0].items)) + self.assertTrue('foo.cc' in results[0].items[0]) + self.assertTrue('bar.mm' in results[0].items[1]) + self.assertTrue('mult.cc' in results[0].items[2]) + self.assertTrue('mult2.cc' in results[0].items[3]) + self.assertTrue('mult3.cc' in results[0].items[4]) + + def testFalsePositives(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('dir/foo.cc', ['return std::unique_ptr<T[]>(foo);']), + MockFile('dir/bar.mm', ['bar = std::unique_ptr<T[]>(foo)']), + MockFile('dir/file.cc', ['std::unique_ptr<T> p = Foo();']), + MockFile('dir/baz.cc', [ + 'std::unique_ptr<T> result = std::make_unique<T>();' + ]), + MockFile('dir/baz2.cc', [ + 'std::unique_ptr<T> result = std::make_unique<T>(' + ]), + MockFile('dir/nested.cc', ['set<std::unique_ptr<T>>();']), + MockFile('dir/nested2.cc', ['map<U, std::unique_ptr<T>>();']), + ] + + results = PRESUBMIT._CheckUniquePtr(mock_input_api, MockOutputApi()) + self.assertEqual(0, len(results)) + + if __name__ == '__main__': unittest.main() |