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