1// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package main
6
7import (
8	"testing"
9)
10
11func TestRealConfigWithUseCCacheFlag(t *testing.T) {
12	resetGlobals()
13	defer resetGlobals()
14	ConfigName = "cros.hardened"
15	UseLlvmNext = "false"
16
17	UseCCache = "false"
18	cfg, err := getRealConfig()
19	if err != nil {
20		t.Fatal(err)
21	}
22	if cfg.useCCache {
23		t.Fatal("UseCCache: Expected false got true")
24	}
25
26	UseCCache = "true"
27	cfg, err = getRealConfig()
28	if err != nil {
29		t.Fatal(err)
30	}
31	if !cfg.useCCache {
32		t.Fatal("UseCCache: Expected true got false")
33	}
34
35	UseCCache = "invalid"
36	if _, err := getRealConfig(); err == nil {
37		t.Fatalf("UseCCache: Expected an error, got none")
38	}
39}
40
41/* TODO: Re-enable this, when llvm-next is different than llvm
42func TestRealConfigWithUseLLvmFlag(t *testing.T) {
43	resetGlobals()
44	defer resetGlobals()
45	ConfigName = "cros.hardened"
46	UseCCache = "false"
47
48	UseLlvmNext = "false"
49	cfg, err := getRealConfig()
50	if err != nil {
51		t.Fatal(err)
52	}
53	if isUsingLLvmNext(cfg) {
54		t.Fatal("UseLLvmNext: Expected not to be used")
55	}
56
57	UseLlvmNext = "true"
58	cfg, err = getRealConfig()
59	if err != nil {
60		t.Fatal(err)
61	}
62
63	if !isUsingLLvmNext(cfg) {
64		t.Fatal("UseLLvmNext: Expected to be used")
65	}
66
67	UseLlvmNext = "invalid"
68	if _, err := getRealConfig(); err == nil {
69		t.Fatalf("UseLlvmNext: Expected an error, got none")
70	}
71}
72*/
73
74func TestRealConfigWithConfigNameFlag(t *testing.T) {
75	resetGlobals()
76	defer resetGlobals()
77	UseCCache = "false"
78	UseLlvmNext = "false"
79
80	ConfigName = "cros.hardened"
81	cfg, err := getRealConfig()
82	if err != nil {
83		t.Fatal(err)
84	}
85	if !isSysrootHardened(cfg) || cfg.isHostWrapper {
86		t.Fatalf("ConfigName: Expected sysroot hardened config. Got: %#v", cfg)
87	}
88
89	ConfigName = "cros.nonhardened"
90	cfg, err = getRealConfig()
91	if err != nil {
92		t.Fatal(err)
93	}
94	if isSysrootHardened(cfg) || cfg.isHostWrapper {
95		t.Fatalf("ConfigName: Expected sysroot non hardened config. Got: %#v", cfg)
96	}
97
98	ConfigName = "cros.host"
99	cfg, err = getRealConfig()
100	if err != nil {
101		t.Fatal(err)
102	}
103	if !cfg.isHostWrapper {
104		t.Fatalf("ConfigName: Expected clang host config. Got: %#v", cfg)
105	}
106
107	ConfigName = "android"
108	cfg, err = getRealConfig()
109	if err != nil {
110		t.Fatal(err)
111	}
112	if !cfg.isAndroidWrapper {
113		t.Fatalf("ConfigName: Expected clang host config. Got: %#v", cfg)
114	}
115
116	ConfigName = "invalid"
117	if _, err := getRealConfig(); err == nil {
118		t.Fatalf("ConfigName: Expected an error, got none")
119	}
120}
121
122func isSysrootHardened(cfg *config) bool {
123	for _, arg := range cfg.commonFlags {
124		if arg == "-pie" {
125			return true
126		}
127	}
128	return false
129}
130
131// TODO: Update this with correct flag when we change llvm-next.
132func isUsingLLvmNext(cfg *config) bool {
133	for _, arg := range cfg.clangFlags {
134		if arg == "-Wno-reorder-init-list" {
135			return true
136		}
137	}
138	return false
139}
140
141func resetGlobals() {
142	// Set all global variables to a defined state.
143	UseLlvmNext = "unknown"
144	ConfigName = "unknown"
145	UseCCache = "unknown"
146}
147