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