1*760c253cSXin Li// Copyright 2019 The ChromiumOS Authors 2*760c253cSXin Li// Use of this source code is governed by a BSD-style license that can be 3*760c253cSXin Li// found in the LICENSE file. 4*760c253cSXin Li 5*760c253cSXin Lipackage main 6*760c253cSXin Li 7*760c253cSXin Liimport ( 8*760c253cSXin Li "path" 9*760c253cSXin Li "path/filepath" 10*760c253cSXin Li "testing" 11*760c253cSXin Li) 12*760c253cSXin Li 13*760c253cSXin Liconst androidGoldenDir = "testdata/android_golden" 14*760c253cSXin Li 15*760c253cSXin Lifunc TestAndroidConfigDoesNotSpecifyCrashDir(t *testing.T) { 16*760c253cSXin Li withTestContext(t, func(ctx *testContext) { 17*760c253cSXin Li useLlvmNext := false 18*760c253cSXin Li useCCache := false 19*760c253cSXin Li cfg, err := getConfig("android", useCCache, useLlvmNext, "123") 20*760c253cSXin Li if err != nil { 21*760c253cSXin Li t.Fatal(err) 22*760c253cSXin Li } 23*760c253cSXin Li ctx.updateConfig(cfg) 24*760c253cSXin Li 25*760c253cSXin Li cmd := ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(clangX86_64, mainCc))) 26*760c253cSXin Li if err := verifyArgCount(cmd, 0, "-fcrash-diagnostics-dir=.*"); err != nil { 27*760c253cSXin Li t.Error(err) 28*760c253cSXin Li } 29*760c253cSXin Li }) 30*760c253cSXin Li} 31*760c253cSXin Li 32*760c253cSXin Lifunc TestAndroidConfig(t *testing.T) { 33*760c253cSXin Li withTestContext(t, func(ctx *testContext) { 34*760c253cSXin Li useLlvmNext := false 35*760c253cSXin Li useCCache := false 36*760c253cSXin Li cfg, err := getConfig("android", useCCache, useLlvmNext, "123") 37*760c253cSXin Li if err != nil { 38*760c253cSXin Li t.Fatal(err) 39*760c253cSXin Li } 40*760c253cSXin Li ctx.updateConfig(cfg) 41*760c253cSXin Li 42*760c253cSXin Li runGoldenRecords(ctx, androidGoldenDir, []goldenFile{ 43*760c253cSXin Li createAndroidClangPathGoldenInputs(ctx), 44*760c253cSXin Li createBisectGoldenInputs(filepath.Join(ctx.tempDir, "clang")), 45*760c253cSXin Li createAndroidCompileWithFallbackGoldenInputs(ctx), 46*760c253cSXin Li }) 47*760c253cSXin Li }) 48*760c253cSXin Li} 49*760c253cSXin Li 50*760c253cSXin Lifunc createAndroidClangPathGoldenInputs(ctx *testContext) goldenFile { 51*760c253cSXin Li gomaPath := path.Join(ctx.tempDir, "gomacc") 52*760c253cSXin Li ctx.writeFile(gomaPath, "") 53*760c253cSXin Li defaultPath := filepath.Join(ctx.tempDir, "clang") 54*760c253cSXin Li clangTidyPath := filepath.Join(ctx.tempDir, "clang-tidy") 55*760c253cSXin Li 56*760c253cSXin Li deepPath := "a/b/c/d/e/f/g/clang" 57*760c253cSXin Li linkedDeepPath := "symlinked/clang_other" 58*760c253cSXin Li ctx.writeFile(filepath.Join(ctx.tempDir, "/pathenv/clang"), "") 59*760c253cSXin Li ctx.symlink(deepPath, linkedDeepPath) 60*760c253cSXin Li return goldenFile{ 61*760c253cSXin Li Name: "clang_path.json", 62*760c253cSXin Li Records: []goldenRecord{ 63*760c253cSXin Li { 64*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc), 65*760c253cSXin Li Cmds: okResults, 66*760c253cSXin Li }, 67*760c253cSXin Li { 68*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc), 69*760c253cSXin Li Cmds: errorResults, 70*760c253cSXin Li }, 71*760c253cSXin Li { 72*760c253cSXin Li Env: []string{"WITH_TIDY=1"}, 73*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc), 74*760c253cSXin Li Cmds: okResults, 75*760c253cSXin Li }, 76*760c253cSXin Li { 77*760c253cSXin Li WrapperCmd: newGoldenCmd(filepath.Join(ctx.tempDir, "clang++"), mainCc), 78*760c253cSXin Li Cmds: okResults, 79*760c253cSXin Li }, 80*760c253cSXin Li { 81*760c253cSXin Li WrapperCmd: newGoldenCmd(clangTidyPath, mainCc), 82*760c253cSXin Li Cmds: okResults, 83*760c253cSXin Li }, 84*760c253cSXin Li { 85*760c253cSXin Li Env: []string{"WITH_TIDY=1"}, 86*760c253cSXin Li WrapperCmd: newGoldenCmd(clangTidyPath, mainCc), 87*760c253cSXin Li Cmds: okResults, 88*760c253cSXin Li }, 89*760c253cSXin Li { 90*760c253cSXin Li WrapperCmd: newGoldenCmd(deepPath, mainCc), 91*760c253cSXin Li Cmds: okResults, 92*760c253cSXin Li }, 93*760c253cSXin Li { 94*760c253cSXin Li WrapperCmd: newGoldenCmd(linkedDeepPath, mainCc), 95*760c253cSXin Li Cmds: okResults, 96*760c253cSXin Li }, 97*760c253cSXin Li { 98*760c253cSXin Li Env: []string{"PATH=" + filepath.Join(ctx.tempDir, "/pathenv")}, 99*760c253cSXin Li WrapperCmd: newGoldenCmd("clang", mainCc), 100*760c253cSXin Li Cmds: okResults, 101*760c253cSXin Li }, 102*760c253cSXin Li { 103*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc, "--gomacc-path", gomaPath), 104*760c253cSXin Li Cmds: okResults, 105*760c253cSXin Li }, 106*760c253cSXin Li }, 107*760c253cSXin Li } 108*760c253cSXin Li} 109*760c253cSXin Li 110*760c253cSXin Lifunc createAndroidCompileWithFallbackGoldenInputs(ctx *testContext) goldenFile { 111*760c253cSXin Li env := []string{ 112*760c253cSXin Li "ANDROID_LLVM_PREBUILT_COMPILER_PATH=fallback_compiler", 113*760c253cSXin Li "ANDROID_LLVM_STDERR_REDIRECT=" + filepath.Join(ctx.tempDir, "fallback_stderr"), 114*760c253cSXin Li "ANDROID_LLVM_FALLBACK_DISABLED_WARNINGS=-a -b", 115*760c253cSXin Li } 116*760c253cSXin Li defaultPath := filepath.Join(ctx.tempDir, "clang") 117*760c253cSXin Li return goldenFile{ 118*760c253cSXin Li Name: "compile_with_fallback.json", 119*760c253cSXin Li Records: []goldenRecord{ 120*760c253cSXin Li { 121*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc), 122*760c253cSXin Li Env: env, 123*760c253cSXin Li Cmds: okResults, 124*760c253cSXin Li }, 125*760c253cSXin Li { 126*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc), 127*760c253cSXin Li Env: env, 128*760c253cSXin Li Cmds: []commandResult{ 129*760c253cSXin Li { 130*760c253cSXin Li ExitCode: 1, 131*760c253cSXin Li }, 132*760c253cSXin Li okResult, 133*760c253cSXin Li }, 134*760c253cSXin Li }, 135*760c253cSXin Li { 136*760c253cSXin Li WrapperCmd: newGoldenCmd(defaultPath, mainCc), 137*760c253cSXin Li Env: env, 138*760c253cSXin Li Cmds: []commandResult{ 139*760c253cSXin Li { 140*760c253cSXin Li ExitCode: 1, 141*760c253cSXin Li }, 142*760c253cSXin Li { 143*760c253cSXin Li ExitCode: 1, 144*760c253cSXin Li }, 145*760c253cSXin Li }, 146*760c253cSXin Li }, 147*760c253cSXin Li }, 148*760c253cSXin Li } 149*760c253cSXin Li} 150