Add presubmit check to guard against assert() usage.

Example of error reporting:

Usage of assert() has been detected in the following files, please use
RTC_DCHECK() instead.
 Files:
  rtc_base/thread.cc

Bug: webrtc:6779
Change-Id: Iae08c3d7ddcc0449073752cadca19b3cf662892c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/225549
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34532}
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 21875f6..6c4a04c 100755
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1042,6 +1042,8 @@
     results.extend(
         CheckAbslMemoryInclude(input_api, output_api, non_third_party_sources))
     results.extend(
+        CheckAssertUsage(input_api, output_api, non_third_party_sources))
+    results.extend(
         CheckBannedAbslMakeUnique(input_api, output_api,
                                   non_third_party_sources))
     results.extend(
@@ -1158,6 +1160,28 @@
     return []
 
 
+def CheckAssertUsage(input_api, output_api, source_file_filter):
+    pattern = input_api.re.compile(r'\bassert\(')
+    file_filter = lambda f: (f.LocalPath().endswith(('.cc', '.h', '.m', '.mm'))
+                             and source_file_filter(f))
+
+    files = []
+    for f in input_api.AffectedFiles(include_deletes=False,
+                                     file_filter=file_filter):
+        for _, line in f.ChangedContents():
+            if pattern.search(line):
+                files.append(f.LocalPath())
+                break
+
+    if len(files):
+        return [
+            output_api.PresubmitError(
+                'Usage of assert() has been detected in the following files, '
+                'please use RTC_DCHECK() instead.\n Files:', files)
+        ]
+    return []
+
+
 def CheckAbslMemoryInclude(input_api, output_api, source_file_filter):
     pattern = input_api.re.compile(r'^#include\s*"absl/memory/memory.h"',
                                    input_api.re.MULTILINE)
diff --git a/presubmit_test.py b/presubmit_test.py
index bb93765..e7879f9 100755
--- a/presubmit_test.py
+++ b/presubmit_test.py
@@ -271,5 +271,69 @@
             f.write(content)
 
 
+class CheckAssertUsageTest(unittest.TestCase):
+    def setUp(self):
+        self.input_api = MockInputApi()
+        self.output_api = MockOutputApi()
+        self._content_with_assert = [
+            'void Foo() {',
+            '    assert(true);',
+            '}'
+        ]
+        self._content_without_assert = [
+            'void Foo() {',
+            '    RTC_CHECK(true);',
+            '}'
+        ]
+
+    def testDetectsAssertInCcFile(self):
+        self.input_api.files = [
+            MockFile('with_assert.cc', self._content_with_assert),
+            MockFile('without_assert.cc', self._content_without_assert),
+        ]
+        errors = PRESUBMIT.CheckAssertUsage(
+            self.input_api, self.output_api, lambda x: True)
+        self.assertEqual(1, len(errors))
+        self.assertEqual('with_assert.cc', errors[0].items[0])
+
+    def testDetectsAssertInHeaderFile(self):
+        self.input_api.files = [
+            MockFile('with_assert.h', self._content_with_assert),
+            MockFile('without_assert.h', self._content_without_assert),
+        ]
+        errors = PRESUBMIT.CheckAssertUsage(
+            self.input_api, self.output_api, lambda x: True)
+        self.assertEqual(1, len(errors))
+        self.assertEqual('with_assert.h', errors[0].items[0])
+
+    def testDetectsAssertInObjCFile(self):
+        self.input_api.files = [
+            MockFile('with_assert.m', self._content_with_assert),
+            MockFile('without_assert.m', self._content_without_assert),
+        ]
+        errors = PRESUBMIT.CheckAssertUsage(
+            self.input_api, self.output_api, lambda x: True)
+        self.assertEqual(1, len(errors))
+        self.assertEqual('with_assert.m', errors[0].items[0])
+
+    def testDetectsAssertInObjCppFile(self):
+        self.input_api.files = [
+            MockFile('with_assert.mm', self._content_with_assert),
+            MockFile('without_assert.mm', self._content_without_assert),
+        ]
+        errors = PRESUBMIT.CheckAssertUsage(
+            self.input_api, self.output_api, lambda x: True)
+        self.assertEqual(1, len(errors))
+        self.assertEqual('with_assert.mm', errors[0].items[0])
+
+    def testDoesntDetectAssertInOtherFiles(self):
+        self.input_api.files = [
+            MockFile('with_assert.cpp', self._content_with_assert),
+        ]
+        errors = PRESUBMIT.CheckAssertUsage(
+            self.input_api, self.output_api, lambda x: True)
+        self.assertEqual(0, len(errors))
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/presubmit_test_mocks.py b/presubmit_test_mocks.py
index b15eb74..4ed7947 100644
--- a/presubmit_test_mocks.py
+++ b/presubmit_test_mocks.py
@@ -24,13 +24,18 @@
         self.change = MockChange([], [])
         self.files = []
         self.presubmit_local_path = os.path.dirname(__file__)
+        self.re = re  # pylint: disable=invalid-name
 
     def AffectedSourceFiles(self, file_filter=None):
         return self.AffectedFiles(file_filter=file_filter)
 
     def AffectedFiles(self, file_filter=None, include_deletes=False):
-        # pylint: disable=unused-argument
-        return self.files
+        for f in self.files:
+            if file_filter and not file_filter(f):
+                continue
+            if not include_deletes and f.Action() == 'D':
+                continue
+            yield f
 
     @classmethod
     def FilterSourceFile(cls,