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