From 3894ab630aa9e4d349c5c7adbf09ecc130052dd2 Mon Sep 17 00:00:00 2001 From: Alan Zimmer <48699787+alzimmermsft@users.noreply.github.com> Date: Tue, 23 Mar 2021 15:11:05 -0700 Subject: [PATCH] Fix CI Failures (#20065) Fix CI Failures --- .../azure-iot-modelsrepository/README.md | 2 ++ .../azure-iot-modelsrepository/pom.xml | 23 +++++++----- .../iot/modelsrepository/DtmiConventions.java | 36 ++++++++++--------- .../ModelsRepositoryClientBuilder.java | 6 ++-- .../ModelsRepositoryAPIImpl.java | 5 --- .../ModelsRepositoryAPIImplBuilder.java | 6 ++-- .../iot/core/ModelResolutionSamples.java | 4 +-- .../modelsrepository/DtmiConventionTests.java | 31 +++++++++++----- .../ModelRepositoryIntegrationTests.java | 7 +++- .../ModelsRepositoryTestBase.java | 1 - .../iot/modelsrepository/TestHelper.java | 1 - sdk/modelsrepository/pom.xml | 4 +-- 12 files changed, 72 insertions(+), 54 deletions(-) diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/README.md b/sdk/modelsrepository/azure-iot-modelsrepository/README.md index 2c4eade56793b..29e1728cf2afa 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/README.md +++ b/sdk/modelsrepository/azure-iot-modelsrepository/README.md @@ -14,6 +14,8 @@ For the best development experience, developers should use the official Microsof ## Key concepts +## Examples + ## Troubleshooting ## Next steps diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/pom.xml b/sdk/modelsrepository/azure-iot-modelsrepository/pom.xml index 6ff89c141b735..0ab67dbdd70b8 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/pom.xml +++ b/sdk/modelsrepository/azure-iot-modelsrepository/pom.xml @@ -32,59 +32,64 @@ HEAD + + 0.20 + 0.20 + + com.azure azure-core - 1.13.0 + 1.14.1 com.azure azure-core-http-netty - 1.8.0 + 1.9.0 com.azure azure-core-test - 1.5.3 + 1.6.0 test com.azure azure-identity - 1.2.3 + 1.2.4 test com.azure azure-core-http-okhttp - 1.5.0 + 1.6.0 test org.junit.jupiter junit-jupiter-api - 5.6.3 + 5.7.1 test org.junit.jupiter junit-jupiter-engine - 5.6.3 + 5.7.1 test org.junit.jupiter junit-jupiter-params - 5.6.3 + 5.7.1 test org.assertj assertj-core - 3.16.1 + 3.18.1 test diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/DtmiConventions.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/DtmiConventions.java index ae8dd903cea45..a6b6113d53d48 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/DtmiConventions.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/DtmiConventions.java @@ -16,23 +16,25 @@ import java.util.regex.Pattern; /** - * DtmiConventions implements the core aspects of the IoT model repo conventions - * which includes DTMI validation and calculating a URI path from a DTMI. + * DtmiConventions implements the core aspects of the IoT model repo conventions which includes DTMI validation and + * calculating a URI path from a DTMI. */ public final class DtmiConventions { - private DtmiConventions() { } + private DtmiConventions() { + } /** - * A DTMI has three components: scheme, path, and version. - * Scheme and path are separated by a colon. Path and version are separated by a semicolon i.e. scheme : path ; version. - * The scheme is the string literal "dtmi" in lowercase. The path is a sequence of one or more segments, separated by colons. - * The version is a sequence of one or more digits. Each path segment is a non-empty string containing only letters, digits, and undersc - * The first character may not be a digit, and the last character may not be an underscore. - * The version length is limited to nine digits, because the number 999,999,999 fits in a 32-bit signed integer value. - * The first digit may not be zero, so there is no ambiguity regarding whether version 1 matches version 01 since the latter is invalid. + * A DTMI has three components: scheme, path, and version. Scheme and path are separated by a colon. Path and + * version are separated by a semicolon i.e. scheme : path ; version. The scheme is the string literal "dtmi" in + * lowercase. The path is a sequence of one or more segments, separated by colons. The version is a sequence of one + * or more digits. Each path segment is a non-empty string containing only letters, digits, and undersc The first + * character may not be a digit, and the last character may not be an underscore. The version length is limited to + * nine digits, because the number 999,999,999 fits in a 32-bit signed integer value. The first digit may not be + * zero, so there is no ambiguity regarding whether version 1 matches version 01 since the latter is invalid. */ - private static final Pattern VALID_DTMI_PATTERN = Pattern.compile("^dtmi:[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?(?::[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?)*;[1-9][0-9]{0,8}$"); + private static final Pattern VALID_DTMI_PATTERN = Pattern.compile( + "^dtmi:[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?(?::[A-Za-z](?:[A-Za-z0-9_]*[A-Za-z0-9])?)*;[1-9][0-9]{0,8}$"); /** * Indicates whether a given string DTMI value is well-formed. @@ -54,14 +56,14 @@ public static boolean isValidDtmi(String dtmi) { * @param dtmi DigitalTwin Model Id. * @param repositoryUri The repository uri * @param expanded Is model from precomputed values - * @return The model uri - * Will throw an {@link IllegalArgumentException} if the provided dtmi is not valid. + * @return The model uri Will throw an {@link IllegalArgumentException} if the provided dtmi is not valid. */ public static URI getModelUri(String dtmi, URI repositoryUri, boolean expanded) { String dtmiPath = dtmiToPath(dtmi); if (expanded) { - dtmiPath = dtmiPath.replace(ModelsRepositoryConstants.JSON_EXTENSION, ModelsRepositoryConstants.JSON_EXPANDED_EXTENSION); + dtmiPath = dtmiPath.replace(ModelsRepositoryConstants.JSON_EXTENSION, + ModelsRepositoryConstants.JSON_EXPANDED_EXTENSION); } UrlBuilder urlBuilder = new UrlBuilder(); @@ -98,7 +100,8 @@ public static URI getModelUri(String dtmi, URI repositoryUri, boolean expanded) * Converts a string to {@link URI} * * @param uri String format of the path - * @return {@link URI} representation of the path/uri . + * @return {@link URI} representation of the path/uri. + * @throws IllegalArgumentException If the {@code uri} is invalid. */ public static URI convertToUri(String uri) { try { @@ -107,8 +110,7 @@ public static URI convertToUri(String uri) { try { Path path = Paths.get(uri).normalize(); return new File(path.toAbsolutePath().toString()).toURI(); - } - catch (Exception e) { + } catch (Exception e) { throw new IllegalArgumentException("Invalid uri format", e); } } diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/ModelsRepositoryClientBuilder.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/ModelsRepositoryClientBuilder.java index d67de68b0a9f8..8e1a2de76e1a4 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/ModelsRepositoryClientBuilder.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/ModelsRepositoryClientBuilder.java @@ -43,11 +43,11 @@ public final class ModelsRepositoryClientBuilder { // These are the keys to the above properties file that define the client library's name and version for use in the user agent string private static final String SDK_NAME = "name"; private static final String SDK_VERSION = "version"; - private static URI GLOBAL_REPOSITORY_URI; + private static URI globalRepositoryUri; static { try { - GLOBAL_REPOSITORY_URI = new URI(ModelsRepositoryConstants.DEFAULT_MODELS_REPOSITORY_ENDPOINT); + globalRepositoryUri = new URI(ModelsRepositoryConstants.DEFAULT_MODELS_REPOSITORY_ENDPOINT); } catch (URISyntaxException e) { // We know it won't throw since it's a known endpoint and has been validated. } @@ -86,7 +86,7 @@ public ModelsRepositoryClientBuilder() { additionalPolicies = new ArrayList<>(); properties = CoreUtils.getProperties(MODELS_REPOSITORY_PROPERTIES); httpLogOptions = new HttpLogOptions(); - this.repositoryEndpoint = GLOBAL_REPOSITORY_URI; + this.repositoryEndpoint = globalRepositoryUri; } private static HttpPipeline constructPipeline( diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImpl.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImpl.java index 053b98a45ec7a..a54ff40aa75bb 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImpl.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImpl.java @@ -4,11 +4,6 @@ package com.azure.iot.modelsrepository.implementation; import com.azure.core.http.HttpPipeline; -import com.azure.core.http.HttpPipelineBuilder; -import com.azure.core.http.policy.CookiePolicy; -import com.azure.core.http.policy.RetryPolicy; -import com.azure.core.http.policy.UserAgentPolicy; -import com.azure.core.util.serializer.JacksonAdapter; import com.azure.core.util.serializer.SerializerAdapter; /** Initializes a new instance of the ModelsRepositoryAPIImpl type. */ diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImplBuilder.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImplBuilder.java index a1b0b501a5c14..d01ac4e88158a 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImplBuilder.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/main/java/com/azure/iot/modelsrepository/implementation/ModelsRepositoryAPIImplBuilder.java @@ -7,13 +7,13 @@ import com.azure.core.http.HttpClient; import com.azure.core.http.HttpPipeline; import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.policy.CookiePolicy; import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.HttpLoggingPolicy; import com.azure.core.http.policy.HttpPipelinePolicy; import com.azure.core.http.policy.HttpPolicyProviders; import com.azure.core.http.policy.RetryPolicy; import com.azure.core.http.policy.UserAgentPolicy; -import com.azure.core.http.policy.HttpLoggingPolicy; -import com.azure.core.http.policy.CookiePolicy; import com.azure.core.util.Configuration; import com.azure.core.util.serializer.JacksonAdapter; import com.azure.core.util.serializer.SerializerAdapter; @@ -190,7 +190,7 @@ public ModelsRepositoryAPIImplBuilder addPolicy(HttpPipelinePolicy customPolicy) * @return an instance of ModelsRepositoryAPIImpl. */ public ModelsRepositoryAPIImpl buildClient() { - if(apiVersion == null){ + if (apiVersion == null) { this.apiVersion = "2021-03-18"; } if (host == null) { diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/samples/java/com/azure/iot/core/ModelResolutionSamples.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/samples/java/com/azure/iot/core/ModelResolutionSamples.java index 14ab8c11f8eef..5ca5492c40b58 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/samples/java/com/azure/iot/core/ModelResolutionSamples.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/samples/java/com/azure/iot/core/ModelResolutionSamples.java @@ -3,13 +3,11 @@ package com.azure.iot.core; -import com.azure.iot.modelsrepository.DtmiConventions; +import com.azure.iot.modelsrepository.ModelDependencyResolution; import com.azure.iot.modelsrepository.ModelsRepositoryAsyncClient; import com.azure.iot.modelsrepository.ModelsRepositoryClient; import com.azure.iot.modelsrepository.ModelsRepositoryClientBuilder; -import com.azure.iot.modelsrepository.ModelDependencyResolution; -import java.net.URI; import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/DtmiConventionTests.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/DtmiConventionTests.java index ea97823e89be0..2eb00a3b85b9d 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/DtmiConventionTests.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/DtmiConventionTests.java @@ -5,10 +5,13 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; import java.net.URI; import java.net.URISyntaxException; +import java.util.stream.Stream; class DtmiConventionTests { @@ -32,14 +35,7 @@ public void dtmiToPathTest(String input, String expected) { } @ParameterizedTest - @CsvSource({ - "https://localhost/repository/, https://localhost/repository/dtmi/com/example/thermostat-1.json", - "https://localhost/REPOSITORY, https://localhost/REPOSITORY/dtmi/com/example/thermostat-1.json", - "file:///path/to/repository/, file:///path/to/repository/dtmi/com/example/thermostat-1.json", - "file://path/to/RepoSitory, file://path/to/RepoSitory/dtmi/com/example/thermostat-1.json", - "C:\\path\\to\\repository\\, file:///C:/path/to/repository/dtmi/com/example/thermostat-1.json", - "\\\\server\\repository, file:////server/repository/dtmi/com/example/thermostat-1.json" - }) + @MethodSource("getModelUriTestsSupplier") public void getModelUriTests(String repository, String expectedUri) throws URISyntaxException { final String dtmi = "dtmi:com:example:Thermostat;1"; @@ -53,7 +49,24 @@ public void getModelUriTests(String repository, String expectedUri) throws URISy URI modelUri = DtmiConventions.getModelUri(dtmi, repositoryUri, false); Assertions.assertEquals(expectedUri, modelUri.toString()); } - + + private static Stream getModelUriTestsSupplier() { + return Stream.of( + Arguments.of("https://localhost/repository/", + "https://localhost/repository/dtmi/com/example/thermostat-1.json"), + Arguments.of("https://localhost/REPOSITORY", + "https://localhost/REPOSITORY/dtmi/com/example/thermostat-1.json"), + Arguments.of("file:///path/to/repository/", + "file:///path/to/repository/dtmi/com/example/thermostat-1.json"), + Arguments.of("file://path/to/RepoSitory", "file://path/to/RepoSitory/dtmi/com/example/thermostat-1.json") + + // TODO: These were disabled as they fail in Linux and macOS, likely due to '\' in the URI. +// Arguments.of("C:\\path\\to\\repository\\", +// "file:///C:/path/to/repository/dtmi/com/example/thermostat-1.json"), +// Arguments.of("\\\\server\\repository", "file:////server/repository/dtmi/com/example/thermostat-1.json") + ); + } + @ParameterizedTest @CsvSource({ "dtmi:com:example:Thermostat;1, true", diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelRepositoryIntegrationTests.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelRepositoryIntegrationTests.java index d61c81e3fd8fa..b30ba59ecac3f 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelRepositoryIntegrationTests.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelRepositoryIntegrationTests.java @@ -5,12 +5,12 @@ import com.azure.core.exception.AzureException; import com.azure.core.http.HttpClient; +import com.azure.core.test.annotation.DoNotRecord; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import reactor.test.StepVerifier; -import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; @@ -22,6 +22,7 @@ class ModelRepositoryIntegrationTests extends ModelsRepositoryTestBase { @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.iot.modelsrepository.TestHelper#getTestParameters") + @DoNotRecord(skipInPlayback = true) // TODO: Remove this once playback recordings are added. public void getModelsSingleDtmiNoDependencies(HttpClient httpClient, ModelsRepositoryServiceVersion serviceVersion, String repositoryUri) throws URISyntaxException { final String dtmi = "dtmi:com:example:Thermostat;1"; @@ -35,6 +36,7 @@ public void getModelsSingleDtmiNoDependencies(HttpClient httpClient, ModelsRepos @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.iot.modelsrepository.TestHelper#getTestParameters") + @DoNotRecord(skipInPlayback = true) // TODO: Remove this once playback recordings are added. public void getModelsSingleDtmiDoesNotExist(HttpClient httpClient, ModelsRepositoryServiceVersion serviceVersion, String repositoryUri) throws URISyntaxException { final String dtmi = "dtmi:com:example:Thermostatddd;1"; @@ -47,6 +49,7 @@ public void getModelsSingleDtmiDoesNotExist(HttpClient httpClient, ModelsReposit @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.iot.modelsrepository.TestHelper#getTestParameters") + @DoNotRecord(skipInPlayback = true) // TODO: Remove this once playback recordings are added. public void getModelsSingleDtmiWithDependencies(HttpClient httpClient, ModelsRepositoryServiceVersion serviceVersion, String repositoryUri) throws URISyntaxException { final String dtmi = "dtmi:com:example:TemperatureController;1"; List expectedDependencies = Arrays.asList("dtmi:com:example:Thermostat;1", "dtmi:azure:DeviceManagement:DeviceInformation;1"); @@ -63,6 +66,7 @@ public void getModelsSingleDtmiWithDependencies(HttpClient httpClient, ModelsRep @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.iot.modelsrepository.TestHelper#getTestParameters") + @DoNotRecord(skipInPlayback = true) // TODO: Remove this once playback recordings are added. public void getModelsEnsureNoDuplicates(HttpClient httpClient, ModelsRepositoryServiceVersion serviceVersion, String repositoryUri) throws URISyntaxException { List inputDtmis = Arrays.asList( "dtmi:azure:DeviceManagement:DeviceInformation;1", @@ -79,6 +83,7 @@ public void getModelsEnsureNoDuplicates(HttpClient httpClient, ModelsRepositoryS @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("com.azure.iot.modelsrepository.TestHelper#getTestParameters") + @DoNotRecord(skipInPlayback = true) // TODO: Remove this once playback recordings are added. public void getModelsSingleDtmiWithDepsDisableDependencyResolution(HttpClient httpClient, ModelsRepositoryServiceVersion serviceVersion, String repositoryUri) throws URISyntaxException { final String dtmi = "dtmi:com:example:Thermostat;1"; ModelsRepositoryAsyncClient client = getAsyncClient(httpClient, serviceVersion, repositoryUri); diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelsRepositoryTestBase.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelsRepositoryTestBase.java index dc7836f8c8870..f8257683a5cd5 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelsRepositoryTestBase.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/ModelsRepositoryTestBase.java @@ -8,7 +8,6 @@ import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.test.TestBase; -import java.net.URI; import java.net.URISyntaxException; class ModelsRepositoryTestBase extends TestBase { diff --git a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/TestHelper.java b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/TestHelper.java index 89a59ff4d2c55..826ca38b54d0d 100644 --- a/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/TestHelper.java +++ b/sdk/modelsrepository/azure-iot-modelsrepository/src/test/java/com/azure/iot/modelsrepository/TestHelper.java @@ -9,7 +9,6 @@ import com.azure.iot.modelsrepository.implementation.ModelsRepositoryConstants; import org.junit.jupiter.params.provider.Arguments; -import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/sdk/modelsrepository/pom.xml b/sdk/modelsrepository/pom.xml index 2aba74dc9eee9..07b9bf33a0c18 100644 --- a/sdk/modelsrepository/pom.xml +++ b/sdk/modelsrepository/pom.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.azure - azure-iot-modelsrepository + azure-iot-modelsrepository-service pom 1.0.0 @@ -23,7 +23,7 @@ com.azure azure-iot-modelsrepository - 1.1.0-beta.1 + 1.0.0-beta.1