diff --git a/jmeter-java-dsl-azure/src/main/java/us/abstracta/jmeter/javadsl/azure/api/AppComponents.java b/jmeter-java-dsl-azure/src/main/java/us/abstracta/jmeter/javadsl/azure/api/AppComponents.java index 052de94d..fae32470 100644 --- a/jmeter-java-dsl-azure/src/main/java/us/abstracta/jmeter/javadsl/azure/api/AppComponents.java +++ b/jmeter-java-dsl-azure/src/main/java/us/abstracta/jmeter/javadsl/azure/api/AppComponents.java @@ -38,7 +38,7 @@ public boolean updateWith(List monitoredResources) { private static class AppComponent { private static final Pattern RESOURCE_ID_PATTERN = Pattern.compile( - "^/subscriptions/([^/]+)/resourceGroups/([^/]+)/providers/([^/]+)/([^/]+)/([^/?]+)$"); + "^/subscriptions/([^/]+)/resourceGroups/([^/]+)/providers/([^/]+)/(.+)$"); private final String resourceId; private final String subscriptionId; @@ -59,8 +59,27 @@ private AppComponent(@JsonProperty("resourceId") String resourceId) { int groupNumber = 1; this.subscriptionId = matcher.group(groupNumber++); this.resourceGroup = matcher.group(groupNumber++); - this.resourceType = matcher.group(groupNumber++) + "/" + matcher.group(groupNumber++); - this.resourceName = matcher.group(groupNumber); + String provider = matcher.group(groupNumber++); + String resourcePath = matcher.group(groupNumber); + String[] resourceSegments = resourcePath.split("/"); + if (resourceSegments.length == 0 || resourceSegments.length % 2 != 0) { + throw new IllegalArgumentException( + "Provided resource id has an invalid resource path. Resource types and names " + + "must appear in pairs: " + resourceId); + } + StringBuilder resourceTypeBuilder = new StringBuilder(provider); + StringBuilder resourceNameBuilder = new StringBuilder(); + for (int i = 0; i < resourceSegments.length; i += 2) { + String type = resourceSegments[i]; + String name = resourceSegments[i + 1]; + resourceTypeBuilder.append("/").append(type); + if (resourceNameBuilder.length() > 0) { + resourceNameBuilder.append("/"); + } + resourceNameBuilder.append(name); + } + this.resourceType = resourceTypeBuilder.toString(); + this.resourceName = resourceNameBuilder.toString(); } } diff --git a/jmeter-java-dsl-azure/src/test/java/us/abstracta/jmeter/javadsl/azure/AzureEngineIT.java b/jmeter-java-dsl-azure/src/test/java/us/abstracta/jmeter/javadsl/azure/AzureEngineIT.java index 86ec1889..4ea0e13e 100644 --- a/jmeter-java-dsl-azure/src/test/java/us/abstracta/jmeter/javadsl/azure/AzureEngineIT.java +++ b/jmeter-java-dsl-azure/src/test/java/us/abstracta/jmeter/javadsl/azure/AzureEngineIT.java @@ -1,6 +1,7 @@ package us.abstracta.jmeter.javadsl.azure; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; import static us.abstracta.jmeter.javadsl.JmeterDsl.autoStop; import static us.abstracta.jmeter.javadsl.JmeterDsl.csvDataSet; @@ -10,7 +11,11 @@ import static us.abstracta.jmeter.javadsl.core.listeners.AutoStopListener.AutoStopCondition.sampleTime; import java.time.Duration; +import java.util.Collections; +import java.util.List; + import org.junit.jupiter.api.Test; +import us.abstracta.jmeter.javadsl.azure.api.AppComponents; import us.abstracta.jmeter.javadsl.core.TestPlanStats; import us.abstracta.jmeter.javadsl.core.engines.AutoStoppedTestException; import us.abstracta.jmeter.javadsl.util.TestResource; @@ -47,4 +52,11 @@ public void shouldAutoStopTestWhenConditionIsMet() { ); } + @Test + public void shouldSupportChildResourceIds() { + assertDoesNotThrow(() -> new AppComponents(Collections.singletonList( + "/subscriptions/sub123/resourceGroups/rg1/providers/" + + "Microsoft.Sql/servers/orm/elasticpools/dbName"))); + } + }