1package credentials
2
3import (
4	"os"
5	"path/filepath"
6	"testing"
7
8	"github.com/aws/aws-sdk-go/internal/sdktesting"
9	"github.com/aws/aws-sdk-go/internal/shareddefaults"
10)
11
12func TestSharedCredentialsProvider(t *testing.T) {
13	restoreEnvFn := sdktesting.StashEnv()
14	defer restoreEnvFn()
15
16	p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
17	creds, err := p.Retrieve()
18	if err != nil {
19		t.Errorf("expect nil, got %v", err)
20	}
21
22	if e, a := "accessKey", creds.AccessKeyID; e != a {
23		t.Errorf("expect %v, got %v", e, a)
24	}
25	if e, a := "secret", creds.SecretAccessKey; e != a {
26		t.Errorf("expect %v, got %v", e, a)
27	}
28	if e, a := "token", creds.SessionToken; e != a {
29		t.Errorf("expect %v, got %v", e, a)
30	}
31}
32
33func TestSharedCredentialsProviderIsExpired(t *testing.T) {
34	restoreEnvFn := sdktesting.StashEnv()
35	defer restoreEnvFn()
36
37	p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
38
39	if !p.IsExpired() {
40		t.Errorf("Expect creds to be expired before retrieve")
41	}
42
43	_, err := p.Retrieve()
44	if err != nil {
45		t.Errorf("expect nil, got %v", err)
46	}
47
48	if p.IsExpired() {
49		t.Errorf("Expect creds to not be expired after retrieve")
50	}
51}
52
53func TestSharedCredentialsProviderWithAWS_SHARED_CREDENTIALS_FILE(t *testing.T) {
54	restoreEnvFn := sdktesting.StashEnv()
55	defer restoreEnvFn()
56
57	os.Setenv("AWS_SHARED_CREDENTIALS_FILE", "example.ini")
58	p := SharedCredentialsProvider{}
59	creds, err := p.Retrieve()
60
61	if err != nil {
62		t.Errorf("expect nil, got %v", err)
63	}
64
65	if e, a := "accessKey", creds.AccessKeyID; e != a {
66		t.Errorf("expect %v, got %v", e, a)
67	}
68	if e, a := "secret", creds.SecretAccessKey; e != a {
69		t.Errorf("expect %v, got %v", e, a)
70	}
71	if e, a := "token", creds.SessionToken; e != a {
72		t.Errorf("expect %v, got %v", e, a)
73	}
74}
75
76func TestSharedCredentialsProviderWithAWS_SHARED_CREDENTIALS_FILEAbsPath(t *testing.T) {
77	restoreEnvFn := sdktesting.StashEnv()
78	defer restoreEnvFn()
79
80	wd, err := os.Getwd()
81	if err != nil {
82		t.Errorf("expect no error, got %v", err)
83	}
84	os.Setenv("AWS_SHARED_CREDENTIALS_FILE", filepath.Join(wd, "example.ini"))
85	p := SharedCredentialsProvider{}
86	creds, err := p.Retrieve()
87	if err != nil {
88		t.Errorf("expect nil, got %v", err)
89	}
90
91	if e, a := "accessKey", creds.AccessKeyID; e != a {
92		t.Errorf("expect %v, got %v", e, a)
93	}
94	if e, a := "secret", creds.SecretAccessKey; e != a {
95		t.Errorf("expect %v, got %v", e, a)
96	}
97	if e, a := "token", creds.SessionToken; e != a {
98		t.Errorf("expect %v, got %v", e, a)
99	}
100}
101
102func TestSharedCredentialsProviderWithAWS_PROFILE(t *testing.T) {
103	restoreEnvFn := sdktesting.StashEnv()
104	defer restoreEnvFn()
105
106	os.Setenv("AWS_PROFILE", "no_token")
107
108	p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
109	creds, err := p.Retrieve()
110	if err != nil {
111		t.Errorf("expect nil, got %v", err)
112	}
113
114	if e, a := "accessKey", creds.AccessKeyID; e != a {
115		t.Errorf("expect %v, got %v", e, a)
116	}
117	if e, a := "secret", creds.SecretAccessKey; e != a {
118		t.Errorf("expect %v, got %v", e, a)
119	}
120	if v := creds.SessionToken; len(v) != 0 {
121		t.Errorf("Expect no token, %v", v)
122	}
123}
124
125func TestSharedCredentialsProviderWithoutTokenFromProfile(t *testing.T) {
126	restoreEnvFn := sdktesting.StashEnv()
127	defer restoreEnvFn()
128
129	p := SharedCredentialsProvider{Filename: "example.ini", Profile: "no_token"}
130	creds, err := p.Retrieve()
131	if err != nil {
132		t.Errorf("expect nil, got %v", err)
133	}
134
135	if e, a := "accessKey", creds.AccessKeyID; e != a {
136		t.Errorf("expect %v, got %v", e, a)
137	}
138	if e, a := "secret", creds.SecretAccessKey; e != a {
139		t.Errorf("expect %v, got %v", e, a)
140	}
141	if v := creds.SessionToken; len(v) != 0 {
142		t.Errorf("Expect no token, %v", v)
143	}
144}
145
146func TestSharedCredentialsProviderColonInCredFile(t *testing.T) {
147	restoreEnvFn := sdktesting.StashEnv()
148	defer restoreEnvFn()
149
150	p := SharedCredentialsProvider{Filename: "example.ini", Profile: "with_colon"}
151	creds, err := p.Retrieve()
152	if err != nil {
153		t.Errorf("expect nil, got %v", err)
154	}
155
156	if e, a := "accessKey", creds.AccessKeyID; e != a {
157		t.Errorf("expect %v, got %v", e, a)
158	}
159	if e, a := "secret", creds.SecretAccessKey; e != a {
160		t.Errorf("expect %v, got %v", e, a)
161	}
162	if v := creds.SessionToken; len(v) != 0 {
163		t.Errorf("Expect no token, %v", v)
164	}
165}
166
167func TestSharedCredentialsProvider_DefaultFilename(t *testing.T) {
168	restoreEnvFn := sdktesting.StashEnv()
169	defer restoreEnvFn()
170
171	os.Setenv("USERPROFILE", "profile_dir")
172	os.Setenv("HOME", "home_dir")
173
174	// default filename and profile
175	p := SharedCredentialsProvider{}
176
177	filename, err := p.filename()
178
179	if err != nil {
180		t.Fatalf("expect no error, got %v", err)
181	}
182
183	if e, a := shareddefaults.SharedCredentialsFilename(), filename; e != a {
184		t.Errorf("expect %q filename, got %q", e, a)
185	}
186}
187
188func BenchmarkSharedCredentialsProvider(b *testing.B) {
189	restoreEnvFn := sdktesting.StashEnv()
190	defer restoreEnvFn()
191
192	p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
193	_, err := p.Retrieve()
194	if err != nil {
195		b.Fatal(err)
196	}
197
198	b.ResetTimer()
199	for i := 0; i < b.N; i++ {
200		_, err := p.Retrieve()
201		if err != nil {
202			b.Fatal(err)
203		}
204	}
205}
206