xref: /aosp_15_r20/external/webrtc/presubmit_test.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker#!/usr/bin/env vpython3
2*d9f75844SAndroid Build Coastguard Worker
3*d9f75844SAndroid Build Coastguard Worker#  Copyright 2017 The WebRTC project authors. All Rights Reserved.
4*d9f75844SAndroid Build Coastguard Worker#
5*d9f75844SAndroid Build Coastguard Worker#  Use of this source code is governed by a BSD-style license
6*d9f75844SAndroid Build Coastguard Worker#  that can be found in the LICENSE file in the root of the source
7*d9f75844SAndroid Build Coastguard Worker#  tree. An additional intellectual property rights grant can be found
8*d9f75844SAndroid Build Coastguard Worker#  in the file PATENTS.  All contributing project authors may
9*d9f75844SAndroid Build Coastguard Worker#  be found in the AUTHORS file in the root of the source tree.
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Workerfrom __future__ import absolute_import
12*d9f75844SAndroid Build Coastguard Workerimport os
13*d9f75844SAndroid Build Coastguard Workerimport shutil
14*d9f75844SAndroid Build Coastguard Workerimport tempfile
15*d9f75844SAndroid Build Coastguard Workerimport textwrap
16*d9f75844SAndroid Build Coastguard Workerimport unittest
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Workerimport PRESUBMIT
19*d9f75844SAndroid Build Coastguard Worker# pylint: disable=line-too-long
20*d9f75844SAndroid Build Coastguard Workerfrom presubmit_test_mocks import MockInputApi, MockOutputApi, MockFile, MockChange
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker
23*d9f75844SAndroid Build Coastguard Workerclass CheckBugEntryFieldTest(unittest.TestCase):
24*d9f75844SAndroid Build Coastguard Worker  def testCommitMessageBugEntryWithNoError(self):
25*d9f75844SAndroid Build Coastguard Worker    mock_input_api = MockInputApi()
26*d9f75844SAndroid Build Coastguard Worker    mock_output_api = MockOutputApi()
27*d9f75844SAndroid Build Coastguard Worker    mock_input_api.change = MockChange([], ['webrtc:1234'])
28*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
29*d9f75844SAndroid Build Coastguard Worker                                                  mock_output_api)
30*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
31*d9f75844SAndroid Build Coastguard Worker
32*d9f75844SAndroid Build Coastguard Worker  def testCommitMessageBugEntryReturnError(self):
33*d9f75844SAndroid Build Coastguard Worker    mock_input_api = MockInputApi()
34*d9f75844SAndroid Build Coastguard Worker    mock_output_api = MockOutputApi()
35*d9f75844SAndroid Build Coastguard Worker    mock_input_api.change = MockChange([], ['webrtc:1234', 'webrtc=4321'])
36*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
37*d9f75844SAndroid Build Coastguard Worker                                                  mock_output_api)
38*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
39*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(('Bogus Bug entry: webrtc=4321. Please specify'
40*d9f75844SAndroid Build Coastguard Worker                      ' the issue tracker prefix and the issue number,'
41*d9f75844SAndroid Build Coastguard Worker                      ' separated by a colon, e.g. webrtc:123 or'
42*d9f75844SAndroid Build Coastguard Worker                      ' chromium:12345.'), str(errors[0]))
43*d9f75844SAndroid Build Coastguard Worker
44*d9f75844SAndroid Build Coastguard Worker  def testCommitMessageBugEntryWithoutPrefix(self):
45*d9f75844SAndroid Build Coastguard Worker    mock_input_api = MockInputApi()
46*d9f75844SAndroid Build Coastguard Worker    mock_output_api = MockOutputApi()
47*d9f75844SAndroid Build Coastguard Worker    mock_input_api.change = MockChange([], ['1234'])
48*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
49*d9f75844SAndroid Build Coastguard Worker                                                  mock_output_api)
50*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
51*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(('Bug entry requires issue tracker prefix, '
52*d9f75844SAndroid Build Coastguard Worker                      'e.g. webrtc:1234'), str(errors[0]))
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker  def testCommitMessageBugEntryIsNone(self):
55*d9f75844SAndroid Build Coastguard Worker    mock_input_api = MockInputApi()
56*d9f75844SAndroid Build Coastguard Worker    mock_output_api = MockOutputApi()
57*d9f75844SAndroid Build Coastguard Worker    mock_input_api.change = MockChange([], ['None'])
58*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
59*d9f75844SAndroid Build Coastguard Worker                                                  mock_output_api)
60*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker  def testCommitMessageBugEntrySupportInternalBugReference(self):
63*d9f75844SAndroid Build Coastguard Worker    mock_input_api = MockInputApi()
64*d9f75844SAndroid Build Coastguard Worker    mock_output_api = MockOutputApi()
65*d9f75844SAndroid Build Coastguard Worker    mock_input_api.change.BUG = 'b/12345'
66*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
67*d9f75844SAndroid Build Coastguard Worker                                                  mock_output_api)
68*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
69*d9f75844SAndroid Build Coastguard Worker    mock_input_api.change.BUG = 'b/12345, webrtc:1234'
70*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
71*d9f75844SAndroid Build Coastguard Worker                                                  mock_output_api)
72*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
73*d9f75844SAndroid Build Coastguard Worker
74*d9f75844SAndroid Build Coastguard Worker
75*d9f75844SAndroid Build Coastguard Workerclass CheckNewlineAtTheEndOfProtoFilesTest(unittest.TestCase):
76*d9f75844SAndroid Build Coastguard Worker  def setUp(self):
77*d9f75844SAndroid Build Coastguard Worker    self.tmp_dir = tempfile.mkdtemp()
78*d9f75844SAndroid Build Coastguard Worker    self.proto_file_path = os.path.join(self.tmp_dir, 'foo.proto')
79*d9f75844SAndroid Build Coastguard Worker    self.input_api = MockInputApi()
80*d9f75844SAndroid Build Coastguard Worker    self.output_api = MockOutputApi()
81*d9f75844SAndroid Build Coastguard Worker
82*d9f75844SAndroid Build Coastguard Worker  def tearDown(self):
83*d9f75844SAndroid Build Coastguard Worker    shutil.rmtree(self.tmp_dir, ignore_errors=True)
84*d9f75844SAndroid Build Coastguard Worker
85*d9f75844SAndroid Build Coastguard Worker  def testErrorIfProtoFileDoesNotEndWithNewline(self):
86*d9f75844SAndroid Build Coastguard Worker    self._GenerateProtoWithoutNewlineAtTheEnd()
87*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [MockFile(self.proto_file_path)]
88*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckNewlineAtTheEndOfProtoFiles(
89*d9f75844SAndroid Build Coastguard Worker        self.input_api, self.output_api, lambda x: True)
90*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
91*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(
92*d9f75844SAndroid Build Coastguard Worker        'File %s must end with exactly one newline.' % self.proto_file_path,
93*d9f75844SAndroid Build Coastguard Worker        str(errors[0]))
94*d9f75844SAndroid Build Coastguard Worker
95*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfProtoFileEndsWithNewline(self):
96*d9f75844SAndroid Build Coastguard Worker    self._GenerateProtoWithNewlineAtTheEnd()
97*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [MockFile(self.proto_file_path)]
98*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckNewlineAtTheEndOfProtoFiles(
99*d9f75844SAndroid Build Coastguard Worker        self.input_api, self.output_api, lambda x: True)
100*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
101*d9f75844SAndroid Build Coastguard Worker
102*d9f75844SAndroid Build Coastguard Worker  def _GenerateProtoWithNewlineAtTheEnd(self):
103*d9f75844SAndroid Build Coastguard Worker    with open(self.proto_file_path, 'w') as f:
104*d9f75844SAndroid Build Coastguard Worker      f.write(
105*d9f75844SAndroid Build Coastguard Worker          textwrap.dedent("""
106*d9f75844SAndroid Build Coastguard Worker        syntax = "proto2";
107*d9f75844SAndroid Build Coastguard Worker        option optimize_for = LITE_RUNTIME;
108*d9f75844SAndroid Build Coastguard Worker        package webrtc.audioproc;
109*d9f75844SAndroid Build Coastguard Worker      """))
110*d9f75844SAndroid Build Coastguard Worker
111*d9f75844SAndroid Build Coastguard Worker  def _GenerateProtoWithoutNewlineAtTheEnd(self):
112*d9f75844SAndroid Build Coastguard Worker    with open(self.proto_file_path, 'w') as f:
113*d9f75844SAndroid Build Coastguard Worker      f.write(
114*d9f75844SAndroid Build Coastguard Worker          textwrap.dedent("""
115*d9f75844SAndroid Build Coastguard Worker        syntax = "proto2";
116*d9f75844SAndroid Build Coastguard Worker        option optimize_for = LITE_RUNTIME;
117*d9f75844SAndroid Build Coastguard Worker        package webrtc.audioproc;"""))
118*d9f75844SAndroid Build Coastguard Worker
119*d9f75844SAndroid Build Coastguard Worker
120*d9f75844SAndroid Build Coastguard Workerclass CheckNoMixingSourcesTest(unittest.TestCase):
121*d9f75844SAndroid Build Coastguard Worker  def setUp(self):
122*d9f75844SAndroid Build Coastguard Worker    self.tmp_dir = tempfile.mkdtemp()
123*d9f75844SAndroid Build Coastguard Worker    self.file_path = os.path.join(self.tmp_dir, 'BUILD.gn')
124*d9f75844SAndroid Build Coastguard Worker    self.input_api = MockInputApi()
125*d9f75844SAndroid Build Coastguard Worker    self.output_api = MockOutputApi()
126*d9f75844SAndroid Build Coastguard Worker
127*d9f75844SAndroid Build Coastguard Worker  def tearDown(self):
128*d9f75844SAndroid Build Coastguard Worker    shutil.rmtree(self.tmp_dir, ignore_errors=True)
129*d9f75844SAndroid Build Coastguard Worker
130*d9f75844SAndroid Build Coastguard Worker  def testErrorIfCAndCppAreMixed(self):
131*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(1, ['foo.c', 'bar.cc', 'bar.h'])
132*d9f75844SAndroid Build Coastguard Worker
133*d9f75844SAndroid Build Coastguard Worker  def testErrorIfCAndObjCAreMixed(self):
134*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(1, ['foo.c', 'bar.m', 'bar.h'])
135*d9f75844SAndroid Build Coastguard Worker
136*d9f75844SAndroid Build Coastguard Worker  def testErrorIfCAndObjCppAreMixed(self):
137*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(1, ['foo.c', 'bar.mm', 'bar.h'])
138*d9f75844SAndroid Build Coastguard Worker
139*d9f75844SAndroid Build Coastguard Worker  def testErrorIfCppAndObjCAreMixed(self):
140*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(1, ['foo.cc', 'bar.m', 'bar.h'])
141*d9f75844SAndroid Build Coastguard Worker
142*d9f75844SAndroid Build Coastguard Worker  def testErrorIfCppAndObjCppAreMixed(self):
143*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(1, ['foo.cc', 'bar.mm', 'bar.h'])
144*d9f75844SAndroid Build Coastguard Worker
145*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfOnlyC(self):
146*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(0, ['foo.c', 'bar.c', 'bar.h'])
147*d9f75844SAndroid Build Coastguard Worker
148*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfOnlyCpp(self):
149*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(0, ['foo.cc', 'bar.cc', 'bar.h'])
150*d9f75844SAndroid Build Coastguard Worker
151*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfOnlyObjC(self):
152*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(0, ['foo.m', 'bar.m', 'bar.h'])
153*d9f75844SAndroid Build Coastguard Worker
154*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfOnlyObjCpp(self):
155*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(0, ['foo.mm', 'bar.mm', 'bar.h'])
156*d9f75844SAndroid Build Coastguard Worker
157*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfObjCAndObjCppAreMixed(self):
158*d9f75844SAndroid Build Coastguard Worker    self._AssertNumberOfErrorsWithSources(0, ['foo.m', 'bar.mm', 'bar.h'])
159*d9f75844SAndroid Build Coastguard Worker
160*d9f75844SAndroid Build Coastguard Worker  def testNoErrorIfSourcesAreInExclusiveIfBranches(self):
161*d9f75844SAndroid Build Coastguard Worker    self._GenerateBuildFile(
162*d9f75844SAndroid Build Coastguard Worker        textwrap.dedent("""
163*d9f75844SAndroid Build Coastguard Worker      rtc_library("bar_foo") {
164*d9f75844SAndroid Build Coastguard Worker        if (is_win) {
165*d9f75844SAndroid Build Coastguard Worker          sources = [
166*d9f75844SAndroid Build Coastguard Worker            "bar.cc",
167*d9f75844SAndroid Build Coastguard Worker          ],
168*d9f75844SAndroid Build Coastguard Worker        }
169*d9f75844SAndroid Build Coastguard Worker        if (is_ios) {
170*d9f75844SAndroid Build Coastguard Worker          sources = [
171*d9f75844SAndroid Build Coastguard Worker            "bar.mm",
172*d9f75844SAndroid Build Coastguard Worker          ],
173*d9f75844SAndroid Build Coastguard Worker        }
174*d9f75844SAndroid Build Coastguard Worker      }
175*d9f75844SAndroid Build Coastguard Worker      rtc_library("foo_bar") {
176*d9f75844SAndroid Build Coastguard Worker        if (is_win) {
177*d9f75844SAndroid Build Coastguard Worker          sources = [
178*d9f75844SAndroid Build Coastguard Worker            "foo.cc",
179*d9f75844SAndroid Build Coastguard Worker          ],
180*d9f75844SAndroid Build Coastguard Worker        }
181*d9f75844SAndroid Build Coastguard Worker        if (is_ios) {
182*d9f75844SAndroid Build Coastguard Worker          sources = [
183*d9f75844SAndroid Build Coastguard Worker            "foo.mm",
184*d9f75844SAndroid Build Coastguard Worker          ],
185*d9f75844SAndroid Build Coastguard Worker        }
186*d9f75844SAndroid Build Coastguard Worker      }
187*d9f75844SAndroid Build Coastguard Worker    """))
188*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [MockFile(self.file_path)]
189*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckNoMixingSources(self.input_api,
190*d9f75844SAndroid Build Coastguard Worker                                            [MockFile(self.file_path)],
191*d9f75844SAndroid Build Coastguard Worker                                            self.output_api)
192*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
193*d9f75844SAndroid Build Coastguard Worker
194*d9f75844SAndroid Build Coastguard Worker  def testErrorIfSourcesAreNotInExclusiveIfBranches(self):
195*d9f75844SAndroid Build Coastguard Worker    self._GenerateBuildFile(
196*d9f75844SAndroid Build Coastguard Worker        textwrap.dedent("""
197*d9f75844SAndroid Build Coastguard Worker      rtc_library("bar_foo") {
198*d9f75844SAndroid Build Coastguard Worker        if (is_win) {
199*d9f75844SAndroid Build Coastguard Worker          sources = [
200*d9f75844SAndroid Build Coastguard Worker            "bar.cc",
201*d9f75844SAndroid Build Coastguard Worker          ],
202*d9f75844SAndroid Build Coastguard Worker        }
203*d9f75844SAndroid Build Coastguard Worker        if (foo_bar) {
204*d9f75844SAndroid Build Coastguard Worker          sources += [
205*d9f75844SAndroid Build Coastguard Worker            "bar.mm",
206*d9f75844SAndroid Build Coastguard Worker          ],
207*d9f75844SAndroid Build Coastguard Worker        }
208*d9f75844SAndroid Build Coastguard Worker      }
209*d9f75844SAndroid Build Coastguard Worker      rtc_library("foo_bar") {
210*d9f75844SAndroid Build Coastguard Worker        if (is_win) {
211*d9f75844SAndroid Build Coastguard Worker          sources = [
212*d9f75844SAndroid Build Coastguard Worker            "foo.cc",
213*d9f75844SAndroid Build Coastguard Worker          ],
214*d9f75844SAndroid Build Coastguard Worker        }
215*d9f75844SAndroid Build Coastguard Worker        if (foo_bar) {
216*d9f75844SAndroid Build Coastguard Worker          sources += [
217*d9f75844SAndroid Build Coastguard Worker            "foo.mm",
218*d9f75844SAndroid Build Coastguard Worker          ],
219*d9f75844SAndroid Build Coastguard Worker        }
220*d9f75844SAndroid Build Coastguard Worker        if (is_ios) {
221*d9f75844SAndroid Build Coastguard Worker          sources = [
222*d9f75844SAndroid Build Coastguard Worker            "bar.m",
223*d9f75844SAndroid Build Coastguard Worker            "bar.c",
224*d9f75844SAndroid Build Coastguard Worker          ],
225*d9f75844SAndroid Build Coastguard Worker        }
226*d9f75844SAndroid Build Coastguard Worker      }
227*d9f75844SAndroid Build Coastguard Worker    """))
228*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [MockFile(self.file_path)]
229*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckNoMixingSources(self.input_api,
230*d9f75844SAndroid Build Coastguard Worker                                            [MockFile(self.file_path)],
231*d9f75844SAndroid Build Coastguard Worker                                            self.output_api)
232*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
233*d9f75844SAndroid Build Coastguard Worker    self.assertTrue('bar.cc' in str(errors[0]))
234*d9f75844SAndroid Build Coastguard Worker    self.assertTrue('bar.mm' in str(errors[0]))
235*d9f75844SAndroid Build Coastguard Worker    self.assertTrue('foo.cc' in str(errors[0]))
236*d9f75844SAndroid Build Coastguard Worker    self.assertTrue('foo.mm' in str(errors[0]))
237*d9f75844SAndroid Build Coastguard Worker    self.assertTrue('bar.m' in str(errors[0]))
238*d9f75844SAndroid Build Coastguard Worker    self.assertTrue('bar.c' in str(errors[0]))
239*d9f75844SAndroid Build Coastguard Worker
240*d9f75844SAndroid Build Coastguard Worker  def _AssertNumberOfErrorsWithSources(self, number_of_errors, sources):
241*d9f75844SAndroid Build Coastguard Worker    assert len(sources) == 3, 'This function accepts a list of 3 source files'
242*d9f75844SAndroid Build Coastguard Worker    self._GenerateBuildFile(
243*d9f75844SAndroid Build Coastguard Worker        textwrap.dedent("""
244*d9f75844SAndroid Build Coastguard Worker      rtc_static_library("bar_foo") {
245*d9f75844SAndroid Build Coastguard Worker        sources = [
246*d9f75844SAndroid Build Coastguard Worker          "%s",
247*d9f75844SAndroid Build Coastguard Worker          "%s",
248*d9f75844SAndroid Build Coastguard Worker          "%s",
249*d9f75844SAndroid Build Coastguard Worker        ],
250*d9f75844SAndroid Build Coastguard Worker      }
251*d9f75844SAndroid Build Coastguard Worker      rtc_library("foo_bar") {
252*d9f75844SAndroid Build Coastguard Worker        sources = [
253*d9f75844SAndroid Build Coastguard Worker          "%s",
254*d9f75844SAndroid Build Coastguard Worker          "%s",
255*d9f75844SAndroid Build Coastguard Worker          "%s",
256*d9f75844SAndroid Build Coastguard Worker        ],
257*d9f75844SAndroid Build Coastguard Worker      }
258*d9f75844SAndroid Build Coastguard Worker    """ % (tuple(sources) * 2)))
259*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [MockFile(self.file_path)]
260*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckNoMixingSources(self.input_api,
261*d9f75844SAndroid Build Coastguard Worker                                            [MockFile(self.file_path)],
262*d9f75844SAndroid Build Coastguard Worker                                            self.output_api)
263*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(number_of_errors, len(errors))
264*d9f75844SAndroid Build Coastguard Worker    if number_of_errors == 1:
265*d9f75844SAndroid Build Coastguard Worker      for source in sources:
266*d9f75844SAndroid Build Coastguard Worker        if not source.endswith('.h'):
267*d9f75844SAndroid Build Coastguard Worker          self.assertTrue(source in str(errors[0]))
268*d9f75844SAndroid Build Coastguard Worker
269*d9f75844SAndroid Build Coastguard Worker  def _GenerateBuildFile(self, content):
270*d9f75844SAndroid Build Coastguard Worker    with open(self.file_path, 'w') as f:
271*d9f75844SAndroid Build Coastguard Worker      f.write(content)
272*d9f75844SAndroid Build Coastguard Worker
273*d9f75844SAndroid Build Coastguard Worker
274*d9f75844SAndroid Build Coastguard Workerclass CheckAssertUsageTest(unittest.TestCase):
275*d9f75844SAndroid Build Coastguard Worker  def setUp(self):
276*d9f75844SAndroid Build Coastguard Worker    self.input_api = MockInputApi()
277*d9f75844SAndroid Build Coastguard Worker    self.output_api = MockOutputApi()
278*d9f75844SAndroid Build Coastguard Worker    self._content_with_assert = ['void Foo() {', '    assert(true);', '}']
279*d9f75844SAndroid Build Coastguard Worker    self._content_without_assert = ['void Foo() {', '    RTC_CHECK(true);', '}']
280*d9f75844SAndroid Build Coastguard Worker
281*d9f75844SAndroid Build Coastguard Worker  def testDetectsAssertInCcFile(self):
282*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [
283*d9f75844SAndroid Build Coastguard Worker        MockFile('with_assert.cc', self._content_with_assert),
284*d9f75844SAndroid Build Coastguard Worker        MockFile('without_assert.cc', self._content_without_assert),
285*d9f75844SAndroid Build Coastguard Worker    ]
286*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckAssertUsage(self.input_api,
287*d9f75844SAndroid Build Coastguard Worker                                        self.output_api, lambda x: True)
288*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
289*d9f75844SAndroid Build Coastguard Worker    self.assertEqual('with_assert.cc', errors[0].items[0])
290*d9f75844SAndroid Build Coastguard Worker
291*d9f75844SAndroid Build Coastguard Worker  def testDetectsAssertInHeaderFile(self):
292*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [
293*d9f75844SAndroid Build Coastguard Worker        MockFile('with_assert.h', self._content_with_assert),
294*d9f75844SAndroid Build Coastguard Worker        MockFile('without_assert.h', self._content_without_assert),
295*d9f75844SAndroid Build Coastguard Worker    ]
296*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckAssertUsage(self.input_api,
297*d9f75844SAndroid Build Coastguard Worker                                        self.output_api, lambda x: True)
298*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
299*d9f75844SAndroid Build Coastguard Worker    self.assertEqual('with_assert.h', errors[0].items[0])
300*d9f75844SAndroid Build Coastguard Worker
301*d9f75844SAndroid Build Coastguard Worker  def testDetectsAssertInObjCFile(self):
302*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [
303*d9f75844SAndroid Build Coastguard Worker        MockFile('with_assert.m', self._content_with_assert),
304*d9f75844SAndroid Build Coastguard Worker        MockFile('without_assert.m', self._content_without_assert),
305*d9f75844SAndroid Build Coastguard Worker    ]
306*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckAssertUsage(self.input_api,
307*d9f75844SAndroid Build Coastguard Worker                                        self.output_api, lambda x: True)
308*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
309*d9f75844SAndroid Build Coastguard Worker    self.assertEqual('with_assert.m', errors[0].items[0])
310*d9f75844SAndroid Build Coastguard Worker
311*d9f75844SAndroid Build Coastguard Worker  def testDetectsAssertInObjCppFile(self):
312*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [
313*d9f75844SAndroid Build Coastguard Worker        MockFile('with_assert.mm', self._content_with_assert),
314*d9f75844SAndroid Build Coastguard Worker        MockFile('without_assert.mm', self._content_without_assert),
315*d9f75844SAndroid Build Coastguard Worker    ]
316*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckAssertUsage(self.input_api,
317*d9f75844SAndroid Build Coastguard Worker                                        self.output_api, lambda x: True)
318*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(1, len(errors))
319*d9f75844SAndroid Build Coastguard Worker    self.assertEqual('with_assert.mm', errors[0].items[0])
320*d9f75844SAndroid Build Coastguard Worker
321*d9f75844SAndroid Build Coastguard Worker  def testDoesntDetectAssertInOtherFiles(self):
322*d9f75844SAndroid Build Coastguard Worker    self.input_api.files = [
323*d9f75844SAndroid Build Coastguard Worker        MockFile('with_assert.cpp', self._content_with_assert),
324*d9f75844SAndroid Build Coastguard Worker    ]
325*d9f75844SAndroid Build Coastguard Worker    errors = PRESUBMIT.CheckAssertUsage(self.input_api,
326*d9f75844SAndroid Build Coastguard Worker                                        self.output_api, lambda x: True)
327*d9f75844SAndroid Build Coastguard Worker    self.assertEqual(0, len(errors))
328*d9f75844SAndroid Build Coastguard Worker
329*d9f75844SAndroid Build Coastguard Worker
330*d9f75844SAndroid Build Coastguard Workerif __name__ == '__main__':
331*d9f75844SAndroid Build Coastguard Worker  unittest.main()
332