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