blob: 9f97df901e0131ee8eda6d6a7fdc9f5a202b1234 [file] [log] [blame]
Henrik Kjellandera18a3bf2017-09-15 11:19:10 +02001#!/usr/bin/env python
2
3# Copyright 2017 The WebRTC project authors. All Rights Reserved.
4#
5# Use of this source code is governed by a BSD-style license
6# that can be found in the LICENSE file in the root of the source
7# tree. An additional intellectual property rights grant can be found
8# in the file PATENTS. All contributing project authors may
9# be found in the AUTHORS file in the root of the source tree.
10
Mirko Bonadeia730c1c2017-09-18 11:33:13 +020011import os
12import shutil
13import tempfile
14import textwrap
charujain9893e252017-09-14 13:33:22 +020015import unittest
16
17import PRESUBMIT
Mirko Bonadei61880182017-10-12 15:12:35 +020018# pylint: disable=line-too-long
19from presubmit_test_mocks import MockInputApi, MockOutputApi, MockFile, MockChange
charujain9893e252017-09-14 13:33:22 +020020
21
Mirko Bonadei7de1eb72017-09-19 10:16:10 +020022class CheckBugEntryFieldTest(unittest.TestCase):
charujain9893e252017-09-14 13:33:22 +020023 def testCommitMessageBugEntryWithNoError(self):
24 mock_input_api = MockInputApi()
25 mock_output_api = MockOutputApi()
Mirko Bonadei61880182017-10-12 15:12:35 +020026 mock_input_api.change = MockChange([], ['webrtc:1234'])
charujain9893e252017-09-14 13:33:22 +020027 errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
Edward Lemur6d01f6d2017-09-14 17:02:01 +020028 mock_output_api)
charujain9893e252017-09-14 13:33:22 +020029 self.assertEqual(0, len(errors))
30
31 def testCommitMessageBugEntryReturnError(self):
32 mock_input_api = MockInputApi()
33 mock_output_api = MockOutputApi()
Mirko Bonadei61880182017-10-12 15:12:35 +020034 mock_input_api.change = MockChange([], ['webrtc:1234', 'webrtc=4321'])
charujain9893e252017-09-14 13:33:22 +020035 errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
Edward Lemur6d01f6d2017-09-14 17:02:01 +020036 mock_output_api)
charujain9893e252017-09-14 13:33:22 +020037 self.assertEqual(1, len(errors))
Mirko Bonadei61880182017-10-12 15:12:35 +020038 self.assertEqual(('Bogus Bug entry: webrtc=4321. Please specify'
charujain9893e252017-09-14 13:33:22 +020039 ' the issue tracker prefix and the issue number,'
40 ' separated by a colon, e.g. webrtc:123 or'
41 ' chromium:12345.'), str(errors[0]))
42
Mirko Bonadei61880182017-10-12 15:12:35 +020043 def testCommitMessageBugEntryWithoutPrefix(self):
44 mock_input_api = MockInputApi()
45 mock_output_api = MockOutputApi()
46 mock_input_api.change = MockChange([], ['1234'])
47 errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
48 mock_output_api)
49 self.assertEqual(1, len(errors))
50 self.assertEqual(('Bug entry requires issue tracker prefix, '
51 'e.g. webrtc:1234'), str(errors[0]))
52
charujain9893e252017-09-14 13:33:22 +020053 def testCommitMessageBugEntryIsNone(self):
54 mock_input_api = MockInputApi()
55 mock_output_api = MockOutputApi()
Mirko Bonadei61880182017-10-12 15:12:35 +020056 mock_input_api.change = MockChange([], ['None'])
charujain9893e252017-09-14 13:33:22 +020057 errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
Edward Lemur6d01f6d2017-09-14 17:02:01 +020058 mock_output_api)
charujain9893e252017-09-14 13:33:22 +020059 self.assertEqual(0, len(errors))
60
charujain81a58c72017-09-25 13:25:45 +020061 def testCommitMessageBugEntrySupportInternalBugReference(self):
62 mock_input_api = MockInputApi()
63 mock_output_api = MockOutputApi()
64 mock_input_api.change.BUG = 'b/12345'
65 errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
66 mock_output_api)
67 self.assertEqual(0, len(errors))
68 mock_input_api.change.BUG = 'b/12345, webrtc:1234'
69 errors = PRESUBMIT.CheckCommitMessageBugEntry(mock_input_api,
70 mock_output_api)
71 self.assertEqual(0, len(errors))
72
charujain9893e252017-09-14 13:33:22 +020073
Mirko Bonadei7de1eb72017-09-19 10:16:10 +020074class CheckNewlineAtTheEndOfProtoFilesTest(unittest.TestCase):
Mirko Bonadeia730c1c2017-09-18 11:33:13 +020075
76 def setUp(self):
77 self.tmp_dir = tempfile.mkdtemp()
78 self.proto_file_path = os.path.join(self.tmp_dir, 'foo.proto')
79 self.input_api = MockInputApi()
80 self.output_api = MockOutputApi()
81
82 def tearDown(self):
83 shutil.rmtree(self.tmp_dir, ignore_errors=True)
84
85 def testErrorIfProtoFileDoesNotEndWithNewline(self):
Mirko Bonadei4dc4e252017-09-19 13:49:16 +020086 self._GenerateProtoWithoutNewlineAtTheEnd()
Mirko Bonadeia730c1c2017-09-18 11:33:13 +020087 self.input_api.files = [MockFile(self.proto_file_path)]
88 errors = PRESUBMIT.CheckNewlineAtTheEndOfProtoFiles(self.input_api,
89 self.output_api)
90 self.assertEqual(1, len(errors))
91 self.assertEqual(
92 'File %s must end with exactly one newline.' % self.proto_file_path,
93 str(errors[0]))
94
95 def testNoErrorIfProtoFileEndsWithNewline(self):
Mirko Bonadei4dc4e252017-09-19 13:49:16 +020096 self._GenerateProtoWithNewlineAtTheEnd()
Mirko Bonadeia730c1c2017-09-18 11:33:13 +020097 self.input_api.files = [MockFile(self.proto_file_path)]
98 errors = PRESUBMIT.CheckNewlineAtTheEndOfProtoFiles(self.input_api,
99 self.output_api)
100 self.assertEqual(0, len(errors))
101
Mirko Bonadei4dc4e252017-09-19 13:49:16 +0200102 def _GenerateProtoWithNewlineAtTheEnd(self):
Mirko Bonadeia730c1c2017-09-18 11:33:13 +0200103 with open(self.proto_file_path, 'w') as f:
104 f.write(textwrap.dedent("""
105 syntax = "proto2";
106 option optimize_for = LITE_RUNTIME;
107 package webrtc.audioproc;
108 """))
109
Mirko Bonadei4dc4e252017-09-19 13:49:16 +0200110 def _GenerateProtoWithoutNewlineAtTheEnd(self):
Mirko Bonadeia730c1c2017-09-18 11:33:13 +0200111 with open(self.proto_file_path, 'w') as f:
112 f.write(textwrap.dedent("""
113 syntax = "proto2";
114 option optimize_for = LITE_RUNTIME;
115 package webrtc.audioproc;"""))
116
117
Mirko Bonadei4dc4e252017-09-19 13:49:16 +0200118class CheckNoMixingSourcesTest(unittest.TestCase):
119
120 def setUp(self):
121 self.tmp_dir = tempfile.mkdtemp()
122 self.file_path = os.path.join(self.tmp_dir, 'BUILD.gn')
123 self.input_api = MockInputApi()
124 self.output_api = MockOutputApi()
125
126 def tearDown(self):
127 shutil.rmtree(self.tmp_dir, ignore_errors=True)
128
129 def testErrorIfCAndCppAreMixed(self):
130 self._AssertNumberOfErrorsWithSources(1, ['foo.c', 'bar.cc', 'bar.h'])
131
132 def testErrorIfCAndObjCAreMixed(self):
133 self._AssertNumberOfErrorsWithSources(1, ['foo.c', 'bar.m', 'bar.h'])
134
135 def testErrorIfCAndObjCppAreMixed(self):
136 self._AssertNumberOfErrorsWithSources(1, ['foo.c', 'bar.mm', 'bar.h'])
137
138 def testErrorIfCppAndObjCAreMixed(self):
139 self._AssertNumberOfErrorsWithSources(1, ['foo.cc', 'bar.m', 'bar.h'])
140
141 def testErrorIfCppAndObjCppAreMixed(self):
142 self._AssertNumberOfErrorsWithSources(1, ['foo.cc', 'bar.mm', 'bar.h'])
143
144 def testNoErrorIfOnlyC(self):
145 self._AssertNumberOfErrorsWithSources(0, ['foo.c', 'bar.c', 'bar.h'])
146
147 def testNoErrorIfOnlyCpp(self):
148 self._AssertNumberOfErrorsWithSources(0, ['foo.cc', 'bar.cc', 'bar.h'])
149
150 def testNoErrorIfOnlyObjC(self):
151 self._AssertNumberOfErrorsWithSources(0, ['foo.m', 'bar.m', 'bar.h'])
152
153 def testNoErrorIfOnlyObjCpp(self):
154 self._AssertNumberOfErrorsWithSources(0, ['foo.mm', 'bar.mm', 'bar.h'])
155
156 def testNoErrorIfObjCAndObjCppAreMixed(self):
157 self._AssertNumberOfErrorsWithSources(0, ['foo.m', 'bar.mm', 'bar.h'])
158
159 def testNoErrorIfSourcesAreInExclusiveIfBranches(self):
160 self._GenerateBuildFile(textwrap.dedent("""
161 rtc_source_set("bar_foo") {
162 if (is_win) {
163 sources = [
164 "bar.cc",
165 ],
166 }
167 if (is_ios) {
168 sources = [
169 "bar.mm",
170 ],
171 }
172 }
173 rtc_source_set("foo_bar") {
174 if (is_win) {
175 sources = [
176 "foo.cc",
177 ],
178 }
179 if (is_ios) {
180 sources = [
181 "foo.mm",
182 ],
183 }
184 }
185 """))
186 self.input_api.files = [MockFile(self.file_path)]
187 errors = PRESUBMIT.CheckNoMixingSources(self.input_api,
188 [MockFile(self.file_path)],
189 self.output_api)
190 self.assertEqual(0, len(errors))
191
192 def testErrorIfSourcesAreNotInExclusiveIfBranches(self):
193 self._GenerateBuildFile(textwrap.dedent("""
194 rtc_source_set("bar_foo") {
195 if (is_win) {
196 sources = [
197 "bar.cc",
198 ],
199 }
200 if (foo_bar) {
201 sources += [
202 "bar.mm",
203 ],
204 }
205 }
206 rtc_source_set("foo_bar") {
207 if (is_win) {
208 sources = [
209 "foo.cc",
210 ],
211 }
212 if (foo_bar) {
213 sources += [
214 "foo.mm",
215 ],
216 }
217 if (is_ios) {
218 sources = [
219 "bar.m",
220 "bar.c",
221 ],
222 }
223 }
224 """))
225 self.input_api.files = [MockFile(self.file_path)]
226 errors = PRESUBMIT.CheckNoMixingSources(self.input_api,
227 [MockFile(self.file_path)],
228 self.output_api)
229 self.assertEqual(1, len(errors))
230 self.assertTrue('bar.cc' in str(errors[0]))
231 self.assertTrue('bar.mm' in str(errors[0]))
232 self.assertTrue('foo.cc' in str(errors[0]))
233 self.assertTrue('foo.mm' in str(errors[0]))
234 self.assertTrue('bar.m' in str(errors[0]))
235 self.assertTrue('bar.c' in str(errors[0]))
236
237 def _AssertNumberOfErrorsWithSources(self, number_of_errors, sources):
238 assert 3 == len(sources), 'This function accepts a list of 3 source files'
239 self._GenerateBuildFile(textwrap.dedent("""
240 rtc_static_library("bar_foo") {
241 sources = [
242 "%s",
243 "%s",
244 "%s",
245 ],
246 }
247 rtc_source_set("foo_bar") {
248 sources = [
249 "%s",
250 "%s",
251 "%s",
252 ],
253 }
254 """ % (tuple(sources) * 2)))
255 self.input_api.files = [MockFile(self.file_path)]
256 errors = PRESUBMIT.CheckNoMixingSources(self.input_api,
257 [MockFile(self.file_path)],
258 self.output_api)
259 self.assertEqual(number_of_errors, len(errors))
260 if number_of_errors == 1:
261 for source in sources:
262 if not source.endswith('.h'):
263 self.assertTrue(source in str(errors[0]))
264
265 def _GenerateBuildFile(self, content):
266 with open(self.file_path, 'w') as f:
267 f.write(content)
268
269
charujain9893e252017-09-14 13:33:22 +0200270if __name__ == '__main__':
271 unittest.main()