11// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22// SPDX-License-Identifier: Apache-2.0
3- package software .amazon .lambda .durable .exception ;
3+ package software .amazon .lambda .durable .util ;
44
55import static org .junit .jupiter .api .Assertions .*;
66
1212import software .amazon .awssdk .awscore .exception .AwsErrorDetails ;
1313import software .amazon .awssdk .awscore .exception .AwsServiceException ;
1414import software .amazon .awssdk .http .SdkHttpResponse ;
15+ import software .amazon .lambda .durable .exception .UnrecoverableDurableExecutionException ;
1516
1617class DurableApiErrorClassifierTest {
1718
1819 @ ParameterizedTest
1920 @ MethodSource ("kmsExceptions" )
20- void classifyException_kmsError_returnsUnrecoverableDurableExecutionException (String errorCode , String message ) {
21+ void classifyException_kmsError_returnsNonRetryable (String errorCode , String message ) {
2122 var error = awsError (502 , errorCode , message );
2223 var result = DurableApiErrorClassifier .classifyException (error );
2324 assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
24- var unrecoverable = ( UnrecoverableDurableExecutionException ) result ;
25- assertEquals (errorCode , unrecoverable .getErrorObject ().errorType ());
26- assertTrue (unrecoverable .getErrorObject ().errorMessage ().contains (message ));
25+ assertFalse ( result . isRetryable ()) ;
26+ assertEquals (errorCode , result .getErrorObject ().errorType ());
27+ assertTrue (result .getErrorObject ().errorMessage ().contains (message ));
2728 }
2829
2930 static Stream <Arguments > kmsExceptions () {
@@ -48,58 +49,64 @@ static Stream<Arguments> kmsExceptions() {
4849 }
4950
5051 @ Test
51- void classifyException_clientError4xx_returnsUnrecoverableDurableExecutionException () {
52+ void classifyException_clientError4xx_returnsNonRetryable () {
5253 var error = awsError (403 , "AccessDeniedException" , "User is not authorized" );
5354
5455 var result = DurableApiErrorClassifier .classifyException (error );
5556 assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
57+ assertFalse (result .isRetryable ());
5658 }
5759
5860 @ Test
59- void classifyException_invalidCheckpointToken_returnsOriginalException () {
61+ void classifyException_invalidCheckpointToken_returnsRetryable () {
6062 var error = awsError (400 , "InvalidParameterValueException" , "Invalid Checkpoint Token: token expired" );
6163
6264 var result = DurableApiErrorClassifier .classifyException (error );
63- assertSame (error , result );
65+ assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
66+ assertTrue (result .isRetryable ());
6467 }
6568
6669 @ Test
67- void classifyException_invalidParameterValueNonToken_returnsUnrecoverableDurableExecutionException () {
70+ void classifyException_invalidParameterValueNonToken_returnsNonRetryable () {
6871 var error = awsError (
6972 400 ,
7073 "InvalidParameterValueException" ,
7174 "The runtime parameter of python3.8 is no longer" + " supported for creating or updating functions." );
7275
7376 var result = DurableApiErrorClassifier .classifyException (error );
7477 assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
78+ assertFalse (result .isRetryable ());
7579 }
7680
7781 @ Test
78- void classifyException_throttled429_returnsOriginalException () {
82+ void classifyException_throttled429_returnsRetryable () {
7983 var error = awsError (429 , "TooManyRequestsException" , "Rate exceeded" );
8084
8185 var result = DurableApiErrorClassifier .classifyException (error );
82- assertSame (error , result );
86+ assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
87+ assertTrue (result .isRetryable ());
8388 }
8489
8590 @ Test
86- void classifyException_serverError500_returnsOriginalException () {
91+ void classifyException_serverError500_returnsRetryable () {
8792 var error = awsError (500 , "ServiceException" , "Service encountered an error" );
8893
8994 var result = DurableApiErrorClassifier .classifyException (error );
90- assertSame (error , result );
95+ assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
96+ assertTrue (result .isRetryable ());
9197 }
9298
9399 @ Test
94- void classifyException_nonMatchingErrorCode502_returnsOriginalException () {
100+ void classifyException_nonMatchingErrorCode502_returnsRetryable () {
95101 var error = awsError (502 , "ServiceException" , "Service unavailable" );
96102
97103 var result = DurableApiErrorClassifier .classifyException (error );
98- assertSame (error , result );
104+ assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
105+ assertTrue (result .isRetryable ());
99106 }
100107
101108 @ Test
102- void classifyException_errorDetailsPreserved () {
109+ void classifyException_nonRetryableError_preservesErrorDetails () {
103110 var error = awsError (
104111 502 ,
105112 "KMSAccessDeniedException" ,
@@ -109,11 +116,9 @@ void classifyException_errorDetailsPreserved() {
109116
110117 var result = DurableApiErrorClassifier .classifyException (error );
111118 assertInstanceOf (UnrecoverableDurableExecutionException .class , result );
112-
113- var unrecoverable = (UnrecoverableDurableExecutionException ) result ;
114- assertEquals ("KMSAccessDeniedException" , unrecoverable .getErrorObject ().errorType ());
115- assertTrue (unrecoverable
116- .getErrorObject ()
119+ assertFalse (result .isRetryable ());
120+ assertEquals ("KMSAccessDeniedException" , result .getErrorObject ().errorType ());
121+ assertTrue (result .getErrorObject ()
117122 .errorMessage ()
118123 .contains ("Lambda was unable to decrypt the environment variables" ));
119124 }
0 commit comments