Skip to content

Commit b7ef59e

Browse files
authored
Fix NPE in EntraIdIntegrationTests #3254
EntraIdIntegrationTests.azureTokenAuthWithDefaultAzureCred
1 parent 2897335 commit b7ef59e

File tree

2 files changed

+104
-31
lines changed

2 files changed

+104
-31
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package io.lettuce.authx;
2+
3+
import com.azure.identity.DefaultAzureCredential;
4+
import com.azure.identity.DefaultAzureCredentialBuilder;
5+
import io.lettuce.core.ClientOptions;
6+
import io.lettuce.core.RedisClient;
7+
import io.lettuce.core.RedisCredentials;
8+
import io.lettuce.core.RedisURI;
9+
import io.lettuce.core.SocketOptions;
10+
import io.lettuce.core.TimeoutOptions;
11+
import io.lettuce.core.api.StatefulRedisConnection;
12+
import io.lettuce.core.api.sync.RedisCommands;
13+
import io.lettuce.test.env.Endpoints;
14+
import io.lettuce.test.env.Endpoints.Endpoint;
15+
import org.junit.jupiter.api.AfterEach;
16+
import org.junit.jupiter.api.Assumptions;
17+
import org.junit.jupiter.api.BeforeEach;
18+
import org.junit.jupiter.api.Tag;
19+
import org.junit.jupiter.api.Test;
20+
import redis.clients.authentication.core.TokenAuthConfig;
21+
import redis.clients.authentication.entraid.AzureTokenAuthConfigBuilder;
22+
23+
import java.time.Duration;
24+
import java.util.UUID;
25+
import java.util.concurrent.ExecutionException;
26+
27+
import static io.lettuce.TestTags.ENTRA_ID;
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
import static org.junit.jupiter.api.Assumptions.assumeTrue;
30+
31+
@Tag(ENTRA_ID)
32+
public class DefaultAzureCredentialsIntegrationTests {
33+
34+
private static final EntraIdTestContext testCtx = EntraIdTestContext.DEFAULT;
35+
36+
private RedisClient client;
37+
38+
private Endpoint standalone;
39+
40+
private ClientOptions clientOptions;
41+
42+
private TokenBasedRedisCredentialsProvider credentialsProvider;
43+
44+
@BeforeEach
45+
public void setup() {
46+
standalone = Endpoints.DEFAULT.getEndpoint("standalone-entraid-acl");
47+
assumeTrue(standalone != null, "Skipping EntraID tests. Redis host with enabled EntraId not provided!");
48+
Assumptions.assumeTrue(testCtx.getClientId() != null && testCtx.getClientSecret() != null,
49+
"Skipping EntraID tests. Azure AD credentials not provided!");
50+
51+
clientOptions = ClientOptions.builder()
52+
.socketOptions(SocketOptions.builder().connectTimeout(Duration.ofSeconds(1)).build())
53+
.timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(1)))
54+
.reauthenticateBehavior(ClientOptions.ReauthenticateBehavior.ON_NEW_CREDENTIALS).build();
55+
56+
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
57+
58+
TokenAuthConfig tokenAuthConfig = AzureTokenAuthConfigBuilder.builder().defaultAzureCredential(credential)
59+
.tokenRequestExecTimeoutInMs(2000).build();
60+
61+
credentialsProvider = TokenBasedRedisCredentialsProvider.create(tokenAuthConfig);
62+
63+
client = createClient(credentialsProvider);
64+
}
65+
66+
@AfterEach
67+
public void cleanUp() {
68+
if (credentialsProvider != null) {
69+
credentialsProvider.close();
70+
}
71+
if (client != null) {
72+
client.shutdown();
73+
}
74+
}
75+
76+
@Test
77+
public void azureTokenAuthWithDefaultAzureCredentials() throws ExecutionException, InterruptedException {
78+
79+
RedisCredentials credentials = credentialsProvider.resolveCredentials().block(Duration.ofSeconds(5));
80+
assertThat(credentials).isNotNull();
81+
82+
String key = UUID.randomUUID().toString();
83+
try (StatefulRedisConnection<String, String> connection = client.connect()) {
84+
RedisCommands<String, String> sync = connection.sync();
85+
assertThat(sync.aclWhoami()).isEqualTo(credentials.getUsername());
86+
sync.set(key, "value");
87+
assertThat(sync.get(key)).isEqualTo("value");
88+
assertThat(connection.async().get(key).get()).isEqualTo("value");
89+
assertThat(connection.reactive().get(key).block()).isEqualTo("value");
90+
sync.del(key);
91+
}
92+
}
93+
94+
private RedisClient createClient(TokenBasedRedisCredentialsProvider credentialsProvider) {
95+
RedisURI uri = RedisURI.create((standalone.getEndpoints().get(0)));
96+
uri.setCredentialsProvider(credentialsProvider);
97+
RedisClient redis = RedisClient.create(uri);
98+
redis.setOptions(clientOptions);
99+
return redis;
100+
}
101+
102+
}

Diff for: src/test/java/io/lettuce/authx/EntraIdIntegrationTests.java

+2-31
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package io.lettuce.authx;
22

3-
import com.azure.identity.DefaultAzureCredential;
4-
import com.azure.identity.DefaultAzureCredentialBuilder;
53
import io.lettuce.core.*;
64
import io.lettuce.core.api.StatefulRedisConnection;
75
import io.lettuce.core.api.async.RedisAsyncCommands;
@@ -13,7 +11,6 @@
1311
import io.lettuce.test.env.Endpoints.Endpoint;
1412
import org.junit.jupiter.api.*;
1513
import redis.clients.authentication.core.TokenAuthConfig;
16-
import redis.clients.authentication.entraid.AzureTokenAuthConfigBuilder;
1714
import redis.clients.authentication.entraid.EntraIDTokenAuthConfigBuilder;
1815

1916
import java.time.Duration;
@@ -57,7 +54,7 @@ public void setup() {
5754
.secret(testCtx.getClientSecret()).authority(testCtx.getAuthority()).scopes(testCtx.getRedisScopes())
5855
.expirationRefreshRatio(0.0000001F).build();
5956

60-
TokenBasedRedisCredentialsProvider credentialsProvider = TokenBasedRedisCredentialsProvider.create(tokenAuthConfig);
57+
credentialsProvider = TokenBasedRedisCredentialsProvider.create(tokenAuthConfig);
6158

6259
client = createClient(credentialsProvider);
6360
}
@@ -119,7 +116,7 @@ public void renewalDuringOperationsTest() throws InterruptedException {
119116
CountDownLatch latch = new CountDownLatch(10); // Wait for at least 10 token renewalss
120117
credentialsProvider.credentials().subscribe(cred -> latch.countDown());
121118

122-
assertThat(latch.await(1, TimeUnit.SECONDS)).isTrue(); // Wait to reach 10 renewals
119+
assertThat(latch.await(2, TimeUnit.SECONDS)).isTrue(); // Wait to reach 10 renewals
123120
commandThread.join(); // Wait for the command thread to finish
124121

125122
assertThat(commandCycleCount.get()).isGreaterThanOrEqualTo(10);
@@ -157,32 +154,6 @@ public void renewalDuringPubSubOperationsTest() throws InterruptedException {
157154
}
158155
}
159156

160-
@Test
161-
public void azureTokenAuthWithDefaultAzureCredentials() throws ExecutionException, InterruptedException {
162-
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
163-
164-
TokenAuthConfig tokenAuthConfig = AzureTokenAuthConfigBuilder.builder().defaultAzureCredential(credential)
165-
.tokenRequestExecTimeoutInMs(2000).build();
166-
167-
try (RedisClient azureCredClient = createClient(credentialsProvider);
168-
TokenBasedRedisCredentialsProvider credentialsProvider = TokenBasedRedisCredentialsProvider
169-
.create(tokenAuthConfig);) {
170-
RedisCredentials credentials = credentialsProvider.resolveCredentials().block(Duration.ofSeconds(5));
171-
assertThat(credentials).isNotNull();
172-
173-
String key = UUID.randomUUID().toString();
174-
try (StatefulRedisConnection<String, String> connection = azureCredClient.connect()) {
175-
RedisCommands<String, String> sync = connection.sync();
176-
assertThat(sync.aclWhoami()).isEqualTo(credentials.getUsername());
177-
sync.set(key, "value");
178-
assertThat(sync.get(key)).isEqualTo("value");
179-
assertThat(connection.async().get(key).get()).isEqualTo("value");
180-
assertThat(connection.reactive().get(key).block()).isEqualTo("value");
181-
sync.del(key);
182-
}
183-
}
184-
}
185-
186157
private RedisClient createClient(TokenBasedRedisCredentialsProvider credentialsProvider) {
187158
RedisURI uri = RedisURI.create((standalone.getEndpoints().get(0)));
188159
uri.setCredentialsProvider(credentialsProvider);

0 commit comments

Comments
 (0)