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