10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <sstream> 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "tools/gn/config.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "tools/gn/config_values_extractors.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "tools/gn/target.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "tools/gn/test_with_scope.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstruct FlagWriter { 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void operator()(const std::string& dir, std::ostream& out) const { 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch out << dir << " "; 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstruct IncludeWriter { 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void operator()(const SourceDir& dir, std::ostream& out) const { 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch out << dir.value() << " "; 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST(ConfigValuesExtractors, IncludeOrdering) { 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestWithScope setup; 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Construct a chain of dependencies: target -> dep1 -> dep2 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Add representative values: cflags (opaque, always copied) and include_dirs 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // (uniquified) to each one so we can check what comes out the other end. 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up dep2, direct and all dependent configs. 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config dep2_all(setup.settings(), Label(SourceDir("//dep2/"), "all")); 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep2_all.config_values().cflags().push_back("--dep2-all"); 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep2_all.config_values().include_dirs().push_back(SourceDir("//dep2/all/")); 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config dep2_direct(setup.settings(), Label(SourceDir("//dep2/"), "direct")); 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep2_direct.config_values().cflags().push_back("--dep2-direct"); 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep2_direct.config_values().include_dirs().push_back( 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SourceDir("//dep2/direct/")); 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Target dep2(setup.settings(), Label(SourceDir("//dep2/"), "dep2")); 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep2.set_output_type(Target::SOURCE_SET); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep2.visibility().SetPublic(); 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dep2.SetToolchain(setup.toolchain()); 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep2.all_dependent_configs().push_back(LabelConfigPair(&dep2_all)); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep2.public_configs().push_back(LabelConfigPair(&dep2_direct)); 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up dep1, direct and all dependent configs. 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config dep1_all(setup.settings(), Label(SourceDir("//dep1/"), "all")); 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep1_all.config_values().cflags().push_back("--dep1-all"); 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep1_all.config_values().include_dirs().push_back(SourceDir("//dep1/all/")); 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config dep1_direct(setup.settings(), Label(SourceDir("//dep1/"), "direct")); 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep1_direct.config_values().cflags().push_back("--dep1-direct"); 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep1_direct.config_values().include_dirs().push_back( 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SourceDir("//dep1/direct/")); 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Target dep1(setup.settings(), Label(SourceDir("//dep1/"), "dep1")); 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep1.set_output_type(Target::SOURCE_SET); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep1.visibility().SetPublic(); 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dep1.SetToolchain(setup.toolchain()); 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dep1.all_dependent_configs().push_back(LabelConfigPair(&dep1_all)); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep1.public_configs().push_back(LabelConfigPair(&dep1_direct)); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep1.private_deps().push_back(LabelTargetPair(&dep2)); 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Set up target, direct and all dependent configs. 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config target_all(setup.settings(), Label(SourceDir("//target/"), "all")); 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target_all.config_values().cflags().push_back("--target-all"); 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target_all.config_values().include_dirs().push_back( 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SourceDir("//target/all/")); 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config target_direct(setup.settings(), 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Label(SourceDir("//target/"), "direct")); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target_direct.config_values().cflags().push_back("--target-direct"); 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target_direct.config_values().include_dirs().push_back( 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SourceDir("//target/direct/")); 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // This config is applied directly to target. 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Config target_config(setup.settings(), 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Label(SourceDir("//target/"), "config")); 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target_config.config_values().cflags().push_back("--target-config"); 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target_config.config_values().include_dirs().push_back( 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SourceDir("//target/config/")); 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Target target(setup.settings(), Label(SourceDir("//target/"), "target")); 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target.set_output_type(Target::SOURCE_SET); 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.SetToolchain(setup.toolchain()); 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target.all_dependent_configs().push_back(LabelConfigPair(&target_all)); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target.public_configs().push_back(LabelConfigPair(&target_direct)); 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target.configs().push_back(LabelConfigPair(&target_config)); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target.private_deps().push_back(LabelTargetPair(&dep1)); 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Additionally add some values directly on "target". 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target.config_values().cflags().push_back("--target"); 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch target.config_values().include_dirs().push_back( 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SourceDir("//target/")); 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Mark targets resolved. This should push dependent configs. 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(dep2.OnResolved(&err)); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(dep1.OnResolved(&err)); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(target.OnResolved(&err)); 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Verify cflags by serializing. 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::ostringstream flag_out; 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FlagWriter flag_writer; 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RecursiveTargetConfigToStream<std::string, FlagWriter>( 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &target, &ConfigValues::cflags, flag_writer, flag_out); 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(flag_out.str(), 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "--target --target-config --target-all --target-direct " 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "--dep1-all --dep2-all --dep1-direct "); 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Verify include dirs by serializing. 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::ostringstream include_out; 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch IncludeWriter include_writer; 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RecursiveTargetConfigToStream<SourceDir, IncludeWriter>( 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &target, &ConfigValues::include_dirs, include_writer, include_out); 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(include_out.str(), 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "//target/ //target/config/ //target/all/ //target/direct/ " 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "//dep1/all/ //dep2/all/ //dep1/direct/ "); 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 128