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