1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "testing/gtest/include/gtest/gtest.h" 6 #include "tools/gn/err.h" 7 #include "tools/gn/settings.h" 8 #include "tools/gn/target_manager.h" 9 #include "tools/gn/value.h" 10 11 /* TODO(brettw) make this compile again 12 namespace { 13 14 class TestTargetManagerDelegate : public TargetManager::Delegate { 15 public: 16 TestTargetManagerDelegate() {} 17 18 virtual bool ScheduleInvocation(ToolchainManager* toolchain_manager, 19 const LocationRange& origin, 20 const Label& toolchain_name, 21 const SourceDir& dir, 22 Err* err) OVERRIDE { 23 invokes.push_back(dir.value()); 24 return true; 25 } 26 virtual void ScheduleTargetFileWrite(const Target* target) { 27 writes.push_back(target); 28 } 29 30 std::vector<std::string> invokes; 31 std::vector<const Target*> writes; 32 }; 33 34 } // namespace 35 36 TEST(TargetManager, ResolveDeps) { 37 TestTargetManagerDelegate ttmd; 38 BuildSettings build_settings(&ttmd); 39 40 TargetManager& target_manager = build_settings.target_manager(); 41 42 SourceDir tc_dir("/chrome/"); 43 std::string tc_name("toolchain"); 44 45 // Get a root target. This should not invoke anything. 46 Err err; 47 Label chromelabel(SourceDir("/chrome/"), "chrome", tc_dir, tc_name); 48 Target* chrome = target_manager.GetTarget( 49 chromelabel, LocationRange(), NULL, &err); 50 EXPECT_EQ(0u, ttmd.invokes.size()); 51 52 // Declare it has a dependency on content1 and 2. We should get one 53 // invocation of the content build file. 54 Label content1label(SourceDir("/content/"), "content1", tc_dir, tc_name); 55 Target* content1 = target_manager.GetTarget( 56 content1label, LocationRange(), chrome, &err); 57 EXPECT_EQ(1u, ttmd.invokes.size()); 58 59 Label content2label(SourceDir("/content/"), "content2", tc_dir, tc_name); 60 Target* content2 = target_manager.GetTarget( 61 content2label, LocationRange(), chrome, &err); 62 EXPECT_EQ(2u, ttmd.invokes.size()); 63 64 // Declare chrome has a depdency on base, this should load it. 65 Label baselabel(SourceDir("/base/"), "base", tc_dir, tc_name); 66 Target* base1 = target_manager.GetTarget( 67 baselabel, LocationRange(), chrome, &err); 68 EXPECT_EQ(3u, ttmd.invokes.size()); 69 70 // Declare content1 has a dependency on base. 71 Target* base2 = target_manager.GetTarget( 72 baselabel, LocationRange(), content1, &err); 73 EXPECT_EQ(3u, ttmd.invokes.size()); 74 EXPECT_EQ(base1, base2); 75 76 // Mark content1 and chrome as done. They have unresolved depdendencies so 77 // shouldn't be written out yet. 78 target_manager.TargetGenerationComplete(content1label); 79 target_manager.TargetGenerationComplete(chromelabel); 80 EXPECT_EQ(0u, ttmd.writes.size()); 81 82 // Mark content2 as done. It has no dependencies so should be written. 83 target_manager.TargetGenerationComplete(content2label); 84 ASSERT_EQ(1u, ttmd.writes.size()); 85 EXPECT_EQ(content2label, ttmd.writes[0]->label()); 86 87 // Mark base as complete. It should have caused itself, content1 and then 88 // chrome to be written. 89 target_manager.TargetGenerationComplete(baselabel); 90 ASSERT_EQ(4u, ttmd.writes.size()); 91 EXPECT_EQ(baselabel, ttmd.writes[1]->label()); 92 EXPECT_EQ(content1label, ttmd.writes[2]->label()); 93 EXPECT_EQ(chromelabel, ttmd.writes[3]->label()); 94 } 95 */ 96