1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "tools/gn/functions.h" 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "tools/gn/target.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "tools/gn/test_with_scope.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GetTargetOutputsTest : public testing::Test { 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetTargetOutputsTest() { 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Want consistent target names so explicitly set platform. 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) setup_.settings()->set_target_os(Settings::LINUX); 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) setup_.scope()->set_item_collector(&items_); 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Value GetTargetOutputs(const std::string& name, Err* err) { 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FunctionCallNode function; 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<Value> args; 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) args.push_back(Value(NULL, name)); 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return functions::RunGetTargetOutputs(setup_.scope(), &function, args, err); 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Shortcut to get a label with the current toolchain. 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Label GetLabel(const std::string& dir, const std::string& name) { 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return Label(SourceDir(dir), name, setup_.toolchain()->label().dir(), 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) setup_.toolchain()->label().name()); 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Asserts that the given list contains a single string with the given value. 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void AssertSingleStringEquals(const Value& list, 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& expected) { 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(list.type() == Value::LIST); 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(1u, list.list_value().size()); 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(list.list_value()[0].type() == Value::STRING); 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(expected, list.list_value()[0].string_value()); 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void AssertTwoStringsEqual(const Value& list, 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& expected1, 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& expected2) { 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(list.type() == Value::LIST); 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(2u, list.list_value().size()); 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(list.list_value()[0].type() == Value::STRING); 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(expected1, list.list_value()[0].string_value()); 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(list.list_value()[1].type() == Value::STRING); 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_EQ(expected2, list.list_value()[1].string_value()); 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected: 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestWithScope setup_; 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Scope::ItemVector items_; 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 61116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GetTargetOutputsTest, Copy) { 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Target* action = new Target(setup_.settings(), GetLabel("//foo/", "bar")); 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch action->set_output_type(Target::COPY_FILES); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch action->sources().push_back(SourceFile("//file.txt")); 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) action->action_values().outputs() = 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SubstitutionList::MakeForTest("//out/Debug/{{source_file_part}}.one"); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch items_.push_back(new scoped_ptr<Item>(action)); 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Err err; 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Value result = GetTargetOutputs("//foo:bar", &err); 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_FALSE(err.has_error()); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AssertSingleStringEquals(result, "//out/Debug/file.txt.one"); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(GetTargetOutputsTest, Action) { 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Target* action = new Target(setup_.settings(), GetLabel("//foo/", "bar")); 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) action->set_output_type(Target::ACTION); 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) action->action_values().outputs() = SubstitutionList::MakeForTest( 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "//output1.txt", 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "//output2.txt"); 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) items_.push_back(new scoped_ptr<Item>(action)); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Err err; 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Value result = GetTargetOutputs("//foo:bar", &err); 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_FALSE(err.has_error()); 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AssertTwoStringsEqual(result, "//output1.txt", "//output2.txt"); 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(GetTargetOutputsTest, ActionForeach) { 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Target* action = new Target(setup_.settings(), GetLabel("//foo/", "bar")); 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) action->set_output_type(Target::ACTION_FOREACH); 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) action->sources().push_back(SourceFile("//file.txt")); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) action->action_values().outputs() = SubstitutionList::MakeForTest( 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "//out/Debug/{{source_file_part}}.one", 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "//out/Debug/{{source_file_part}}.two"); 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) items_.push_back(new scoped_ptr<Item>(action)); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Err err; 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Value result = GetTargetOutputs("//foo:bar", &err); 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_FALSE(err.has_error()); 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AssertTwoStringsEqual(result, "//out/Debug/file.txt.one", 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "//out/Debug/file.txt.two"); 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 107