Skip to content

Commit c995282

Browse files
authored
mgmt test, add getTokenCredentialForTest utility function (#46440)
* getTokenCredentialForTest * changelog * update release date * use TestMode as parameter * update netapp test
1 parent 87408ae commit c995282

File tree

6 files changed

+93
-59
lines changed

6 files changed

+93
-59
lines changed

eng/versioning/version_client.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,7 @@ unreleased_com.azure.v2:azure-core;2.0.0-beta.1
541541
unreleased_com.azure.v2:azure-identity;2.0.0-beta.1
542542
unreleased_io.clientcore:http-netty4;1.0.0-beta.1
543543
unreleased_com.azure.resourcemanager:azure-resourcemanager-storage;2.54.0-beta.1
544+
unreleased_com.azure.resourcemanager:azure-resourcemanager-test;2.0.0-beta.2
544545

545546
# Released Beta dependencies: Copy the entry from above, prepend "beta_", remove the current
546547
# version and set the version to the released beta. Released beta dependencies are only valid

sdk/netapp/azure-resourcemanager-netapp/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,11 @@
7575
<version>2.53.1</version> <!-- {x-version-update;com.azure.resourcemanager:azure-resourcemanager-resources;dependency} -->
7676
<scope>test</scope>
7777
</dependency>
78+
<dependency>
79+
<groupId>com.azure.resourcemanager</groupId>
80+
<artifactId>azure-resourcemanager-test</artifactId>
81+
<version>2.0.0-beta.2</version> <!-- {x-version-update;unreleased_com.azure.resourcemanager:azure-resourcemanager-test;dependency} -->
82+
<scope>test</scope>
83+
</dependency>
7884
</dependencies>
7985
</project>

sdk/netapp/azure-resourcemanager-netapp/src/test/java/com/azure/resourcemanager/netapp/NetAppFilesManagerTests.java

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,14 @@
99
import com.azure.core.management.AzureEnvironment;
1010
import com.azure.core.management.Region;
1111
import com.azure.core.management.profile.AzureProfile;
12-
import com.azure.core.test.InterceptorManager;
1312
import com.azure.core.test.TestProxyTestBase;
1413
import com.azure.core.test.annotation.LiveOnly;
15-
import com.azure.core.test.utils.MockTokenCredential;
1614
import com.azure.core.util.Configuration;
1715
import com.azure.core.util.CoreUtils;
18-
import com.azure.identity.AzureCliCredentialBuilder;
19-
import com.azure.identity.AzureDeveloperCliCredentialBuilder;
20-
import com.azure.identity.AzurePipelinesCredentialBuilder;
21-
import com.azure.identity.AzurePowerShellCredentialBuilder;
22-
import com.azure.identity.ChainedTokenCredentialBuilder;
23-
import com.azure.identity.EnvironmentCredentialBuilder;
2416
import com.azure.resourcemanager.netapp.models.NetAppAccount;
2517
import com.azure.resourcemanager.resources.ResourceManager;
2618
import com.azure.resourcemanager.resources.fluentcore.policy.ProviderRegistrationPolicy;
19+
import com.azure.resourcemanager.test.utils.TestUtilities;
2720
import org.junit.jupiter.api.Assertions;
2821
import org.junit.jupiter.api.Test;
2922

@@ -39,7 +32,7 @@ public class NetAppFilesManagerTests extends TestProxyTestBase {
3932

4033
@Override
4134
public void beforeTest() {
42-
final TokenCredential credential = getIdentityTestCredential(super.interceptorManager);
35+
final TokenCredential credential = TestUtilities.getTokenCredentialForTest(getTestMode());
4336
final AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
4437

4538
resourceManager = ResourceManager.configure()
@@ -96,42 +89,4 @@ protected void afterTest() {
9689
private static String randomPadding() {
9790
return String.format("%05d", Math.abs(RANDOM.nextInt() % 100000));
9891
}
99-
100-
/**
101-
* Gets a token credential for use in tests.
102-
* @param interceptorManager the interceptor manager
103-
* @return the TokenCredential
104-
*/
105-
private static TokenCredential getIdentityTestCredential(InterceptorManager interceptorManager) {
106-
if (interceptorManager.isPlaybackMode()) {
107-
return new MockTokenCredential();
108-
}
109-
110-
Configuration config = Configuration.getGlobalConfiguration();
111-
112-
ChainedTokenCredentialBuilder builder
113-
= new ChainedTokenCredentialBuilder().addLast(new EnvironmentCredentialBuilder().build())
114-
.addLast(new AzureCliCredentialBuilder().build())
115-
.addLast(new AzureDeveloperCliCredentialBuilder().build());
116-
117-
String serviceConnectionId = config.get("AZURESUBSCRIPTION_SERVICE_CONNECTION_ID");
118-
String clientId = config.get("AZURESUBSCRIPTION_CLIENT_ID");
119-
String tenantId = config.get("AZURESUBSCRIPTION_TENANT_ID");
120-
String systemAccessToken = config.get("SYSTEM_ACCESSTOKEN");
121-
122-
if (!CoreUtils.isNullOrEmpty(serviceConnectionId)
123-
&& !CoreUtils.isNullOrEmpty(clientId)
124-
&& !CoreUtils.isNullOrEmpty(tenantId)
125-
&& !CoreUtils.isNullOrEmpty(systemAccessToken)) {
126-
127-
builder.addLast(new AzurePipelinesCredentialBuilder().systemAccessToken(systemAccessToken)
128-
.clientId(clientId)
129-
.tenantId(tenantId)
130-
.serviceConnectionId(serviceConnectionId)
131-
.build());
132-
}
133-
134-
builder.addLast(new AzurePowerShellCredentialBuilder().build());
135-
return builder.build();
136-
}
13792
}

sdk/resourcemanager/azure-resourcemanager-test/CHANGELOG.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
# Release History
22

3-
## 2.0.0-beta.2 (Unreleased)
3+
## 2.0.0-beta.2 (2025-08-20)
44

55
### Features Added
66

7-
### Breaking Changes
8-
9-
### Bugs Fixed
10-
11-
### Other Changes
7+
- Added `getTokenCredentialForTest` to `TestUtilities`.
128

139
## 2.0.0-beta.1 (2025-08-12)
1410

sdk/resourcemanager/azure-resourcemanager-test/src/main/java/com/azure/resourcemanager/test/ResourceManagerTestProxyTestBase.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,15 @@
1818
import com.azure.core.test.models.CustomMatcher;
1919
import com.azure.core.test.models.TestProxySanitizer;
2020
import com.azure.core.test.models.TestProxySanitizerType;
21-
import com.azure.core.test.utils.MockTokenCredential;
2221
import com.azure.core.test.utils.ResourceNamer;
2322
import com.azure.core.util.Configuration;
2423
import com.azure.core.util.logging.ClientLogger;
25-
import com.azure.identity.DefaultAzureCredentialBuilder;
2624
import com.azure.json.JsonProviders;
2725
import com.azure.json.JsonReader;
2826
import com.azure.resourcemanager.test.model.AzureUser;
2927
import com.azure.resourcemanager.test.policy.HttpDebugLoggingPolicy;
3028
import com.azure.resourcemanager.test.utils.CliRunner;
29+
import com.azure.resourcemanager.test.utils.TestUtilities;
3130
import org.junit.jupiter.api.Assertions;
3231
import org.junit.jupiter.api.extension.ExtensionContext;
3332
import org.junit.jupiter.api.extension.InvocationInterceptor;
@@ -305,10 +304,12 @@ protected void beforeTest() {
305304
}
306305
}
307306

307+
credential = TestUtilities.getTokenCredentialForTest(getTestMode());
308+
308309
if (isPlaybackMode()) {
309310
testProfile = PLAYBACK_PROFILE;
310311
List<HttpPipelinePolicy> policies = new ArrayList<>();
311-
httpPipeline = buildHttpPipeline(new MockTokenCredential(), testProfile,
312+
httpPipeline = buildHttpPipeline(credential, testProfile,
312313
new HttpLogOptions().setLogLevel(httpLogDetailLevel), policies, interceptorManager.getPlaybackClient());
313314
if (!testContextManager.doNotRecordTest()) {
314315
// don't match api-version when matching url
@@ -327,9 +328,6 @@ protected void beforeTest() {
327328
= Objects.requireNonNull(configuration.get(Configuration.PROPERTY_AZURE_SUBSCRIPTION_ID),
328329
"'AZURE_SUBSCRIPTION_ID' environment variable cannot be null.");
329330
testProfile = new AzureProfile(tenantId, subscriptionId, AzureCloud.AZURE_PUBLIC_CLOUD);
330-
credential = new DefaultAzureCredentialBuilder()
331-
.authorityHost(testProfile.getEnvironment().getActiveDirectoryEndpoint())
332-
.build();
333331

334332
List<HttpPipelinePolicy> policies = new ArrayList<>();
335333
if (interceptorManager.isRecordMode() && !testContextManager.doNotRecordTest()) {

sdk/resourcemanager/azure-resourcemanager-test/src/main/java/com/azure/resourcemanager/test/utils/TestUtilities.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,19 @@
33

44
package com.azure.resourcemanager.test.utils;
55

6+
import com.azure.core.credential.TokenCredential;
67
import com.azure.core.http.rest.PagedIterable;
8+
import com.azure.core.test.TestMode;
9+
import com.azure.core.test.utils.MockTokenCredential;
10+
import com.azure.core.util.Configuration;
11+
import com.azure.core.util.CoreUtils;
12+
import com.azure.identity.AzureCliCredentialBuilder;
13+
import com.azure.identity.AzureDeveloperCliCredentialBuilder;
14+
import com.azure.identity.AzurePipelinesCredentialBuilder;
15+
import com.azure.identity.AzurePowerShellCredentialBuilder;
16+
import com.azure.identity.ChainedTokenCredentialBuilder;
17+
import com.azure.identity.DefaultAzureCredentialBuilder;
18+
import com.azure.identity.EnvironmentCredentialBuilder;
719

820
import java.util.Iterator;
921

@@ -59,4 +71,70 @@ public static <T> int getSize(Iterable<T> iterable) {
5971
public static <T> boolean isEmpty(PagedIterable<T> iterable) {
6072
return !iterable.iterator().hasNext();
6173
}
74+
75+
/**
76+
* Creates a comprehensive {@link TokenCredential} chain optimized for test environments.
77+
* <p>
78+
* This method constructs a credential chain that attempts multiple authentication methods
79+
* in a specific order, making it suitable for various testing scenarios including local
80+
* development and live tests in CI/CD pipelines.
81+
* </p>
82+
*
83+
* <strong>Azure Pipelines Configuration:</strong><br>
84+
* For Azure Pipelines authentication, the following environment variables must be set:
85+
* <ul>
86+
* <li>{@code AZURESUBSCRIPTION_SERVICE_CONNECTION_ID}</li>
87+
* <li>{@code AZURESUBSCRIPTION_CLIENT_ID}</li>
88+
* <li>{@code AZURESUBSCRIPTION_TENANT_ID}</li>
89+
* <li>{@code SYSTEM_ACCESSTOKEN}</li>
90+
* </ul>
91+
*
92+
* <strong>Local run Configuration:</strong><br>
93+
* For local run authentication, use Azure CLI for example, the following environment variables must be set:
94+
* <ul>
95+
* <li>{@code AZURE_SUBSCRIPTION_ID}</li>
96+
* <li>{@code AZURE_TENANT_ID}</li>
97+
* </ul>
98+
*
99+
* @param testMode {@link TestMode} that the test is running in, usually set through {@code AZURE_TEST_MODE} env var
100+
* @return a {@link TokenCredential} appropriate for the test environment:
101+
* {@link MockTokenCredential} for playback mode, or a
102+
* {@link com.azure.identity.ChainedTokenCredential} for live testing
103+
* @see MockTokenCredential
104+
* @see com.azure.identity.ChainedTokenCredential
105+
*/
106+
public static TokenCredential getTokenCredentialForTest(TestMode testMode) {
107+
if (testMode == TestMode.LIVE) {
108+
Configuration config = Configuration.getGlobalConfiguration();
109+
110+
ChainedTokenCredentialBuilder builder
111+
= new ChainedTokenCredentialBuilder().addLast(new EnvironmentCredentialBuilder().build())
112+
.addLast(new AzureCliCredentialBuilder().build())
113+
.addLast(new AzureDeveloperCliCredentialBuilder().build());
114+
115+
String serviceConnectionId = config.get("AZURESUBSCRIPTION_SERVICE_CONNECTION_ID");
116+
String clientId = config.get("AZURESUBSCRIPTION_CLIENT_ID");
117+
String tenantId = config.get("AZURESUBSCRIPTION_TENANT_ID");
118+
String systemAccessToken = config.get("SYSTEM_ACCESSTOKEN");
119+
120+
if (!CoreUtils.isNullOrEmpty(serviceConnectionId)
121+
&& !CoreUtils.isNullOrEmpty(clientId)
122+
&& !CoreUtils.isNullOrEmpty(tenantId)
123+
&& !CoreUtils.isNullOrEmpty(systemAccessToken)) {
124+
125+
builder.addLast(new AzurePipelinesCredentialBuilder().systemAccessToken(systemAccessToken)
126+
.clientId(clientId)
127+
.tenantId(tenantId)
128+
.serviceConnectionId(serviceConnectionId)
129+
.build());
130+
}
131+
132+
builder.addLast(new AzurePowerShellCredentialBuilder().build());
133+
return builder.build();
134+
} else if (testMode == TestMode.RECORD) {
135+
return new DefaultAzureCredentialBuilder().build();
136+
} else {
137+
return new MockTokenCredential();
138+
}
139+
}
62140
}

0 commit comments

Comments
 (0)