1- package processcreds
1+ package processcreds_test
22
33import (
4+ "fmt"
45 "os"
5- "path/filepath"
6+ "runtime"
7+ "strings"
68 "testing"
7-
8- "github.com/stretchr/testify/assert"
9+ "time"
10+
11+ "github.com/aws/aws-sdk-go/aws"
12+ "github.com/aws/aws-sdk-go/aws/awserr"
13+ "github.com/aws/aws-sdk-go/aws/credentials"
14+ "github.com/aws/aws-sdk-go/aws/credentials/processcreds"
15+ "github.com/aws/aws-sdk-go/aws/session"
16+ "github.com/aws/aws-sdk-go/awstesting"
917)
1018
11- func TestProcessProvider (t * testing.T ) {
12- os .Clearenv ()
13-
14- p := ProcessProvider {Filename : "example.ini" , Profile : "process" , executionFunc : executeCredentialProcess }
15- creds , err := p .Retrieve ()
16- assert .Nil (t , err , "Expect no error" )
19+ func TestProcessProviderFromSession (t * testing.T ) {
20+ oldEnv := preserveImportantStashEnv ()
21+ defer awstesting .PopEnv (oldEnv )
1722
18- assert .Equal (t , "accessKey" , creds .AccessKeyID , "Expect access key ID to match" )
19- assert .Equal (t , "secret" , creds .SecretAccessKey , "Expect secret access key to match" )
20- assert .Equal (t , "tokenProcess" , creds .SessionToken , "Expect session token to match" )
21- }
23+ if runtime .GOOS == "windows" {
24+ os .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "provider_test_win.ini" )
25+ } else {
26+ os .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "provider_test.ini" )
27+ }
2228
23- func fakeExectuteCredsExpired ( process string ) ([] byte , error ) {
24- return [] byte ( `{"Version": 1, "AccessKeyId": "accessKey", "SecretAccessKey": "secret", "SessionToken": "tokenDefault", "Expiration": "2000-01-01T00:00:00-00:00"}` ), nil
25- }
29+ sess , err := session . NewSession ( & aws. Config {
30+ Region : aws . String ( "region" )},
31+ )
2632
27- func TestProcessProviderIsExpired (t * testing.T ) {
28- os .Clearenv ()
33+ if err != nil {
34+ t .Errorf ("error getting session: %v" , err )
35+ }
2936
30- p := ProcessProvider {Filename : "example.ini" , Profile : "process" , executionFunc : fakeExectuteCredsExpired }
37+ creds , err := sess .Config .Credentials .Get ()
38+ if err != nil {
39+ t .Errorf ("error getting credentials: %v" , err )
40+ }
3141
32- assert .True (t , p .IsExpired (), "Expect creds to be expired before retrieve" )
33- }
42+ if e , a := "accessKey" , creds .AccessKeyID ; e != a {
43+ t .Errorf ("expected %v, got %v" , e , a )
44+ }
3445
35- func TestProcessProviderWithAWS_CONFIG_FILE (t * testing.T ) {
36- os .Clearenv ()
37- os .Setenv ("AWS_CONFIG_FILE" , "example.ini" )
38- os .Setenv ("AWS_DEFAULT_PROFILE" , "process" )
39- p := ProcessProvider {Filename : "" , Profile : "" , executionFunc : executeCredentialProcess }
40- creds , err := p .Retrieve ()
46+ if e , a := "secret" , creds .SecretAccessKey ; e != a {
47+ t .Errorf ("expected %v, got %v" , e , a )
48+ }
4149
42- assert .Nil (t , err , "Expect no error" )
50+ if e , a := "tokenDefault" , creds .SessionToken ; e != a {
51+ t .Errorf ("expected %v, got %v" , e , a )
52+ }
4353
44- assert .Equal (t , "accessKey" , creds .AccessKeyID , "Expect access key ID to match" )
45- assert .Equal (t , "secret" , creds .SecretAccessKey , "Expect secret access key to match" )
46- assert .Equal (t , "tokenProcess" , creds .SessionToken , "Expect session token to match" )
4754}
4855
49- func TestProcessProviderWithAWS_CONFIG_FILEAbsPath (t * testing.T ) {
50- os .Clearenv ()
51- wd , err := os .Getwd ()
52- assert .NoError (t , err )
53- os .Setenv ("AWS_CONFIG_FILE" , filepath .Join (wd , "example.ini" ))
54- p := ProcessProvider {executionFunc : executeCredentialProcess }
55- creds , err := p .Retrieve ()
56- assert .Nil (t , err , "Expect no error" )
57-
58- assert .Equal (t , "accessKey" , creds .AccessKeyID , "Expect access key ID to match" )
59- assert .Equal (t , "secret" , creds .SecretAccessKey , "Expect secret access key to match" )
60- assert .Equal (t , "tokenDefault" , creds .SessionToken , "Expect session token to match" )
61- }
56+ func TestProcessProviderFromSessionWithProfile (t * testing.T ) {
57+ oldEnv := preserveImportantStashEnv ()
58+ defer awstesting .PopEnv (oldEnv )
6259
63- func fakeExectuteCredsSuccess (process string ) ([]byte , error ) {
64- return []byte (`{"Version": 1, "AccessKeyId": "accessKey", "SecretAccessKey": "secret", "SessionToken": "tokenFake", "Expiration": "2000-01-01T00:00:00-00:00"}` ), nil
65- }
60+ if runtime .GOOS == "windows" {
61+ os .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "provider_test_win.ini" )
62+ } else {
63+ os .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "provider_test.ini" )
64+ }
65+ os .Setenv ("AWS_PROFILE" , "non_expire" )
6666
67- func TestProcessProviderWithAWS_PROFILE ( t * testing. T ) {
68- os . Clearenv ()
69- os . Setenv ( "AWS_PROFILE" , "process" )
67+ sess , err := session . NewSession ( & aws. Config {
68+ Region : aws . String ( "region" )},
69+ )
7070
71- p := ProcessProvider { Filename : "example.ini" , Profile : "" , executionFunc : fakeExectuteCredsSuccess }
72- creds , err := p . Retrieve ( )
73- assert . Nil ( t , err , "Expect no error" )
71+ if err != nil {
72+ t . Errorf ( "error getting session: %v" , err )
73+ }
7474
75- assert .Equal (t , "accessKey" , creds .AccessKeyID , "Expect access key ID to match" )
76- assert .Equal (t , "secret" , creds .SecretAccessKey , "Expect secret access key to match" )
77- assert .Equal (t , "tokenFake" , creds .SessionToken , "Expect token to match" )
78- }
75+ creds , err := sess .Config .Credentials .Get ()
76+ if err != nil {
77+ t .Errorf ("error getting credentials: %v" , err )
78+ }
79+
80+ if e , a := "nonDefaultToken" , creds .SessionToken ; e != a {
81+ t .Errorf ("expected %v, got %v" , e , a )
82+ }
7983
80- func fakeExectuteCredsFailMalformed (process string ) ([]byte , error ) {
81- return []byte (`{"Version": 1, "AccessKeyId": "accessKey", "SecretAccessKey": "secret", "SessionToken": "tokenDefault", "Expiration": ` ), nil
8284}
8385
84- func TestProcessProviderMalformed (t * testing.T ) {
85- os . Clearenv ()
86- os . Setenv ( "AWS_PROFILE" , "process" )
86+ func TestProcessProviderExpectErrors (t * testing.T ) {
87+ oldEnv := preserveImportantStashEnv ()
88+ defer awstesting . PopEnv ( oldEnv )
8789
88- p := ProcessProvider {Filename : "example.ini" , Profile : "" , executionFunc : fakeExectuteCredsFailMalformed }
89- _ , err := p . Retrieve ()
90- assert . NotNil ( t , err , "Expect an error" )
91- }
90+ creds := credentials . NewCredentials ( & processcreds. ProcessProvider {
91+ Process : "/bad/process" ,
92+ } )
93+ _ , err := creds . Get ()
9294
93- func fakeExectuteCredsNoToken ( process string ) ([] byte , error ) {
94- return [] byte ( `{"Version": 1, "AccessKeyId": "accessKey", "SecretAccessKey": "secret"}` ), nil
95- }
95+ if err .(awserr. Error ). Code () != processcreds . ErrCodeProcessProviderExecution {
96+ t . Errorf ( "expected %v, got %v" , processcreds . ErrCodeProcessProviderExecution , err )
97+ }
9698
97- func TestProcessProviderNoToken (t * testing.T ) {
98- os .Clearenv ()
99+ process := fixForOS ("echo {\\ \" Version\\ \" : 1" )
100+ p := & processcreds.ProcessProvider {
101+ Process : process ,
102+ }
103+ _ , err = p .Retrieve ()
104+ if err .(awserr.Error ).Code () != processcreds .ErrCodeProcessProviderParse {
105+ t .Errorf ("expected %v, got %v" , processcreds .ErrCodeProcessProviderParse , err )
106+ }
99107
100- p := ProcessProvider {Filename : "example.ini" , Profile : "process" , executionFunc : fakeExectuteCredsNoToken }
101- creds , err := p .Retrieve ()
102- assert .Nil (t , err , "Expect no error" )
103- assert .Empty (t , creds .SessionToken , "Expect no token" )
104- }
108+ process = fixForOS ("echo {\\ \" Version\\ \" : 2}" )
109+ p = & processcreds.ProcessProvider {
110+ Process : process ,
111+ }
112+ _ , err = p .Retrieve ()
113+ if err .(awserr.Error ).Code () != processcreds .ErrCodeProcessProviderVersion {
114+ t .Errorf ("expected %v, got %v" , processcreds .ErrCodeProcessProviderVersion , err )
115+ }
105116
106- func fakeExectuteCredsFailVersion (process string ) ([]byte , error ) {
107- return []byte (`{"Version": 2, "AccessKeyId": "accessKey", "SecretAccessKey": "secret", "SessionToken": "tokenDefault"}` ), nil
108- }
117+ process = fixForOS ("echo {\\ \" Version\\ \" : 1, \\ \" AccessKeyId\\ \" : \\ \" accesskey\\ \" }" )
118+ p = & processcreds.ProcessProvider {
119+ Process : process ,
120+ }
121+ _ , err = p .Retrieve ()
122+ if err .(awserr.Error ).Code () != processcreds .ErrCodeProcessProviderRequired {
123+ t .Errorf ("expected %v, got %v" , processcreds .ErrCodeProcessProviderRequired , err )
124+ }
109125
110- func TestProcessProviderWrongVersion (t * testing.T ) {
111- os .Clearenv ()
112- p := ProcessProvider {Filename : "example.ini" , Profile : "process" , executionFunc : fakeExectuteCredsFailVersion }
113- _ , err := p .Retrieve ()
114- assert .NotNil (t , err , "Expect an error" )
126+ process = fixForOS ("echo {\\ \" Version\\ \" : 1, \\ \" SecretAccessKey\\ \" : \\ \" secretkey\\ \" }" )
127+ p = & processcreds.ProcessProvider {
128+ Process : process ,
129+ }
130+ _ , err = p .Retrieve ()
131+ if err .(awserr.Error ).Code () != processcreds .ErrCodeProcessProviderRequired {
132+ t .Errorf ("expected %v, got %v" , processcreds .ErrCodeProcessProviderRequired , err )
133+ }
115134}
116135
117- func fakeExectuteCredsFailExpiration (process string ) ([]byte , error ) {
118- return []byte (`{"Version": 1, "AccessKeyId": "accessKey", "SecretAccessKey": "secret", "SessionToken": "tokenDefault", "Expiration": "20222"}` ), nil
119- }
120- func TestProcessProviderBadExpiry (t * testing.T ) {
121- os .Clearenv ()
122- p := ProcessProvider {Filename : "example.ini" , Profile : "process" , executionFunc : fakeExectuteCredsFailExpiration }
136+ func TestProcessProviderExpiration (t * testing.T ) {
137+ oldEnv := preserveImportantStashEnv ()
138+ defer awstesting .PopEnv (oldEnv )
139+
140+ // static creds
141+ process := fixForOS ("echo {\\ \" Version\\ \" : 1, \\ \" SecretAccessKey\\ \" : \\ \" secretkey\\ \" , \\ \" AccessKeyId\\ \" : \\ \" accesskey\\ \" }" )
142+ p := & processcreds.ProcessProvider {
143+ Process : process ,
144+ }
123145 _ , err := p .Retrieve ()
124- assert .NotNil (t , err , "Expect an error" )
146+ if err != nil {
147+ t .Errorf ("expected %v, got %v" , "no error" , err )
148+ }
149+ if p .IsExpired () {
150+ t .Errorf ("expected %v, got %v" , "static credentials/not expired" , "expired" )
151+ }
152+
153+ // not expired creds
154+ future := time .Now ().Add (1 * time .Hour ).UTC ().Format (time .RFC3339 )
155+ process = fixForOS (fmt .Sprintf ("echo {\\ \" Version\\ \" : 1, \\ \" SecretAccessKey\\ \" : \\ \" secretkey\\ \" , \\ \" AccessKeyId\\ \" : \\ \" accesskey\\ \" , \\ \" Expiration\\ \" : \\ \" %v\\ \" }" , future ))
156+ p = & processcreds.ProcessProvider {
157+ Process : process ,
158+ }
159+ _ , err = p .Retrieve ()
160+ if err != nil {
161+ t .Errorf ("expected %v, got %v" , "no error" , err )
162+ }
163+ if p .IsExpired () {
164+ t .Errorf ("expected %v, got %v" , "not expired" , "expired" )
165+ }
166+
167+ // expired creds
168+ past := time .Now ().Add (- 1 * time .Hour ).UTC ().Format (time .RFC3339 )
169+ process = fixForOS (fmt .Sprintf ("echo {\\ \" Version\\ \" : 1, \\ \" SecretAccessKey\\ \" : \\ \" secretkey\\ \" , \\ \" AccessKeyId\\ \" : \\ \" accesskey\\ \" , \\ \" Expiration\\ \" : \\ \" %v\\ \" }" , past ))
170+ p = & processcreds.ProcessProvider {
171+ Process : process ,
172+ }
173+ _ , err = p .Retrieve ()
174+ if err != nil {
175+ t .Errorf ("expected %v, got %v" , "no error" , err )
176+ }
177+ if ! p .IsExpired () {
178+ t .Errorf ("expected %v, got %v" , "expired" , "not expired" )
179+ }
125180}
126181
127182func BenchmarkProcessProvider (b * testing.B ) {
128- os .Clearenv ()
183+ oldEnv := preserveImportantStashEnv ()
184+ defer awstesting .PopEnv (oldEnv )
129185
130- p := ProcessProvider {Filename : "example.ini" , Profile : "process" , executionFunc : executeCredentialProcess }
186+ process := fixForOS ("echo {\\ \" Version\\ \" : 1, \\ \" SecretAccessKey\\ \" : \\ \" secretkey\\ \" , \\ \" AccessKeyId\\ \" : \\ \" accesskey\\ \" }" )
187+ p := & processcreds.ProcessProvider {
188+ Process : process ,
189+ }
131190 _ , err := p .Retrieve ()
132191 if err != nil {
133192 b .Fatal (err )
@@ -141,3 +200,23 @@ func BenchmarkProcessProvider(b *testing.B) {
141200 }
142201 }
143202}
203+
204+ func preserveImportantStashEnv () []string {
205+ var comspec string
206+ if len (os .Getenv ("ComSpec" )) != 0 {
207+ comspec = os .Getenv ("ComSpec" )
208+ }
209+
210+ oldEnv := awstesting .StashEnv () //clear env
211+
212+ os .Setenv ("ComSpec" , comspec )
213+ return oldEnv
214+ }
215+
216+ func fixForOS (in string ) string {
217+ if runtime .GOOS == "windows" {
218+ return strings .Replace (in , "\\ " , "" , - 1 )
219+ }
220+
221+ return in
222+ }
0 commit comments