// 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 (
	"testing"
)

func TestAddStrongStackProtectorFlag(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		initStackProtectorStrongConfig(ctx.cfg)
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64, mainCc)))
		if err := verifyArgOrder(cmd, "-fstack-protector-strong", mainCc); err != nil {
			t.Error(err)
		}
	})
}

func TestAddNoStackProtectorFlagWhenKernelDefined(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		initStackProtectorStrongConfig(ctx.cfg)
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64, "-D__KERNEL__", mainCc)))
		if err := verifyArgOrder(cmd, "-fno-stack-protector", mainCc); err != nil {
			t.Error(err)
		}
	})
}

func TestOmitNoStackProtectorFlagWhenAlreadyInCommonFlags(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		ctx.cfg.commonFlags = []string{"-fno-stack-protector"}
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64, mainCc)))
		if err := verifyArgCount(cmd, 1, "-fno-stack-protector"); err != nil {
			t.Error(err)
		}
	})
}

func TestAddStrongStackProtectorFlagForEabiEvenIfNoStackProtectorGiven(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		initStackProtectorStrongConfig(ctx.cfg)
		cmd := ctx.must(callCompiler(ctx, ctx.cfg,
			ctx.newCommand(gccX86_64Eabi, "-fno-stack-protector", mainCc)))
		if err := verifyArgCount(cmd, 1, "-fstack-protector-strong"); err != nil {
			t.Error(err)
		}
	})
}

func initStackProtectorStrongConfig(cfg *config) {
	cfg.commonFlags = []string{"-fstack-protector-strong"}
}
