diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 5c69998dac68..0db93c5fc7c8 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -185,7 +185,7 @@ com.azure:azure-search-perf;1.0.0-beta.1;1.0.0-beta.1 com.azure:azure-security-attestation;1.1.39;1.2.0-beta.1 com.azure:azure-security-confidentialledger;1.0.35;1.1.0-beta.3 com.azure:azure-security-keyvault-administration;4.7.7;4.8.0 -com.azure:azure-security-keyvault-certificates;4.8.7;4.9.0 +com.azure:azure-security-keyvault-certificates;4.9.0;4.10.0-beta.1 com.azure:azure-security-keyvault-jca;2.11.0;2.12.0-beta.1 com.azure:azure-security-test-keyvault-jca;1.0.0;1.0.0 com.azure:azure-security-keyvault-keys;4.10.7;4.11.0 diff --git a/sdk/keyvault/azure-security-keyvault-certificates/CHANGELOG.md b/sdk/keyvault/azure-security-keyvault-certificates/CHANGELOG.md index 1e48b947d6d4..97e79d8aa56e 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/CHANGELOG.md +++ b/sdk/keyvault/azure-security-keyvault-certificates/CHANGELOG.md @@ -1,5 +1,12 @@ # Release History +## 4.10.0-beta.1 (2026-05-29) + +### Features Added + +- Added an experimental `models.PlatformManaged` certificate policy property for Azure Key Vault internal usage. + Any calls using this property will fail and it is not recommended to be used at this point. + ## 4.9.0 (2026-05-26) ### Features Added diff --git a/sdk/keyvault/azure-security-keyvault-certificates/customizations/src/main/java/CertificatesCustomizations.java b/sdk/keyvault/azure-security-keyvault-certificates/customizations/src/main/java/CertificatesCustomizations.java index a71342b48b72..35d17c4ef6f3 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/customizations/src/main/java/CertificatesCustomizations.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/customizations/src/main/java/CertificatesCustomizations.java @@ -104,7 +104,7 @@ private static void customizeServiceVersion(LibraryCustomization customization) .setJavadocComment("The versions of Azure Key Vault Certificates supported by this client library."); for (String version : Arrays.asList("7.0", "7.1", "7.2", "7.3", "7.4", "7.5", "7.6", - "2025-07-01")) { + "2025-07-01", "2026-03-01-preview")) { enumDeclaration.addEnumConstant("V" + version.replace('.', '_').replace('-', '_').toUpperCase()) .setJavadocComment("Service version {@code " + version + "}.") .addArgument(new StringLiteralExpr(version)); @@ -121,6 +121,10 @@ private static void customizeServiceVersion(LibraryCustomization customization) .addMarkerAnnotation("Override") .setBody(StaticJavaParser.parseBlock("{ return this.version; }")); + // Intentionally pin getLatest() to V2025_07_01. V2026_03_01_PREVIEW exposes the PlatformManaged + // certificate policy property, which is reserved for internal (1P) Key Vault use. Defaulting 3P + // customers to the preview version would invalidate existing recordings without unlocking new + // functionality for them; bump this only when a stable version supersedes V2025_07_01. enumDeclaration.addMethod("getLatest", Modifier.Keyword.PUBLIC, Modifier.Keyword.STATIC) .setType("CertificateServiceVersion") .setJavadocComment(new Javadoc(parseText("Gets the latest service version supported by this client library.")) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/pom.xml b/sdk/keyvault/azure-security-keyvault-certificates/pom.xml index 93f14a991d3f..e9fab21bf3a4 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/pom.xml +++ b/sdk/keyvault/azure-security-keyvault-certificates/pom.xml @@ -12,7 +12,7 @@ com.azure azure-security-keyvault-certificates - 4.9.0 + 4.10.0-beta.1 Microsoft Azure client library for KeyVault Certificates This module contains client library for Microsoft Azure KeyVault Certificates. diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateServiceVersion.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateServiceVersion.java index 7a0f4d699c97..7186a9d7debe 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateServiceVersion.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateServiceVersion.java @@ -41,7 +41,11 @@ public enum CertificateServiceVersion implements ServiceVersion { /** * Service version {@code 2025-07-01}. */ - V2025_07_01("2025-07-01"); + V2025_07_01("2025-07-01"), + /** + * Service version {@code 2026-03-01-preview}. + */ + V2026_03_01_PREVIEW("2026-03-01-preview"); private final String version; diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/implementation/models/CertificatePolicy.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/implementation/models/CertificatePolicy.java index 53a264bf40ed..33d119801517 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/implementation/models/CertificatePolicy.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/implementation/models/CertificatePolicy.java @@ -10,6 +10,7 @@ import com.azure.json.JsonSerializable; import com.azure.json.JsonToken; import com.azure.json.JsonWriter; +import com.azure.security.keyvault.certificates.models.PlatformManaged; import java.io.IOException; import java.util.List; @@ -60,6 +61,12 @@ public final class CertificatePolicy implements JsonSerializable writer.writeJson(element)); jsonWriter.writeJsonField("issuer", this.issuerParameters); jsonWriter.writeJsonField("attributes", this.attributes); + jsonWriter.writeJsonField("platformManaged", this.platformManaged); return jsonWriter.writeEndObject(); } @@ -259,6 +291,8 @@ public static CertificatePolicy fromJson(JsonReader jsonReader) throws IOExcepti deserializedCertificatePolicy.issuerParameters = IssuerParameters.fromJson(reader); } else if ("attributes".equals(fieldName)) { deserializedCertificatePolicy.attributes = CertificateAttributes.fromJson(reader); + } else if ("platformManaged".equals(fieldName)) { + deserializedCertificatePolicy.platformManaged = PlatformManaged.fromJson(reader); } else { reader.skipChildren(); } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/CertificatePolicy.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/CertificatePolicy.java index 09f1abc13dde..c161da644187 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/CertificatePolicy.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/CertificatePolicy.java @@ -426,6 +426,26 @@ public Boolean isCertificateTransparent() { return impl.getIssuerParameters().isCertificateTransparency(); } + /** + * Get the platform managed certificate configuration. + * + * @return the platform managed certificate configuration. + */ + public PlatformManaged getPlatformManaged() { + return impl.getPlatformManaged(); + } + + /** + * Set the platform managed certificate configuration. + * + * @param platformManaged the platform managed certificate configuration. + * @return the updated CertificatePolicy object itself. + */ + public CertificatePolicy setPlatformManaged(PlatformManaged platformManaged) { + impl.setPlatformManaged(platformManaged); + return this; + } + /** * Set the lifetime actions * @param actions the lifetime actions to set. diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/PlatformManaged.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/PlatformManaged.java new file mode 100644 index 000000000000..5e1b5246783b --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/models/PlatformManaged.java @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.keyvault.certificates.models; + +import com.azure.core.annotation.Fluent; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; + +import java.io.IOException; +import java.util.Map; +import java.util.Objects; + +/** + * Properties of the platform managed certificate. + */ +@Fluent +public final class PlatformManaged implements JsonSerializable { + /* + * The intended usage of the certificate. + */ + private String certificateUsage; + + /* + * JSON-formatted platform managed metadata. + */ + private Map metadata; + + /** + * Creates an instance of {@link PlatformManaged}. + * + * @param certificateUsage The intended usage of the certificate. + */ + public PlatformManaged(String certificateUsage) { + this.certificateUsage = Objects.requireNonNull(certificateUsage, "'certificateUsage' cannot be null."); + } + + private PlatformManaged() { + } + + /** + * Get the certificate usage. + * + * @return the certificate usage. + */ + public String getCertificateUsage() { + return this.certificateUsage; + } + + /** + * Set the certificate usage. + * + * @param certificateUsage the certificate usage. + * @return the updated PlatformManaged object itself. + */ + public PlatformManaged setCertificateUsage(String certificateUsage) { + this.certificateUsage = Objects.requireNonNull(certificateUsage, "'certificateUsage' cannot be null."); + return this; + } + + /** + * Get the platform managed metadata. + * + * @return the platform managed metadata. + */ + public Map getMetadata() { + return this.metadata; + } + + /** + * Set the platform managed metadata. + * + * @param metadata the platform managed metadata. + * @return the updated PlatformManaged object itself. + */ + public PlatformManaged setMetadata(Map metadata) { + this.metadata = metadata; + return this; + } + + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("certificateUsage", this.certificateUsage); + if (this.metadata != null) { + jsonWriter.writeUntypedField("metadata", this.metadata); + } + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of PlatformManaged from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of PlatformManaged if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IOException If an error occurs while reading the PlatformManaged. + */ + public static PlatformManaged fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + PlatformManaged deserializedPlatformManaged = new PlatformManaged(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + + if ("certificateUsage".equals(fieldName)) { + deserializedPlatformManaged.certificateUsage = reader.getString(); + } else if ("metadata".equals(fieldName)) { + deserializedPlatformManaged.metadata = reader.readMap(JsonReader::readUntyped); + } else { + reader.skipChildren(); + } + } + + return deserializedPlatformManaged; + }); + } +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateAsyncClientTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateAsyncClientTest.java index b7bd7a4ac43d..c583df13f3a9 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateAsyncClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateAsyncClientTest.java @@ -570,6 +570,24 @@ public void updateCertificatePolicy(HttpClient httpClient, CertificateServiceVer }); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS, allowZeroInvocations = true) + @MethodSource("getPlatformManagedTestParameters") + public void createCertificateWithPlatformManagedPolicy(HttpClient httpClient, + CertificateServiceVersion serviceVersion) { + createCertificateAsyncClient(httpClient, serviceVersion); + + platformManagedCertificatePolicyRunner(certificateName -> { + CertificatePolicy policy = setupPlatformManagedPolicy(); + PollerFlux certPoller + = setPlaybackPollerFluxPollInterval( + certificateAsyncClient.beginCreateCertificate(certificateName, policy)); + + StepVerifier.create(certPoller.last().flatMap(AsyncPollResponse::getFinalResult)) + .assertNext(certificate -> assertPlatformManagedPolicy(policy, certificate.getPolicy())) + .verifyComplete(); + }); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("getTestParameters") public void restoreCertificateFromMalformedBackup(HttpClient httpClient, CertificateServiceVersion serviceVersion) { diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java index 0e6d5716fe92..efe0c19909d0 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java @@ -570,6 +570,24 @@ public void updateCertificatePolicy(HttpClient httpClient, CertificateServiceVer }); } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS, allowZeroInvocations = true) + @MethodSource("getPlatformManagedTestParameters") + public void createCertificateWithPlatformManagedPolicy(HttpClient httpClient, + CertificateServiceVersion serviceVersion) { + createCertificateClient(httpClient, serviceVersion); + + platformManagedCertificatePolicyRunner(certificateName -> { + CertificatePolicy policy = setupPlatformManagedPolicy(); + SyncPoller certPoller + = setPlaybackSyncPollerPollInterval(certificateClient.beginCreateCertificate(certificateName, policy)); + + certPoller.waitForCompletion(); + + KeyVaultCertificateWithPolicy certificate = certPoller.getFinalResult(); + assertPlatformManagedPolicy(policy, certificate.getPolicy()); + }); + } + @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("getTestParameters") public void restoreCertificateFromMalformedBackup(HttpClient httpClient, CertificateServiceVersion serviceVersion) { diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java index bafec5f3565b..643df3635499 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java @@ -34,6 +34,7 @@ import com.azure.security.keyvault.certificates.models.ImportCertificateOptions; import com.azure.security.keyvault.certificates.models.KeyVaultCertificate; import com.azure.security.keyvault.certificates.models.LifetimeAction; +import com.azure.security.keyvault.certificates.models.PlatformManaged; import com.azure.security.keyvault.certificates.models.SubjectAlternativeNames; import com.azure.security.keyvault.certificates.models.WellKnownIssuerNames; import org.junit.jupiter.api.Test; @@ -287,6 +288,10 @@ void updateCertificatePolicyRunner(Consumer testRunner) { testRunner.accept(testResourceNamer.randomName(TEST_CERTIFICATE_NAME, 25)); } + void platformManagedCertificatePolicyRunner(Consumer testRunner) { + testRunner.accept(testResourceNamer.randomName("platformManagedCert", 25)); + } + @Test public abstract void restoreCertificateFromMalformedBackup(HttpClient httpClient, CertificateServiceVersion serviceVersion); @@ -568,6 +573,12 @@ static CertificatePolicy setupPolicy() { .setLifetimeActions(new LifetimeAction(CertificatePolicyAction.AUTO_RENEW).setDaysBeforeExpiry(40)); } + static CertificatePolicy setupPlatformManagedPolicy() { + return CertificatePolicy.getDefault() + .setPlatformManaged( + new PlatformManaged("serverAuth").setMetadata(Collections.singletonMap("source", "java-sdk-test"))); + } + static void assertPolicy(CertificatePolicy expected, CertificatePolicy actual) { assertEquals(expected.getKeyType(), actual.getKeyType()); assertEquals(expected.getContentType(), actual.getContentType()); @@ -583,6 +594,14 @@ static void assertPolicy(CertificatePolicy expected, CertificatePolicy actual) { assertEquals(expected.getKeyUsage().size(), actual.getKeyUsage().size()); } + static void assertPlatformManagedPolicy(CertificatePolicy expected, CertificatePolicy actual) { + assertNotNull(actual); + assertNotNull(actual.getPlatformManaged()); + assertEquals(expected.getPlatformManaged().getCertificateUsage(), + actual.getPlatformManaged().getCertificateUsage()); + assertEquals(expected.getPlatformManaged().getMetadata(), actual.getPlatformManaged().getMetadata()); + } + static void assertCertificate(KeyVaultCertificate expected, KeyVaultCertificate actual) { assertEquals(expected.getId(), actual.getId()); assertEquals(expected.getKeyId(), actual.getKeyId()); @@ -644,6 +663,17 @@ static Stream getTestParameters() { return argumentsList.stream(); } + static Stream getPlatformManagedTestParameters() { + List argumentsList = new ArrayList<>(); + + if (shouldServiceVersionBeTested(CertificateServiceVersion.V2026_03_01_PREVIEW)) { + getHttpClients().forEach(httpClient -> argumentsList + .add(Arguments.of(httpClient, CertificateServiceVersion.V2026_03_01_PREVIEW))); + } + + return argumentsList.stream(); + } + /** * Returns whether the given service version match the rules of test framework. * diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/CertificatePolicyTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/CertificatePolicyTest.java new file mode 100644 index 000000000000..8abeb9fc4877 --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/CertificatePolicyTest.java @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.keyvault.certificates.models; + +import com.azure.json.JsonProviders; +import com.azure.json.JsonReader; +import com.azure.json.JsonWriter; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CertificatePolicyTest { + @Test + void getAndSetPlatformManaged() { + CertificatePolicy policy = CertificatePolicy.getDefault(); + PlatformManaged platformManaged = new PlatformManaged("serverAuth"); + + CertificatePolicy result = policy.setPlatformManaged(platformManaged); + + assertSame(policy, result); + assertSame(platformManaged, policy.getPlatformManaged()); + } + + @Test + void platformManagedDefaultsToNull() { + assertNull(CertificatePolicy.getDefault().getPlatformManaged()); + } + + @Test + void jsonRoundTripPlatformManaged() throws IOException { + CertificatePolicy policy = CertificatePolicy.getDefault() + .setPlatformManaged( + new PlatformManaged("serverAuth").setMetadata(Collections.singletonMap("service", "contoso"))); + + CertificatePolicy deserialized = roundTrip(policy); + + assertNotNull(deserialized); + assertNotNull(deserialized.getPlatformManaged()); + assertEquals("serverAuth", deserialized.getPlatformManaged().getCertificateUsage()); + assertEquals("contoso", deserialized.getPlatformManaged().getMetadata().get("service")); + } + + @Test + void serializePlatformManagedUsesExpectedJsonFieldName() throws IOException { + CertificatePolicy policy = CertificatePolicy.getDefault().setPlatformManaged(new PlatformManaged("serverAuth")); + + String json = toJsonString(policy); + + assertTrue(json.contains("\"platformManaged\"")); + assertTrue(json.contains("\"certificateUsage\"")); + } + + @Test + void nullPlatformManagedIsOmittedInSerialization() throws IOException { + String json = toJsonString(CertificatePolicy.getDefault()); + + assertFalse(json.contains("\"platformManaged\"")); + } + + private static CertificatePolicy roundTrip(CertificatePolicy original) throws IOException { + String json = toJsonString(original); + try (JsonReader reader = JsonProviders.createReader(json)) { + return CertificatePolicy.fromJson(reader); + } + } + + private static String toJsonString(CertificatePolicy policy) throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (JsonWriter writer = JsonProviders.createWriter(outputStream)) { + policy.toJson(writer); + } + return outputStream.toString("UTF-8"); + } +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/PlatformManagedTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/PlatformManagedTest.java new file mode 100644 index 000000000000..ebd98977b8fa --- /dev/null +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/models/PlatformManagedTest.java @@ -0,0 +1,131 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.keyvault.certificates.models; + +import com.azure.json.JsonProviders; +import com.azure.json.JsonReader; +import com.azure.json.JsonWriter; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PlatformManagedTest { + @Test + void getAndSetProperties() { + PlatformManaged platformManaged = new PlatformManaged("serverAuth"); + Map metadata = createMetadata(); + + PlatformManaged result = platformManaged.setCertificateUsage("clientAuth").setMetadata(metadata); + + assertSame(platformManaged, result); + assertEquals("clientAuth", platformManaged.getCertificateUsage()); + assertSame(metadata, platformManaged.getMetadata()); + } + + @Test + void constructorRequiresCertificateUsage() { + assertThrows(NullPointerException.class, () -> new PlatformManaged(null)); + } + + @Test + void setCertificateUsageRequiresNonNullValue() { + PlatformManaged platformManaged = new PlatformManaged("serverAuth"); + + assertThrows(NullPointerException.class, () -> platformManaged.setCertificateUsage(null)); + } + + @Test + void jsonRoundTripWithMetadata() throws IOException { + PlatformManaged original = new PlatformManaged("serverAuth").setMetadata(createMetadata()); + + PlatformManaged deserialized = roundTrip(original); + + assertNotNull(deserialized); + assertEquals("serverAuth", deserialized.getCertificateUsage()); + assertEquals("contoso", deserialized.getMetadata().get("service")); + assertEquals(3, ((Number) deserialized.getMetadata().get("revision")).intValue()); + assertEquals(true, deserialized.getMetadata().get("enabled")); + assertEquals(Arrays.asList("alpha", "beta"), deserialized.getMetadata().get("labels")); + assertEquals("westus", ((Map) deserialized.getMetadata().get("details")).get("region")); + } + + @Test + void jsonRoundTripWithoutMetadata() throws IOException { + PlatformManaged original = new PlatformManaged("serverAuth"); + + String json = toJsonString(original); + PlatformManaged deserialized; + try (JsonReader reader = JsonProviders.createReader(json)) { + deserialized = PlatformManaged.fromJson(reader); + } + + assertNotNull(deserialized); + assertEquals("serverAuth", deserialized.getCertificateUsage()); + assertFalse(json.contains("\"metadata\"")); + } + + @Test + void deserializeIgnoresUnknownFields() throws IOException { + String json = "{\"certificateUsage\":\"serverAuth\",\"unknownField\":\"ignored\"}"; + + PlatformManaged deserialized; + try (JsonReader reader = JsonProviders.createReader(json)) { + deserialized = PlatformManaged.fromJson(reader); + } + + assertNotNull(deserialized); + assertEquals("serverAuth", deserialized.getCertificateUsage()); + } + + @Test + void serializeUsesExpectedJsonFieldNames() throws IOException { + PlatformManaged platformManaged = new PlatformManaged("serverAuth").setMetadata(createMetadata()); + + String json = toJsonString(platformManaged); + + assertTrue(json.contains("\"certificateUsage\"")); + assertTrue(json.contains("\"metadata\"")); + assertTrue(json.contains("\"service\"")); + } + + private static PlatformManaged roundTrip(PlatformManaged original) throws IOException { + String json = toJsonString(original); + try (JsonReader reader = JsonProviders.createReader(json)) { + return PlatformManaged.fromJson(reader); + } + } + + private static String toJsonString(PlatformManaged platformManaged) throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (JsonWriter writer = JsonProviders.createWriter(outputStream)) { + platformManaged.toJson(writer); + } + return outputStream.toString("UTF-8"); + } + + private static Map createMetadata() { + Map metadata = new LinkedHashMap<>(); + metadata.put("service", "contoso"); + metadata.put("revision", 3); + metadata.put("enabled", true); + metadata.put("labels", Arrays.asList("alpha", "beta")); + + Map details = new LinkedHashMap<>(); + details.put("region", "westus"); + metadata.put("details", details); + + return metadata; + } +} diff --git a/sdk/keyvault/azure-security-keyvault-certificates/tsp-location.yaml b/sdk/keyvault/azure-security-keyvault-certificates/tsp-location.yaml index 94a2837d2b59..012b60c0808d 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/tsp-location.yaml +++ b/sdk/keyvault/azure-security-keyvault-certificates/tsp-location.yaml @@ -1,6 +1,6 @@ -directory: specification/keyvault/Security.KeyVault.Certificates -commit: 35275d315efee7fa79b6661c29cb3f1c05e86b76 +directory: specification/keyvault/data-plane/Certificates +commit: ea20c467080ed3d3875c8b5aeff28ce52f6a55ca repo: Azure/azure-rest-api-specs cleanup: true -additionalDirectories: -- specification/keyvault/Security.KeyVault.Common/ +additionalDirectories: +- specification/keyvault/data-plane/Certificates/common