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  }