Skip to content

Commit

Permalink
[Communication] - phone-numbers - Implement a phone number pool for l…
Browse files Browse the repository at this point in the history
…ive tests (#27072)

* Implement a phone number pool for live tests

* Fix pipeline script

* Add MatrixConfigs param to communication template

This allows for individual packages to customize their job matrix if needed.

* Require test agent phone number in livetests

Throw an exception when there is no phone number assigned to the current test agent. This only applies when not skipping update capabilities live tests.

The main purpose of this is for the test run to fail when it isn't properly configured, instead of silently falling back on the default method for setting the test phone number.
  • Loading branch information
danielortega-msft authored Feb 17, 2022
1 parent 6a93edf commit 5c09976
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 53 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"displayNames": {
"true": "TestFromSource"
},
"matrix": {
"Agent": {
"ubuntu-20.04": {
"OSVmImage": "MMSUbuntu20.04",
"Pool": "azsdk-pool-mms-ubuntu-2004-general",
"JavaTestVersion": "1.8",
"AZURE_TEST_HTTP_CLIENTS": "okhttp",
"AZURE_TEST_AGENT": "ubuntu_2004_java8"
},
"macOS-10.15": {
"OSVmImage": "macOS-10.15",
"Pool": "Azure Pipelines",
"JavaTestVersion": "1.11",
"AZURE_TEST_HTTP_CLIENTS": "netty",
"AZURE_TEST_AGENT": "macos_1015_java11"
}
},
"SKIP_UPDATE_CAPABILITIES_LIVE_TESTS": "false",
"TestFromSource": false,
"TestGoals": "surefire:test",
"TestOptions": ""
},
"include": [
{
"Agent": {
"ubuntu-20.04": {
"OSVmImage": "MMSUbuntu20.04",
"Pool": "azsdk-pool-mms-ubuntu-2004-general"
}
},
"JavaTestVersion": "1.11",
"AZURE_TEST_HTTP_CLIENTS": "netty",
"TestFromSource": true,
"TestGoals": "verify",
"TestOptions": "-DskipCompile=true -DskipTestCompile=true -DcreateSourcesJar=false",
"SKIP_UPDATE_CAPABILITIES_LIVE_TESTS": "true"
},
{
"Agent": {
"windows-2019": {
"OSVmImage": "MMS2019",
"Pool": "azsdk-pool-mms-win-2019-general"
}
},
"JavaTestVersion": "1.11",
"AZURE_TEST_HTTP_CLIENTS": "netty",
"TestFromSource": false,
"TestGoals": "verify",
"TestOptions": "-DskipCompile=true -DskipTestCompile=true -DcreateSourcesJar=false",
"SKIP_UPDATE_CAPABILITIES_LIVE_TESTS": "false",
"AZURE_TEST_AGENT": "windows_2019_java11"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class PhoneNumbersAsyncClientIntegrationTest extends PhoneNumbersIntegrat
@ParameterizedTest
@MethodSource("com.azure.core.test.TestBase#getHttpClients")
public void getPurchasedPhoneNumber(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
StepVerifier.create(
this.getClientWithConnectionString(httpClient, "getPurchasedPhoneNumber").getPurchasedPhoneNumber(phoneNumber)
)
Expand All @@ -46,7 +46,7 @@ public void getPurchasedPhoneNumber(HttpClient httpClient) {
@ParameterizedTest
@MethodSource("com.azure.core.test.TestBase#getHttpClients")
public void getPurchasedPhoneNumberWithAAD(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
StepVerifier.create(
this.getClientWithManagedIdentity(httpClient, "getPurchasedPhoneNumberWithAAD").getPurchasedPhoneNumber(phoneNumber)
)
Expand All @@ -60,7 +60,7 @@ public void getPurchasedPhoneNumberWithAAD(HttpClient httpClient) {
@ParameterizedTest
@MethodSource("com.azure.core.test.TestBase#getHttpClients")
public void getPurchasedPhoneNumberWithResponse(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
StepVerifier.create(
this.getClientWithConnectionString(httpClient, "getPurchasedPhoneNumberWithResponse").getPurchasedPhoneNumberWithResponse(phoneNumber)
)
Expand Down Expand Up @@ -132,7 +132,7 @@ public void beginPurchaseandReleasePhoneNumbers(HttpClient httpClient) {
.flatMap((AsyncPollResponse<PhoneNumberOperation, PhoneNumberSearchResult> result) -> {
return result.getFinalResult()
.flatMap((PhoneNumberSearchResult searchResult) -> {
String phoneNumber = getTestPhoneNumber(searchResult.getPhoneNumbers().get(0));
String phoneNumber = redactIfPlaybackMode(searchResult.getPhoneNumbers().get(0));
return beginPurchasePhoneNumbersHelper(httpClient, searchResult.getSearchId(), "beginPurchasePhoneNumbers").last()
.flatMap((AsyncPollResponse<PhoneNumberOperation, PurchasePhoneNumbersResult> purchaseResult) -> {
assertEquals(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED, purchaseResult.getStatus());
Expand All @@ -153,10 +153,10 @@ public void beginPurchaseandReleasePhoneNumbers(HttpClient httpClient) {
named = "COMMUNICATION_SKIP_INT_PHONENUMBERS_TEST",
matches = "(?i)(true)")
@DisabledIfEnvironmentVariable(
named = "SKIP_LIVE_TEST",
named = "SKIP_UPDATE_CAPABILITIES_LIVE_TESTS",
matches = "(?i)(true)")
public void beginUpdatePhoneNumberCapabilities(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());

StepVerifier.create(
this.getClientWithConnectionString(httpClient, "getPurchasedPhoneNumberForCapabilities").getPurchasedPhoneNumberWithResponse(phoneNumber)
Expand Down Expand Up @@ -276,11 +276,4 @@ private PhoneNumbersAsyncClient getClientWithManagedIdentity(HttpClient httpClie
PhoneNumbersClientBuilder builder = super.getClientBuilderUsingManagedIdentity(httpClient);
return addLoggingPolicy(builder, testName).buildAsyncClient();
}

private String getTestPhoneNumber(String phoneNumber) {
if (getTestMode() == TestMode.PLAYBACK) {
phoneNumber = "+REDACTED";
}
return phoneNumber;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class PhoneNumbersClientIntegrationTest extends PhoneNumbersIntegrationTe
@ParameterizedTest
@MethodSource("com.azure.core.test.TestBase#getHttpClients")
public void getPurchasedPhoneNumber(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
PurchasedPhoneNumber number = this.getClientWithConnectionString(httpClient, "getPurchasedPhoneNumberSync").getPurchasedPhoneNumber(phoneNumber);
assertEquals(phoneNumber, number.getPhoneNumber());
assertEquals(COUNTRY_CODE, number.getCountryCode());
Expand All @@ -45,7 +45,7 @@ public void getPurchasedPhoneNumber(HttpClient httpClient) {
@ParameterizedTest
@MethodSource("com.azure.core.test.TestBase#getHttpClients")
public void getPurchasedPhoneNumberWithAAD(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
PurchasedPhoneNumber number = this.getClientWithManagedIdentity(httpClient, "getPurchasedPhoneNumberWithAADSync").getPurchasedPhoneNumber(phoneNumber);
assertEquals(phoneNumber, number.getPhoneNumber());
assertEquals(COUNTRY_CODE, number.getCountryCode());
Expand All @@ -54,7 +54,7 @@ public void getPurchasedPhoneNumberWithAAD(HttpClient httpClient) {
@ParameterizedTest
@MethodSource("com.azure.core.test.TestBase#getHttpClients")
public void getPurchasedPhoneNumberWithResponse(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
Response<PurchasedPhoneNumber> response = this.getClientWithConnectionString(httpClient, "getPurchasedPhoneNumberWithResponseSync")
.getPurchasedPhoneNumberWithResponse(phoneNumber, Context.NONE);
PurchasedPhoneNumber number = response.getValue();
Expand Down Expand Up @@ -108,7 +108,7 @@ public void beginPurchaseandReleasePhoneNumbersWithoutContext(HttpClient httpCli
PollResponse<PhoneNumberOperation> response = poller.waitForCompletion();
if (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {
PhoneNumberSearchResult searchResult = poller.getFinalResult();
String phoneNumber = getTestPhoneNumber(searchResult.getPhoneNumbers().get(0));
String phoneNumber = redactIfPlaybackMode(searchResult.getPhoneNumbers().get(0));
PollResponse<PhoneNumberOperation> purchaseOperationResponse = beginPurchasePhoneNumbersHelper(httpClient, searchResult.getSearchId(), "beginPurchasePhoneNumbersWithoutContextSync", false).waitForCompletion();
assertEquals(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED, purchaseOperationResponse.getStatus());
PollResponse<PhoneNumberOperation> releaseOperationResponse = beginReleasePhoneNumberHelper(httpClient, phoneNumber, "beginReleasePhoneNumberWithoutContextSync", false).waitForCompletion();
Expand All @@ -128,7 +128,7 @@ public void beginPurchaseandReleasePhoneNumbers(HttpClient httpClient) {
PollResponse<PhoneNumberOperation> response = poller.waitForCompletion();
if (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {
PhoneNumberSearchResult searchResult = poller.getFinalResult();
String phoneNumber = getTestPhoneNumber(searchResult.getPhoneNumbers().get(0));
String phoneNumber = redactIfPlaybackMode(searchResult.getPhoneNumbers().get(0));
PollResponse<PhoneNumberOperation> purchaseOperationResponse = beginPurchasePhoneNumbersHelper(httpClient, searchResult.getSearchId(), "beginPurchasePhoneNumbersSync", true).waitForCompletion();
assertEquals(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED, purchaseOperationResponse.getStatus());
PollResponse<PhoneNumberOperation> releaseOperationResponse = beginReleasePhoneNumberHelper(httpClient, phoneNumber, "beginReleasePhoneNumberSync", true).waitForCompletion();
Expand All @@ -144,7 +144,7 @@ public void beginPurchaseandReleasePhoneNumbers(HttpClient httpClient) {
named = "COMMUNICATION_SKIP_INT_PHONENUMBERS_TEST",
matches = "(?i)(true)")
public void beginUpdatePhoneNumberCapabilitiesWithoutContext(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
PollResponse<PhoneNumberOperation> result = beginUpdatePhoneNumberCapabilitiesHelper(httpClient, phoneNumber, "beginUpdatePhoneNumberCapabilitiesWithoutContextSync", false).waitForCompletion();
assertEquals(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED, result.getStatus());
assertEquals(PhoneNumberOperationStatus.SUCCEEDED, result.getValue().getStatus());
Expand All @@ -156,10 +156,10 @@ public void beginUpdatePhoneNumberCapabilitiesWithoutContext(HttpClient httpClie
named = "COMMUNICATION_SKIP_INT_PHONENUMBERS_TEST",
matches = "(?i)(true)")
@DisabledIfEnvironmentVariable(
named = "SKIP_LIVE_TEST",
named = "SKIP_UPDATE_CAPABILITIES_LIVE_TESTS",
matches = "(?i)(true)")
public void beginUpdatePhoneNumberCapabilities(HttpClient httpClient) {
String phoneNumber = getTestPhoneNumber(PHONE_NUMBER);
String phoneNumber = redactIfPlaybackMode(getTestPhoneNumber());
PollResponse<PhoneNumberOperation> result = beginUpdatePhoneNumberCapabilitiesHelper(httpClient, phoneNumber, "beginUpdatePhoneNumberCapabilities", true).waitForCompletion();
assertEquals(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED, result.getStatus());
assertEquals(PhoneNumberOperationStatus.SUCCEEDED, result.getValue().getStatus());
Expand Down Expand Up @@ -236,11 +236,4 @@ private PhoneNumbersClient getClientWithManagedIdentity(HttpClient httpClient, S
PhoneNumbersClientBuilder builder = super.getClientBuilderUsingManagedIdentity(httpClient);
return addLoggingPolicy(builder, testName).buildClient();
}

private String getTestPhoneNumber(String phoneNumber) {
if (getTestMode() == TestMode.PLAYBACK) {
phoneNumber = "+REDACTED";
}
return phoneNumber;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,18 @@

public class PhoneNumbersIntegrationTestBase extends TestBase {
private static final String CONNECTION_STRING = Configuration.getGlobalConfiguration()
.get("COMMUNICATION_LIVETEST_STATIC_CONNECTION_STRING", "endpoint=https://REDACTED.communication.azure.com/;accesskey=QWNjZXNzS2V5");
protected static final String COUNTRY_CODE =
.get("COMMUNICATION_LIVETEST_STATIC_CONNECTION_STRING", "endpoint=https://REDACTED.communication.azure.com/;accesskey=QWNjZXNzS2V5");
protected static final String COUNTRY_CODE =
Configuration.getGlobalConfiguration().get("COUNTRY_CODE", "US");
protected static final String AREA_CODE =
protected static final String AREA_CODE =
Configuration.getGlobalConfiguration().get("AREA_CODE", "833");

protected static final String PHONE_NUMBER =
Configuration.getGlobalConfiguration().get("AZURE_PHONE_NUMBER", "+11234567891");

private static final StringJoiner JSON_PROPERTIES_TO_REDACT =
private static final StringJoiner JSON_PROPERTIES_TO_REDACT =
new StringJoiner("\":\"|\"", "\"", "\":\"")
.add("id")
.add("phoneNumber");

private static final Pattern JSON_PROPERTY_VALUE_REDACTION_PATTERN =
private static final Pattern JSON_PROPERTY_VALUE_REDACTION_PATTERN =
Pattern.compile(String.format("(?:%s)(.*?)(?:\",|\"})", JSON_PROPERTIES_TO_REDACT.toString()), Pattern.CASE_INSENSITIVE);

protected PhoneNumbersClientBuilder getClientBuilder(HttpClient httpClient) {
Expand All @@ -52,13 +49,13 @@ protected PhoneNumbersClientBuilder getClientBuilder(HttpClient httpClient) {

CommunicationConnectionString communicationConnectionString = new CommunicationConnectionString(CONNECTION_STRING);
String communicationEndpoint = communicationConnectionString.getEndpoint();
String communicationAccessKey = communicationConnectionString.getAccessKey();
String communicationAccessKey = communicationConnectionString.getAccessKey();

PhoneNumbersClientBuilder builder = new PhoneNumbersClientBuilder();
builder
.httpClient(httpClient)
.endpoint(communicationEndpoint)
.credential(new AzureKeyCredential(communicationAccessKey));
.httpClient(httpClient)
.endpoint(communicationEndpoint)
.credential(new AzureKeyCredential(communicationAccessKey));

if (getTestMode() == TestMode.RECORD) {
List<Function<String, String>> redactors = new ArrayList<>();
Expand All @@ -76,8 +73,8 @@ protected PhoneNumbersClientBuilder getClientBuilderWithConnectionString(HttpCli

PhoneNumbersClientBuilder builder = new PhoneNumbersClientBuilder();
builder
.httpClient(httpClient)
.connectionString(CONNECTION_STRING);
.httpClient(httpClient)
.connectionString(CONNECTION_STRING);

if (getTestMode() == TestMode.RECORD) {
List<Function<String, String>> redactors = new ArrayList<>();
Expand All @@ -91,8 +88,8 @@ protected PhoneNumbersClientBuilder getClientBuilderWithConnectionString(HttpCli
protected PhoneNumbersClientBuilder getClientBuilderUsingManagedIdentity(HttpClient httpClient) {
PhoneNumbersClientBuilder builder = new PhoneNumbersClientBuilder();
builder
.endpoint(new CommunicationConnectionString(CONNECTION_STRING).getEndpoint())
.httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient);
.endpoint(new CommunicationConnectionString(CONNECTION_STRING).getEndpoint())
.httpClient(httpClient == null ? interceptorManager.getPlaybackClient() : httpClient);

if (getTestMode() == TestMode.PLAYBACK) {
builder.credential(new FakeCredentials());
Expand All @@ -113,16 +110,34 @@ protected PhoneNumbersClientBuilder addLoggingPolicy(PhoneNumbersClientBuilder b
return builder.addPolicy((context, next) -> logHeaders(testName, next));
}

protected String getTestPhoneNumber() {
boolean skipCapabilitiesTests = Configuration.getGlobalConfiguration()
.get("SKIP_UPDATE_CAPABILITIES_LIVE_TESTS", "false").equals("true");

if (getTestMode() == TestMode.PLAYBACK || skipCapabilitiesTests) {
return getDefaultPhoneNumber();
}

return getPhoneNumberByTestAgent();
}

protected String redactIfPlaybackMode(String phoneNumber) {
if (getTestMode() == TestMode.PLAYBACK) {
phoneNumber = "+REDACTED";
}
return phoneNumber;
}

private Mono<HttpResponse> logHeaders(String testName, HttpPipelineNextPolicy next) {
return next.process()
.flatMap(httpResponse -> {
final HttpResponse bufferedResponse = httpResponse.buffer();

// Should sanitize printed reponse url
System.out.println("MS-CV header for " + testName + " request "
+ bufferedResponse.getRequest().getUrl() + ": " + bufferedResponse.getHeaderValue("MS-CV"));
return Mono.just(bufferedResponse);
});
.flatMap(httpResponse -> {
final HttpResponse bufferedResponse = httpResponse.buffer();

// Should sanitize printed reponse url
System.out.println("MS-CV header for " + testName + " request "
+ bufferedResponse.getRequest().getUrl() + ": " + bufferedResponse.getHeaderValue("MS-CV"));
return Mono.just(bufferedResponse);
});
}

static class FakeCredentials implements TokenCredential {
Expand All @@ -143,4 +158,23 @@ private String redact(String content, Matcher matcher, String replacement) {
return content;
}

private String getDefaultPhoneNumber() {
return Configuration.getGlobalConfiguration().get("AZURE_PHONE_NUMBER", "+11234567891");
}

private String getPhoneNumberByTestAgent() {
String testAgent = Configuration.getGlobalConfiguration().get("AZURE_TEST_AGENT");
if (testAgent == null) {
throw new IllegalStateException(
"AZURE_TEST_AGENT value is required to run update capabilities live tests.");
}

String phoneNumber = Configuration.getGlobalConfiguration().get(String.format("AZURE_PHONE_NUMBER_%s", testAgent));
if (phoneNumber == null) {
throw new IllegalStateException(
"A phone number specific to the current test agent is required to run update capabilities live tests.");
}

return phoneNumber;
}
}
5 changes: 5 additions & 0 deletions sdk/communication/azure-communication-phonenumbers/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,8 @@ stages:
parameters:
PackageName: azure-communication-phonenumbers
SafeName: azurecommunicationphonenumbers
MatrixConfigs:
- Name: PhoneNumbers_java_livetest_matrix
Path: sdk/communication/azure-communication-phonenumbers/phone-numbers-livetest-matrix.json
Selection: sparse
GenerateVMJobs: true
Loading

0 comments on commit 5c09976

Please sign in to comment.