xref: /aosp_15_r20/prebuilts/checkstyle/tests.py (revision 387726c4b5c67c6b48512fa4a28a3b8997d21b0d)
1*387726c4SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*387726c4SAndroid Build Coastguard Worker
3*387726c4SAndroid Build Coastguard Worker#
4*387726c4SAndroid Build Coastguard Worker# Copyright 2015, The Android Open Source Project
5*387726c4SAndroid Build Coastguard Worker#
6*387726c4SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
7*387726c4SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
8*387726c4SAndroid Build Coastguard Worker# You may obtain a copy of the License at
9*387726c4SAndroid Build Coastguard Worker#
10*387726c4SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
11*387726c4SAndroid Build Coastguard Worker#
12*387726c4SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
13*387726c4SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
14*387726c4SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*387726c4SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
16*387726c4SAndroid Build Coastguard Worker# limitations under the License.
17*387726c4SAndroid Build Coastguard Worker#
18*387726c4SAndroid Build Coastguard Worker
19*387726c4SAndroid Build Coastguard Worker"""Tests the Checkstyle script used to run style checks on Java files."""
20*387726c4SAndroid Build Coastguard Worker
21*387726c4SAndroid Build Coastguard Workertry:
22*387726c4SAndroid Build Coastguard Worker  from StringIO import StringIO
23*387726c4SAndroid Build Coastguard Workerexcept ImportError:
24*387726c4SAndroid Build Coastguard Worker  # python3 use io instead of StringIO
25*387726c4SAndroid Build Coastguard Worker  from io import StringIO
26*387726c4SAndroid Build Coastguard Workerimport unittest
27*387726c4SAndroid Build Coastguard Workerimport checkstyle
28*387726c4SAndroid Build Coastguard Worker
29*387726c4SAndroid Build Coastguard Worker
30*387726c4SAndroid Build Coastguard WorkerTEST_RULE = u'com.puppycrawl.tools.checkstyle.checks.BANANAS'
31*387726c4SAndroid Build Coastguard WorkerTEST_SHA = u'0000deadbeef000000deadbeef00deadbeef0000'
32*387726c4SAndroid Build Coastguard WorkerTEST_ROOT = u'/usr/local/android/master/framework/support'
33*387726c4SAndroid Build Coastguard WorkerTEST_FILE1 = TEST_ROOT + u'/Blarg.java'
34*387726c4SAndroid Build Coastguard WorkerTEST_FILE2 = TEST_ROOT + u'/Blarg2.java'
35*387726c4SAndroid Build Coastguard WorkerTEST_FILE_NON_JAVA = TEST_ROOT + u'/blarg.cc'
36*387726c4SAndroid Build Coastguard WorkerFILE_ADDED = u'A '
37*387726c4SAndroid Build Coastguard WorkerFILE_MODIFIED = u'M '
38*387726c4SAndroid Build Coastguard WorkerFILE_UNTRACKED = u'??'
39*387726c4SAndroid Build Coastguard Worker
40*387726c4SAndroid Build Coastguard Worker
41*387726c4SAndroid Build Coastguard Workerdef mock_repository_root():
42*387726c4SAndroid Build Coastguard Worker  return TEST_ROOT
43*387726c4SAndroid Build Coastguard Worker
44*387726c4SAndroid Build Coastguard Worker
45*387726c4SAndroid Build Coastguard Workerdef mock_last_commit():
46*387726c4SAndroid Build Coastguard Worker  return TEST_SHA
47*387726c4SAndroid Build Coastguard Worker
48*387726c4SAndroid Build Coastguard Worker
49*387726c4SAndroid Build Coastguard Workerdef mock_modified_files_good(root, tracked_only=False, commit=None):
50*387726c4SAndroid Build Coastguard Worker  if commit:
51*387726c4SAndroid Build Coastguard Worker    return {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED}
52*387726c4SAndroid Build Coastguard Worker  return {}
53*387726c4SAndroid Build Coastguard Worker
54*387726c4SAndroid Build Coastguard Worker
55*387726c4SAndroid Build Coastguard Workerdef mock_modified_files_uncommitted(root, tracked_only=False, commit=None):
56*387726c4SAndroid Build Coastguard Worker  if tracked_only and not commit:
57*387726c4SAndroid Build Coastguard Worker    return {TEST_FILE1: FILE_MODIFIED}
58*387726c4SAndroid Build Coastguard Worker  if commit:
59*387726c4SAndroid Build Coastguard Worker    return {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED}
60*387726c4SAndroid Build Coastguard Worker  return {}
61*387726c4SAndroid Build Coastguard Worker
62*387726c4SAndroid Build Coastguard Worker
63*387726c4SAndroid Build Coastguard Workerdef mock_modified_files_untracked(root, tracked_only=False, commit=None):
64*387726c4SAndroid Build Coastguard Worker  if not tracked_only:
65*387726c4SAndroid Build Coastguard Worker    return {TEST_FILE1: FILE_UNTRACKED}
66*387726c4SAndroid Build Coastguard Worker  if commit:
67*387726c4SAndroid Build Coastguard Worker    return {TEST_FILE2: FILE_ADDED}
68*387726c4SAndroid Build Coastguard Worker  return {}
69*387726c4SAndroid Build Coastguard Worker
70*387726c4SAndroid Build Coastguard Worker
71*387726c4SAndroid Build Coastguard Workerdef mock_modified_files_non_java(root, tracked_only=False, commit=None):
72*387726c4SAndroid Build Coastguard Worker  if commit:
73*387726c4SAndroid Build Coastguard Worker    return {TEST_FILE1: FILE_MODIFIED, TEST_FILE_NON_JAVA: FILE_ADDED}
74*387726c4SAndroid Build Coastguard Worker  return {}
75*387726c4SAndroid Build Coastguard Worker
76*387726c4SAndroid Build Coastguard Worker
77*387726c4SAndroid Build Coastguard Workerclass TestCheckstyle(unittest.TestCase):
78*387726c4SAndroid Build Coastguard Worker
79*387726c4SAndroid Build Coastguard Worker  def setUp(self):
80*387726c4SAndroid Build Coastguard Worker    checkstyle.git.repository_root = mock_repository_root
81*387726c4SAndroid Build Coastguard Worker    checkstyle.git.last_commit = mock_last_commit
82*387726c4SAndroid Build Coastguard Worker
83*387726c4SAndroid Build Coastguard Worker  def test_ShouldSkip(self):
84*387726c4SAndroid Build Coastguard Worker    # Skip checks for explicit git commit.
85*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(True, None, 1, TEST_RULE))
86*387726c4SAndroid Build Coastguard Worker    self.assertTrue(checkstyle._ShouldSkip(True, [], 1, TEST_RULE))
87*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(True, [1], 1, TEST_RULE))
88*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 1, TEST_RULE))
89*387726c4SAndroid Build Coastguard Worker    self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 4, TEST_RULE))
90*387726c4SAndroid Build Coastguard Worker    for rule in checkstyle.FORCED_RULES:
91*387726c4SAndroid Build Coastguard Worker      self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 1, rule))
92*387726c4SAndroid Build Coastguard Worker      self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 4, rule))
93*387726c4SAndroid Build Coastguard Worker
94*387726c4SAndroid Build Coastguard Worker    # Skip checks for explicitly checked files.
95*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(False, None, 1, TEST_RULE))
96*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(False, [], 1, TEST_RULE))
97*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(False, [1], 1, TEST_RULE))
98*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 1, TEST_RULE))
99*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 4, TEST_RULE))
100*387726c4SAndroid Build Coastguard Worker    for rule in checkstyle.FORCED_RULES:
101*387726c4SAndroid Build Coastguard Worker      self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 1, rule))
102*387726c4SAndroid Build Coastguard Worker      self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 4, rule))
103*387726c4SAndroid Build Coastguard Worker
104*387726c4SAndroid Build Coastguard Worker    # Skip checks for test classes.
105*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(True, None, 1, TEST_RULE, True))
106*387726c4SAndroid Build Coastguard Worker    self.assertTrue(checkstyle._ShouldSkip(True, [], 1, TEST_RULE, True))
107*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(True, [1], 1, TEST_RULE, True))
108*387726c4SAndroid Build Coastguard Worker    self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 1, TEST_RULE, True))
109*387726c4SAndroid Build Coastguard Worker    self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 4, TEST_RULE, True))
110*387726c4SAndroid Build Coastguard Worker    for rule in checkstyle.SKIPPED_RULES_FOR_TEST_FILES:
111*387726c4SAndroid Build Coastguard Worker      self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 1, rule, True))
112*387726c4SAndroid Build Coastguard Worker      self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 4, rule, True))
113*387726c4SAndroid Build Coastguard Worker
114*387726c4SAndroid Build Coastguard Worker  def test_GetModifiedFiles(self):
115*387726c4SAndroid Build Coastguard Worker    checkstyle.git.modified_files = mock_modified_files_good
116*387726c4SAndroid Build Coastguard Worker    out = StringIO()
117*387726c4SAndroid Build Coastguard Worker    files = checkstyle._GetModifiedFiles(mock_last_commit(), out=out)
118*387726c4SAndroid Build Coastguard Worker    output = out.getvalue()
119*387726c4SAndroid Build Coastguard Worker    self.assertEqual(output, '')
120*387726c4SAndroid Build Coastguard Worker    self.assertEqual(files, {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED})
121*387726c4SAndroid Build Coastguard Worker
122*387726c4SAndroid Build Coastguard Worker  def test_GetModifiedFilesUncommitted(self):
123*387726c4SAndroid Build Coastguard Worker    checkstyle.git.modified_files = mock_modified_files_uncommitted
124*387726c4SAndroid Build Coastguard Worker    with self.assertRaises(SystemExit):
125*387726c4SAndroid Build Coastguard Worker      out = StringIO()
126*387726c4SAndroid Build Coastguard Worker      checkstyle._GetModifiedFiles(mock_last_commit(), out=out)
127*387726c4SAndroid Build Coastguard Worker    self.assertEqual(out.getvalue(), checkstyle.ERROR_UNCOMMITTED)
128*387726c4SAndroid Build Coastguard Worker
129*387726c4SAndroid Build Coastguard Worker  def test_GetModifiedFilesUncommittedExplicitCommit(self):
130*387726c4SAndroid Build Coastguard Worker    checkstyle.git.modified_files = mock_modified_files_uncommitted
131*387726c4SAndroid Build Coastguard Worker    out = StringIO()
132*387726c4SAndroid Build Coastguard Worker    files = checkstyle._GetModifiedFiles(mock_last_commit(), True, out=out)
133*387726c4SAndroid Build Coastguard Worker    output = out.getvalue()
134*387726c4SAndroid Build Coastguard Worker    self.assertEqual(output, '')
135*387726c4SAndroid Build Coastguard Worker    self.assertEqual(files, {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED})
136*387726c4SAndroid Build Coastguard Worker
137*387726c4SAndroid Build Coastguard Worker  def test_GetModifiedFilesNonJava(self):
138*387726c4SAndroid Build Coastguard Worker    checkstyle.git.modified_files = mock_modified_files_non_java
139*387726c4SAndroid Build Coastguard Worker    out = StringIO()
140*387726c4SAndroid Build Coastguard Worker    files = checkstyle._GetModifiedFiles(mock_last_commit(), out=out)
141*387726c4SAndroid Build Coastguard Worker    output = out.getvalue()
142*387726c4SAndroid Build Coastguard Worker    self.assertEqual(output, '')
143*387726c4SAndroid Build Coastguard Worker    self.assertEqual(files, {TEST_FILE1: FILE_MODIFIED})
144*387726c4SAndroid Build Coastguard Worker
145*387726c4SAndroid Build Coastguard Worker  def test_WarnIfUntrackedFiles(self):
146*387726c4SAndroid Build Coastguard Worker    checkstyle.git.modified_files = mock_modified_files_untracked
147*387726c4SAndroid Build Coastguard Worker    out = StringIO()
148*387726c4SAndroid Build Coastguard Worker    checkstyle._WarnIfUntrackedFiles(out=out)
149*387726c4SAndroid Build Coastguard Worker    output = out.getvalue()
150*387726c4SAndroid Build Coastguard Worker    self.assertEqual(output, checkstyle.ERROR_UNTRACKED + TEST_FILE1 + '\n\n')
151*387726c4SAndroid Build Coastguard Worker
152*387726c4SAndroid Build Coastguard Worker  def test_WarnIfUntrackedFilesNoUntracked(self):
153*387726c4SAndroid Build Coastguard Worker    checkstyle.git.modified_files = mock_modified_files_good
154*387726c4SAndroid Build Coastguard Worker    out = StringIO()
155*387726c4SAndroid Build Coastguard Worker    checkstyle._WarnIfUntrackedFiles(out=out)
156*387726c4SAndroid Build Coastguard Worker    output = out.getvalue()
157*387726c4SAndroid Build Coastguard Worker    self.assertEqual(output, '')
158*387726c4SAndroid Build Coastguard Worker
159*387726c4SAndroid Build Coastguard Worker  def test_FilterFiles(self):
160*387726c4SAndroid Build Coastguard Worker    files = {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED}
161*387726c4SAndroid Build Coastguard Worker    output = checkstyle._FilterFiles(files, None)
162*387726c4SAndroid Build Coastguard Worker    self.assertEqual(files, output)
163*387726c4SAndroid Build Coastguard Worker    output = checkstyle._FilterFiles(files, ['Blarg2'])
164*387726c4SAndroid Build Coastguard Worker    self.assertEqual({TEST_FILE2: FILE_ADDED}, output)
165*387726c4SAndroid Build Coastguard Worker    output = checkstyle._FilterFiles(files, ['Blarg'])
166*387726c4SAndroid Build Coastguard Worker    self.assertEqual(files, output)
167*387726c4SAndroid Build Coastguard Worker    output = checkstyle._FilterFiles(files, ['FunkyTown'])
168*387726c4SAndroid Build Coastguard Worker    self.assertEqual({}, output)
169*387726c4SAndroid Build Coastguard Worker
170*387726c4SAndroid Build Coastguard Workerif __name__ == '__main__':
171*387726c4SAndroid Build Coastguard Worker  unittest.main()
172