• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <algorithm>
6 #include <sstream>
7 
8 #include "gn/ninja_copy_target_writer.h"
9 #include "gn/target.h"
10 #include "gn/test_with_scope.h"
11 #include "util/test/test.h"
12 
13 // Tests multiple files with an output pattern and no toolchain dependency.
TEST(NinjaCopyTargetWriter,Run)14 TEST(NinjaCopyTargetWriter, Run) {
15   Err err;
16   TestWithScope setup;
17 
18   Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
19   target.set_output_type(Target::COPY_FILES);
20 
21   target.sources().push_back(SourceFile("//foo/input1.txt"));
22   target.sources().push_back(SourceFile("//foo/input2.txt"));
23 
24   target.action_values().outputs() =
25       SubstitutionList::MakeForTest("//out/Debug/{{source_name_part}}.out");
26 
27   target.SetToolchain(setup.toolchain());
28   ASSERT_TRUE(target.OnResolved(&err));
29 
30   std::ostringstream out;
31   NinjaCopyTargetWriter writer(&target, out);
32   writer.Run();
33 
34   const char expected_linux[] =
35       "build input1.out: copy ../../foo/input1.txt\n"
36       "build input2.out: copy ../../foo/input2.txt\n"
37       "\n"
38       "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
39   std::string out_str = out.str();
40   EXPECT_EQ(expected_linux, out_str);
41 }
42 
43 // Tests a single file with no output pattern.
TEST(NinjaCopyTargetWriter,ToolchainDeps)44 TEST(NinjaCopyTargetWriter, ToolchainDeps) {
45   Err err;
46   TestWithScope setup;
47 
48   Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
49   target.set_output_type(Target::COPY_FILES);
50 
51   target.sources().push_back(SourceFile("//foo/input1.txt"));
52 
53   target.action_values().outputs() =
54       SubstitutionList::MakeForTest("//out/Debug/output.out");
55 
56   target.SetToolchain(setup.toolchain());
57   ASSERT_TRUE(target.OnResolved(&err));
58 
59   std::ostringstream out;
60   NinjaCopyTargetWriter writer(&target, out);
61   writer.Run();
62 
63   const char expected_linux[] =
64       "build output.out: copy ../../foo/input1.txt\n"
65       "\n"
66       "build obj/foo/bar.stamp: stamp output.out\n";
67   std::string out_str = out.str();
68   EXPECT_EQ(expected_linux, out_str);
69 }
70 
TEST(NinjaCopyTargetWriter,OrderOnlyDeps)71 TEST(NinjaCopyTargetWriter, OrderOnlyDeps) {
72   Err err;
73   TestWithScope setup;
74 
75   Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
76   target.set_output_type(Target::COPY_FILES);
77   target.sources().push_back(SourceFile("//foo/input1.txt"));
78   target.action_values().outputs() =
79       SubstitutionList::MakeForTest("//out/Debug/{{source_name_part}}.out");
80   target.config_values().inputs().push_back(SourceFile("//foo/script.py"));
81   target.SetToolchain(setup.toolchain());
82   ASSERT_TRUE(target.OnResolved(&err));
83 
84   std::ostringstream out;
85   NinjaCopyTargetWriter writer(&target, out);
86   writer.Run();
87 
88   const char expected_linux[] =
89       "build input1.out: copy ../../foo/input1.txt || ../../foo/script.py\n"
90       "\n"
91       "build obj/foo/bar.stamp: stamp input1.out\n";
92   std::string out_str = out.str();
93   EXPECT_EQ(expected_linux, out_str);
94 }
95 
TEST(NinjaCopyTargetWriter,DataDeps)96 TEST(NinjaCopyTargetWriter, DataDeps) {
97   Err err;
98   TestWithScope setup;
99 
100   Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
101   target.set_output_type(Target::COPY_FILES);
102   target.sources().push_back(SourceFile("//foo/input1.txt"));
103   target.action_values().outputs() =
104       SubstitutionList::MakeForTest("//out/Debug/{{source_name_part}}.out");
105 
106   Target data_dep(setup.settings(), Label(SourceDir("//foo/"), "datadep"));
107   data_dep.set_output_type(Target::ACTION);
108   data_dep.visibility().SetPublic();
109   data_dep.SetToolchain(setup.toolchain());
110   ASSERT_TRUE(data_dep.OnResolved(&err));
111 
112   target.data_deps().push_back(LabelTargetPair(&data_dep));
113   target.SetToolchain(setup.toolchain());
114   ASSERT_TRUE(target.OnResolved(&err));
115 
116   std::ostringstream out;
117   NinjaCopyTargetWriter writer(&target, out);
118   writer.Run();
119 
120   const char expected_linux[] =
121       "build input1.out: copy ../../foo/input1.txt || obj/foo/datadep.stamp\n"
122       "\n"
123       "build obj/foo/bar.stamp: stamp input1.out\n";
124   std::string out_str = out.str();
125   EXPECT_EQ(expected_linux, out_str);
126 }
127