OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. |
| 5 |
| 6 """Tests for checkdeps. |
| 7 """ |
| 8 |
| 9 import os |
| 10 import unittest |
| 11 |
| 12 |
| 13 import checkdeps |
| 14 import results |
| 15 |
| 16 |
| 17 class CheckDepsTest(unittest.TestCase): |
| 18 |
| 19 def setUp(self): |
| 20 self.deps_checker = checkdeps.DepsChecker(being_tested=True) |
| 21 |
| 22 def ImplTestRegularCheckDepsRun(self, ignore_temp_rules, skip_tests): |
| 23 self.deps_checker._ignore_temp_rules = ignore_temp_rules |
| 24 self.deps_checker._skip_tests = skip_tests |
| 25 self.deps_checker.CheckDirectory( |
| 26 os.path.join(self.deps_checker.base_directory, |
| 27 'tools/checkdeps/testdata')) |
| 28 |
| 29 problems = self.deps_checker.results_formatter.GetResults() |
| 30 if skip_tests: |
| 31 self.failUnlessEqual(3, len(problems)) |
| 32 else: |
| 33 self.failUnlessEqual(4, len(problems)) |
| 34 |
| 35 def VerifySubstringsInProblems(key_path, substrings_in_sequence): |
| 36 """Finds the problem in |problems| that contains |key_path|, |
| 37 then verifies that each of |substrings_in_sequence| occurs in |
| 38 that problem, in the order they appear in |
| 39 |substrings_in_sequence|. |
| 40 """ |
| 41 found = False |
| 42 key_path = os.path.normpath(key_path) |
| 43 for problem in problems: |
| 44 index = problem.find(key_path) |
| 45 if index != -1: |
| 46 for substring in substrings_in_sequence: |
| 47 index = problem.find(substring, index + 1) |
| 48 self.failUnless(index != -1, '%s in %s' % (substring, problem)) |
| 49 found = True |
| 50 break |
| 51 if not found: |
| 52 self.fail('Found no problem for file %s' % key_path) |
| 53 |
| 54 if ignore_temp_rules: |
| 55 VerifySubstringsInProblems('testdata/allowed/test.h', |
| 56 ['-tools/checkdeps/testdata/disallowed', |
| 57 'temporarily_allowed.h', |
| 58 '-third_party/explicitly_disallowed', |
| 59 'Because of no rule applying']) |
| 60 else: |
| 61 VerifySubstringsInProblems('testdata/allowed/test.h', |
| 62 ['-tools/checkdeps/testdata/disallowed', |
| 63 '-third_party/explicitly_disallowed', |
| 64 'Because of no rule applying']) |
| 65 |
| 66 VerifySubstringsInProblems('testdata/disallowed/test.h', |
| 67 ['-third_party/explicitly_disallowed', |
| 68 'Because of no rule applying', |
| 69 'Because of no rule applying']) |
| 70 VerifySubstringsInProblems('disallowed/allowed/test.h', |
| 71 ['-third_party/explicitly_disallowed', |
| 72 'Because of no rule applying', |
| 73 'Because of no rule applying']) |
| 74 |
| 75 if not skip_tests: |
| 76 VerifySubstringsInProblems('allowed/not_a_test.cc', |
| 77 ['-tools/checkdeps/testdata/disallowed']) |
| 78 |
| 79 def testRegularCheckDepsRun(self): |
| 80 self.ImplTestRegularCheckDepsRun(False, False) |
| 81 |
| 82 def testRegularCheckDepsRunIgnoringTempRules(self): |
| 83 self.ImplTestRegularCheckDepsRun(True, False) |
| 84 |
| 85 def testRegularCheckDepsRunSkipTests(self): |
| 86 self.ImplTestRegularCheckDepsRun(False, True) |
| 87 |
| 88 def testRegularCheckDepsRunIgnoringTempRulesSkipTests(self): |
| 89 self.ImplTestRegularCheckDepsRun(True, True) |
| 90 |
| 91 def CountViolations(self, ignore_temp_rules): |
| 92 self.deps_checker._ignore_temp_rules = ignore_temp_rules |
| 93 self.deps_checker.results_formatter = results.CountViolationsFormatter() |
| 94 self.deps_checker.CheckDirectory( |
| 95 os.path.join(self.deps_checker.base_directory, |
| 96 'tools/checkdeps/testdata')) |
| 97 return self.deps_checker.results_formatter.GetResults() |
| 98 |
| 99 def testCountViolations(self): |
| 100 self.failUnlessEqual('10', self.CountViolations(False)) |
| 101 |
| 102 def testCountViolationsIgnoringTempRules(self): |
| 103 self.failUnlessEqual('11', self.CountViolations(True)) |
| 104 |
| 105 def testTempRulesGenerator(self): |
| 106 self.deps_checker.results_formatter = results.TemporaryRulesFormatter() |
| 107 self.deps_checker.CheckDirectory( |
| 108 os.path.join(self.deps_checker.base_directory, |
| 109 'tools/checkdeps/testdata/allowed')) |
| 110 temp_rules = self.deps_checker.results_formatter.GetResults() |
| 111 expected = [u' "!third_party/explicitly_disallowed/bad.h",', |
| 112 u' "!third_party/no_rule/bad.h",', |
| 113 u' "!tools/checkdeps/testdata/disallowed/bad.h",', |
| 114 u' "!tools/checkdeps/testdata/disallowed/teststuff/bad.h",'] |
| 115 self.failUnlessEqual(expected, temp_rules) |
| 116 |
| 117 def testCheckAddedIncludesAllGood(self): |
| 118 problems = self.deps_checker.CheckAddedCppIncludes( |
| 119 [['tools/checkdeps/testdata/allowed/test.cc', |
| 120 ['#include "tools/checkdeps/testdata/allowed/good.h"', |
| 121 '#include "tools/checkdeps/testdata/disallowed/allowed/good.h"'] |
| 122 ]]) |
| 123 self.failIf(problems) |
| 124 |
| 125 def testCheckAddedIncludesManyGarbageLines(self): |
| 126 garbage_lines = ["My name is Sam%d\n" % num for num in range(50)] |
| 127 problems = self.deps_checker.CheckAddedCppIncludes( |
| 128 [['tools/checkdeps/testdata/allowed/test.cc', garbage_lines]]) |
| 129 self.failIf(problems) |
| 130 |
| 131 def testCheckAddedIncludesNoRule(self): |
| 132 problems = self.deps_checker.CheckAddedCppIncludes( |
| 133 [['tools/checkdeps/testdata/allowed/test.cc', |
| 134 ['#include "no_rule_for_this/nogood.h"'] |
| 135 ]]) |
| 136 self.failUnless(problems) |
| 137 |
| 138 def testCheckAddedIncludesSkippedDirectory(self): |
| 139 problems = self.deps_checker.CheckAddedCppIncludes( |
| 140 [['tools/checkdeps/testdata/disallowed/allowed/skipped/test.cc', |
| 141 ['#include "whatever/whocares.h"'] |
| 142 ]]) |
| 143 self.failIf(problems) |
| 144 |
| 145 def testCheckAddedIncludesTempAllowed(self): |
| 146 problems = self.deps_checker.CheckAddedCppIncludes( |
| 147 [['tools/checkdeps/testdata/allowed/test.cc', |
| 148 ['#include "tools/checkdeps/testdata/disallowed/temporarily_allowed.h"'] |
| 149 ]]) |
| 150 self.failUnless(problems) |
| 151 |
| 152 def testCopyIsDeep(self): |
| 153 # Regression test for a bug where we were making shallow copies of |
| 154 # Rules objects and therefore all Rules objects shared the same |
| 155 # dictionary for specific rules. |
| 156 # |
| 157 # The first pair should bring in a rule from testdata/allowed/DEPS |
| 158 # into that global dictionary that allows the |
| 159 # temp_allowed_for_tests.h file to be included in files ending |
| 160 # with _unittest.cc, and the second pair should completely fail |
| 161 # once the bug is fixed, but succeed (with a temporary allowance) |
| 162 # if the bug is in place. |
| 163 problems = self.deps_checker.CheckAddedCppIncludes( |
| 164 [['tools/checkdeps/testdata/allowed/test.cc', |
| 165 ['#include "tools/checkdeps/testdata/disallowed/temporarily_allowed.h"'] |
| 166 ], |
| 167 ['tools/checkdeps/testdata/disallowed/foo_unittest.cc', |
| 168 ['#include "tools/checkdeps/testdata/bongo/temp_allowed_for_tests.h"'] |
| 169 ]]) |
| 170 # With the bug in place, there would be two problems reported, and |
| 171 # the second would be for foo_unittest.cc. |
| 172 self.failUnless(len(problems) == 1) |
| 173 self.failUnless(problems[0][0].endswith('/test.cc')) |
| 174 |
| 175 |
| 176 if __name__ == '__main__': |
| 177 unittest.main() |
OLD | NEW |