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

func TestRealConfigWithUseCCacheFlag(t *testing.T) {
	resetGlobals()
	defer resetGlobals()
	ConfigName = "cros.hardened"
	UseLlvmNext = "false"

	UseCCache = "false"
	cfg, err := getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if cfg.useCCache {
		t.Fatal("UseCCache: Expected false got true")
	}

	UseCCache = "true"
	cfg, err = getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if !cfg.useCCache {
		t.Fatal("UseCCache: Expected true got false")
	}

	UseCCache = "invalid"
	if _, err := getRealConfig(); err == nil {
		t.Fatalf("UseCCache: Expected an error, got none")
	}
}

func TestRealConfigWithUseLLvmFlag(t *testing.T) {
	resetGlobals()
	defer resetGlobals()
	ConfigName = "cros.hardened"
	UseCCache = "false"

	UseLlvmNext = "false"
	cfg, err := getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if cfg.useLlvmNext {
		t.Fatal("UseLLvmNext: Expected not to be used")
	}

	UseLlvmNext = "true"
	cfg, err = getRealConfig()
	if err != nil {
		t.Fatal(err)
	}

	if !cfg.useLlvmNext {
		t.Fatal("UseLLvmNext: Expected to be used")
	}

	UseLlvmNext = "invalid"
	if _, err := getRealConfig(); err == nil {
		t.Fatalf("UseLlvmNext: Expected an error, got none")
	}
}

func TestRealConfigWithConfigNameFlag(t *testing.T) {
	resetGlobals()
	defer resetGlobals()
	UseCCache = "false"
	UseLlvmNext = "false"

	ConfigName = "cros.hardened"
	cfg, err := getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if !isSysrootHardened(cfg) || cfg.isHostWrapper {
		t.Fatalf("ConfigName: Expected sysroot hardened config. Got: %#v", cfg)
	}

	ConfigName = "cros.nonhardened"
	cfg, err = getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if isSysrootHardened(cfg) || cfg.isHostWrapper {
		t.Fatalf("ConfigName: Expected sysroot non hardened config. Got: %#v", cfg)
	}

	ConfigName = "cros.host"
	cfg, err = getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if !cfg.isHostWrapper {
		t.Fatalf("ConfigName: Expected clang host config. Got: %#v", cfg)
	}

	ConfigName = "android"
	cfg, err = getRealConfig()
	if err != nil {
		t.Fatal(err)
	}
	if !cfg.isAndroidWrapper {
		t.Fatalf("ConfigName: Expected clang host config. Got: %#v", cfg)
	}

	ConfigName = "invalid"
	if _, err := getRealConfig(); err == nil {
		t.Fatalf("ConfigName: Expected an error, got none")
	}
}

func isSysrootHardened(cfg *config) bool {
	for _, arg := range cfg.commonFlags {
		if arg == "-D_FORTIFY_SOURCE=2" {
			return true
		}
	}
	return false
}

func resetGlobals() {
	// Set all global variables to a defined state.
	UseLlvmNext = "unknown"
	ConfigName = "unknown"
	UseCCache = "unknown"
}
