Skip to content

Commit dea8c9c

Browse files
committed
unit test case added for retry mechanism
1 parent 1746e40 commit dea8c9c

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

src/main/java/io/cdap/plugin/gcp/gcs/ServiceAccountAccessTokenProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public class ServiceAccountAccessTokenProvider implements AccessTokenProvider {
5959
private static final Pattern SERVER_ERROR_PATTERN = Pattern.compile("Unexpected Error code 5\\d{2} trying to get " +
6060
"security access token from Compute Engine metadata for the default service account.*");
6161

62+
@VisibleForTesting
6263
@Override
6364
public AccessToken getAccessToken() {
6465
try {
@@ -100,7 +101,7 @@ static boolean isServerError(IOException e) {
100101
return msg != null && SERVER_ERROR_PATTERN.matcher(msg).matches();
101102
}
102103

103-
private com.google.auth.oauth2.AccessToken retrieveAccessToken() throws IOException {
104+
com.google.auth.oauth2.AccessToken retrieveAccessToken() throws IOException {
104105
try {
105106
return getCredentials().getAccessToken();
106107
} catch (IOException e) {

src/test/java/io/cdap/plugin/gcp/gcs/ServiceAccountAccessTokenProviderTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,23 @@
1717
package io.cdap.plugin.gcp.gcs;
1818

1919
import com.google.api.client.auth.oauth2.Credential;
20+
import com.google.auth.oauth2.AccessToken;
2021
import com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemConfiguration;
2122
import com.google.cloud.hadoop.util.AccessTokenProvider;
2223
import com.google.cloud.hadoop.util.CredentialFactory;
2324
import com.google.cloud.hadoop.util.CredentialFromAccessTokenProviderClassFactory;
2425
import com.google.cloud.hadoop.util.HadoopCredentialConfiguration;
2526
import com.google.common.collect.ImmutableList;
2627
import io.cdap.plugin.gcp.common.GCPUtils;
28+
import io.cdap.plugin.gcp.common.ServerErrorException;
2729
import org.apache.hadoop.conf.Configuration;
2830
import org.junit.Assert;
2931
import org.junit.Test;
32+
import org.mockito.Mockito;
33+
3034
import java.io.IOException;
35+
import java.time.Instant;
36+
import java.util.Date;
3137
import java.util.Map;
3238

3339
/**
@@ -102,4 +108,36 @@ public void testIsServerErrorWith5xxErrorCode503() {
102108
"service account.");
103109
Assert.assertTrue(ServiceAccountAccessTokenProvider.isServerError(serverError));
104110
}
111+
112+
@Test(expected = ServerErrorException.class)
113+
public void testRetryMechanismFailsAfterMaxRetries() throws IOException {
114+
ServiceAccountAccessTokenProvider provider = Mockito.spy(new ServiceAccountAccessTokenProvider());
115+
Mockito.doThrow(new ServerErrorException(503, "Unexpected Error code 503 trying to get security access token " +
116+
"from Compute Engine metadata for the default service account.", null))
117+
.when(provider).retrieveAccessToken();
118+
provider.getAccessToken();
119+
}
120+
121+
@Test
122+
public void testRetryMechanismSucceedsAfterFewRetries() throws IOException {
123+
ServiceAccountAccessTokenProvider provider = Mockito.spy(new ServiceAccountAccessTokenProvider());
124+
125+
// Create a valid token with future expiration
126+
AccessToken validToken = new AccessToken("valid-token", Date.from(Instant.now().plusSeconds(3600)));
127+
128+
// Fail first 2 attempts, then succeed
129+
Mockito.doThrow(new ServerErrorException(503, "Unexpected Error code 503 trying to get security access token " +
130+
"from Compute Engine metadata for the default service account.", null))
131+
.doThrow(new ServerErrorException(500, "Unexpected Error code 500 trying to get security access token " +
132+
"from Compute Engine metadata for the default service account.", null))
133+
.doReturn(validToken)
134+
.when(provider).retrieveAccessToken();
135+
AccessTokenProvider.AccessToken accessToken = provider.getAccessToken();
136+
137+
Assert.assertNotNull(accessToken);
138+
Assert.assertEquals("valid-token", accessToken.getToken());
139+
140+
// Verify that retrieveAccessToken was called 3 times (2 failures + 1 success)
141+
Mockito.verify(provider, Mockito.times(3)).retrieveAccessToken();
142+
}
105143
}

0 commit comments

Comments
 (0)