2424-define (DUMMY_SESSION_TOKEN , " dummy-session-token" ).
2525-define (DUMMY_REGION , <<" us-east-1" >>).
2626-define (DUMMY_REGION2 , <<" us-east-2" >>).
27+ -define (DUMMY_EXPIRATION , <<" 2035-09-25T23:43:56Z" >>).
2728
2829all () ->
2930 [ {group , file }
@@ -38,6 +39,7 @@ all() ->
3839 , {group , eks }
3940 , {group , web_identity }
4041 , {group , web_identity_default_session_name }
42+ , {group , web_identity_error }
4143 , {group , credential_process }
4244 ].
4345
@@ -54,6 +56,7 @@ groups() ->
5456 , {eks , [], all_testcases ()}
5557 , {web_identity , [], all_testcases ()}
5658 , {web_identity_default_session_name , [], all_testcases ()}
59+ , {web_identity_error , [], all_testcases ()}
5760 , {credential_process , [], all_testcases ()}
5861 ].
5962
@@ -81,6 +84,8 @@ init_per_group(GroupName, Config) ->
8184 init_group (credential_process , provider (file ), credential_process , Config );
8285 web_identity_default_session_name = GroupName ->
8386 init_group (GroupName , provider (web_identity ), GroupName , Config );
87+ web_identity_error ->
88+ init_group (web_identity_error , provider (web_identity ), web_identity , Config );
8489 GroupName -> init_group (GroupName , Config )
8590 end .
8691
@@ -135,6 +140,14 @@ assert_test(WebIdentity) when WebIdentity =:= web_identity;
135140 assert_values (? DUMMY_ACCESS_KEY , ? DUMMY_SECRET_ACCESS_KEY , Provider ),
136141 #{token := Token } = aws_credentials :get_credentials (),
137142 ? assertEqual (<<" unused" >>, Token );
143+ assert_test (web_identity_error ) ->
144+ ? assertEqual (undefined , aws_credentials :get_credentials ()),
145+ {error , [{_ , {error , ErrorInfo }}]} =
146+ aws_credentials_provider :fetch (),
147+ #{status := 400 , message := Message , code := Code } = ErrorInfo ,
148+ ExpectedMsg = <<" The web identity token that was passed is expired" >>,
149+ ? assertEqual (<<" InvalidIdentityToken" >>, Code ),
150+ ? assertEqual (ExpectedMsg , Message );
138151assert_test (GroupName ) ->
139152 Provider = provider (GroupName ),
140153 assert_values (? DUMMY_ACCESS_KEY , ? DUMMY_SECRET_ACCESS_KEY , Provider ).
@@ -249,6 +262,19 @@ setup_provider(web_identity, Config) ->
249262 , env => [ {" AWS_ROLE_ARN" , OldRoleArn }
250263 , {" AWS_WEB_IDENTITY_TOKEN_FILE" , OldWebIdentityTokenFile }
251264 ]};
265+ setup_provider (web_identity_error , Config ) ->
266+ OldRoleArn = os :getenv (" AWS_ROLE_ARN" ),
267+ OldWebIdentityTokenFile = os :getenv (" AWS_WEB_IDENTITY_TOKEN_FILE" ),
268+ application :set_env (aws_credentials , fail_if_unavailable , false ),
269+ os :putenv (" AWS_ROLE_ARN" , " arg:aws:iam::123123123" ),
270+ os :putenv (" AWS_WEB_IDENTITY_TOKEN_FILE" , ? config (data_dir , Config ) ++ " web_identity/token" ),
271+ meck :new (httpc , [no_link , passthrough ]),
272+ meck :expect (httpc , request , fun mock_httpc_request_web_identity_error /5 ),
273+ #{ mocks => [httpc ]
274+ , env => [ {" AWS_ROLE_ARN" , OldRoleArn }
275+ , {" AWS_WEB_IDENTITY_TOKEN_FILE" , OldWebIdentityTokenFile }
276+ ]
277+ };
252278setup_provider (config_env , Config ) ->
253279 Old = os :getenv (" AWS_CONFIG_FILE" ),
254280 os :putenv (" AWS_CONFIG_FILE" , ? config (data_dir , Config ) ++ " env/config" ),
@@ -283,6 +309,7 @@ setup_provider(_GroupName, _Config) ->
283309 }.
284310
285311teardown_provider (Context ) ->
312+ application :unset_env (aws_credentials , fail_if_unavailable ),
286313 #{mocks := Mocks , env := Env } = Context ,
287314 [meck :unload (Mock ) || Mock <- Mocks ],
288315 [maybe_put_env (Key , Value ) || {Key , Value } <- Env ],
@@ -301,7 +328,7 @@ mock_httpc_request_ec2(Method, Request, HTTPOptions, Options, Profile) ->
301328 {ok , response ('document' )};
302329 _ ->
303330 meck :passthrough ([Method , Request , HTTPOptions , Options , Profile ])
304- end .
331+ end .
305332
306333mock_httpc_request_ecs (Method , Request , HTTPOptions , Options , Profile ) ->
307334 case Request of
@@ -343,9 +370,19 @@ mock_httpc_request_web_identity(Method, Request, HTTPOptions, Options, Profile)
343370 _ ->
344371 meck :passthrough ([Method , Request , HTTPOptions , Options , Profile ])
345372 end .
373+ mock_httpc_request_web_identity_error (Method , {Url , Headers }, HTTPOptions , Options , Profile ) ->
374+ case string :find (Url , " sts.amazonaws.com" ) of
375+ nomatch ->
376+ meck :passthrough ([Method , {Url , Headers }, HTTPOptions , Options , Profile ]);
377+ _ ->
378+ {ok , response (400 , 'web-identity-error' )}
379+ end .
346380
347381response (BodyTag ) ->
348- StatusLine = {unused , 200 , unused },
382+ response (200 , BodyTag ).
383+
384+ response (Status , BodyTag ) ->
385+ StatusLine = {" HTTP/1.1" , Status , " " },
349386 Headers = [],
350387 Body = body (BodyTag ),
351388 {StatusLine , Headers , Body }.
@@ -357,34 +394,43 @@ body('security-credentials') ->
357394body ('dummy-role' ) ->
358395 jsx :encode (#{ 'AccessKeyId' => ? DUMMY_ACCESS_KEY
359396 , 'SecretAccessKey' => ? DUMMY_SECRET_ACCESS_KEY
360- , 'Expiration' => << " 2026-09-25T23:43:56Z " >>
397+ , 'Expiration' => ? DUMMY_EXPIRATION
361398 , 'Token' => unused
362399 });
363400body ('document' ) ->
364401 jsx :encode (#{ 'region' => unused });
365402body ('dummy-uri' ) ->
366403 jsx :encode (#{ 'AccessKeyId' => ? DUMMY_ACCESS_KEY
367404 , 'SecretAccessKey' => ? DUMMY_SECRET_ACCESS_KEY
368- , 'Expiration' => << " 2026-09-25T23:43:56Z " >>
405+ , 'Expiration' => ? DUMMY_EXPIRATION
369406 , 'Token' => unused
370407 });
371408body ('eks-credentials' ) ->
372409 jsx :encode (#{ 'AccessKeyId' => ? DUMMY_ACCESS_KEY
373410 , 'SecretAccessKey' => ? DUMMY_SECRET_ACCESS_KEY
374- , 'Expiration' => << " 2026-09-25T23:43:56Z " >>
411+ , 'Expiration' => ? DUMMY_EXPIRATION
375412 , 'Token' => unused
376413 });
377414body ('web-identity-credentials' ) ->
378- <<" <AssumeRoleWithWebIdentityResponse>
379- <AssumeRoleWithWebIdentityResult>
380- <Credentials>
381- <AccessKeyId>" , ? DUMMY_ACCESS_KEY /binary , " </AccessKeyId>
382- <SecretAccessKey>" , ? DUMMY_SECRET_ACCESS_KEY /binary , " </SecretAccessKey>
383- <SessionToken>unused</SessionToken>
384- <Expiration>2026-09-25T23:43:56Z</Expiration>
385- </Credentials>
386- </AssumeRoleWithWebIdentityResult>
387- </AssumeRoleWithWebIdentityResponse>" >>.
415+ <<" <AssumeRoleWithWebIdentityResponse>\n "
416+ " <AssumeRoleWithWebIdentityResult>\n "
417+ " <Credentials>\n "
418+ " <AccessKeyId>" , ? DUMMY_ACCESS_KEY /binary , " </AccessKeyId>\n "
419+ " <SecretAccessKey>" , ? DUMMY_SECRET_ACCESS_KEY /binary , " </SecretAccessKey>\n "
420+ " <SessionToken>unused</SessionToken>\n "
421+ " <Expiration>" , ? DUMMY_EXPIRATION /binary , " </Expiration>\n "
422+ " </Credentials>\n "
423+ " </AssumeRoleWithWebIdentityResult>\n "
424+ " </AssumeRoleWithWebIdentityResponse>" >>;
425+ body ('web-identity-error' ) ->
426+ <<" <ErrorResponse xmlns=\" https://sts.amazonaws.com/doc/2011-06-15/\" >\n "
427+ " <Error>\n "
428+ " <Type>User</Type>\n "
429+ " <Code>InvalidIdentityToken</Code>\n "
430+ " <Message>The web identity token that was passed is expired</Message>\n "
431+ " </Error>\n "
432+ " <RequestId>dummy-request-id</RequestId>\n "
433+ " </ErrorResponse>" >>.
388434
389435maybe_put_env (Key , false ) ->
390436 os :unsetenv (Key );
0 commit comments