1// Copyright 2019 The ChromiumOS Authors 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 41func TestRealConfigWithUseLLvmFlag(t *testing.T) { 42 resetGlobals() 43 defer resetGlobals() 44 ConfigName = "cros.hardened" 45 UseCCache = "false" 46 47 UseLlvmNext = "false" 48 cfg, err := getRealConfig() 49 if err != nil { 50 t.Fatal(err) 51 } 52 if cfg.useLlvmNext { 53 t.Fatal("UseLLvmNext: Expected not to be used") 54 } 55 56 UseLlvmNext = "true" 57 cfg, err = getRealConfig() 58 if err != nil { 59 t.Fatal(err) 60 } 61 62 if !cfg.useLlvmNext { 63 t.Fatal("UseLLvmNext: Expected to be used") 64 } 65 66 UseLlvmNext = "invalid" 67 if _, err := getRealConfig(); err == nil { 68 t.Fatalf("UseLlvmNext: Expected an error, got none") 69 } 70} 71 72func TestRealConfigWithConfigNameFlag(t *testing.T) { 73 resetGlobals() 74 defer resetGlobals() 75 UseCCache = "false" 76 UseLlvmNext = "false" 77 78 ConfigName = "cros.hardened" 79 cfg, err := getRealConfig() 80 if err != nil { 81 t.Fatal(err) 82 } 83 if !isSysrootHardened(cfg) || cfg.isHostWrapper { 84 t.Fatalf("ConfigName: Expected sysroot hardened config. Got: %#v", cfg) 85 } 86 87 ConfigName = "cros.nonhardened" 88 cfg, err = getRealConfig() 89 if err != nil { 90 t.Fatal(err) 91 } 92 if isSysrootHardened(cfg) || cfg.isHostWrapper { 93 t.Fatalf("ConfigName: Expected sysroot non hardened config. Got: %#v", cfg) 94 } 95 96 ConfigName = "cros.host" 97 cfg, err = getRealConfig() 98 if err != nil { 99 t.Fatal(err) 100 } 101 if !cfg.isHostWrapper { 102 t.Fatalf("ConfigName: Expected clang host config. Got: %#v", cfg) 103 } 104 105 ConfigName = "android" 106 cfg, err = getRealConfig() 107 if err != nil { 108 t.Fatal(err) 109 } 110 if !cfg.isAndroidWrapper { 111 t.Fatalf("ConfigName: Expected clang host config. Got: %#v", cfg) 112 } 113 114 ConfigName = "invalid" 115 if _, err := getRealConfig(); err == nil { 116 t.Fatalf("ConfigName: Expected an error, got none") 117 } 118} 119 120func isSysrootHardened(cfg *config) bool { 121 for _, arg := range cfg.commonFlags { 122 if arg == "-D_FORTIFY_SOURCE=3" { 123 return true 124 } 125 } 126 return false 127} 128 129func resetGlobals() { 130 // Set all global variables to a defined state. 131 UseLlvmNext = "unknown" 132 ConfigName = "unknown" 133 UseCCache = "unknown" 134} 135