| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "tools/gn/err.h" |
| #include "tools/gn/settings.h" |
| #include "tools/gn/target_manager.h" |
| #include "tools/gn/value.h" |
| |
| /* TODO(brettw) make this compile again |
| namespace { |
| |
| class TestTargetManagerDelegate : public TargetManager::Delegate { |
| public: |
| TestTargetManagerDelegate() {} |
| |
| virtual bool ScheduleInvocation(ToolchainManager* toolchain_manager, |
| const LocationRange& origin, |
| const Label& toolchain_name, |
| const SourceDir& dir, |
| Err* err) OVERRIDE { |
| invokes.push_back(dir.value()); |
| return true; |
| } |
| virtual void ScheduleTargetFileWrite(const Target* target) { |
| writes.push_back(target); |
| } |
| |
| std::vector<std::string> invokes; |
| std::vector<const Target*> writes; |
| }; |
| |
| } // namespace |
| |
| TEST(TargetManager, ResolveDeps) { |
| TestTargetManagerDelegate ttmd; |
| BuildSettings build_settings(&ttmd); |
| |
| TargetManager& target_manager = build_settings.target_manager(); |
| |
| SourceDir tc_dir("/chrome/"); |
| std::string tc_name("toolchain"); |
| |
| // Get a root target. This should not invoke anything. |
| Err err; |
| Label chromelabel(SourceDir("/chrome/"), "chrome", tc_dir, tc_name); |
| Target* chrome = target_manager.GetTarget( |
| chromelabel, LocationRange(), NULL, &err); |
| EXPECT_EQ(0u, ttmd.invokes.size()); |
| |
| // Declare it has a dependency on content1 and 2. We should get one |
| // invocation of the content build file. |
| Label content1label(SourceDir("/content/"), "content1", tc_dir, tc_name); |
| Target* content1 = target_manager.GetTarget( |
| content1label, LocationRange(), chrome, &err); |
| EXPECT_EQ(1u, ttmd.invokes.size()); |
| |
| Label content2label(SourceDir("/content/"), "content2", tc_dir, tc_name); |
| Target* content2 = target_manager.GetTarget( |
| content2label, LocationRange(), chrome, &err); |
| EXPECT_EQ(2u, ttmd.invokes.size()); |
| |
| // Declare chrome has a depdency on base, this should load it. |
| Label baselabel(SourceDir("/base/"), "base", tc_dir, tc_name); |
| Target* base1 = target_manager.GetTarget( |
| baselabel, LocationRange(), chrome, &err); |
| EXPECT_EQ(3u, ttmd.invokes.size()); |
| |
| // Declare content1 has a dependency on base. |
| Target* base2 = target_manager.GetTarget( |
| baselabel, LocationRange(), content1, &err); |
| EXPECT_EQ(3u, ttmd.invokes.size()); |
| EXPECT_EQ(base1, base2); |
| |
| // Mark content1 and chrome as done. They have unresolved depdendencies so |
| // shouldn't be written out yet. |
| target_manager.TargetGenerationComplete(content1label); |
| target_manager.TargetGenerationComplete(chromelabel); |
| EXPECT_EQ(0u, ttmd.writes.size()); |
| |
| // Mark content2 as done. It has no dependencies so should be written. |
| target_manager.TargetGenerationComplete(content2label); |
| ASSERT_EQ(1u, ttmd.writes.size()); |
| EXPECT_EQ(content2label, ttmd.writes[0]->label()); |
| |
| // Mark base as complete. It should have caused itself, content1 and then |
| // chrome to be written. |
| target_manager.TargetGenerationComplete(baselabel); |
| ASSERT_EQ(4u, ttmd.writes.size()); |
| EXPECT_EQ(baselabel, ttmd.writes[1]->label()); |
| EXPECT_EQ(content1label, ttmd.writes[2]->label()); |
| EXPECT_EQ(chromelabel, ttmd.writes[3]->label()); |
| } |
| */ |