github.com/hashicorp/packer@v1.14.3/internal/hcp/env/env_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package env 5 6 import ( 7 "os" 8 "path/filepath" 9 "testing" 10 ) 11 12 func Test_IsHCPDisabled(t *testing.T) { 13 tcs := []struct { 14 name string 15 registry_value string 16 output bool 17 }{ 18 { 19 name: "nothing set", 20 registry_value: "", 21 output: false, 22 }, 23 { 24 name: "registry set with 1", 25 registry_value: "1", 26 output: false, 27 }, 28 { 29 name: "registry set with 0", 30 registry_value: "0", 31 output: true, 32 }, 33 { 34 name: "registry set with OFF", 35 registry_value: "OFF", 36 output: true, 37 }, 38 { 39 name: "registry set with off", 40 registry_value: "off", 41 output: true, 42 }, 43 } 44 45 for _, tc := range tcs { 46 t.Run(tc.name, func(t *testing.T) { 47 t.Setenv(HCPPackerRegistry, tc.registry_value) 48 out := IsHCPDisabled() 49 if out != tc.output { 50 t.Fatalf("unexpected output: %t", out) 51 } 52 }) 53 } 54 } 55 func Test_HasHCPAuth(t *testing.T) { 56 origClientID := os.Getenv(HCPClientID) 57 origClientSecret := os.Getenv(HCPClientSecret) 58 origCredFile := os.Getenv(HCPCredFile) 59 origDefaultCredFilePath := "" 60 61 // Save and restore default cred file at ~/.config/hcp/cred_file.json 62 homeDir, err := os.UserHomeDir() 63 if err != nil { 64 t.Fatalf("failed to get home dir: %v", err) 65 } 66 credDir := filepath.Join(homeDir, HCPDefaultCredFilePath) 67 defaultCredPath := filepath.Join(credDir, HCPDefaultCredFile) 68 69 if _, err := os.Stat(defaultCredPath); err == nil { 70 tmpFile, err := os.CreateTemp("", "orig_cred_file.json") 71 if err != nil { 72 t.Fatalf("failed to create temp file for original cred file: %v", err) 73 } 74 tmpFile.Close() 75 origDefaultCredFilePath = tmpFile.Name() 76 if err := os.Rename(defaultCredPath, origDefaultCredFilePath); err != nil { 77 t.Fatalf("failed to move original cred file: %v", err) 78 } 79 } 80 81 type setupFunc func(t *testing.T) 82 83 tmpCredFile := func(t *testing.T) string { 84 f, err := os.CreateTemp("", "cred_file.json") 85 if err != nil { 86 t.Fatalf("failed to create temp file: %v", err) 87 } 88 f.Close() 89 t.Cleanup(func() { os.Remove(f.Name()) }) 90 return f.Name() 91 } 92 93 tmpDefaultCredFile := func(t *testing.T) string { 94 homeDir, err := os.UserHomeDir() 95 if err != nil { 96 t.Fatalf("failed to get home dir: %v", err) 97 } 98 credDir := filepath.Join(homeDir, HCPDefaultCredFilePath) 99 os.MkdirAll(credDir, 0755) 100 credPath := filepath.Join(credDir, HCPDefaultCredFile) 101 f, err := os.Create(credPath) 102 if err != nil { 103 t.Fatalf("failed to create default cred file: %v", err) 104 } 105 f.Close() 106 t.Cleanup(func() { os.Remove(credPath) }) 107 return credPath 108 } 109 110 tcs := []struct { 111 name string 112 setup setupFunc 113 want bool 114 wantErr bool 115 }{ 116 { 117 name: "neither credentials nor certificate present", 118 setup: func(t *testing.T) { 119 os.Unsetenv(HCPClientID) 120 os.Unsetenv(HCPClientSecret) 121 os.Unsetenv(HCPCredFile) 122 }, 123 want: false, 124 wantErr: false, 125 }, 126 { 127 name: "only credentials present", 128 setup: func(t *testing.T) { 129 os.Unsetenv(HCPCredFile) 130 os.Setenv(HCPClientID, "foo") 131 os.Setenv(HCPClientSecret, "bar") 132 }, 133 want: true, 134 wantErr: false, 135 }, 136 { 137 name: "only certificate present via env var", 138 setup: func(t *testing.T) { 139 os.Unsetenv(HCPClientID) 140 os.Unsetenv(HCPClientSecret) 141 os.Setenv(HCPCredFile, tmpCredFile(t)) 142 }, 143 want: true, 144 wantErr: false, 145 }, 146 { 147 name: "only certificate present via default path", 148 setup: func(t *testing.T) { 149 os.Unsetenv(HCPClientID) 150 os.Unsetenv(HCPClientSecret) 151 os.Unsetenv(HCPCredFile) 152 tmpDefaultCredFile(t) 153 }, 154 want: true, 155 wantErr: false, 156 }, 157 { 158 name: "both credentials and certificate present", 159 setup: func(t *testing.T) { 160 os.Setenv(HCPClientID, "foo") 161 os.Setenv(HCPClientSecret, "bar") 162 os.Setenv(HCPCredFile, tmpCredFile(t)) 163 }, 164 want: true, 165 wantErr: false, 166 }, 167 { 168 name: "certificate file doesn't exist", 169 setup: func(t *testing.T) { 170 os.Unsetenv(HCPClientID) 171 os.Unsetenv(HCPClientSecret) 172 os.Setenv(HCPCredFile, "/my_fake_file") // Invalid path to trigger error 173 }, 174 want: false, 175 wantErr: false, 176 }, 177 } 178 179 for _, tc := range tcs { 180 t.Run(tc.name, func(t *testing.T) { 181 tc.setup(t) 182 got, err := HasHCPAuth() 183 if got != tc.want { 184 t.Fatalf("expected %v, got %v", tc.want, got) 185 } 186 if tc.wantErr && err == nil { 187 t.Fatalf("expected error, got nil") 188 } 189 if !tc.wantErr && err != nil { 190 t.Fatalf("unexpected error: %v", err) 191 } 192 }) 193 } 194 195 // Restore original env vars 196 if origClientID != "" { 197 os.Setenv(HCPClientID, origClientID) 198 } else { 199 os.Unsetenv(HCPClientID) 200 } 201 if origClientSecret != "" { 202 os.Setenv(HCPClientSecret, origClientSecret) 203 } else { 204 os.Unsetenv(HCPClientSecret) 205 } 206 if origCredFile != "" { 207 os.Setenv(HCPCredFile, origCredFile) 208 } else { 209 os.Unsetenv(HCPCredFile) 210 } 211 os.Remove(defaultCredPath) 212 // Restore original default cred file if it was present before test run 213 if origDefaultCredFilePath != "" { 214 if err := os.Rename(origDefaultCredFilePath, defaultCredPath); err != nil { 215 t.Fatalf("failed to replace temp default cred file: %v", err) 216 } 217 } 218 }