xref: /aosp_15_r20/external/skia/PRESUBMIT_test.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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