1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "tools/gn/test_with_scope.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(Template, Basic) { 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestWithScope setup; 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestParseInput input( 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "template(\"foo\") {\n" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " print(target_name)\n" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " print(invoker.bar)\n" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}\n" 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "foo(\"lala\") {\n" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " bar = 42\n" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}"); 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(input.has_error()); 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Err err; 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch input.parsed()->Execute(setup.scope(), &err); 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(err.has_error()) << err.message(); 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ("lala\n42\n", setup.print_output()); 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(Template, UnusedTargetNameShouldThrowError) { 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestWithScope setup; 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestParseInput input( 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "template(\"foo\") {\n" 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " print(invoker.bar)\n" 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}\n" 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "foo(\"lala\") {\n" 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " bar = 42\n" 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}"); 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(input.has_error()); 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Err err; 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch input.parsed()->Execute(setup.scope(), &err); 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(err.has_error()); 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(Template, UnusedInvokerShouldThrowError) { 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestWithScope setup; 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestParseInput input( 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "template(\"foo\") {\n" 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " print(target_name)\n" 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}\n" 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "foo(\"lala\") {\n" 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " bar = 42\n" 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}"); 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(input.has_error()); 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Err err; 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch input.parsed()->Execute(setup.scope(), &err); 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(err.has_error()); 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(Template, UnusedVarInInvokerShouldThrowError) { 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestWithScope setup; 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestParseInput input( 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "template(\"foo\") {\n" 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " print(target_name)\n" 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " print(invoker.bar)\n" 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}\n" 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "foo(\"lala\") {\n" 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " bar = 42\n" 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch " baz = [ \"foo\" ]\n" 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "}"); 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(input.has_error()); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Err err; 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch input.parsed()->Execute(setup.scope(), &err); 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(err.has_error()); 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Previous versions of the template implementation would copy templates by 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// value when it makes a closure. Doing a sequence of them means that every new 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// one copies all previous ones, which gives a significant blow-up in memory. 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// If this test doesn't crash with out-of-memory, it passed. 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST(Template, MemoryBlowUp) { 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestWithScope setup; 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string code; 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (int i = 0; i < 100; i++) 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) code += "template(\"test" + base::IntToString(i) + "\") {}\n"; 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestParseInput input(code); 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Err err; 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) input.parsed()->Execute(setup.scope(), &err); 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_FALSE(input.has_error()); 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 94