- add sources.
[platform/framework/web/crosswalk.git] / src / tools / checkdeps / checkdeps_test.py
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()