| #!/usr/bin/env python3 |
| |
| # |
| # Copyright 2015, The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| """Tests the Checkstyle script used to run style checks on Java files.""" |
| |
| try: |
| from StringIO import StringIO |
| except ImportError: |
| # python3 use io instead of StringIO |
| from io import StringIO |
| import unittest |
| import checkstyle |
| |
| |
| TEST_RULE = u'com.puppycrawl.tools.checkstyle.checks.BANANAS' |
| TEST_SHA = u'0000deadbeef000000deadbeef00deadbeef0000' |
| TEST_ROOT = u'/usr/local/android/master/framework/support' |
| TEST_FILE1 = TEST_ROOT + u'/Blarg.java' |
| TEST_FILE2 = TEST_ROOT + u'/Blarg2.java' |
| TEST_FILE_NON_JAVA = TEST_ROOT + u'/blarg.cc' |
| FILE_ADDED = u'A ' |
| FILE_MODIFIED = u'M ' |
| FILE_UNTRACKED = u'??' |
| |
| |
| def mock_repository_root(): |
| return TEST_ROOT |
| |
| |
| def mock_last_commit(): |
| return TEST_SHA |
| |
| |
| def mock_modified_files_good(root, tracked_only=False, commit=None): |
| if commit: |
| return {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED} |
| return {} |
| |
| |
| def mock_modified_files_uncommitted(root, tracked_only=False, commit=None): |
| if tracked_only and not commit: |
| return {TEST_FILE1: FILE_MODIFIED} |
| if commit: |
| return {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED} |
| return {} |
| |
| |
| def mock_modified_files_untracked(root, tracked_only=False, commit=None): |
| if not tracked_only: |
| return {TEST_FILE1: FILE_UNTRACKED} |
| if commit: |
| return {TEST_FILE2: FILE_ADDED} |
| return {} |
| |
| |
| def mock_modified_files_non_java(root, tracked_only=False, commit=None): |
| if commit: |
| return {TEST_FILE1: FILE_MODIFIED, TEST_FILE_NON_JAVA: FILE_ADDED} |
| return {} |
| |
| |
| class TestCheckstyle(unittest.TestCase): |
| |
| def setUp(self): |
| checkstyle.git.repository_root = mock_repository_root |
| checkstyle.git.last_commit = mock_last_commit |
| |
| def test_ShouldSkip(self): |
| # Skip checks for explicit git commit. |
| self.assertFalse(checkstyle._ShouldSkip(True, None, 1, TEST_RULE)) |
| self.assertTrue(checkstyle._ShouldSkip(True, [], 1, TEST_RULE)) |
| self.assertFalse(checkstyle._ShouldSkip(True, [1], 1, TEST_RULE)) |
| self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 1, TEST_RULE)) |
| self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 4, TEST_RULE)) |
| for rule in checkstyle.FORCED_RULES: |
| self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 1, rule)) |
| self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 4, rule)) |
| |
| # Skip checks for explicitly checked files. |
| self.assertFalse(checkstyle._ShouldSkip(False, None, 1, TEST_RULE)) |
| self.assertFalse(checkstyle._ShouldSkip(False, [], 1, TEST_RULE)) |
| self.assertFalse(checkstyle._ShouldSkip(False, [1], 1, TEST_RULE)) |
| self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 1, TEST_RULE)) |
| self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 4, TEST_RULE)) |
| for rule in checkstyle.FORCED_RULES: |
| self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 1, rule)) |
| self.assertFalse(checkstyle._ShouldSkip(False, [1, 2, 3], 4, rule)) |
| |
| # Skip checks for test classes. |
| self.assertFalse(checkstyle._ShouldSkip(True, None, 1, TEST_RULE, True)) |
| self.assertTrue(checkstyle._ShouldSkip(True, [], 1, TEST_RULE, True)) |
| self.assertFalse(checkstyle._ShouldSkip(True, [1], 1, TEST_RULE, True)) |
| self.assertFalse(checkstyle._ShouldSkip(True, [1, 2, 3], 1, TEST_RULE, True)) |
| self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 4, TEST_RULE, True)) |
| for rule in checkstyle.SKIPPED_RULES_FOR_TEST_FILES: |
| self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 1, rule, True)) |
| self.assertTrue(checkstyle._ShouldSkip(True, [1, 2, 3], 4, rule, True)) |
| |
| def test_GetModifiedFiles(self): |
| checkstyle.git.modified_files = mock_modified_files_good |
| out = StringIO() |
| files = checkstyle._GetModifiedFiles(mock_last_commit(), out=out) |
| output = out.getvalue() |
| self.assertEqual(output, '') |
| self.assertEqual(files, {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED}) |
| |
| def test_GetModifiedFilesUncommitted(self): |
| checkstyle.git.modified_files = mock_modified_files_uncommitted |
| with self.assertRaises(SystemExit): |
| out = StringIO() |
| checkstyle._GetModifiedFiles(mock_last_commit(), out=out) |
| self.assertEqual(out.getvalue(), checkstyle.ERROR_UNCOMMITTED) |
| |
| def test_GetModifiedFilesUncommittedExplicitCommit(self): |
| checkstyle.git.modified_files = mock_modified_files_uncommitted |
| out = StringIO() |
| files = checkstyle._GetModifiedFiles(mock_last_commit(), True, out=out) |
| output = out.getvalue() |
| self.assertEqual(output, '') |
| self.assertEqual(files, {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED}) |
| |
| def test_GetModifiedFilesNonJava(self): |
| checkstyle.git.modified_files = mock_modified_files_non_java |
| out = StringIO() |
| files = checkstyle._GetModifiedFiles(mock_last_commit(), out=out) |
| output = out.getvalue() |
| self.assertEqual(output, '') |
| self.assertEqual(files, {TEST_FILE1: FILE_MODIFIED}) |
| |
| def test_WarnIfUntrackedFiles(self): |
| checkstyle.git.modified_files = mock_modified_files_untracked |
| out = StringIO() |
| checkstyle._WarnIfUntrackedFiles(out=out) |
| output = out.getvalue() |
| self.assertEqual(output, checkstyle.ERROR_UNTRACKED + TEST_FILE1 + '\n\n') |
| |
| def test_WarnIfUntrackedFilesNoUntracked(self): |
| checkstyle.git.modified_files = mock_modified_files_good |
| out = StringIO() |
| checkstyle._WarnIfUntrackedFiles(out=out) |
| output = out.getvalue() |
| self.assertEqual(output, '') |
| |
| def test_FilterFiles(self): |
| files = {TEST_FILE1: FILE_MODIFIED, TEST_FILE2: FILE_ADDED} |
| output = checkstyle._FilterFiles(files, None) |
| self.assertEqual(files, output) |
| output = checkstyle._FilterFiles(files, ['Blarg2']) |
| self.assertEqual({TEST_FILE2: FILE_ADDED}, output) |
| output = checkstyle._FilterFiles(files, ['Blarg']) |
| self.assertEqual(files, output) |
| output = checkstyle._FilterFiles(files, ['FunkyTown']) |
| self.assertEqual({}, output) |
| |
| if __name__ == '__main__': |
| unittest.main() |