1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "tools/gn/builder.h" 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "tools/gn/loader.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "tools/gn/target.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "tools/gn/test_with_scope.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "tools/gn/toolchain.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MockLoader : public Loader { 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockLoader() { 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Loader implementation: 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Load(const SourceFile& file, 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const LocationRange& origin, 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Label& toolchain_name) OVERRIDE { 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) files_.push_back(file); 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ToolchainLoaded(const Toolchain* toolchain) OVERRIDE { 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual Label GetDefaultToolchain() const OVERRIDE { 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return Label(); 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual const Settings* GetToolchainSettings( 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Label& label) const OVERRIDE { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return NULL; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool HasLoadedNone() const { 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return files_.empty(); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns true if two loads have been requested and they match the given 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // file. This will clear the records so it will be empty for the next call. 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool HasLoadedTwo(const SourceFile& a, const SourceFile& b) { 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (files_.size() != 2u) { 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) files_.clear(); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool match = ( 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (files_[0] == a && files_[1] == b) || 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (files_[0] == b && files_[1] == a)); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) files_.clear(); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return match; 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~MockLoader() {} 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<SourceFile> files_; 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class BuilderTest : public testing::Test { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuilderTest() 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : loader_(new MockLoader), 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_(new Builder(loader_.get())), 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings_(&build_settings_, std::string()), 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scope_(&settings_) { 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) build_settings_.SetBuildDir(SourceDir("//out/")); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings_.set_toolchain_label(Label(SourceDir("//tc/"), "default")); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings_.set_default_toolchain_label(settings_.toolchain_label()); 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Toolchain* DefineToolchain() { 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Toolchain* tc = new Toolchain(&settings_, settings_.toolchain_label()); 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope::SetupToolchain(tc); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(tc)); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return tc; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<MockLoader> loader_; 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<Builder> builder_; 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuildSettings build_settings_; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Settings settings_; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Scope scope_; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(BuilderTest, BasicDeps) { 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SourceDir toolchain_dir = settings_.toolchain_label().dir(); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string toolchain_name = settings_.toolchain_label().name(); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Construct a dependency chain: A -> B -> C. Define A first with a 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // forward-reference to B, then C, then B to test the different orders that 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the dependencies are hooked up. 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Label a_label(SourceDir("//a/"), "a", toolchain_dir, toolchain_name); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Label b_label(SourceDir("//b/"), "b", toolchain_dir, toolchain_name); 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Label c_label(SourceDir("//c/"), "c", toolchain_dir, toolchain_name); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The builder will take ownership of the pointers. 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Target* a = new Target(&settings_, a_label); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a->public_deps().push_back(LabelTargetPair(b_label)); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) a->set_output_type(Target::EXECUTABLE); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(a)); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Should have requested that B and the toolchain is loaded. 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(loader_->HasLoadedTwo(SourceFile("//tc/BUILD.gn"), 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SourceFile("//b/BUILD.gn"))); 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Define the toolchain. 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DefineToolchain(); 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BuilderRecord* toolchain_record = 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch builder_->GetRecord(settings_.toolchain_label()); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(toolchain_record); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(BuilderRecord::ITEM_TOOLCHAIN, toolchain_record->type()); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A should be unresolved with an item 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuilderRecord* a_record = builder_->GetRecord(a_label); 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(a_record->item()); 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(a_record->resolved()); 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(a_record->can_resolve()); 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // B should be unresolved, have no item, and no deps. 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuilderRecord* b_record = builder_->GetRecord(b_label); 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(b_record->item()); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(b_record->resolved()); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(b_record->can_resolve()); 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(b_record->all_deps().empty()); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A should have two deps: B and the toolchain. Only B should be unresolved. 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(2u, a_record->all_deps().size()); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, a_record->unresolved_deps().size()); 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NE(a_record->all_deps().end(), 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) a_record->all_deps().find(toolchain_record)); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NE(a_record->all_deps().end(), 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) a_record->all_deps().find(b_record)); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NE(a_record->unresolved_deps().end(), 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) a_record->unresolved_deps().find(b_record)); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // B should be marked as having A waiting on it. 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, b_record->waiting_on_resolution().size()); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NE(b_record->waiting_on_resolution().end(), 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) b_record->waiting_on_resolution().find(a_record)); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Add the C target. 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Target* c = new Target(&settings_, c_label); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) c->set_output_type(Target::STATIC_LIBRARY); 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci c->visibility().SetPublic(); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(c)); 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // C only depends on the already-loaded toolchain so we shouldn't have 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // requested anything else. 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(loader_->HasLoadedNone()); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Add the B target. 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Target* b = new Target(&settings_, b_label); 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a->public_deps().push_back(LabelTargetPair(c_label)); 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) b->set_output_type(Target::SHARED_LIBRARY); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->visibility().SetPublic(); 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(b)); 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // B depends only on the already-loaded C and toolchain so we shouldn't have 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // requested anything else. 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(loader_->HasLoadedNone()); 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // All targets should now be resolved. 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuilderRecord* c_record = builder_->GetRecord(c_label); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(a_record->resolved()); 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(b_record->resolved()); 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(c_record->resolved()); 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(a_record->unresolved_deps().empty()); 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(b_record->unresolved_deps().empty()); 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(c_record->unresolved_deps().empty()); 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(a_record->waiting_on_resolution().empty()); 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(b_record->waiting_on_resolution().empty()); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(c_record->waiting_on_resolution().empty()); 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that the should generate bit is set and propogated properly. 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(BuilderTest, ShouldGenerate) { 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DefineToolchain(); 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Define a secondary toolchain. 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Settings settings2(&build_settings_, "secondary/"); 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Label toolchain_label2(SourceDir("//tc/"), "secondary"); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings2.set_toolchain_label(toolchain_label2); 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Toolchain* tc2 = new Toolchain(&settings2, toolchain_label2); 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope::SetupToolchain(tc2); 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(tc2)); 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Construct a dependency chain: A -> B. A is in the default toolchain, B 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is not. 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Label a_label(SourceDir("//foo/"), "a", 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings_.toolchain_label().dir(), "a"); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Label b_label(SourceDir("//foo/"), "b", 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) toolchain_label2.dir(), toolchain_label2.name()); 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // First define B. 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Target* b = new Target(&settings2, b_label); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->visibility().SetPublic(); 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) b->set_output_type(Target::EXECUTABLE); 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(b)); 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // B should not be marked generated by default. 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuilderRecord* b_record = builder_->GetRecord(b_label); 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(b_record->should_generate()); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Define A with a dependency on B. 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Target* a = new Target(&settings_, a_label); 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci a->public_deps().push_back(LabelTargetPair(b_label)); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) a->set_output_type(Target::EXECUTABLE); 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder_->ItemDefined(scoped_ptr<Item>(a)); 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A should have the generate bit set since it's in the default toolchain. 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BuilderRecord* a_record = builder_->GetRecord(a_label); 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(a_record->should_generate()); 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // It should have gotten pushed to B. 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(b_record->should_generate()); 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 223