1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2023 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard Workerimport unittest 7*c8dee2aaSAndroid Build Coastguard Workerfrom unittest import mock 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Workerimport PRESUBMIT 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Workerfrom PRESUBMIT_test_mocks import MockFile, MockAffectedFile 12*c8dee2aaSAndroid Build Coastguard Workerfrom PRESUBMIT_test_mocks import MockInputApi, MockOutputApi 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Workerclass ReleaseNotesTest(unittest.TestCase): 16*c8dee2aaSAndroid Build Coastguard Worker def testNoEditTopReleaseNotesNoWarning(self): 17*c8dee2aaSAndroid Build Coastguard Worker mock_input_api = MockInputApi() 18*c8dee2aaSAndroid Build Coastguard Worker mock_input_api.files = [ 19*c8dee2aaSAndroid Build Coastguard Worker MockFile('README.chromium', ''), 20*c8dee2aaSAndroid Build Coastguard Worker ] 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker mock_output_api = MockOutputApi() 23*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._CheckTopReleaseNotesChanged( 24*c8dee2aaSAndroid Build Coastguard Worker mock_input_api, mock_output_api) 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(0, len(results)) 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker def testUpdateTopReleaseNotesIssuesWarning(self): 29*c8dee2aaSAndroid Build Coastguard Worker mock_input_api = MockInputApi() 30*c8dee2aaSAndroid Build Coastguard Worker mock_input_api.files = [ 31*c8dee2aaSAndroid Build Coastguard Worker MockFile('RELEASE_NOTES.md', ''), 32*c8dee2aaSAndroid Build Coastguard Worker ] 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker mock_output_api = MockOutputApi() 35*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._CheckTopReleaseNotesChanged( 36*c8dee2aaSAndroid Build Coastguard Worker mock_input_api, mock_output_api) 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(1, len(results)) 39*c8dee2aaSAndroid Build Coastguard Worker self.assertIsInstance( 40*c8dee2aaSAndroid Build Coastguard Worker results[0], mock_output_api.PresubmitPromptWarning, 'Not a warning') 41*c8dee2aaSAndroid Build Coastguard Worker self.assertTrue(results[0].message.startswith( 42*c8dee2aaSAndroid Build Coastguard Worker 'Do not edit RELEASE_NOTES.md')) 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker def testUpdateTopReleaseNotesNoWarning(self): 45*c8dee2aaSAndroid Build Coastguard Worker mock_input_api = MockInputApi() 46*c8dee2aaSAndroid Build Coastguard Worker mock_input_api.files = [ 47*c8dee2aaSAndroid Build Coastguard Worker MockFile('RELEASE_NOTES.md', ''), 48*c8dee2aaSAndroid Build Coastguard Worker MockFile('relnotes/deleted_note.md', ''), 49*c8dee2aaSAndroid Build Coastguard Worker ] 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker mock_output_api = MockOutputApi() 52*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._CheckTopReleaseNotesChanged( 53*c8dee2aaSAndroid Build Coastguard Worker mock_input_api, mock_output_api) 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(0, len(results)) 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker def testUpdatePublicHeaderAndNoReleaseNoteGeneratesWarning(self): 58*c8dee2aaSAndroid Build Coastguard Worker mock_input_api = MockInputApi() 59*c8dee2aaSAndroid Build Coastguard Worker mock_input_api.files = [ 60*c8dee2aaSAndroid Build Coastguard Worker MockFile('include/core/SkDrawable.h', ''), 61*c8dee2aaSAndroid Build Coastguard Worker ] 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker mock_output_api = MockOutputApi() 64*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._CheckReleaseNotesForPublicAPI( 65*c8dee2aaSAndroid Build Coastguard Worker mock_input_api, mock_output_api) 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(1, len(results)) 68*c8dee2aaSAndroid Build Coastguard Worker self.assertIsInstance( 69*c8dee2aaSAndroid Build Coastguard Worker results[0], mock_output_api.PresubmitPromptWarning, 'Not a warning') 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker def testUpdatePublicHeaderAndReleaseNoteGeneratesNoWarning(self): 72*c8dee2aaSAndroid Build Coastguard Worker mock_input_api = MockInputApi() 73*c8dee2aaSAndroid Build Coastguard Worker mock_input_api.files = [ 74*c8dee2aaSAndroid Build Coastguard Worker MockFile('include/core/SkDrawable.h', ''), 75*c8dee2aaSAndroid Build Coastguard Worker MockFile('relnotes/new_note.md', ''), 76*c8dee2aaSAndroid Build Coastguard Worker ] 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker mock_output_api = MockOutputApi() 79*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._CheckReleaseNotesForPublicAPI( 80*c8dee2aaSAndroid Build Coastguard Worker mock_input_api, mock_output_api) 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(0, len(results)) 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Workerclass RunCommandAndCheckDiffTest(unittest.TestCase): 86*c8dee2aaSAndroid Build Coastguard Worker def setUp(self): 87*c8dee2aaSAndroid Build Coastguard Worker self.foo_file = MockAffectedFile('foo.txt', new_contents=['foo']) 88*c8dee2aaSAndroid Build Coastguard Worker self.bar_file = MockAffectedFile('bar.txt', new_contents=['bar']) 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker self.mock_input_api = MockInputApi() 91*c8dee2aaSAndroid Build Coastguard Worker self.mock_input_api.files = [self.foo_file, self.bar_file] 92*c8dee2aaSAndroid Build Coastguard Worker self.mock_output_api = MockOutputApi() 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker def setContents(self, file, contents): 95*c8dee2aaSAndroid Build Coastguard Worker file._new_contents = contents 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker @mock.patch('subprocess.check_output') 98*c8dee2aaSAndroid Build Coastguard Worker def testNoChangesReturnsNoResults(self, mock_subprocess): 99*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._RunCommandAndCheckDiff(self.mock_output_api, [], []) 100*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(results, []) 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker @mock.patch('subprocess.check_output') 103*c8dee2aaSAndroid Build Coastguard Worker def testChangingIrrelevantFilesReturnsNoResults(self, mock_subprocess): 104*c8dee2aaSAndroid Build Coastguard Worker mock_subprocess.side_effect = lambda *args, **kwargs: self.setContents(self.bar_file, ['foo']) 105*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._RunCommandAndCheckDiff( 106*c8dee2aaSAndroid Build Coastguard Worker self.mock_output_api, ['cmd'], [self.foo_file], 107*c8dee2aaSAndroid Build Coastguard Worker ) 108*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(results, []) 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker @mock.patch('subprocess.check_output') 111*c8dee2aaSAndroid Build Coastguard Worker def testChangingRelevantFilesReturnsDiff(self, mock_subprocess): 112*c8dee2aaSAndroid Build Coastguard Worker mock_subprocess.side_effect = lambda *args, **kwargs: self.setContents(self.foo_file, ['bar']) 113*c8dee2aaSAndroid Build Coastguard Worker results = PRESUBMIT._RunCommandAndCheckDiff( 114*c8dee2aaSAndroid Build Coastguard Worker self.mock_output_api, ['cmd'], [self.foo_file], 115*c8dee2aaSAndroid Build Coastguard Worker ) 116*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(len(results), 1) 117*c8dee2aaSAndroid Build Coastguard Worker self.assertEqual(results[0].message, 118*c8dee2aaSAndroid Build Coastguard Worker"""Diffs found after running "cmd": 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker--- foo.txt 121*c8dee2aaSAndroid Build Coastguard Worker+++ foo.txt 122*c8dee2aaSAndroid Build Coastguard Worker@@ -1 +1 @@ 123*c8dee2aaSAndroid Build Coastguard Worker-foo 124*c8dee2aaSAndroid Build Coastguard Worker+bar 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard WorkerPlease commit or discard the above changes.""") 127*c8dee2aaSAndroid Build Coastguard Worker 128*c8dee2aaSAndroid Build Coastguard Worker 129*c8dee2aaSAndroid Build Coastguard Workerif __name__ == '__main__': 130*c8dee2aaSAndroid Build Coastguard Worker unittest.main() 131