Find #include "foo.cc" with a presubmit check

An #include "foo.cc" will often compile, until it causes linking
problems later, for instance in jumbo builds. The error messages are
then not good at pointing out what is wrong.

Change-Id: Ic155dc5542e22b54d13c213230d6df4977263642
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1566344
Commit-Queue: Daniel Bratell <bratell@opera.com>
Reviewed-by: Jochen Eisinger <jochen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#653105}
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index 623b87a9..efd12ce0 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -1507,6 +1507,82 @@
     self.assertEqual(1, len(errors))
 
 
+class CCIncludeTest(unittest.TestCase):
+  def testThirdPartyNotBlinkIgnored(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockAffectedFile('third_party/test.cpp', '#include "file.cc"'),
+    ]
+
+    mock_output_api = MockOutputApi()
+
+    errors = PRESUBMIT._CheckForCcIncludes(
+        mock_input_api, mock_output_api)
+    self.assertEqual(0, len(errors))
+
+  def testPythonFileIgnored(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockAffectedFile('test.py', '#include "file.cc"'),
+    ]
+
+    mock_output_api = MockOutputApi()
+
+    errors = PRESUBMIT._CheckForCcIncludes(
+        mock_input_api, mock_output_api)
+    self.assertEqual(0, len(errors))
+
+  def testIncFilesAccepted(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockAffectedFile('test.py', '#include "file.inc"'),
+    ]
+
+    mock_output_api = MockOutputApi()
+
+    errors = PRESUBMIT._CheckForCcIncludes(
+        mock_input_api, mock_output_api)
+    self.assertEqual(0, len(errors))
+
+  def testInnocuousChangesAllowed(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockAffectedFile('test.cpp', '#include "header.h"'),
+      MockAffectedFile('test2.cpp', 'Something "file.cc"'),
+    ]
+
+    mock_output_api = MockOutputApi()
+
+    errors = PRESUBMIT._CheckForCcIncludes(
+        mock_input_api, mock_output_api)
+    self.assertEqual(0, len(errors))
+
+  def testCcIncludeNonBlinkProducesError(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockAffectedFile('test.cpp', ['#include "file.cc"']),
+    ]
+
+    mock_output_api = MockOutputApi()
+
+    errors = PRESUBMIT._CheckForCcIncludes(
+        mock_input_api, mock_output_api)
+    self.assertEqual(1, len(errors))
+
+  def testCppIncludeBlinkProducesError(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+      MockAffectedFile('third_party/blink/test.cpp',
+                       ['#include "foo/file.cpp"']),
+    ]
+
+    mock_output_api = MockOutputApi()
+
+    errors = PRESUBMIT._CheckForCcIncludes(
+        mock_input_api, mock_output_api)
+    self.assertEqual(1, len(errors))
+
+
 class NewHeaderWithoutGnChangeTest(unittest.TestCase):
   def testAddHeaderWithoutGn(self):
     mock_input_api = MockInputApi()