Skip to content

Commit b09954d

Browse files
committed
Fixed unit testcase for the changes
1 parent e931da8 commit b09954d

File tree

2 files changed

+75
-27
lines changed

2 files changed

+75
-27
lines changed

sdk/identity/azure-identity/src/main/java/com/azure/identity/WorkloadIdentityCredential.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,6 @@ public class WorkloadIdentityCredential implements TokenCredential {
9595
|| CoreUtils.isNullOrEmpty(clientIdInput)
9696
|| CoreUtils.isNullOrEmpty(identityClientOptions.getAuthorityHost()))) {
9797

98-
if (tenantIdInput == null || clientIdInput == null || federatedTokenFilePathInput == null) {
99-
throw LOGGER.logExceptionAsError(
100-
new IllegalStateException("Required parameters cannot be null: tenantId=" + tenantIdInput
101-
+ ", clientId=" + clientIdInput + ", federatedTokenFilePath=" + federatedTokenFilePathInput));
102-
}
103-
10498
ClientAssertionCredentialBuilder builder = new ClientAssertionCredentialBuilder().tenantId(tenantIdInput)
10599
.clientId(clientIdInput)
106100
.clientAssertion(() -> readFederatedTokenFromFile(federatedTokenFilePathInput));

sdk/identity/azure-identity/src/test/java/com/azure/identity/WorkloadIdentityCredentialTest.java

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,25 @@
77
import com.azure.core.credential.TokenRequestContext;
88
import com.azure.core.test.utils.TestConfigurationSource;
99
import com.azure.core.util.Configuration;
10-
import com.azure.identity.implementation.IdentityClient;
11-
import com.azure.identity.implementation.IdentitySyncClient;
1210
import com.azure.identity.util.TestUtils;
1311
import org.junit.jupiter.api.Assertions;
1412
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.io.TempDir;
1514
import org.mockito.MockedConstruction;
15+
16+
import reactor.core.publisher.Mono;
1617
import reactor.test.StepVerifier;
1718

19+
import java.io.IOException;
20+
import java.nio.file.Files;
21+
import java.nio.file.Path;
1822
import java.time.OffsetDateTime;
1923
import java.time.ZoneOffset;
2024
import java.util.UUID;
2125

2226
import static org.junit.jupiter.api.Assertions.assertNotNull;
2327
import static org.junit.jupiter.api.Assertions.assertTrue;
28+
import static org.mockito.ArgumentMatchers.any;
2429
import static org.mockito.Mockito.mockConstruction;
2530
import static org.mockito.Mockito.when;
2631

@@ -29,65 +34,71 @@ public class WorkloadIdentityCredentialTest {
2934
private static final String CLIENT_ID = UUID.randomUUID().toString();
3035

3136
@Test
32-
public void testWorkloadIdentityFlow() {
37+
public void testWorkloadIdentityFlow(@TempDir Path tempDir) throws IOException {
3338
// setup
3439
String endpoint = "https://localhost";
3540
String token1 = "token1";
36-
TokenRequestContext request1 = new TokenRequestContext().addScopes("https://management.azure.com");
41+
TokenRequestContext request1 = new TokenRequestContext().addScopes("https://management.azure.com/.default");
3742
OffsetDateTime expiresAt = OffsetDateTime.now(ZoneOffset.UTC).plusHours(1);
3843
Configuration configuration = TestUtils.createTestConfiguration(
3944
new TestConfigurationSource().put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, endpoint));
4045

46+
// Create a temporary token file
47+
Path tokenFile = tempDir.resolve("token.txt");
48+
Files.write(tokenFile, "dummy-token".getBytes());
49+
4150
// mock
42-
try (MockedConstruction<IdentityClient> identityClientMock
43-
= mockConstruction(IdentityClient.class, (identityClient, context) -> {
44-
when(identityClient.authenticateWithWorkloadIdentityConfidentialClient(request1))
51+
try (MockedConstruction<ClientAssertionCredential> clientAssertionMock
52+
= mockConstruction(ClientAssertionCredential.class, (clientAssertion, context) -> {
53+
when(clientAssertion.getToken(any(TokenRequestContext.class)))
4554
.thenReturn(TestUtils.getMockAccessToken(token1, expiresAt));
4655
})) {
4756
// test
4857
WorkloadIdentityCredential credential = new WorkloadIdentityCredentialBuilder().tenantId("dummy-tenantid")
49-
.clientId("dummy-clientid")
50-
.tokenFilePath("dummy-path")
51-
.configuration(configuration)
5258
.clientId(CLIENT_ID)
59+
.tokenFilePath(tokenFile.toString())
60+
.configuration(configuration)
5361
.build();
5462
StepVerifier.create(credential.getToken(request1))
5563
.expectNextMatches(token -> token1.equals(token.getToken())
5664
&& expiresAt.getSecond() == token.getExpiresAt().getSecond())
5765
.verifyComplete();
58-
assertNotNull(identityClientMock);
66+
assertNotNull(clientAssertionMock);
5967
}
6068
}
6169

6270
@Test
63-
public void testWorkloadIdentityFlowSync() {
71+
public void testWorkloadIdentityFlowSync(@TempDir Path tempDir) throws IOException {
6472
// setup
6573
String endpoint = "https://localhost";
6674
String token1 = "token1";
67-
TokenRequestContext request1 = new TokenRequestContext().addScopes("https://management.azure.com");
75+
TokenRequestContext request1 = new TokenRequestContext().addScopes("https://management.azure.com/.default");
6876
OffsetDateTime expiresAt = OffsetDateTime.now(ZoneOffset.UTC).plusHours(1);
6977
Configuration configuration = TestUtils.createTestConfiguration(
7078
new TestConfigurationSource().put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, endpoint));
7179

80+
// Create a temporary token file
81+
Path tokenFile = tempDir.resolve("token.txt");
82+
Files.write(tokenFile, "dummy-token".getBytes());
83+
7284
// mock
73-
try (MockedConstruction<IdentitySyncClient> identityClientMock
74-
= mockConstruction(IdentitySyncClient.class, (identityClient, context) -> {
75-
when(identityClient.authenticateWithWorkloadIdentityConfidentialClient(request1))
85+
try (MockedConstruction<ClientAssertionCredential> clientAssertionMock
86+
= mockConstruction(ClientAssertionCredential.class, (clientAssertion, context) -> {
87+
when(clientAssertion.getTokenSync(any(TokenRequestContext.class)))
7688
.thenReturn(TestUtils.getMockAccessTokenSync(token1, expiresAt));
7789
})) {
7890
// test
7991
WorkloadIdentityCredential credential = new WorkloadIdentityCredentialBuilder().tenantId("dummy-tenantid")
80-
.clientId("dummy-clientid")
81-
.tokenFilePath("dummy-path")
82-
.configuration(configuration)
8392
.clientId(CLIENT_ID)
93+
.tokenFilePath(tokenFile.toString())
94+
.configuration(configuration)
8495
.build();
8596

8697
AccessToken token = credential.getTokenSync(request1);
8798

8899
assertTrue(token1.equals(token.getToken()));
89100
assertTrue(expiresAt.getSecond() == token.getExpiresAt().getSecond());
90-
assertNotNull(identityClientMock);
101+
assertNotNull(clientAssertionMock);
91102
}
92103
}
93104

@@ -135,4 +146,47 @@ public void testWorkloadIdentityFlowFailureNoTokenPath() {
135146
.clientId("client-id")
136147
.build());
137148
}
138-
}
149+
150+
@Test
151+
public void testGetClientId(@TempDir Path tempDir) throws IOException {
152+
// setup
153+
String endpoint = "https://localhost";
154+
Configuration configuration = TestUtils.createTestConfiguration(
155+
new TestConfigurationSource().put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, endpoint));
156+
157+
// test
158+
WorkloadIdentityCredential credential = new WorkloadIdentityCredentialBuilder().tenantId("dummy-tenantid")
159+
.clientId(CLIENT_ID)
160+
.tokenFilePath("dummy-path")
161+
.configuration(configuration)
162+
.build();
163+
164+
Assertions.assertEquals(CLIENT_ID, credential.getClientId());
165+
}
166+
167+
@Test
168+
public void testFileReadingError(@TempDir Path tempDir) {
169+
// setup
170+
String endpoint = "https://localhost";
171+
Configuration configuration = TestUtils.createTestConfiguration(
172+
new TestConfigurationSource().put(Configuration.PROPERTY_AZURE_AUTHORITY_HOST, endpoint));
173+
TokenRequestContext request = new TokenRequestContext().addScopes("https://management.azure.com/.default");
174+
175+
String nonExistentFile = tempDir.resolve("non-existent-file.txt").toString();
176+
177+
WorkloadIdentityCredential credential = new WorkloadIdentityCredentialBuilder()
178+
.tenantId("dummy-tenantid")
179+
.clientId(CLIENT_ID)
180+
.tokenFilePath(nonExistentFile)
181+
.configuration(configuration)
182+
.build();
183+
184+
StepVerifier.create(credential.getToken(request))
185+
.expectErrorSatisfies(error -> {
186+
assertTrue(error instanceof RuntimeException);
187+
assertTrue(error.getMessage().contains("Failed to read federated token from file"));
188+
assertTrue(error.getCause() instanceof IOException); // Original IOException from Files.readAllBytes
189+
})
190+
.verify();
191+
}
192+
}

0 commit comments

Comments
 (0)