1//go:build go1.7
2// +build go1.7
3
4package session
5
6import (
7	"os"
8	"path/filepath"
9	"strings"
10	"testing"
11
12	"github.com/aws/aws-sdk-go/internal/sdktesting"
13)
14
15func TestSession_loadCSMConfig(t *testing.T) {
16	defConfigFiles := []string{
17		filepath.Join("testdata", "csm_shared_config"),
18	}
19	cases := map[string]struct {
20		Envs        map[string]string
21		ConfigFiles []string
22		CSMProfile  string
23
24		Expect csmConfig
25		Err    string
26	}{
27		"no config": {
28			Envs:        map[string]string{},
29			Expect:      csmConfig{},
30			ConfigFiles: defConfigFiles,
31			CSMProfile:  "aws_csm_empty",
32		},
33		"env enabled": {
34			Envs: map[string]string{
35				"AWS_CSM_ENABLED":   "true",
36				"AWS_CSM_PORT":      "4321",
37				"AWS_CSM_HOST":      "ahost",
38				"AWS_CSM_CLIENT_ID": "client id",
39			},
40			Expect: csmConfig{
41				Enabled:  true,
42				Port:     "4321",
43				Host:     "ahost",
44				ClientID: "client id",
45			},
46		},
47		"shared cfg enabled": {
48			ConfigFiles: defConfigFiles,
49			Expect: csmConfig{
50				Enabled:  true,
51				Port:     "1234",
52				Host:     "bar",
53				ClientID: "foo",
54			},
55		},
56		"mixed cfg, use env": {
57			Envs: map[string]string{
58				"AWS_CSM_ENABLED": "true",
59			},
60			ConfigFiles: defConfigFiles,
61			Expect: csmConfig{
62				Enabled: true,
63			},
64		},
65		"mixed cfg, use env disabled": {
66			Envs: map[string]string{
67				"AWS_CSM_ENABLED": "false",
68			},
69			ConfigFiles: defConfigFiles,
70			Expect: csmConfig{
71				Enabled: false,
72			},
73		},
74		"mixed cfg, use shared config": {
75			Envs: map[string]string{
76				"AWS_CSM_PORT": "4321",
77			},
78			ConfigFiles: defConfigFiles,
79			Expect: csmConfig{
80				Enabled:  true,
81				Port:     "1234",
82				Host:     "bar",
83				ClientID: "foo",
84			},
85		},
86	}
87
88	for name, c := range cases {
89		t.Run(name, func(t *testing.T) {
90			restoreFn := sdktesting.StashEnv()
91			defer restoreFn()
92
93			if len(c.CSMProfile) != 0 {
94				csmProfile := csmProfileName
95				defer func() {
96					csmProfileName = csmProfile
97				}()
98				csmProfileName = c.CSMProfile
99			}
100
101			for name, v := range c.Envs {
102				os.Setenv(name, v)
103			}
104
105			envCfg, err := loadEnvConfig()
106			if err != nil {
107				t.Fatalf("failed to load the envcfg, %v", err)
108			}
109			csmCfg, err := loadCSMConfig(envCfg, c.ConfigFiles)
110			if len(c.Err) != 0 {
111				if err == nil {
112					t.Fatalf("expect error, got none")
113				}
114				if e, a := c.Err, err.Error(); !strings.Contains(a, e) {
115					t.Errorf("expect %v in error %v", e, a)
116				}
117				return
118			}
119
120			if e, a := c.Expect, csmCfg; e != a {
121				t.Errorf("expect %v CSM config got %v", e, a)
122			}
123		})
124	}
125}
126