15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <sstream> 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/err.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/escape.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/substitution_list.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/substitution_pattern.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/substitution_writer.h" 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "tools/gn/target.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/test_with_scope.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SubstitutionWriter, GetListAs) { 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionList list = SubstitutionList::MakeForTest( 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "//foo/bar/a.cc", 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "//foo/bar/b.cc"); 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<SourceFile> sources; 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::GetListAsSourceFiles(list, &sources); 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_EQ(2u, sources.size()); 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("//foo/bar/a.cc", sources[0].value()); 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("//foo/bar/b.cc", sources[1].value()); 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<OutputFile> outputs; 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::GetListAsOutputFiles(setup.settings(), list, &outputs); 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_EQ(2u, outputs.size()); 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("../../foo/bar/a.cc", outputs[0].value()); 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("../../foo/bar/b.cc", outputs[1].value()); 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(SubstitutionWriter, ApplyPatternToSource) { 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestWithScope setup; 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionPattern pattern; 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Err err; 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(pattern.Parse("{{source_gen_dir}}/{{source_name_part}}.tmp", 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL, &err)); 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SourceFile result = SubstitutionWriter::ApplyPatternToSource( 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt")); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ("//out/Debug/gen/foo/bar/myfile.tmp", result.value()); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(SubstitutionWriter, ApplyPatternToSourceAsOutputFile) { 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestWithScope setup; 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionPattern pattern; 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Err err; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(pattern.Parse("{{source_gen_dir}}/{{source_name_part}}.tmp", 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL, &err)); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OutputFile result = SubstitutionWriter::ApplyPatternToSourceAsOutputFile( 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt")); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ("gen/foo/bar/myfile.tmp", result.value()); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(SubstitutionWriter, WriteNinjaVariablesForSource) { 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestWithScope setup; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<SubstitutionType> types; 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) types.push_back(SUBSTITUTION_SOURCE); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) types.push_back(SUBSTITUTION_SOURCE_NAME_PART); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) types.push_back(SUBSTITUTION_SOURCE_DIR); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EscapeOptions options; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.mode = ESCAPE_NONE; 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::ostringstream out; 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionWriter::WriteNinjaVariablesForSource( 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setup.settings(), SourceFile("//foo/bar/baz.txt"), types, options, out); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The "source" should be skipped since that will expand to $in which is 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // implicit. 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) " source_name_part = baz\n" 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) " source_dir = ../../foo/bar\n", 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) out.str()); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(SubstitutionWriter, WriteWithNinjaVariables) { 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Err err; 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionPattern pattern; 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(pattern.Parse( 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "-i {{source}} --out=bar\"{{source_name_part}}\".o", 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL, &err)); 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(err.has_error()); 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EscapeOptions options; 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.mode = ESCAPE_NONE; 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::ostringstream out; 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ( 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "-i ${in} --out=bar\"${source_name_part}\".o", 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) out.str()); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(SubstitutionWriter, SourceSubstitutions) { 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestWithScope setup; 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Call to get substitutions relative to the build dir. 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) #define GetRelSubst(str, what) \ 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionWriter::GetSourceSubstitution( \ 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setup.settings(), \ 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SourceFile(str), \ 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) what, \ 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionWriter::OUTPUT_RELATIVE, \ 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setup.settings()->build_settings()->build_dir()) 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Call to get absolute directory substitutions. 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) #define GetAbsSubst(str, what) \ 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionWriter::GetSourceSubstitution( \ 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setup.settings(), \ 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SourceFile(str), \ 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) what, \ 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionWriter::OUTPUT_ABSOLUTE, \ 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SourceDir()) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Try all possible templates with a normal looking string. 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("../../foo/bar/baz.txt", 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE)); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("//foo/bar/baz.txt", 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE)); 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("baz", 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_NAME_PART)); 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("baz", 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_NAME_PART)); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("baz.txt", 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_FILE_PART)); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("baz.txt", 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_FILE_PART)); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("../../foo/bar", 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_DIR)); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("//foo/bar", 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_DIR)); 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("foo/bar", GetRelSubst("//foo/bar/baz.txt", 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR)); 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("foo/bar", GetAbsSubst("//foo/bar/baz.txt", 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR)); 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("gen/foo/bar", 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR)); 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("//out/Debug/gen/foo/bar", 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR)); 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("obj/foo/bar", 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR)); 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("//out/Debug/obj/foo/bar", 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR)); 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Operations on an absolute path. 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("/baz.txt", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE)); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("/.", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_DIR)); 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("gen", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR)); 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("obj", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR)); 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(".", 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetRelSubst("//baz.txt", SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR)); 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) #undef GetAbsSubst 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) #undef GetRelSubst 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SubstitutionWriter, TargetSubstitutions) { 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target target(setup.settings(), Label(SourceDir("//foo/bar/"), "baz")); 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.set_output_type(Target::STATIC_LIBRARY); 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.SetToolchain(setup.toolchain()); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(target.OnResolved(&err)); 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string result; 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(SubstitutionWriter::GetTargetSubstitution( 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SUBSTITUTION_LABEL, &result)); 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("//foo/bar:baz", result); 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(SubstitutionWriter::GetTargetSubstitution( 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SUBSTITUTION_ROOT_GEN_DIR, &result)); 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("gen", result); 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(SubstitutionWriter::GetTargetSubstitution( 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SUBSTITUTION_ROOT_OUT_DIR, &result)); 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(".", result); 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(SubstitutionWriter::GetTargetSubstitution( 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SUBSTITUTION_TARGET_GEN_DIR, &result)); 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("gen/foo/bar", result); 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(SubstitutionWriter::GetTargetSubstitution( 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SUBSTITUTION_TARGET_OUT_DIR, &result)); 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("obj/foo/bar", result); 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(SubstitutionWriter::GetTargetSubstitution( 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SUBSTITUTION_TARGET_OUTPUT_NAME, &result)); 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("libbaz", result); 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SubstitutionWriter, CompilerSubstitutions) { 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target target(setup.settings(), Label(SourceDir("//foo/bar/"), "baz")); 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.set_output_type(Target::STATIC_LIBRARY); 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.SetToolchain(setup.toolchain()); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(target.OnResolved(&err)); 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The compiler substitution is just source + target combined. So test one 21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // of each of those classes of things to make sure this is hooked up. 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("file", 22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::GetCompilerSubstitution( 22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SourceFile("//foo/bar/file.txt"), 22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SUBSTITUTION_SOURCE_NAME_PART)); 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("gen/foo/bar", 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::GetCompilerSubstitution( 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, SourceFile("//foo/bar/file.txt"), 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SUBSTITUTION_TARGET_GEN_DIR)); 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(SubstitutionWriter, LinkerSubstitutions) { 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestWithScope setup; 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Err err; 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Target target(setup.settings(), Label(SourceDir("//foo/bar/"), "baz")); 23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.set_output_type(Target::SHARED_LIBRARY); 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) target.SetToolchain(setup.toolchain()); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(target.OnResolved(&err)); 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const Tool* tool = setup.toolchain()->GetToolForTargetFinalOutput(&target); 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The compiler substitution is just target + OUTPUT_EXTENSION combined. So 24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // test one target one plus the output extension. 24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(".so", 24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::GetLinkerSubstitution( 24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, tool, SUBSTITUTION_OUTPUT_EXTENSION)); 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("gen/foo/bar", 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionWriter::GetLinkerSubstitution( 24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, tool, SUBSTITUTION_TARGET_GEN_DIR)); 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Test that we handle paths that end up in the root build dir properly 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // (no leading "./" or "/"). 25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SubstitutionPattern pattern; 25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE( 25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pattern.Parse("{{root_out_dir}}/{{target_output_name}}.so", NULL, &err)); 25503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OutputFile output = SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( 25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &target, tool, pattern); 25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("./libbaz.so", output.value()); 25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 260