diff --git a/sdk/confidentialledger/azure-security-confidentialledger/pom.xml b/sdk/confidentialledger/azure-security-confidentialledger/pom.xml index 9e7baf6b32f07..0c494a2e1cd82 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/pom.xml +++ b/sdk/confidentialledger/azure-security-confidentialledger/pom.xml @@ -32,7 +32,10 @@ UTF-8 + --add-exports com.azure.core/com.azure.core.implementation=ALL-UNNAMED --add-exports com.azure.core/com.azure.core.implementation.jackson=ALL-UNNAMED + --add-exports com.azure.core/com.azure.core.implementation.util=ALL-UNNAMED + --add-exports com.azure.http.netty/com.azure.core.http.netty=com.azure.security.confidentialledger --add-reads com.azure.security.confidentialledger=com.azure.http.netty diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/samples/java/com/azure/security/confidentialledger/PostLedgerEntrySample.java b/sdk/confidentialledger/azure-security-confidentialledger/src/samples/java/com/azure/security/confidentialledger/PostLedgerEntrySample.java index 89c2c03257d10..e46355e7683b9 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/samples/java/com/azure/security/confidentialledger/PostLedgerEntrySample.java +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/samples/java/com/azure/security/confidentialledger/PostLedgerEntrySample.java @@ -5,6 +5,7 @@ import java.io.IOException; +import com.azure.core.http.HttpHeaderName; import org.junit.jupiter.api.Assertions; import com.azure.core.http.rest.RequestOptions; @@ -34,7 +35,7 @@ public static void main(String[] args) { JsonNode responseBodyJson = null; try { - + responseBodyJson = objectMapper.readTree(parsedResponse.toBytes()); } catch (IOException e) { e.printStackTrace(); @@ -44,12 +45,14 @@ public static void main(String[] args) { String collectionId = responseBodyJson.get("collectionId").asText(); // you can use the transaction id to get the transaction status - String transactionId = response.getHeaders().get("x-ms-ccf-transaction-id").getValue(); + String transactionId = response.getHeaders() + .get(HttpHeaderName.fromString("x-ms-ccf-transaction-id")) + .getValue(); requestOptions = new RequestOptions(); // the transactionId can be retrieved after posting to a ledger (see PostLedgerEntry.java) Response transactionResponse = confidentialLedgerClient.getTransactionStatusWithResponse(transactionId, requestOptions); - + JsonNode transactionResponseBodyJson = null; try { diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgeCertificateClientTestBase.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerCertificateClientTestBase.java similarity index 100% rename from sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgeCertificateClientTestBase.java rename to sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerCertificateClientTestBase.java diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerClientTestBase.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerClientTestBase.java index 4c68a4ca2e326..c5f245495b3f8 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerClientTestBase.java +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerClientTestBase.java @@ -6,34 +6,42 @@ import com.azure.core.credential.AccessToken; import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpHeaderName; import com.azure.core.http.netty.NettyAsyncHttpClientBuilder; import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; import com.azure.core.test.TestBase; import com.azure.core.test.TestMode; import com.azure.core.util.BinaryData; -import com.azure.core.util.Configuration; import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.security.confidentialledger.certificate.ConfidentialLedgerCertificateClient; import com.azure.security.confidentialledger.certificate.ConfidentialLedgerCertificateClientBuilder; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; - import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; +import org.junit.jupiter.api.Assertions; import reactor.core.publisher.Mono; +import javax.net.ssl.SSLException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.OffsetDateTime; -import javax.net.ssl.SSLException; - -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; class ConfidentialLedgerClientTestBase extends TestBase { + protected static final String TRANSACTION_ID = "transactionId"; + protected static final String COLLECTION_ID = "collectionId"; + protected static final BinaryData BINARY_DATA = + BinaryData.fromString("{\"contents\":\"New ledger entry contents.\"}"); + + protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + protected ConfidentialLedgerClient confidentialLedgerClient; protected ConfidentialLedgerClientBuilder confidentialLedgerClientBuilder; protected ConfidentialLedgerCertificateClient confidentialLedgerCertificateClient; @@ -41,8 +49,8 @@ class ConfidentialLedgerClientTestBase extends TestBase { @Override protected void beforeTest() { ConfidentialLedgerCertificateClientBuilder confidentialLedgerCertificateClientBuilder = new ConfidentialLedgerCertificateClientBuilder() - .certificateEndpoint("https://identity.confidential-ledger.core.azure.com") - .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + .certificateEndpoint(ConfidentialLedgerEnvironment.getConfidentialLedgerIdentityUrl()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY)); if (getTestMode() == TestMode.PLAYBACK) { confidentialLedgerCertificateClientBuilder @@ -58,10 +66,8 @@ protected void beforeTest() { confidentialLedgerCertificateClient = confidentialLedgerCertificateClientBuilder.buildClient(); - String ledgerName = Configuration.getGlobalConfiguration().get("LEDGER_NAME", "java-sdk-live-tests-ledger"); - Response ledgerIdentityWithResponse = confidentialLedgerCertificateClient - .getLedgerIdentityWithResponse(ledgerName, null); + .getLedgerIdentityWithResponse(ConfidentialLedgerEnvironment.getConfidentialLedgerName(), null); BinaryData identityResponse = ledgerIdentityWithResponse.getValue(); ObjectMapper mapper = new ObjectMapper(); JsonNode jsonNode = null; @@ -91,7 +97,7 @@ protected void beforeTest() { HttpClient httpClient = new NettyAsyncHttpClientBuilder(reactorClient).wiretap(true).build(); confidentialLedgerClientBuilder = new ConfidentialLedgerClientBuilder() - .ledgerEndpoint(Configuration.getGlobalConfiguration().get("LEDGER_URI", "https://java-sdk-live-tests-ledger.confidential-ledger.azure.com")) + .ledgerEndpoint(ConfidentialLedgerEnvironment.getConfidentialLedgerUrl()) .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); if (getTestMode() == TestMode.PLAYBACK) { @@ -111,4 +117,35 @@ protected void beforeTest() { confidentialLedgerClient = confidentialLedgerClientBuilder.buildClient(); } + /** + * Posts and asserts that an entry was added. Useful for tests that require a ledger entry. + * + * @return The transaction id associated with the ledger entry. + */ + protected String postLedgerEntry() throws IOException { + // Arrange + final RequestOptions options = new RequestOptions(); + final String contents = BINARY_DATA.toString(); + + // Act + final Response response = + confidentialLedgerClient.createLedgerEntryWithResponse(BINARY_DATA, options); + + // Assert + assertEquals(200, response.getStatusCode()); + + JsonNode jsonNode = OBJECT_MAPPER.readTree(response.getValue().toBytes()); + JsonNode collectionIdNode = jsonNode.get("collectionId"); + + assertNotNull(collectionIdNode); + assertEquals("subledger:0", collectionIdNode.asText()); + + String transactionId = response.getHeaders() + .get(HttpHeaderName.fromString("x-ms-ccf-transaction-id")) + .getValue(); + + assertNotNull(transactionId, "transaction id should exist on headers."); + + return transactionId; + } } diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerEnvironment.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerEnvironment.java new file mode 100644 index 0000000000000..52a43ec45253a --- /dev/null +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/ConfidentialLedgerEnvironment.java @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.security.confidentialledger; + +import com.azure.core.util.Configuration; + +/** + * Set of environment variables shared in confidential ledger tests. + */ +public class ConfidentialLedgerEnvironment { + + private static final Configuration GLOBAL_CONFIGURATION = Configuration.getGlobalConfiguration(); + + public static String getConfidentialLedgerName() { + return GLOBAL_CONFIGURATION.get("CONFIDENTIALLEDGER_NAME", "java-sdk-live-tests-ledger"); + } + + public static String getConfidentialLedgerUrl() { + return GLOBAL_CONFIGURATION.get("CONFIDENTIALLEDGER_URL", + "https://" + getConfidentialLedgerName() + ".confidential-ledger.azure.com"); + } + + public static String getConfidentialLedgerIdentityUrl() { + return GLOBAL_CONFIGURATION.get("CONFIDENTIALLEDGER_IDENTITY_URL", "https://identity.confidential-ledger.core.azure.com"); + } + + public static String getConfidentialLedgerAdminOid() { + return GLOBAL_CONFIGURATION.get("CONFIDENTIALLEDGER_CLIENT_OBJECTID", "d958292f-5b70-4b66-9502-562217cc7eaa"); + } + + public static String getClientPEM() { + return GLOBAL_CONFIGURATION.get("CONFIDENTIALLEDGER_CLIENT_PEM", "test-pem"); + } + + public static String getClientPEMPk() { + return GLOBAL_CONFIGURATION.get("CONFIDENTIALLEDGER_CLIENT_PEM_PK", "test-pek"); + } +} diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/LedgerEntriesTest.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/LedgerEntriesTest.java index 9bbc7279ea2db..b41f8bd8e16db 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/LedgerEntriesTest.java +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/LedgerEntriesTest.java @@ -10,74 +10,59 @@ import com.azure.core.util.BinaryData; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Isolated; + import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +@Isolated("There is an assumption in post ledger entries that checks it is latest entry.") public final class LedgerEntriesTest extends ConfidentialLedgerClientTestBase { @Test public void testPostLedgerEntryTests() throws Exception { - BinaryData entry = BinaryData.fromString("{\"contents\":\"New ledger entry contents.\"}"); + // Arrange RequestOptions requestOptions = new RequestOptions(); - Response response = confidentialLedgerClient.createLedgerEntryWithResponse(entry, requestOptions); - - String transactionId = response.getHeaders().get("x-ms-ccf-transaction-id").getValue(); - - BinaryData parsedResponse = response.getValue(); - - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode responseBodyJson = null; - - responseBodyJson = objectMapper.readTree(parsedResponse.toBytes()); - - Assertions.assertEquals(responseBodyJson.get("collectionId").asText(), "subledger:0"); + String transactionId = postLedgerEntry(); Response transactionResponse = confidentialLedgerClient.getTransactionStatusWithResponse(transactionId, requestOptions); - JsonNode transactionResponseBodyJson = null; + JsonNode transactionResponseBodyJson = OBJECT_MAPPER.readTree(transactionResponse.getValue().toBytes()); - try { - transactionResponseBodyJson = objectMapper.readTree(transactionResponse.getValue().toBytes()); - } catch (IOException e) { - e.printStackTrace(); - Assertions.assertTrue(false); - } + assertEquals(transactionResponseBodyJson.get(TRANSACTION_ID).asText(), transactionId); - Assertions.assertEquals(transactionResponseBodyJson.get("transactionId").asText(), transactionId); - Assertions.assertTrue(200 == transactionResponse.getStatusCode() || 406 == transactionResponse.getStatusCode()); + int statusCode = transactionResponse.getStatusCode(); + assertTrue(200 == statusCode || 406 == statusCode, "Expected 200, or 206. Actual: " + statusCode); + // Act Response currentResponse = confidentialLedgerClient.getCurrentLedgerEntryWithResponse(requestOptions); - JsonNode currentResponseBodyJson = null; + // Assert + JsonNode currentResponseBodyJson = OBJECT_MAPPER.readTree(currentResponse.getValue().toBytes()); - try { - - currentResponseBodyJson = objectMapper.readTree(currentResponse.getValue().toBytes()); - } catch (IOException e) { - e.printStackTrace(); - Assertions.assertTrue(false); - } - - Assertions.assertTrue(200 == currentResponse.getStatusCode() || 406 == currentResponse.getStatusCode()); + assertTrue(200 == currentResponse.getStatusCode() || 406 == currentResponse.getStatusCode()); if (200 == currentResponse.getStatusCode()) { - // we assume no one else is using this test ledger - Assertions.assertTrue(currentResponseBodyJson.get("transactionId").asDouble() <= Double.parseDouble(transactionId)); + // we assume no one has created an entry since we created this entry. + assertTrue(currentResponseBodyJson.get(TRANSACTION_ID).asDouble() <= Double.parseDouble(transactionId)); } } @Test public void testGetCollectionIdsTests() throws Exception { + postLedgerEntry(); + RequestOptions requestOptions = new RequestOptions(); PagedIterable pagedIterableResponse = confidentialLedgerClient.listCollections(requestOptions); List collectionKeys = new ArrayList<>(); pagedIterableResponse.streamByPage().forEach(resp -> { - Assertions.assertEquals(200, resp.getStatusCode()); + assertEquals(200, resp.getStatusCode()); resp.getValue().forEach(item -> { ObjectMapper objectMapper = new ObjectMapper(); JsonNode responseBodyJson = null; @@ -86,14 +71,15 @@ public void testGetCollectionIdsTests() throws Exception { responseBodyJson = objectMapper.readTree(item.toBytes()); } catch (IOException e) { e.printStackTrace(); - Assertions.assertTrue(false); + assertTrue(false); } - Assertions.assertNotNull(responseBodyJson.get("collectionId")); - collectionKeys.add(responseBodyJson.get("collectionId").asText()); + Assertions.assertNotNull(responseBodyJson.get(COLLECTION_ID)); + collectionKeys.add(responseBodyJson.get(COLLECTION_ID).asText()); }); - collectionKeys.stream().anyMatch((item) -> item.contains("subledger:0")); + boolean exists = collectionKeys.stream().anyMatch((item) -> item.contains("subledger:0")); + assertTrue(exists, "Did not find matching collection."); }); } } diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/UserTests.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/UserTests.java index a01ebb1f19d29..1697e983ab187 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/UserTests.java +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/UserTests.java @@ -7,19 +7,17 @@ import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; import com.azure.core.util.BinaryData; -import com.azure.core.util.Configuration; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.io.IOException; + public final class UserTests extends ConfidentialLedgerClientTestBase { @Test public void testGetUserTests() throws Exception { - String userAad = Configuration.getGlobalConfiguration().get("USER_AAD", "d958292f-5b70-4b66-9502-562217cc7eaa"); + String userAad = ConfidentialLedgerEnvironment.getConfidentialLedgerAdminOid(); RequestOptions requestOptions = new RequestOptions(); Response response = confidentialLedgerClient.getUserWithResponse(userAad, requestOptions); diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/ConfidentialLedgerCertificateClientTestBase.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/ConfidentialLedgerCertificateClientTestBase.java index dbd3a58d01377..31edfa1e38639 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/ConfidentialLedgerCertificateClientTestBase.java +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/ConfidentialLedgerCertificateClientTestBase.java @@ -10,14 +10,18 @@ import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.test.TestBase; import com.azure.core.test.TestMode; -import com.azure.core.util.Configuration; import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.confidentialledger.ConfidentialLedgerEnvironment; import com.azure.security.confidentialledger.certificate.ConfidentialLedgerCertificateClient; import com.azure.security.confidentialledger.certificate.ConfidentialLedgerCertificateClientBuilder; -import java.time.OffsetDateTime; +import com.fasterxml.jackson.databind.ObjectMapper; import reactor.core.publisher.Mono; +import java.time.OffsetDateTime; + class ConfidentialLedgerCertificateClientTestBase extends TestBase { + protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + protected ConfidentialLedgerCertificateClient confidentialLedgerCertificateClient; @Override @@ -25,10 +29,10 @@ protected void beforeTest() { ConfidentialLedgerCertificateClientBuilder confidentialLedgerCertificateClientbuilder = new ConfidentialLedgerCertificateClientBuilder() .certificateEndpoint( - Configuration.getGlobalConfiguration() - .get("CERTIFICATEENDPOINT", "certificateendpoint")) + ConfidentialLedgerEnvironment.getConfidentialLedgerIdentityUrl()) .httpClient(HttpClient.createDefault()) .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { confidentialLedgerCertificateClientbuilder .httpClient(interceptorManager.getPlaybackClient()) diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/GetLedgerIdentityTests.java b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/GetLedgerIdentityTests.java index f17bba388f410..a23f6d3f05b66 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/GetLedgerIdentityTests.java +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/java/com/azure/security/confidentialledger/certificate/generated/GetLedgerIdentityTests.java @@ -7,23 +7,33 @@ import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; import com.azure.core.util.BinaryData; +import com.azure.security.confidentialledger.ConfidentialLedgerEnvironment; +import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import java.io.IOException; + public final class GetLedgerIdentityTests extends ConfidentialLedgerCertificateClientTestBase { @Test - @Disabled - public void testGetLedgerIdentityTests() { - RequestOptions requestOptions = new RequestOptions(); - Response response = - confidentialLedgerCertificateClient.getLedgerIdentityWithResponse( - "contoso-ledger-12345", requestOptions); + public void testGetLedgerIdentityTests() throws IOException { + // Arrange + final String ledgerName = ConfidentialLedgerEnvironment.getConfidentialLedgerName(); + final RequestOptions requestOptions = new RequestOptions(); + + // Act + final Response response = + confidentialLedgerCertificateClient.getLedgerIdentityWithResponse(ledgerName, requestOptions); + + // Assert Assertions.assertEquals(200, response.getStatusCode()); - Assertions.assertEquals( - BinaryData.fromString( - "{\"ledgerTlsCertificate\":\"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ2akNDQVVLZ0F3SUJBZ0lRVkwrMFZxWnAzVnpNeUZLcUQ0Q3M4ekFNQmdncWhrak9QUVFEQXdVQU1CWXgKRkRBU0JnTlZCQU1NQzBORFJpQk9aWFIzYjNKck1CNFhEVEU1TVRFd01UQXdNREF3TUZvWERUSXhNVEl6TVRJegpOVGsxT1Zvd0ZqRVVNQklHQTFVRUF3d0xRME5HSUU1bGRIZHZjbXN3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBCklnTmlBQVRCbTRqTlY0S3lqNmJjL2lNS0RFWFRDeVU2UDZVMUtXQWlEb2RsK0pkOGFESnNCd0xpbXRnNFFDdWcKMW1wSG5WUG1jYlBBYk5NMTEreHJMSHVGRWZ1WmxTM0RJK0NDWDhGVUIyVnZEVlQzU2ZXTERWbXIxeExTdFRESAp1TjRZakJPalV6QlJNQThHQTFVZEV3UUlNQVlCQWY4Q0FRQXdIUVlEVlIwT0JCWUVGR1Nkc1Rod3hyVE9FUXhiCloyTnNzbE52SlJZa01COEdBMVVkSXdRWU1CYUFGR1Nkc1Rod3hyVE9FUXhiWjJOc3NsTnZKUllrTUF3R0NDcUcKU000OUJBTURCUUFEYUFBd1pRSXdKTExXbGxOWjgzeW0vSFF1dnRHR1NkRi9SQ1p3VW9oK3loYWQvdlVmVm5oRQoyZFlMRERFSk9PUnB4cEVJVmZYZ0FqRUEvQ0xjUndTWnh6RW1MRFllMXk0cHVYS3VTRENVaXUrYktZZ2R2UkxqClJRSmdUeWd1dGNUZEk2NHNTd2VxUHZlSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgA=\"}") - .toObject(Object.class), - response.getValue().toObject(Object.class)); + + final JsonNode jsonNode = OBJECT_MAPPER.readTree(response.getValue().toBytes()); + final JsonNode ledgerTlsCertificate = jsonNode.get("ledgerTlsCertificate"); + + Assertions.assertNotNull(ledgerTlsCertificate); + + final String certificate = ledgerTlsCertificate.asText(); + Assertions.assertNotNull(certificate); } } diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/GetLedgerIdentityTests.testGetLedgerIdentityTests.json b/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/GetLedgerIdentityTests.testGetLedgerIdentityTests.json new file mode 100644 index 0000000000000..94c091783e864 --- /dev/null +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/GetLedgerIdentityTests.testGetLedgerIdentityTests.json @@ -0,0 +1,28 @@ +{ + "networkCallRecords" : [ { + "Method" : "GET", + "Uri" : "https://REDACTED.confidential-ledger.core.azure.com/ledgerIdentity/java-sdk-live-tests-ledger?api-version=2022-05-13", + "Headers" : { + "x-ms-client-request-id" : "5ad1b694-ec37-4b94-824f-2fcc544d0e21", + "user-agent" : "azsdk-java-azure-security-confidentialledger/1.1.0-beta.1 (17.0.7; Windows 11; 10.0)" + }, + "Response" : { + "Transfer-Encoding" : "chunked", + "x-azure-ref" : "20230814T222323Z-xuke02d9md2qdduqcksx81bm0c000000068000000000048z", + "X-Cache" : "CONFIG_NOCACHE", + "Connection" : "keep-alive", + "x-ms-image-tag" : "1.0.02406.1320-aae7b315353a85cf9043b54f7f4ab02a79499e54", + "retry-after" : "0", + "StatusCode" : "200", + "Date" : "Mon, 14 Aug 2023 22:23:23 GMT", + "x-ms-correlation-request-id" : "fb1c0d3a-46a2-472e-8ec8-6e4cd4c8a8d9", + "x-ms-machineName" : "identityservice-d86887dd-rmgn9", + "x-ms-image-digest" : "sha256:43aa9ae9edf65a92516a739e4a72571aa920f22b1eee335169c6abddadb056dd", + "Body" : "{\"ledgerTlsCertificate\":\"-----BEGIN CERTIFICATE-----\\nMIIBfzCCASagAwIBAgIQE42ZPlx4OBwUHUH3MeUkhzAKBggqhkjOPQQDAjAWMRQw\\nEgYDVQQDDAtDQ0YgTmV0d29yazAeFw0yMzA4MTEwMTA2MzZaFw0yMzExMDkwMTA2\\nMzVaMBYxFDASBgNVBAMMC0NDRiBOZXR3b3JrMFkwEwYHKoZIzj0CAQYIKoZIzj0D\\nAQcDQgAEr1de3dejkboSpN3MMBpkMA1/xouz10vuB+vWyNpGRqexHrthFPHRe1ZS\\nezjrqv+FyqHu06fPD8+HtONR+fvbIKNWMFQwEgYDVR0TAQH/BAgwBgEB/wIBADAd\\nBgNVHQ4EFgQUo5Br9DW0WrNaIxZgfK/T1+n043cwHwYDVR0jBBgwFoAUo5Br9DW0\\nWrNaIxZgfK/T1+n043cwCgYIKoZIzj0EAwIDRwAwRAIgVqGDPqmWRZsD9XQ4XyY3\\nv/qKzsTApHHqreKpcY3z0PACICzEukDi1PDDAl5q/nXPIAzRJHBOLzRO4yDQsEHA\\nXdaY\\n-----END CERTIFICATE-----\\n\",\"ledgerId\":\"java-sdk-live-tests-ledger\"}", + "x-ms-client-request-id" : "5ad1b694-ec37-4b94-824f-2fcc544d0e21", + "Content-Type" : "application/json; charset=utf-8" + }, + "Exception" : null + } ], + "variables" : [ ] +} diff --git a/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/LedgerEntriesTest.testGetCollectionIdsTests.json b/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/LedgerEntriesTest.testGetCollectionIdsTests.json index 258c01dd2e4ca..e0290cfdedc5e 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/LedgerEntriesTest.testGetCollectionIdsTests.json +++ b/sdk/confidentialledger/azure-security-confidentialledger/src/test/resources/session-records/LedgerEntriesTest.testGetCollectionIdsTests.json @@ -3,42 +3,62 @@ "Method" : "GET", "Uri" : "https://REDACTED.confidential-ledger.core.azure.com/ledgerIdentity/java-sdk-live-tests-ledger?api-version=2022-05-13", "Headers" : { - "User-Agent" : "azsdk-java-azure-security-confidentialledger/1.1.0-beta.1 (18.0.2.1; Windows 11; 10.0)", - "x-ms-client-request-id" : "85a6bfcd-d2b7-473f-9984-63bb44d05d2d" + "x-ms-client-request-id" : "37ff9d19-0d26-49d2-acc8-dd3ec2c2c169", + "user-agent" : "azsdk-java-azure-security-confidentialledger/1.1.0-beta.1 (17.0.7; Windows 11; 10.0)" }, "Response" : { "Transfer-Encoding" : "chunked", - "x-ms-machineName" : "identityservice-74474fbb54-jt9mc", - "Server" : "Kestrel", - "x-ms-image-digest" : "sha256:99312b48a4a36c2a35a64344ef1a7d53831ef6d94f7f4dbde1c0e95b272869e2", - "x-ms-image-tag" : "1.0.02181.52-650996ff8a6192801b2212d88c07f72145942d6f", + "X-Cache" : "CONFIG_NOCACHE", + "x-ms-image-tag" : "1.0.02406.1320-aae7b315353a85cf9043b54f7f4ab02a79499e54", "retry-after" : "0", "StatusCode" : "200", - "Body" : "{\"ledgerTlsCertificate\":\"-----BEGIN CERTIFICATE-----\\nMIIBezCCASGgAwIBAgIRAKLZijU4vM4pdXBFECX9udEwCgYIKoZIzj0EAwIwFjEU\\nMBIGA1UEAwwLQ0NGIE5ldHdvcmswHhcNMjMwMzAxMTM1NDU5WhcNMjMwNTMwMTM1\\nNDU4WjAWMRQwEgYDVQQDDAtDQ0YgTmV0d29yazBZMBMGByqGSM49AgEGCCqGSM49\\nAwEHA0IABMEG2833BvKMjevK2yR4iNnbmLVxFCfUOSAMEihqiq/YQGRuuQgdjDE9\\nPlAeW3768OgMRx5k8EomiwA1CFJRhJWjUDBOMAwGA1UdEwQFMAMBAf8wHQYDVR0O\\nBBYEFOr/ulXMbmxjEG4+VqP7GLIQr81gMB8GA1UdIwQYMBaAFOr/ulXMbmxjEG4+\\nVqP7GLIQr81gMAoGCCqGSM49BAMCA0gAMEUCIQC5M+E/wBy0wBx+5b+avIm4IML7\\nj/H/n54VbAPbkd3xxAIgYvb4at1tOSYV8w3p3N4geyXcsQSZazMHv+Yywtlto/I=\\n-----END CERTIFICATE-----\\n\",\"ledgerId\":\"java-sdk-live-tests-ledger\"}", - "Date" : "Wed, 01 Mar 2023 14:31:12 GMT", - "x-ms-client-request-id" : "85a6bfcd-d2b7-473f-9984-63bb44d05d2d", - "x-ms-correlation-request-id" : "645a46f0-8dc5-4f05-a9c0-e465b9fd8abd", + "Date" : "Mon, 14 Aug 2023 22:31:49 GMT", + "x-ms-correlation-request-id" : "1ad4318a-ed6f-4f9c-859a-44f6a89b6ea0", + "x-ms-machineName" : "identityservice-d86887dd-rmgn9", + "x-ms-image-digest" : "sha256:43aa9ae9edf65a92516a739e4a72571aa920f22b1eee335169c6abddadb056dd", + "X-Azure-Ref" : "0VqvaZAAAAABqvs0TgbUZS5HM3i7KjhYNV1NURURHRTAxMDkAMjQyYjE4MjAtYjI3YS00NTE2LTk4OTktMGVmNGViZTU0YWQ0", + "Body" : "{\"ledgerTlsCertificate\":\"-----BEGIN CERTIFICATE-----\\nMIIBfzCCASagAwIBAgIQE42ZPlx4OBwUHUH3MeUkhzAKBggqhkjOPQQDAjAWMRQw\\nEgYDVQQDDAtDQ0YgTmV0d29yazAeFw0yMzA4MTEwMTA2MzZaFw0yMzExMDkwMTA2\\nMzVaMBYxFDASBgNVBAMMC0NDRiBOZXR3b3JrMFkwEwYHKoZIzj0CAQYIKoZIzj0D\\nAQcDQgAEr1de3dejkboSpN3MMBpkMA1/xouz10vuB+vWyNpGRqexHrthFPHRe1ZS\\nezjrqv+FyqHu06fPD8+HtONR+fvbIKNWMFQwEgYDVR0TAQH/BAgwBgEB/wIBADAd\\nBgNVHQ4EFgQUo5Br9DW0WrNaIxZgfK/T1+n043cwHwYDVR0jBBgwFoAUo5Br9DW0\\nWrNaIxZgfK/T1+n043cwCgYIKoZIzj0EAwIDRwAwRAIgVqGDPqmWRZsD9XQ4XyY3\\nv/qKzsTApHHqreKpcY3z0PACICzEukDi1PDDAl5q/nXPIAzRJHBOLzRO4yDQsEHA\\nXdaY\\n-----END CERTIFICATE-----\\n\",\"ledgerId\":\"java-sdk-live-tests-ledger\"}", + "x-ms-client-request-id" : "37ff9d19-0d26-49d2-acc8-dd3ec2c2c169", "Content-Type" : "application/json; charset=utf-8" }, "Exception" : null + }, { + "Method" : "POST", + "Uri" : "https://REDACTED.confidential-ledger.azure.com/app/transactions?api-version=2022-05-13", + "Headers" : { + "content-type" : "application/json", + "x-ms-client-request-id" : "5b44f6ca-9ed1-4daf-8baa-338988a7a159", + "user-agent" : "azsdk-java-azure-security-confidentialledger/1.1.0-beta.1 (17.0.7; Windows 11; 10.0)" + }, + "Response" : { + "content-length" : "30", + "content-type" : "application/json", + "retry-after" : "0", + "x-ms-ccf-transaction-id" : "2.77", + "StatusCode" : "200", + "x-ms-request-id" : "539343619", + "Body" : "{\"collectionId\":\"subledger:0\"}", + "x-ms-client-request-id" : "5b44f6ca-9ed1-4daf-8baa-338988a7a159" + }, + "Exception" : null }, { "Method" : "GET", "Uri" : "https://REDACTED.confidential-ledger.azure.com/app/collections?api-version=2022-05-13", "Headers" : { - "User-Agent" : "azsdk-java-azure-security-confidentialledger/1.1.0-beta.1 (18.0.2.1; Windows 11; 10.0)", - "x-ms-client-request-id" : "f6f997cb-9281-4f56-833c-e11cbcd4c277" + "x-ms-client-request-id" : "db112d0e-ae51-4914-ab1f-19839cecd278", + "user-agent" : "azsdk-java-azure-security-confidentialledger/1.1.0-beta.1 (17.0.7; Windows 11; 10.0)" }, "Response" : { "content-length" : "48", "content-type" : "application/json", "retry-after" : "0", - "x-ms-ccf-transaction-id" : "2.38", + "x-ms-ccf-transaction-id" : "2.77", "StatusCode" : "200", - "x-ms-request-id" : "239451724", + "x-ms-request-id" : "2125179648", "Body" : "{\"collections\":[{\"collectionId\":\"subledger:0\"}]}", - "x-ms-client-request-id" : "f6f997cb-9281-4f56-833c-e11cbcd4c277" + "x-ms-client-request-id" : "db112d0e-ae51-4914-ab1f-19839cecd278" }, "Exception" : null } ], "variables" : [ ] -} \ No newline at end of file +} diff --git a/sdk/confidentialledger/azure-security-confidentialledger/test-resources-pre.ps1 b/sdk/confidentialledger/azure-security-confidentialledger/test-resources-pre.ps1 new file mode 100644 index 0000000000000..91d2ab5a7ff9b --- /dev/null +++ b/sdk/confidentialledger/azure-security-confidentialledger/test-resources-pre.ps1 @@ -0,0 +1,35 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +# IMPORTANT: Do not invoke this file directly. Please instead run eng/common/New-TestResources.ps1 from the repository root. + +#Requires -Version 6.0 +#Requires -PSEdition Core + +using namespace System.Security.Cryptography +using namespace System.Security.Cryptography.X509Certificates + +# Use same parameter names as declared in eng/common/New-TestResources.ps1 (assume validation therein). +[CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] +param ( + [Parameter()] + [hashtable] $DeploymentOutputs, + + # Captures any arguments from eng/common/New-TestResources.ps1 not declared here (no parameter errors). + [Parameter(ValueFromRemainingArguments = $true)] + $RemainingArguments +) + +# By default stop for any error. +if (!$PSBoundParameters.ContainsKey('ErrorAction')) { + $ErrorActionPreference = 'Stop' +} + +Import-Module -Name $PSScriptRoot/../../../eng/common/scripts/X509Certificate2 -Verbose +$cert = New-X509Certificate2 -SubjectName 'E=opensource@microsoft.com, CN=Azure SDK, OU=Azure SDK, O=Microsoft, L=Frisco, S=TX, C=US' -ValidDays 365 + +$pem = (Format-X509Certificate2 -Certificate $cert).ReplaceLineEndings([string]::Empty) +Write-Host $pem +$templateFileParameters['ConfidentialLedgerPrincipalPEM'] = $pem +$pemPk = (Format-X509Certificate2 -Type Pkcs8 -Certificate $cert).ReplaceLineEndings([string]::Empty) +$templateFileParameters['ConfidentialLedgerPrincipalPEMPK'] = $pemPk diff --git a/sdk/confidentialledger/azure-security-confidentialledger/test-resources.json b/sdk/confidentialledger/azure-security-confidentialledger/test-resources.json index dbf966b50da4b..3d71da72402e8 100644 --- a/sdk/confidentialledger/azure-security-confidentialledger/test-resources.json +++ b/sdk/confidentialledger/azure-security-confidentialledger/test-resources.json @@ -2,7 +2,7 @@ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { - "BaseName": { + "baseName": { "type": "string", "metadata": { "description": "Name of the test ledger" @@ -33,26 +33,42 @@ "description": "Application object ID for the test application" } }, - "testApplicationSecret": { - "type": "string", - "metadata": { - "description": "Application secret for the test application" - } - } + "testApplicationSecret": { + "type": "string", + "metadata": { + "description": "Application secret for the test application" + } + }, + "ConfidentialLedgerPrincipalPEM": { + "type": "string", + "metadata": { + "description": "The certificate to configure as a certBasedSecurityPrincipal." + } + }, + "ConfidentialLedgerPrincipalPEMPK": { + "type": "string", + "metadata": { + "description": "The certificate to configure as a certBasedSecurityPrincipal." + } + } }, - "functions": [], - "variables": {}, "resources": [ { - "name": "[parameters('BaseName')]", + "name": "[parameters('baseName')]", "type": "Microsoft.ConfidentialLedger/ledgers", "apiVersion": "2020-12-01-preview", - "location": "[parameters('location')]", + "location": "eastus", "properties": { "ledgerType": "Public", "aadBasedSecurityPrincipals": [ { - "principalId": "[parameters('TestApplicationId')]", + "principalId": "[parameters('testApplicationOid')]", + "ledgerRoleName": "Administrator" + } + ], + "certBasedSecurityPrincipals": [ + { + "cert": "[parameters('ConfidentialLedgerPrincipalPEM')]", "ledgerRoleName": "Administrator" } ] @@ -61,28 +77,40 @@ ], "outputs": { "AZURE_TENANT_ID": { - "type": "string", - "value": "[parameters('tenantId')]" - }, - "AZURE_CLIENT_ID": { - "type": "string", - "value": "[parameters('testApplicationId')]" - }, - "AZURE_CLIENT_SECRET": { - "type": "string", - "value": "[parameters('testApplicationSecret')]" - }, - "LEDGER_NAME": { "type": "string", - "value": "[parameters('BaseName')]" + "value": "[parameters('tenantId')]" }, - "LEDGER_URI": { + "AZURE_CLIENT_ID": { "type": "string", - "value": "[concat('https://', parameters('BaseName'), '.confidential-ledger.azure.com')]" + "value": "[parameters('testApplicationId')]" }, - "USER_AAD": { + "AZURE_CLIENT_SECRET": { + "type": "string", + "value": "[parameters('testApplicationSecret')]" + }, + "CONFIDENTIALLEDGER_NAME": { + "type": "string", + "value": "[parameters('baseName')]" + }, + "CONFIDENTIALLEDGER_URL": { + "type": "string", + "value": "[format('https://{0}.confidential-ledger.azure.com', parameters('baseName'))]" + }, + "CONFIDENTIALLEDGER_IDENTITY_URL": { + "type": "string", + "value": "https://identity.confidential-ledger.core.azure.com" + }, + "CONFIDENTIALLEDGER_CLIENT_OBJECTID": { "type": "string", "value": "[parameters('testApplicationOid')]" + }, + "CONFIDENTIALLEDGER_CLIENT_PEM": { + "type": "string", + "value": "[parameters('ConfidentialLedgerPrincipalPEM')]" + }, + "CONFIDENTIALLEDGER_CLIENT_PEM_PK": { + "type": "string", + "value": "[parameters('ConfidentialLedgerPrincipalPEMPK')]" } } }