// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"path"
	"path/filepath"
	"testing"
)

const androidGoldenDir = "testdata/android_golden"

func TestAndroidConfig(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		useLlvmNext := false
		useCCache := false
		cfg, err := getConfig("android", useCCache, useLlvmNext, "123")
		if err != nil {
			t.Fatal(err)
		}
		ctx.updateConfig(cfg)

		runGoldenRecords(ctx, androidGoldenDir, []goldenFile{
			createAndroidClangPathGoldenInputs(ctx),
			createBisectGoldenInputs(filepath.Join(ctx.tempDir, "clang")),
			createAndroidCompileWithFallbackGoldenInputs(ctx),
		})
	})
}

func createAndroidClangPathGoldenInputs(ctx *testContext) goldenFile {
	gomaPath := path.Join(ctx.tempDir, "gomacc")
	ctx.writeFile(gomaPath, "")
	defaultPath := filepath.Join(ctx.tempDir, "clang")
	clangTidyPath := filepath.Join(ctx.tempDir, "clang-tidy")

	deepPath := "a/b/c/d/e/f/g/clang"
	linkedDeepPath := "symlinked/clang_other"
	ctx.writeFile(filepath.Join(ctx.tempDir, "/pathenv/clang"), "")
	ctx.symlink(deepPath, linkedDeepPath)
	return goldenFile{
		Name: "clang_path.json",
		Records: []goldenRecord{
			{
				WrapperCmd: newGoldenCmd(defaultPath, mainCc),
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(defaultPath, mainCc),
				Cmds:       errorResults,
			},
			{
				Env:        []string{"WITH_TIDY=1"},
				WrapperCmd: newGoldenCmd(defaultPath, mainCc),
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(filepath.Join(ctx.tempDir, "clang++"), mainCc),
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(clangTidyPath, mainCc),
				Cmds:       okResults,
			},
			{
				Env:        []string{"WITH_TIDY=1"},
				WrapperCmd: newGoldenCmd(clangTidyPath, mainCc),
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(deepPath, mainCc),
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(linkedDeepPath, mainCc),
				Cmds:       okResults,
			},
			{
				Env:        []string{"PATH=" + filepath.Join(ctx.tempDir, "/pathenv")},
				WrapperCmd: newGoldenCmd("clang", mainCc),
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(defaultPath, mainCc, "--gomacc-path", gomaPath),
				Cmds:       okResults,
			},
		},
	}
}

func createAndroidCompileWithFallbackGoldenInputs(ctx *testContext) goldenFile {
	env := []string{
		"ANDROID_LLVM_PREBUILT_COMPILER_PATH=fallback_compiler",
		"ANDROID_LLVM_STDERR_REDIRECT=" + filepath.Join(ctx.tempDir, "fallback_stderr"),
		"ANDROID_LLVM_FALLBACK_DISABLED_WARNINGS=-a -b",
	}
	defaultPath := filepath.Join(ctx.tempDir, "clang")
	return goldenFile{
		Name: "compile_with_fallback.json",
		Records: []goldenRecord{
			{
				WrapperCmd: newGoldenCmd(defaultPath, mainCc),
				Env:        env,
				Cmds:       okResults,
			},
			{
				WrapperCmd: newGoldenCmd(defaultPath, mainCc),
				Env:        env,
				Cmds: []commandResult{
					{
						ExitCode: 1,
					},
					okResult,
				},
			},
			{
				WrapperCmd: newGoldenCmd(defaultPath, mainCc),
				Env:        env,
				Cmds: []commandResult{
					{
						ExitCode: 1,
					},
					{
						ExitCode: 1,
					},
				},
			},
		},
	}
}
