Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "tools/gn/config.h" | 8 #include "tools/gn/config.h" |
| 9 #include "tools/gn/header_checker.h" | 9 #include "tools/gn/header_checker.h" |
| 10 #include "tools/gn/scheduler.h" | 10 #include "tools/gn/scheduler.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 p.set_output_type(Target::SOURCE_SET); | 79 p.set_output_type(Target::SOURCE_SET); |
| 80 p.SetToolchain(setup_.toolchain(), &err); | 80 p.SetToolchain(setup_.toolchain(), &err); |
| 81 EXPECT_FALSE(err.has_error()); | 81 EXPECT_FALSE(err.has_error()); |
| 82 p.private_deps().push_back(LabelTargetPair(&c_)); | 82 p.private_deps().push_back(LabelTargetPair(&c_)); |
| 83 p.visibility().SetPublic(); | 83 p.visibility().SetPublic(); |
| 84 p.OnResolved(&err); | 84 p.OnResolved(&err); |
| 85 | 85 |
| 86 a_.public_deps().push_back(LabelTargetPair(&p)); | 86 a_.public_deps().push_back(LabelTargetPair(&p)); |
| 87 | 87 |
| 88 // A does not depend on itself. | 88 // A does not depend on itself. |
| 89 bool is_public = false; | 89 bool is_permitted = false; |
| 90 std::vector<const Target*> chain; | 90 HeaderChecker::Chain chain; |
| 91 EXPECT_FALSE(checker->IsDependencyOf(&a_, &a_, &chain, &is_public)); | 91 EXPECT_FALSE(checker->IsDependencyOf(&a_, &a_, &chain, &is_permitted)); |
| 92 | 92 |
| 93 // A depends on B. | 93 // A depends publicly on B. |
| 94 chain.clear(); | 94 chain.clear(); |
| 95 is_public = false; | 95 is_permitted = false; |
| 96 EXPECT_TRUE(checker->IsDependencyOf(&b_, &a_, &chain, &is_public)); | 96 EXPECT_TRUE(checker->IsDependencyOf(&b_, &a_, &chain, &is_permitted)); |
| 97 ASSERT_EQ(2u, chain.size()); | 97 ASSERT_EQ(2u, chain.size()); |
| 98 EXPECT_EQ(&b_, chain[0]); | 98 EXPECT_EQ(HeaderChecker::ChainLink(&b_, true), chain[0]); |
| 99 EXPECT_EQ(&a_, chain[1]); | 99 EXPECT_EQ(HeaderChecker::ChainLink(&a_, true), chain[1]); |
| 100 EXPECT_TRUE(is_public); | 100 EXPECT_TRUE(is_permitted); |
| 101 | 101 |
| 102 // A indirectly depends on C. The "public" dependency path through B should | 102 // A indirectly depends on C. The "public" dependency path through B should |
| 103 // be identified. | 103 // be identified. |
| 104 chain.clear(); | 104 chain.clear(); |
| 105 is_public = false; | 105 is_permitted = false; |
| 106 EXPECT_TRUE(checker->IsDependencyOf(&c_, &a_, &chain, &is_public)); | 106 EXPECT_TRUE(checker->IsDependencyOf(&c_, &a_, &chain, &is_permitted)); |
| 107 ASSERT_EQ(3u, chain.size()); | 107 ASSERT_EQ(3u, chain.size()); |
| 108 EXPECT_EQ(&c_, chain[0]); | 108 EXPECT_EQ(HeaderChecker::ChainLink(&c_, true), chain[0]); |
| 109 EXPECT_EQ(&b_, chain[1]); | 109 EXPECT_EQ(HeaderChecker::ChainLink(&b_, true), chain[1]); |
| 110 EXPECT_EQ(&a_, chain[2]); | 110 EXPECT_EQ(HeaderChecker::ChainLink(&a_, true), chain[2]); |
| 111 EXPECT_TRUE(is_public); | 111 EXPECT_TRUE(is_permitted); |
| 112 | 112 |
| 113 // C does not depend on A. | 113 // C does not depend on A. |
| 114 chain.clear(); | 114 chain.clear(); |
| 115 is_public = false; | 115 is_permitted = false; |
| 116 EXPECT_FALSE(checker->IsDependencyOf(&a_, &c_, &chain, &is_public)); | 116 EXPECT_FALSE(checker->IsDependencyOf(&a_, &c_, &chain, &is_permitted)); |
| 117 EXPECT_TRUE(chain.empty()); | 117 EXPECT_TRUE(chain.empty()); |
| 118 EXPECT_FALSE(is_public); | 118 EXPECT_FALSE(is_permitted); |
| 119 | 119 |
| 120 // Add a private A -> C dependency. This should not be detected since it's | 120 // Remove the B -> C public dependency, leaving P's private dep on C the only |
| 121 // private, even though it's shorter than the A -> B -> C one. | 121 // path from A to C. This should now be found. |
| 122 chain.clear(); | 122 chain.clear(); |
| 123 is_public = false; | 123 EXPECT_EQ(&c_, b_.public_deps()[0].ptr); // Validate it's the right one. |
| 124 a_.private_deps().push_back(LabelTargetPair(&c_)); | 124 b_.public_deps().erase(b_.public_deps().begin()); |
| 125 EXPECT_TRUE(checker->IsDependencyOf(&c_, &a_, &chain, &is_public)); | 125 EXPECT_TRUE(checker->IsDependencyOf(&c_, &a_, &chain, &is_permitted)); |
| 126 EXPECT_EQ(&c_, chain[0]); | 126 EXPECT_EQ(3u, chain.size()); |
| 127 EXPECT_EQ(&b_, chain[1]); | 127 EXPECT_EQ(HeaderChecker::ChainLink(&c_, false), chain[0]); |
| 128 EXPECT_EQ(&a_, chain[2]); | 128 EXPECT_EQ(HeaderChecker::ChainLink(&p, true), chain[1]); |
|
scottmg
2014/09/18 22:33:52
hm, no i guess is_public for ChainLink makes sense
| |
| 129 EXPECT_TRUE(is_public); | 129 EXPECT_EQ(HeaderChecker::ChainLink(&a_, true), chain[2]); |
| 130 EXPECT_FALSE(is_permitted); | |
| 130 | 131 |
|
scottmg
2014/09/18 22:33:52
since the iteration depends on discarding disallow
| |
| 131 // Remove the B -> C public dependency, leaving A's private dep on C the only | 132 // P privately depends on C. That dependency should be OK since it's only |
| 132 // path. This should now be found. | 133 // one hop. |
| 133 chain.clear(); | 134 chain.clear(); |
| 134 EXPECT_EQ(&c_, b_.public_deps()[0].ptr); // Validate it's the right one. | 135 is_permitted = false; |
| 135 b_.public_deps().erase(b_.public_deps().begin()); | 136 EXPECT_TRUE(checker->IsDependencyOf(&c_, &p, &chain, &is_permitted)); |
| 136 EXPECT_TRUE(checker->IsDependencyOf(&c_, &a_, &chain, &is_public)); | 137 ASSERT_EQ(2u, chain.size()); |
| 137 EXPECT_EQ(&c_, chain[0]); | 138 EXPECT_EQ(HeaderChecker::ChainLink(&c_, false), chain[0]); |
| 138 EXPECT_EQ(&a_, chain[1]); | 139 EXPECT_EQ(HeaderChecker::ChainLink(&p, true), chain[1]); |
| 139 EXPECT_FALSE(is_public); | 140 EXPECT_TRUE(is_permitted); |
|
scottmg
2014/09/18 22:33:52
Maybe a test that
A -> B -> C -> D
is right too,
| |
| 140 } | 141 } |
| 141 | 142 |
| 142 TEST_F(HeaderCheckerTest, CheckInclude) { | 143 TEST_F(HeaderCheckerTest, CheckInclude) { |
| 143 InputFile input_file(SourceFile("//some_file.cc")); | 144 InputFile input_file(SourceFile("//some_file.cc")); |
| 144 input_file.SetContents(std::string()); | 145 input_file.SetContents(std::string()); |
| 145 LocationRange range; // Dummy value. | 146 LocationRange range; // Dummy value. |
| 146 | 147 |
| 147 // Add a disconnected target d with a header to check that you have to have | 148 // Add a disconnected target d with a header to check that you have to have |
| 148 // to depend on a target listing a header. | 149 // to depend on a target listing a header. |
| 149 SourceFile d_header("//d_header.h"); | 150 SourceFile d_header("//d_header.h"); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 EXPECT_TRUE(err.has_error()); | 210 EXPECT_TRUE(err.has_error()); |
| 210 | 211 |
| 211 // Add an allow_circular_includes_from on A that lists B. | 212 // Add an allow_circular_includes_from on A that lists B. |
| 212 a_.allow_circular_includes_from().insert(b_.label()); | 213 a_.allow_circular_includes_from().insert(b_.label()); |
| 213 | 214 |
| 214 // Now the include from B to A should be allowed. | 215 // Now the include from B to A should be allowed. |
| 215 err = Err(); | 216 err = Err(); |
| 216 EXPECT_TRUE(checker->CheckInclude(&b_, input_file, a_public, range, &err)); | 217 EXPECT_TRUE(checker->CheckInclude(&b_, input_file, a_public, range, &err)); |
| 217 EXPECT_FALSE(err.has_error()); | 218 EXPECT_FALSE(err.has_error()); |
| 218 } | 219 } |
| OLD | NEW |