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

package main

import (
	"path"
	"testing"
)

func TestOmitSysrootGivenUserDefinedSysroot(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		runWithCompiler := func(compiler string) {
			cmd := ctx.must(callCompiler(ctx, ctx.cfg,
				ctx.newCommand(compiler, "--sysroot=/somepath", mainCc)))
			if err := verifyArgOrder(cmd, "--sysroot=/somepath", mainCc); err != nil {
				t.Error(err)
			}
			if err := verifyArgCount(cmd, 1, "--sysroot.*"); err != nil {
				t.Error(err)
			}
		}

		runWithCompiler(gccX86_64)
		runWithCompiler(clangX86_64)
	})
}

func TestSetSysrootFlagFromEnv(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		ctx.env = []string{"SYSROOT=/envpath"}
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64, mainCc)))
		if err := verifyEnvUpdate(cmd, "SYSROOT="); err != nil {
			t.Error(err)
		}
		if err := verifyArgOrder(cmd, "--sysroot=/envpath", mainCc); err != nil {
			t.Error(err)
		}
	})
}

func TestClearEmptySysrootFlagInEnv(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		ctx.env = []string{"SYSROOT="}
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64, mainCc)))
		if err := verifyEnvUpdate(cmd, "SYSROOT="); err != nil {
			t.Error(err)
		}
		if err := verifyArgOrder(cmd, "--sysroot=.*/x86_64-cros-linux-gnu", mainCc); err != nil {
			t.Error(err)
		}
	})
}

func TestSetSysrootRelativeToWrapperPath(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		ctx.cfg.gccRootRelPath = "somepath"
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64, mainCc)))
		if err := verifyArgOrder(cmd,
			"--sysroot="+ctx.tempDir+"/somepath/usr/x86_64-cros-linux-gnu", mainCc); err != nil {
			t.Error(err)
		}
	})
}

func TestSetSysrootRelativeToSymlinkedWrapperPath(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		ctx.cfg.gccRootRelPath = "somepath"
		linkedWrapperPath := path.Join(ctx.tempDir, "a/linked/path/x86_64-cros-linux-gnu-gcc")
		ctx.symlink(path.Join(ctx.tempDir, gccX86_64), linkedWrapperPath)

		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(linkedWrapperPath, mainCc)))
		if err := verifyArgOrder(cmd,
			"--sysroot="+ctx.tempDir+"/somepath/usr/x86_64-cros-linux-gnu", mainCc); err != nil {
			t.Error(err)
		}
	})
}
