1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*8975f5c5SAndroid Build Coastguard Worker# Copyright 2020 The Chromium Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker""" 6*8975f5c5SAndroid Build Coastguard Workerangle_presubmit_utils_unittest.py: Top-level unittest script for ANGLE presubmit checks. 7*8975f5c5SAndroid Build Coastguard Worker""" 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Workerimport importlib.machinery 10*8975f5c5SAndroid Build Coastguard Workerimport os 11*8975f5c5SAndroid Build Coastguard Workerimport pathlib 12*8975f5c5SAndroid Build Coastguard Workerimport sys 13*8975f5c5SAndroid Build Coastguard Workerimport tempfile 14*8975f5c5SAndroid Build Coastguard Workerimport unittest 15*8975f5c5SAndroid Build Coastguard Workerfrom angle_presubmit_utils import * 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Workerdef SetCWDToAngleFolder(): 18*8975f5c5SAndroid Build Coastguard Worker angle_folder = "angle" 19*8975f5c5SAndroid Build Coastguard Worker cwd = os.path.dirname(os.path.abspath(__file__)) 20*8975f5c5SAndroid Build Coastguard Worker cwd = cwd.split(angle_folder)[0] + angle_folder 21*8975f5c5SAndroid Build Coastguard Worker os.chdir(cwd) 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard WorkerSetCWDToAngleFolder() 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Workerloader = importlib.machinery.SourceFileLoader('PRESUBMIT', 'PRESUBMIT.py') 27*8975f5c5SAndroid Build Coastguard WorkerPRESUBMIT = loader.load_module() 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Workerclass CommitMessageFormattingCheckTest(unittest.TestCase): 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker def __init__(self, *args, **kwargs): 33*8975f5c5SAndroid Build Coastguard Worker super(CommitMessageFormattingCheckTest, self).__init__(*args, **kwargs) 34*8975f5c5SAndroid Build Coastguard Worker self.output_api = OutputAPI_mock() 35*8975f5c5SAndroid Build Coastguard Worker 36*8975f5c5SAndroid Build Coastguard Worker def run_check_commit_message_formatting(self, commit_msg): 37*8975f5c5SAndroid Build Coastguard Worker input_api = InputAPI_mock(commit_msg) 38*8975f5c5SAndroid Build Coastguard Worker return PRESUBMIT._CheckCommitMessageFormatting(input_api, self.output_api) 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker def test_correct_commit_message(self): 41*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Workerb 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard WorkerBug: angleproject:4662 46*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I966c79d96175da9eee92ef6da20db50d488137b2 47*8975f5c5SAndroid Build Coastguard Worker""" 48*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 49*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker def test_missing_description_body_and_description_summary(self): 52*8975f5c5SAndroid Build Coastguard Worker commit_msg = """Change-Id: I966c79d96175da9eee92ef6da20db50d488137b2""" 53*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 54*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 55*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 56*8975f5c5SAndroid Build Coastguard Worker errors[0], 57*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 58*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Please ensure that your" + 59*8975f5c5SAndroid Build Coastguard Worker " description summary and description body are not blank.")) 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker def test_missing_description_body(self): 62*8975f5c5SAndroid Build Coastguard Worker commit_msg = """ 63*8975f5c5SAndroid Build Coastguard Worker a 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Workerb: d 66*8975f5c5SAndroid Build Coastguard Workerc: e 67*8975f5c5SAndroid Build Coastguard Worker""" 68*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 69*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 70*8975f5c5SAndroid Build Coastguard Worker 71*8975f5c5SAndroid Build Coastguard Worker def test_missing_tag_paragraph(self): 72*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 73*8975f5c5SAndroid Build Coastguard Worker 74*8975f5c5SAndroid Build Coastguard Workerbd 75*8975f5c5SAndroid Build Coastguard Workerefgh""" 76*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 77*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 78*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 79*8975f5c5SAndroid Build Coastguard Worker errors[0], 80*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 81*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Please ensure that there are tags (e.g., Bug:, Test:) in your description." 82*8975f5c5SAndroid Build Coastguard Worker )) 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker def test_missing_tag_paragraph_and_description_body(self): 85*8975f5c5SAndroid Build Coastguard Worker commit_msg = "a" 86*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 87*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 88*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 89*8975f5c5SAndroid Build Coastguard Worker errors[0], 90*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 91*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Please ensure that there are tags (e.g., Bug:, Test:) in your description." 92*8975f5c5SAndroid Build Coastguard Worker )) 93*8975f5c5SAndroid Build Coastguard Worker 94*8975f5c5SAndroid Build Coastguard Worker def test_missing_blank_line_between_description_summary_and_description_body(self): 95*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 96*8975f5c5SAndroid Build Coastguard Workerb 97*8975f5c5SAndroid Build Coastguard Worker 98*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I925cdb45779a9cdebe4e14f9e81e4211ade37c12""" 99*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 100*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 101*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(errors[0], self.output_api.PresubmitError( 102*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Please ensure the summary is only 1 line and there is 1 blank line" + \ 103*8975f5c5SAndroid Build Coastguard Worker " between the summary and description body.")) 104*8975f5c5SAndroid Build Coastguard Worker 105*8975f5c5SAndroid Build Coastguard Worker def test_missing_blank_line_between_description_body_and_tags_paragraph(self): 106*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Workerb 109*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I925cdb45779a9cdebe4e14f9e81e4211ade37c12""" 110*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 111*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker def test_multiple_blank_lines_before_and_after_commit_message(self): 114*8975f5c5SAndroid Build Coastguard Worker commit_msg = """ 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker 117*8975f5c5SAndroid Build Coastguard Worker a 118*8975f5c5SAndroid Build Coastguard Worker 119*8975f5c5SAndroid Build Coastguard Worker b 120*8975f5c5SAndroid Build Coastguard Worker 121*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I925cdb45779a9cdebe4e14f9e81e4211ade37c12 122*8975f5c5SAndroid Build Coastguard Worker""" 123*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 124*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 125*8975f5c5SAndroid Build Coastguard Worker 126*8975f5c5SAndroid Build Coastguard Worker def test_newlines_within_description_body(self): 127*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard Workerb 130*8975f5c5SAndroid Build Coastguard Worker 131*8975f5c5SAndroid Build Coastguard Workerd 132*8975f5c5SAndroid Build Coastguard Worker 133*8975f5c5SAndroid Build Coastguard Workere 134*8975f5c5SAndroid Build Coastguard Worker 135*8975f5c5SAndroid Build Coastguard Workerfor 136*8975f5c5SAndroid Build Coastguard Worker 137*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 138*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 139*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 140*8975f5c5SAndroid Build Coastguard Worker 141*8975f5c5SAndroid Build Coastguard Worker # Summary description in warning threshold(at 65 characters) 142*8975f5c5SAndroid Build Coastguard Worker def test_summmary_description_in_warning_thresholds(self): 143*8975f5c5SAndroid Build Coastguard Worker commit_msg = """aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 144*8975f5c5SAndroid Build Coastguard Worker 145*8975f5c5SAndroid Build Coastguard Workerb 146*8975f5c5SAndroid Build Coastguard Worker 147*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I925cdb45779a9cdebe4e14f9e81e4211ade37c12 148*8975f5c5SAndroid Build Coastguard Worker""" 149*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 150*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 151*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 152*8975f5c5SAndroid Build Coastguard Worker errors[0], 153*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitPromptWarning( 154*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Your description summary should be on one line of 64 or less characters." 155*8975f5c5SAndroid Build Coastguard Worker )) 156*8975f5c5SAndroid Build Coastguard Worker 157*8975f5c5SAndroid Build Coastguard Worker # Summary description in error threshold(at 71 characters) 158*8975f5c5SAndroid Build Coastguard Worker def test_summary_description_in_error_threshold(self): 159*8975f5c5SAndroid Build Coastguard Worker commit_msg = """aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 160*8975f5c5SAndroid Build Coastguard Worker 161*8975f5c5SAndroid Build Coastguard Workerb 162*8975f5c5SAndroid Build Coastguard Worker 163*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I925cdb45779a9cdebe4e14f9e81e4211ade37c12""" 164*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 165*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 166*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 167*8975f5c5SAndroid Build Coastguard Worker errors[0], 168*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 169*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Please ensure that your description summary is on one line of 64 or less characters." 170*8975f5c5SAndroid Build Coastguard Worker )) 171*8975f5c5SAndroid Build Coastguard Worker 172*8975f5c5SAndroid Build Coastguard Worker def test_description_body_exceeds_line_count_limit(self): 173*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 174*8975f5c5SAndroid Build Coastguard Worker 175*8975f5c5SAndroid Build Coastguard Workerbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 176*8975f5c5SAndroid Build Coastguard Worker 177*8975f5c5SAndroid Build Coastguard Worker 178*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 179*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 180*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 2) 181*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 182*8975f5c5SAndroid Build Coastguard Worker errors[0], 183*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 184*8975f5c5SAndroid Build Coastguard Worker "Commit 1:Please ensure that there exists only 1 blank line between tags and description body." 185*8975f5c5SAndroid Build Coastguard Worker )) 186*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 187*8975f5c5SAndroid Build Coastguard Worker errors[1], 188*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError("""Commit 1:Line 3 is too long. 189*8975f5c5SAndroid Build Coastguard Worker"bbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 190*8975f5c5SAndroid Build Coastguard WorkerPlease wrap it to 72 characters. Lines without spaces or lines starting with 4 spaces are exempt.""" 191*8975f5c5SAndroid Build Coastguard Worker )) 192*8975f5c5SAndroid Build Coastguard Worker 193*8975f5c5SAndroid Build Coastguard Worker def test_description_body_exceeds_line_count_limit_but_with_4_spaces_prefix(self): 194*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 195*8975f5c5SAndroid Build Coastguard Worker 196*8975f5c5SAndroid Build Coastguard Workercc 197*8975f5c5SAndroid Build Coastguard Worker 198*8975f5c5SAndroid Build Coastguard Workerdddd 199*8975f5c5SAndroid Build Coastguard Worker 200*8975f5c5SAndroid Build Coastguard Worker bbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 203*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 204*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 205*8975f5c5SAndroid Build Coastguard Worker 206*8975f5c5SAndroid Build Coastguard Worker def test_description_body_exceeds_line_count_limit_but_without_space(self): 207*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 208*8975f5c5SAndroid Build Coastguard Worker 209*8975f5c5SAndroid Build Coastguard Workercc 210*8975f5c5SAndroid Build Coastguard Worker 211*8975f5c5SAndroid Build Coastguard Workerdddd 212*8975f5c5SAndroid Build Coastguard Worker 213*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 214*8975f5c5SAndroid Build Coastguard Worker 215*8975f5c5SAndroid Build Coastguard Workera: d""" 216*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 217*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 218*8975f5c5SAndroid Build Coastguard Worker 219*8975f5c5SAndroid Build Coastguard Worker def test_description_body_exceeds_line_count_limit_but_in_quote(self): 220*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 221*8975f5c5SAndroid Build Coastguard Worker 222*8975f5c5SAndroid Build Coastguard Workercc 223*8975f5c5SAndroid Build Coastguard Worker 224*8975f5c5SAndroid Build Coastguard Workerdddd 225*8975f5c5SAndroid Build Coastguard Worker 226*8975f5c5SAndroid Build Coastguard Worker> bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 227*8975f5c5SAndroid Build Coastguard Worker 228*8975f5c5SAndroid Build Coastguard Workera: d""" 229*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 230*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 231*8975f5c5SAndroid Build Coastguard Worker 232*8975f5c5SAndroid Build Coastguard Worker def test_tabs_in_commit_message(self): 233*8975f5c5SAndroid Build Coastguard Worker commit_msg = """ a 234*8975f5c5SAndroid Build Coastguard Worker 235*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 236*8975f5c5SAndroid Build Coastguard Worker 237*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 238*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 239*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 240*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 241*8975f5c5SAndroid Build Coastguard Worker errors[0], 242*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError("Commit 1:Tabs are not allowed in commit message.")) 243*8975f5c5SAndroid Build Coastguard Worker 244*8975f5c5SAndroid Build Coastguard Worker def test_allowlist_revert(self): 245*8975f5c5SAndroid Build Coastguard Worker commit_msg = """Revert "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssa 246*8975f5c5SAndroid Build Coastguard Worker 247*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 248*8975f5c5SAndroid Build Coastguard Worker 249*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 250*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 251*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 252*8975f5c5SAndroid Build Coastguard Worker 253*8975f5c5SAndroid Build Coastguard Worker def test_allowlist_roll(self): 254*8975f5c5SAndroid Build Coastguard Worker commit_msg = """Roll sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadd 255*8975f5c5SAndroid Build Coastguard Worker 256*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 257*8975f5c5SAndroid Build Coastguard Worker 258*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 259*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 260*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 261*8975f5c5SAndroid Build Coastguard Worker 262*8975f5c5SAndroid Build Coastguard Worker def test_allowlist_reland(self): 263*8975f5c5SAndroid Build Coastguard Worker commit_msg = """Reland sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadd 264*8975f5c5SAndroid Build Coastguard Worker 265*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 266*8975f5c5SAndroid Build Coastguard Worker 267*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 268*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 269*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 270*8975f5c5SAndroid Build Coastguard Worker 271*8975f5c5SAndroid Build Coastguard Worker def test_allowlist_reland2(self): 272*8975f5c5SAndroid Build Coastguard Worker commit_msg = """Reland: sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadd 273*8975f5c5SAndroid Build Coastguard Worker 274*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 275*8975f5c5SAndroid Build Coastguard Worker 276*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 277*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 278*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 279*8975f5c5SAndroid Build Coastguard Worker 280*8975f5c5SAndroid Build Coastguard Worker def test_multiple_commits_with_errors_in_multiple_commits(self): 281*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 282*8975f5c5SAndroid Build Coastguard Worker 283*8975f5c5SAndroid Build Coastguard Workerbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 284*8975f5c5SAndroid Build Coastguard Worker 285*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b 286*8975f5c5SAndroid Build Coastguard Worker 287*8975f5c5SAndroid Build Coastguard Workera 288*8975f5c5SAndroid Build Coastguard Worker 289*8975f5c5SAndroid Build Coastguard Workercccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccc 290*8975f5c5SAndroid Build Coastguard Worker 291*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 292*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 293*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 2) 294*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 295*8975f5c5SAndroid Build Coastguard Worker errors[0], 296*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError("""Commit 2:Line 3 is too long. 297*8975f5c5SAndroid Build Coastguard Worker"bbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 298*8975f5c5SAndroid Build Coastguard WorkerPlease wrap it to 72 characters. Lines without spaces or lines starting with 4 spaces are exempt.""" 299*8975f5c5SAndroid Build Coastguard Worker )) 300*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 301*8975f5c5SAndroid Build Coastguard Worker errors[1], 302*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError("""Commit 1:Line 4 is too long. 303*8975f5c5SAndroid Build Coastguard Worker"cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccc" 304*8975f5c5SAndroid Build Coastguard WorkerPlease wrap it to 72 characters. Lines without spaces or lines starting with 4 spaces are exempt.""" 305*8975f5c5SAndroid Build Coastguard Worker )) 306*8975f5c5SAndroid Build Coastguard Worker 307*8975f5c5SAndroid Build Coastguard Worker def test_multiple_commits_with_error_in_one_commit(self): 308*8975f5c5SAndroid Build Coastguard Worker commit_msg = """a 309*8975f5c5SAndroid Build Coastguard Worker 310*8975f5c5SAndroid Build Coastguard Workerbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 311*8975f5c5SAndroid Build Coastguard Worker 312*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b 313*8975f5c5SAndroid Build Coastguard Worker 314*8975f5c5SAndroid Build Coastguard WorkerRoll sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadd 315*8975f5c5SAndroid Build Coastguard Worker 316*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 317*8975f5c5SAndroid Build Coastguard Worker 318*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 319*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 320*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 321*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 322*8975f5c5SAndroid Build Coastguard Worker errors[0], 323*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError("""Commit 2:Line 3 is too long. 324*8975f5c5SAndroid Build Coastguard Worker"bbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" 325*8975f5c5SAndroid Build Coastguard WorkerPlease wrap it to 72 characters. Lines without spaces or lines starting with 4 spaces are exempt.""" 326*8975f5c5SAndroid Build Coastguard Worker )) 327*8975f5c5SAndroid Build Coastguard Worker 328*8975f5c5SAndroid Build Coastguard Worker def test_multiple_commits_with_no_error(self): 329*8975f5c5SAndroid Build Coastguard Worker commit_msg = """Reland sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadd 330*8975f5c5SAndroid Build Coastguard Worker 331*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 332*8975f5c5SAndroid Build Coastguard Worker 333*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b 334*8975f5c5SAndroid Build Coastguard Worker 335*8975f5c5SAndroid Build Coastguard WorkerRoll sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadd 336*8975f5c5SAndroid Build Coastguard Worker 337*8975f5c5SAndroid Build Coastguard Workerbbbbbbbbbbbbbbbbbbbb 338*8975f5c5SAndroid Build Coastguard Worker 339*8975f5c5SAndroid Build Coastguard WorkerChange-Id: I443c36aaa8956c20da1abddf7aea613659e2cd5b""" 340*8975f5c5SAndroid Build Coastguard Worker errors = self.run_check_commit_message_formatting(commit_msg) 341*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 342*8975f5c5SAndroid Build Coastguard Worker 343*8975f5c5SAndroid Build Coastguard Worker 344*8975f5c5SAndroid Build Coastguard Workerclass GClientFileExistenceCheck(unittest.TestCase): 345*8975f5c5SAndroid Build Coastguard Worker 346*8975f5c5SAndroid Build Coastguard Worker def __init__(self, *args, **kwargs): 347*8975f5c5SAndroid Build Coastguard Worker super(GClientFileExistenceCheck, self).__init__(*args, **kwargs) 348*8975f5c5SAndroid Build Coastguard Worker self.output_api = OutputAPI_mock() 349*8975f5c5SAndroid Build Coastguard Worker 350*8975f5c5SAndroid Build Coastguard Worker def run_gclient_presubmit(self, cwd, search_limit): 351*8975f5c5SAndroid Build Coastguard Worker input_api = InputAPI_mock('') 352*8975f5c5SAndroid Build Coastguard Worker input_api.cwd = cwd 353*8975f5c5SAndroid Build Coastguard Worker return PRESUBMIT._CheckGClientExists(input_api, self.output_api, 354*8975f5c5SAndroid Build Coastguard Worker pathlib.Path(search_limit)) 355*8975f5c5SAndroid Build Coastguard Worker 356*8975f5c5SAndroid Build Coastguard Worker def test_gclient_in_cwd(self): 357*8975f5c5SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as cwd: 358*8975f5c5SAndroid Build Coastguard Worker pathlib.Path(cwd).joinpath('.gclient').touch() 359*8975f5c5SAndroid Build Coastguard Worker errors = self.run_gclient_presubmit(cwd, cwd) 360*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 361*8975f5c5SAndroid Build Coastguard Worker 362*8975f5c5SAndroid Build Coastguard Worker def test_missing_gclient(self): 363*8975f5c5SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as cwd: 364*8975f5c5SAndroid Build Coastguard Worker errors = self.run_gclient_presubmit(cwd, cwd) 365*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 366*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(errors[0], self.output_api.PresubmitError('Missing .gclient file.')) 367*8975f5c5SAndroid Build Coastguard Worker 368*8975f5c5SAndroid Build Coastguard Worker def test_gclient_in_parent(self): 369*8975f5c5SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as cwd: 370*8975f5c5SAndroid Build Coastguard Worker cwd = pathlib.Path(cwd) 371*8975f5c5SAndroid Build Coastguard Worker cwd.joinpath('.gclient').touch() 372*8975f5c5SAndroid Build Coastguard Worker inner = cwd.joinpath('inner') 373*8975f5c5SAndroid Build Coastguard Worker inner.mkdir() 374*8975f5c5SAndroid Build Coastguard Worker errors = self.run_gclient_presubmit(str(inner), str(cwd)) 375*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 376*8975f5c5SAndroid Build Coastguard Worker 377*8975f5c5SAndroid Build Coastguard Worker 378*8975f5c5SAndroid Build Coastguard Workerclass CheckShaderVersionInShaderLangHeaderTest(unittest.TestCase): 379*8975f5c5SAndroid Build Coastguard Worker 380*8975f5c5SAndroid Build Coastguard Worker def __init__(self, *args, **kwargs): 381*8975f5c5SAndroid Build Coastguard Worker super(CheckShaderVersionInShaderLangHeaderTest, self).__init__(*args, **kwargs) 382*8975f5c5SAndroid Build Coastguard Worker self.output_api = OutputAPI_mock() 383*8975f5c5SAndroid Build Coastguard Worker 384*8975f5c5SAndroid Build Coastguard Worker def run_shader_version_check_presubmit(self, commit_msg, diffs): 385*8975f5c5SAndroid Build Coastguard Worker affected_files = [AffectedFile_mock(diff) for diff in diffs] 386*8975f5c5SAndroid Build Coastguard Worker input_api = InputAPI_mock(commit_msg, affected_files) 387*8975f5c5SAndroid Build Coastguard Worker return PRESUBMIT._CheckShaderVersionInShaderLangHeader(input_api, self.output_api) 388*8975f5c5SAndroid Build Coastguard Worker 389*8975f5c5SAndroid Build Coastguard Worker def test_headers_not_changed(self): 390*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', []) 391*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 392*8975f5c5SAndroid Build Coastguard Worker 393*8975f5c5SAndroid Build Coastguard Worker def test_shader_lang_changed_with_version_change(self): 394*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """-#define ANGLE_SH_VERSION 100 395*8975f5c5SAndroid Build Coastguard Worker+#define ANGLE_SH_VERSION 101 396*8975f5c5SAndroid Build Coastguard Worker""" 397*8975f5c5SAndroid Build Coastguard Worker 398*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', [shader_lang_diff]) 399*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 400*8975f5c5SAndroid Build Coastguard Worker 401*8975f5c5SAndroid Build Coastguard Worker def test_both_changed_with_version_change(self): 402*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """-#define ANGLE_SH_VERSION 100 403*8975f5c5SAndroid Build Coastguard Worker+#define ANGLE_SH_VERSION 101 404*8975f5c5SAndroid Build Coastguard Worker""" 405*8975f5c5SAndroid Build Coastguard Worker shader_vars_diff = """-any change""" 406*8975f5c5SAndroid Build Coastguard Worker 407*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', [shader_lang_diff, shader_vars_diff]) 408*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 409*8975f5c5SAndroid Build Coastguard Worker 410*8975f5c5SAndroid Build Coastguard Worker def test_shader_lang_changed_with_no_version_change(self): 411*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """+some change""" 412*8975f5c5SAndroid Build Coastguard Worker 413*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', [shader_lang_diff]) 414*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 415*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 416*8975f5c5SAndroid Build Coastguard Worker errors[0], 417*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 418*8975f5c5SAndroid Build Coastguard Worker 'ANGLE_SH_VERSION should be incremented when ShaderLang.h or ShaderVars.h change.') 419*8975f5c5SAndroid Build Coastguard Worker ) 420*8975f5c5SAndroid Build Coastguard Worker 421*8975f5c5SAndroid Build Coastguard Worker def test_shader_lang_changed_with_no_version_change(self): 422*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """+some change 423*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SH_VERSION 100 424*8975f5c5SAndroid Build Coastguard Worker-other changes""" 425*8975f5c5SAndroid Build Coastguard Worker 426*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', [shader_lang_diff]) 427*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 428*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 429*8975f5c5SAndroid Build Coastguard Worker errors[0], 430*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 431*8975f5c5SAndroid Build Coastguard Worker 'ANGLE_SH_VERSION should be incremented when ShaderLang.h or ShaderVars.h change.') 432*8975f5c5SAndroid Build Coastguard Worker ) 433*8975f5c5SAndroid Build Coastguard Worker 434*8975f5c5SAndroid Build Coastguard Worker def test_shader_lang_changed_with_version_cosmetic_change(self): 435*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """-#define ANGLE_SH_VERSION 100 436*8975f5c5SAndroid Build Coastguard Worker+#define ANGLE_SH_VERSION 100 // cosmetic change 437*8975f5c5SAndroid Build Coastguard Worker""" 438*8975f5c5SAndroid Build Coastguard Worker 439*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', [shader_lang_diff]) 440*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 441*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 442*8975f5c5SAndroid Build Coastguard Worker errors[0], 443*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 444*8975f5c5SAndroid Build Coastguard Worker 'ANGLE_SH_VERSION should be incremented when ShaderLang.h or ShaderVars.h change.') 445*8975f5c5SAndroid Build Coastguard Worker ) 446*8975f5c5SAndroid Build Coastguard Worker 447*8975f5c5SAndroid Build Coastguard Worker def test_shader_lang_changed_with_version_decrement(self): 448*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """-#define ANGLE_SH_VERSION 100 449*8975f5c5SAndroid Build Coastguard Worker+#define ANGLE_SH_VERSION 99 450*8975f5c5SAndroid Build Coastguard Worker""" 451*8975f5c5SAndroid Build Coastguard Worker 452*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('', [shader_lang_diff]) 453*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 1) 454*8975f5c5SAndroid Build Coastguard Worker self.assertEqual( 455*8975f5c5SAndroid Build Coastguard Worker errors[0], 456*8975f5c5SAndroid Build Coastguard Worker self.output_api.PresubmitError( 457*8975f5c5SAndroid Build Coastguard Worker 'ANGLE_SH_VERSION should be incremented when ShaderLang.h or ShaderVars.h change.') 458*8975f5c5SAndroid Build Coastguard Worker ) 459*8975f5c5SAndroid Build Coastguard Worker 460*8975f5c5SAndroid Build Coastguard Worker def test_shader_lang_changed_in_revert(self): 461*8975f5c5SAndroid Build Coastguard Worker shader_lang_diff = """-#define ANGLE_SH_VERSION 100 462*8975f5c5SAndroid Build Coastguard Worker+#define ANGLE_SH_VERSION 99 463*8975f5c5SAndroid Build Coastguard Worker""" 464*8975f5c5SAndroid Build Coastguard Worker 465*8975f5c5SAndroid Build Coastguard Worker errors = self.run_shader_version_check_presubmit('Revert some change', [shader_lang_diff]) 466*8975f5c5SAndroid Build Coastguard Worker self.assertEqual(len(errors), 0) 467*8975f5c5SAndroid Build Coastguard Worker 468*8975f5c5SAndroid Build Coastguard Worker 469*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__': 470*8975f5c5SAndroid Build Coastguard Worker unittest.main() 471