xref: /aosp_15_r20/build/soong/makedeps/deps_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage makedeps
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"bytes"
19*333d2b36SAndroid Build Coastguard Worker	"io"
20*333d2b36SAndroid Build Coastguard Worker	"io/ioutil"
21*333d2b36SAndroid Build Coastguard Worker	"os"
22*333d2b36SAndroid Build Coastguard Worker	"testing"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workerfunc TestParse(t *testing.T) {
26*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
27*333d2b36SAndroid Build Coastguard Worker		name   string
28*333d2b36SAndroid Build Coastguard Worker		input  string
29*333d2b36SAndroid Build Coastguard Worker		output Deps
30*333d2b36SAndroid Build Coastguard Worker		err    error
31*333d2b36SAndroid Build Coastguard Worker	}{
32*333d2b36SAndroid Build Coastguard Worker		// These come from the ninja test suite
33*333d2b36SAndroid Build Coastguard Worker		{
34*333d2b36SAndroid Build Coastguard Worker			name:  "Basic",
35*333d2b36SAndroid Build Coastguard Worker			input: "build/ninja.o: ninja.cc ninja.h eval_env.h manifest_parser.h",
36*333d2b36SAndroid Build Coastguard Worker			output: Deps{
37*333d2b36SAndroid Build Coastguard Worker				Output: "build/ninja.o",
38*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{
39*333d2b36SAndroid Build Coastguard Worker					"ninja.cc",
40*333d2b36SAndroid Build Coastguard Worker					"ninja.h",
41*333d2b36SAndroid Build Coastguard Worker					"eval_env.h",
42*333d2b36SAndroid Build Coastguard Worker					"manifest_parser.h",
43*333d2b36SAndroid Build Coastguard Worker				},
44*333d2b36SAndroid Build Coastguard Worker			},
45*333d2b36SAndroid Build Coastguard Worker		},
46*333d2b36SAndroid Build Coastguard Worker		{
47*333d2b36SAndroid Build Coastguard Worker			name: "EarlyNewlineAndWhitespace",
48*333d2b36SAndroid Build Coastguard Worker			input: ` \
49*333d2b36SAndroid Build Coastguard Worker  out: in`,
50*333d2b36SAndroid Build Coastguard Worker			output: Deps{
51*333d2b36SAndroid Build Coastguard Worker				Output: "out",
52*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{"in"},
53*333d2b36SAndroid Build Coastguard Worker			},
54*333d2b36SAndroid Build Coastguard Worker		},
55*333d2b36SAndroid Build Coastguard Worker		{
56*333d2b36SAndroid Build Coastguard Worker			name: "Continuation",
57*333d2b36SAndroid Build Coastguard Worker			input: `foo.o: \
58*333d2b36SAndroid Build Coastguard Worker  bar.h baz.h
59*333d2b36SAndroid Build Coastguard Worker`,
60*333d2b36SAndroid Build Coastguard Worker			output: Deps{
61*333d2b36SAndroid Build Coastguard Worker				Output: "foo.o",
62*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{"bar.h", "baz.h"},
63*333d2b36SAndroid Build Coastguard Worker			},
64*333d2b36SAndroid Build Coastguard Worker		},
65*333d2b36SAndroid Build Coastguard Worker		{
66*333d2b36SAndroid Build Coastguard Worker			name:  "CarriageReturnContinuation",
67*333d2b36SAndroid Build Coastguard Worker			input: "foo.o: \\\r\n  bar.h baz.h\r\n",
68*333d2b36SAndroid Build Coastguard Worker			output: Deps{
69*333d2b36SAndroid Build Coastguard Worker				Output: "foo.o",
70*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{"bar.h", "baz.h"},
71*333d2b36SAndroid Build Coastguard Worker			},
72*333d2b36SAndroid Build Coastguard Worker		},
73*333d2b36SAndroid Build Coastguard Worker		{
74*333d2b36SAndroid Build Coastguard Worker			name: "BackSlashes",
75*333d2b36SAndroid Build Coastguard Worker			input: `Project\Dir\Build\Release8\Foo\Foo.res : \
76*333d2b36SAndroid Build Coastguard Worker  Dir\Library\Foo.rc \
77*333d2b36SAndroid Build Coastguard Worker  Dir\Library\Version\Bar.h \
78*333d2b36SAndroid Build Coastguard Worker  Dir\Library\Foo.ico \
79*333d2b36SAndroid Build Coastguard Worker  Project\Thing\Bar.tlb \
80*333d2b36SAndroid Build Coastguard Worker`,
81*333d2b36SAndroid Build Coastguard Worker			output: Deps{
82*333d2b36SAndroid Build Coastguard Worker				Output: `Project\Dir\Build\Release8\Foo\Foo.res`,
83*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{
84*333d2b36SAndroid Build Coastguard Worker					`Dir\Library\Foo.rc`,
85*333d2b36SAndroid Build Coastguard Worker					`Dir\Library\Version\Bar.h`,
86*333d2b36SAndroid Build Coastguard Worker					`Dir\Library\Foo.ico`,
87*333d2b36SAndroid Build Coastguard Worker					`Project\Thing\Bar.tlb`,
88*333d2b36SAndroid Build Coastguard Worker				},
89*333d2b36SAndroid Build Coastguard Worker			},
90*333d2b36SAndroid Build Coastguard Worker		},
91*333d2b36SAndroid Build Coastguard Worker		{
92*333d2b36SAndroid Build Coastguard Worker			name:  "Spaces",
93*333d2b36SAndroid Build Coastguard Worker			input: `a\ bc\ def:   a\ b c d`,
94*333d2b36SAndroid Build Coastguard Worker			output: Deps{
95*333d2b36SAndroid Build Coastguard Worker				Output: `a bc def`,
96*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{"a b", "c", "d"},
97*333d2b36SAndroid Build Coastguard Worker			},
98*333d2b36SAndroid Build Coastguard Worker		},
99*333d2b36SAndroid Build Coastguard Worker		{
100*333d2b36SAndroid Build Coastguard Worker			name:  "Escapes",
101*333d2b36SAndroid Build Coastguard Worker			input: `\!\@\#$$\%\^\&\\:`,
102*333d2b36SAndroid Build Coastguard Worker			output: Deps{
103*333d2b36SAndroid Build Coastguard Worker				Output: `\!\@#$\%\^\&\`,
104*333d2b36SAndroid Build Coastguard Worker			},
105*333d2b36SAndroid Build Coastguard Worker		},
106*333d2b36SAndroid Build Coastguard Worker		{
107*333d2b36SAndroid Build Coastguard Worker			name: "SpecialChars",
108*333d2b36SAndroid Build Coastguard Worker			// Ninja includes a number of '=', but our parser can't handle that,
109*333d2b36SAndroid Build Coastguard Worker			// since it sees the equals and switches over to assuming it's an
110*333d2b36SAndroid Build Coastguard Worker			// assignment.
111*333d2b36SAndroid Build Coastguard Worker			//
112*333d2b36SAndroid Build Coastguard Worker			// We don't have any files in our tree that contain an '=' character,
113*333d2b36SAndroid Build Coastguard Worker			// and Kati can't handle parsing this either, so for now I'm just
114*333d2b36SAndroid Build Coastguard Worker			// going to remove all the '=' characters below.
115*333d2b36SAndroid Build Coastguard Worker			//
116*333d2b36SAndroid Build Coastguard Worker			// It looks like make will only do this for the first
117*333d2b36SAndroid Build Coastguard Worker			// dependency, but not later dependencies.
118*333d2b36SAndroid Build Coastguard Worker			input: `C\:/Program\ Files\ (x86)/Microsoft\ crtdefs.h: \
119*333d2b36SAndroid Build Coastguard Worker en@quot.header~ t+t-x!1 \
120*333d2b36SAndroid Build Coastguard Worker openldap/slapd.d/cnconfig/cnschema/cn{0}core.ldif \
121*333d2b36SAndroid Build Coastguard Worker Fu` + "\303\244ball",
122*333d2b36SAndroid Build Coastguard Worker			output: Deps{
123*333d2b36SAndroid Build Coastguard Worker				Output: "C:/Program Files (x86)/Microsoft crtdefs.h",
124*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{
125*333d2b36SAndroid Build Coastguard Worker					"[email protected]~",
126*333d2b36SAndroid Build Coastguard Worker					"t+t-x!1",
127*333d2b36SAndroid Build Coastguard Worker					"openldap/slapd.d/cnconfig/cnschema/cn{0}core.ldif",
128*333d2b36SAndroid Build Coastguard Worker					"Fu\303\244ball",
129*333d2b36SAndroid Build Coastguard Worker				},
130*333d2b36SAndroid Build Coastguard Worker			},
131*333d2b36SAndroid Build Coastguard Worker		},
132*333d2b36SAndroid Build Coastguard Worker		// Ninja's UnifyMultipleOutputs and RejectMultipleDifferentOutputs tests have been omitted,
133*333d2b36SAndroid Build Coastguard Worker		// since we don't want the same behavior.
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker		// Our own tests
136*333d2b36SAndroid Build Coastguard Worker		{
137*333d2b36SAndroid Build Coastguard Worker			name: "Multiple outputs",
138*333d2b36SAndroid Build Coastguard Worker			input: `a b: c
139*333d2b36SAndroid Build Coastguard Workera: d
140*333d2b36SAndroid Build Coastguard Workerb: e`,
141*333d2b36SAndroid Build Coastguard Worker			output: Deps{
142*333d2b36SAndroid Build Coastguard Worker				Output: "b",
143*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{
144*333d2b36SAndroid Build Coastguard Worker					"c",
145*333d2b36SAndroid Build Coastguard Worker					"d",
146*333d2b36SAndroid Build Coastguard Worker					"e",
147*333d2b36SAndroid Build Coastguard Worker				},
148*333d2b36SAndroid Build Coastguard Worker			},
149*333d2b36SAndroid Build Coastguard Worker		},
150*333d2b36SAndroid Build Coastguard Worker		{
151*333d2b36SAndroid Build Coastguard Worker			// TODO(b/141372861): remove this
152*333d2b36SAndroid Build Coastguard Worker			// AIDL produces a dep file with no output file for a parcelable (b/
153*333d2b36SAndroid Build Coastguard Worker			name: "AIDL parcelable",
154*333d2b36SAndroid Build Coastguard Worker			input: ` : \
155*333d2b36SAndroid Build Coastguard Worker  frameworks/base/tests/net/integration/src/com/android/server/net/integrationtests/HttpResponse.aidl
156*333d2b36SAndroid Build Coastguard Worker`,
157*333d2b36SAndroid Build Coastguard Worker			output: Deps{
158*333d2b36SAndroid Build Coastguard Worker				Output: "",
159*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{
160*333d2b36SAndroid Build Coastguard Worker					"frameworks/base/tests/net/integration/src/com/android/server/net/integrationtests/HttpResponse.aidl",
161*333d2b36SAndroid Build Coastguard Worker				},
162*333d2b36SAndroid Build Coastguard Worker			},
163*333d2b36SAndroid Build Coastguard Worker		},
164*333d2b36SAndroid Build Coastguard Worker	}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
167*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
168*333d2b36SAndroid Build Coastguard Worker			out, err := Parse("test.d", bytes.NewBufferString(tc.input))
169*333d2b36SAndroid Build Coastguard Worker			if err != tc.err {
170*333d2b36SAndroid Build Coastguard Worker				t.Fatalf("Unexpected error: %v (expected %v)", err, tc.err)
171*333d2b36SAndroid Build Coastguard Worker			}
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Worker			if out.Output != tc.output.Output {
174*333d2b36SAndroid Build Coastguard Worker				t.Errorf("output file doesn't match:\n"+
175*333d2b36SAndroid Build Coastguard Worker					" str: %#v\n"+
176*333d2b36SAndroid Build Coastguard Worker					"want: %#v\n"+
177*333d2b36SAndroid Build Coastguard Worker					" got: %#v", tc.input, tc.output.Output, out.Output)
178*333d2b36SAndroid Build Coastguard Worker			}
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker			matches := true
181*333d2b36SAndroid Build Coastguard Worker			if len(out.Inputs) != len(tc.output.Inputs) {
182*333d2b36SAndroid Build Coastguard Worker				matches = false
183*333d2b36SAndroid Build Coastguard Worker			} else {
184*333d2b36SAndroid Build Coastguard Worker				for i := range out.Inputs {
185*333d2b36SAndroid Build Coastguard Worker					if out.Inputs[i] != tc.output.Inputs[i] {
186*333d2b36SAndroid Build Coastguard Worker						matches = false
187*333d2b36SAndroid Build Coastguard Worker					}
188*333d2b36SAndroid Build Coastguard Worker				}
189*333d2b36SAndroid Build Coastguard Worker			}
190*333d2b36SAndroid Build Coastguard Worker			if !matches {
191*333d2b36SAndroid Build Coastguard Worker				t.Errorf("input files don't match:\n"+
192*333d2b36SAndroid Build Coastguard Worker					" str: %#v\n"+
193*333d2b36SAndroid Build Coastguard Worker					"want: %#v\n"+
194*333d2b36SAndroid Build Coastguard Worker					" got: %#v", tc.input, tc.output.Inputs, out.Inputs)
195*333d2b36SAndroid Build Coastguard Worker			}
196*333d2b36SAndroid Build Coastguard Worker		})
197*333d2b36SAndroid Build Coastguard Worker	}
198*333d2b36SAndroid Build Coastguard Worker}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Workerfunc BenchmarkParsing(b *testing.B) {
201*333d2b36SAndroid Build Coastguard Worker	// Write it out to a file to most closely match ninja's perftest
202*333d2b36SAndroid Build Coastguard Worker	tmpfile, err := ioutil.TempFile("", "depfile")
203*333d2b36SAndroid Build Coastguard Worker	if err != nil {
204*333d2b36SAndroid Build Coastguard Worker		b.Fatal("Failed to create temp file:", err)
205*333d2b36SAndroid Build Coastguard Worker	}
206*333d2b36SAndroid Build Coastguard Worker	defer os.Remove(tmpfile.Name())
207*333d2b36SAndroid Build Coastguard Worker	_, err = io.WriteString(tmpfile, `out/soong/.intermediates/external/ninja/ninja/linux_glibc_x86_64/obj/external/ninja/src/ninja.o: \
208*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/ninja.cc external/libcxx/include/errno.h \
209*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__config \
210*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/features.h \
211*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/predefs.h \
212*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/sys/cdefs.h \
213*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/wordsize.h \
214*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/gnu/stubs.h \
215*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
216*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/errno.h \
217*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/errno.h \
218*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/linux/errno.h \
219*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/asm/errno.h \
220*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/asm-generic/errno.h \
221*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/asm-generic/errno-base.h \
222*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/limits.h \
223*333d2b36SAndroid Build Coastguard Worker  prebuilts/clang/host/linux-x86/clang-4639204/lib64/clang/6.0.1/include/limits.h \
224*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/limits.h \
225*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/posix1_lim.h \
226*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/local_lim.h \
227*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/linux/limits.h \
228*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/posix2_lim.h \
229*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/xopen_lim.h \
230*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
231*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/stdio.h \
232*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/stdio.h \
233*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/stddef.h \
234*333d2b36SAndroid Build Coastguard Worker  prebuilts/clang/host/linux-x86/clang-4639204/lib64/clang/6.0.1/include/stddef.h \
235*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/types.h \
236*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/typesizes.h \
237*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/libio.h \
238*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/_G_config.h \
239*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/wchar.h \
240*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/wchar.h \
241*333d2b36SAndroid Build Coastguard Worker  prebuilts/clang/host/linux-x86/clang-4639204/lib64/clang/6.0.1/include/stdarg.h \
242*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
243*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/stdlib.h \
244*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/stdlib.h \
245*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/waitflags.h \
246*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/waitstatus.h \
247*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/endian.h \
248*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/endian.h \
249*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/byteswap.h \
250*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/xlocale.h \
251*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/sys/types.h \
252*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/time.h \
253*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/sys/select.h \
254*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/select.h \
255*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/sigset.h \
256*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/time.h \
257*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/select2.h \
258*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/sys/sysmacros.h \
259*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
260*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/alloca.h \
261*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/string.h \
262*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/string.h \
263*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/getopt.h \
264*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/unistd.h \
265*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/posix_opt.h \
266*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/environments.h \
267*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/confname.h \
268*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/browse.h external/ninja/src/build.h \
269*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/cstdio external/libcxx/include/map \
270*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__tree external/libcxx/include/iterator \
271*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/iosfwd \
272*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/wchar.h \
273*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__functional_base \
274*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/type_traits external/libcxx/include/cstddef \
275*333d2b36SAndroid Build Coastguard Worker  prebuilts/clang/host/linux-x86/clang-4639204/lib64/clang/6.0.1/include/__stddef_max_align_t.h \
276*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__nullptr external/libcxx/include/typeinfo \
277*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/exception external/libcxx/include/cstdlib \
278*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/cstdint external/libcxx/include/stdint.h \
279*333d2b36SAndroid Build Coastguard Worker  prebuilts/clang/host/linux-x86/clang-4639204/lib64/clang/6.0.1/include/stdint.h \
280*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/stdint.h \
281*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/new external/libcxx/include/utility \
282*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__tuple \
283*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/initializer_list \
284*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/cstring external/libcxx/include/__debug \
285*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/memory external/libcxx/include/limits \
286*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__undef_macros external/libcxx/include/tuple \
287*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/stdexcept external/libcxx/include/cassert \
288*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/assert.h \
289*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/atomic external/libcxx/include/algorithm \
290*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/functional external/libcxx/include/queue \
291*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/deque external/libcxx/include/__split_buffer \
292*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/vector external/libcxx/include/__bit_reference \
293*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/climits external/libcxx/include/set \
294*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/string external/libcxx/include/string_view \
295*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__string external/libcxx/include/cwchar \
296*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/cwctype external/libcxx/include/cctype \
297*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/ctype.h \
298*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/ctype.h \
299*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/wctype.h \
300*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/wctype.h \
301*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/graph.h external/ninja/src/eval_env.h \
302*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/string_piece.h external/ninja/src/timestamp.h \
303*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/util.h external/ninja/src/exit_status.h \
304*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/line_printer.h external/ninja/src/metrics.h \
305*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/build_log.h external/ninja/src/hash_map.h \
306*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/unordered_map \
307*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/__hash_table external/libcxx/include/cmath \
308*333d2b36SAndroid Build Coastguard Worker  external/libcxx/include/math.h \
309*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/math.h \
310*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/huge_val.h \
311*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/huge_valf.h \
312*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/huge_vall.h \
313*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/inf.h \
314*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/nan.h \
315*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/mathdef.h \
316*333d2b36SAndroid Build Coastguard Worker  prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/sysroot/usr/include/x86_64-linux-gnu/bits/mathcalls.h \
317*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/deps_log.h external/ninja/src/clean.h \
318*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/debug_flags.h external/ninja/src/disk_interface.h \
319*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/graphviz.h external/ninja/src/manifest_parser.h \
320*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/lexer.h external/ninja/src/state.h \
321*333d2b36SAndroid Build Coastguard Worker  external/ninja/src/version.h`)
322*333d2b36SAndroid Build Coastguard Worker	tmpfile.Close()
323*333d2b36SAndroid Build Coastguard Worker	if err != nil {
324*333d2b36SAndroid Build Coastguard Worker		b.Fatal("Failed to write dep file:", err)
325*333d2b36SAndroid Build Coastguard Worker	}
326*333d2b36SAndroid Build Coastguard Worker	b.ResetTimer()
327*333d2b36SAndroid Build Coastguard Worker
328*333d2b36SAndroid Build Coastguard Worker	for n := 0; n < b.N; n++ {
329*333d2b36SAndroid Build Coastguard Worker		depfile, err := ioutil.ReadFile(tmpfile.Name())
330*333d2b36SAndroid Build Coastguard Worker		if err != nil {
331*333d2b36SAndroid Build Coastguard Worker			b.Fatal("Failed to read dep file:", err)
332*333d2b36SAndroid Build Coastguard Worker		}
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Worker		_, err = Parse(tmpfile.Name(), bytes.NewBuffer(depfile))
335*333d2b36SAndroid Build Coastguard Worker		if err != nil {
336*333d2b36SAndroid Build Coastguard Worker			b.Fatal("Failed to parse:", err)
337*333d2b36SAndroid Build Coastguard Worker		}
338*333d2b36SAndroid Build Coastguard Worker	}
339*333d2b36SAndroid Build Coastguard Worker}
340*333d2b36SAndroid Build Coastguard Worker
341*333d2b36SAndroid Build Coastguard Workerfunc TestDepPrint(t *testing.T) {
342*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
343*333d2b36SAndroid Build Coastguard Worker		name   string
344*333d2b36SAndroid Build Coastguard Worker		input  Deps
345*333d2b36SAndroid Build Coastguard Worker		output string
346*333d2b36SAndroid Build Coastguard Worker	}{
347*333d2b36SAndroid Build Coastguard Worker		{
348*333d2b36SAndroid Build Coastguard Worker			name: "Empty",
349*333d2b36SAndroid Build Coastguard Worker			input: Deps{
350*333d2b36SAndroid Build Coastguard Worker				Output: "a",
351*333d2b36SAndroid Build Coastguard Worker			},
352*333d2b36SAndroid Build Coastguard Worker			output: "a:",
353*333d2b36SAndroid Build Coastguard Worker		},
354*333d2b36SAndroid Build Coastguard Worker		{
355*333d2b36SAndroid Build Coastguard Worker			name: "Basic",
356*333d2b36SAndroid Build Coastguard Worker			input: Deps{
357*333d2b36SAndroid Build Coastguard Worker				Output: "a",
358*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{"b", "c"},
359*333d2b36SAndroid Build Coastguard Worker			},
360*333d2b36SAndroid Build Coastguard Worker			output: "a: b c",
361*333d2b36SAndroid Build Coastguard Worker		},
362*333d2b36SAndroid Build Coastguard Worker		{
363*333d2b36SAndroid Build Coastguard Worker			name: "Escapes",
364*333d2b36SAndroid Build Coastguard Worker			input: Deps{
365*333d2b36SAndroid Build Coastguard Worker				Output: `\!\@#$\%\^\&\`,
366*333d2b36SAndroid Build Coastguard Worker			},
367*333d2b36SAndroid Build Coastguard Worker			output: `\\!\\@\#$$\\%\\^\\&\\:`,
368*333d2b36SAndroid Build Coastguard Worker		},
369*333d2b36SAndroid Build Coastguard Worker		{
370*333d2b36SAndroid Build Coastguard Worker			name: "Spaces",
371*333d2b36SAndroid Build Coastguard Worker			input: Deps{
372*333d2b36SAndroid Build Coastguard Worker				Output: "a b",
373*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{"c d", "e f "},
374*333d2b36SAndroid Build Coastguard Worker			},
375*333d2b36SAndroid Build Coastguard Worker			output: `a\ b: c\ d e\ f\ `,
376*333d2b36SAndroid Build Coastguard Worker		},
377*333d2b36SAndroid Build Coastguard Worker		{
378*333d2b36SAndroid Build Coastguard Worker			name: "SpecialChars",
379*333d2b36SAndroid Build Coastguard Worker			input: Deps{
380*333d2b36SAndroid Build Coastguard Worker				Output: "C:/Program Files (x86)/Microsoft crtdefs.h",
381*333d2b36SAndroid Build Coastguard Worker				Inputs: []string{
382*333d2b36SAndroid Build Coastguard Worker					"[email protected]~",
383*333d2b36SAndroid Build Coastguard Worker					"t+t-x!1",
384*333d2b36SAndroid Build Coastguard Worker					"openldap/slapd.d/cnconfig/cnschema/cn{0}core.ldif",
385*333d2b36SAndroid Build Coastguard Worker					"Fu\303\244ball",
386*333d2b36SAndroid Build Coastguard Worker				},
387*333d2b36SAndroid Build Coastguard Worker			},
388*333d2b36SAndroid Build Coastguard Worker			output: `C\:/Program\ Files\ (x86)/Microsoft\ crtdefs.h: en@quot.header~ t+t-x!1 openldap/slapd.d/cnconfig/cnschema/cn{0}core.ldif Fu` + "\303\244ball",
389*333d2b36SAndroid Build Coastguard Worker		},
390*333d2b36SAndroid Build Coastguard Worker	}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
393*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
394*333d2b36SAndroid Build Coastguard Worker			out := tc.input.Print()
395*333d2b36SAndroid Build Coastguard Worker			outStr := string(out)
396*333d2b36SAndroid Build Coastguard Worker			want := tc.output + "\n"
397*333d2b36SAndroid Build Coastguard Worker
398*333d2b36SAndroid Build Coastguard Worker			if outStr != want {
399*333d2b36SAndroid Build Coastguard Worker				t.Errorf("output doesn't match:\nwant:%q\n got:%q", want, outStr)
400*333d2b36SAndroid Build Coastguard Worker			}
401*333d2b36SAndroid Build Coastguard Worker		})
402*333d2b36SAndroid Build Coastguard Worker	}
403*333d2b36SAndroid Build Coastguard Worker}
404