From d6b84da427eac3247c33e22e18cca2e958a84f2f Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Wed, 27 Mar 2024 15:42:05 +0100 Subject: [PATCH] feat(policy): handle 'remedy' attribute in Prohibition --- .../from/JsonObjectFromPolicyTransformer.java | 8 ++ .../JsonObjectToProhibitionTransformer.java | 16 ++-- .../JsonObjectFromPolicyTransformerTest.java | 12 ++- ...sonObjectToProhibitionTransformerTest.java | 55 +++++--------- .../eclipse/edc/policy/model/Prohibition.java | 19 +++++ .../managementapi/AssetApiEndToEndTest.java | 26 ++++--- .../managementapi/CatalogApiEndToEndTest.java | 26 ++++--- .../ContractAgreementApiEndToEndTest.java | 26 ++++--- .../ContractDefinitionApiEndToEndTest.java | 26 ++++--- .../ContractNegotiationApiEndToEndTest.java | 26 ++++--- .../e2e/managementapi/InMemoryRuntime.java | 52 ------------- .../PolicyDefinitionApiEndToEndTest.java | 51 +++++++++---- .../e2e/managementapi/PostgresRuntime.java | 55 -------------- .../edc/test/e2e/managementapi/Runtimes.java | 74 +++++++++++++++++++ .../TransferProcessApiEndToEndTest.java | 26 ++++--- 15 files changed, 272 insertions(+), 226 deletions(-) delete mode 100644 system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/InMemoryRuntime.java delete mode 100644 system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PostgresRuntime.java create mode 100644 system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/Runtimes.java diff --git a/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformer.java b/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformer.java index f017bb7ce7..8e57fc7683 100644 --- a/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformer.java +++ b/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformer.java @@ -42,6 +42,7 @@ import java.util.Optional; +import static jakarta.json.stream.JsonCollectors.toJsonArray; import static java.util.UUID.randomUUID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; @@ -65,6 +66,7 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_TYPE_SET; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_PROHIBITION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REFINEMENT_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REMEDY_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_RIGHT_OPERAND_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_XONE_CONSTRAINT_ATTRIBUTE; @@ -195,6 +197,12 @@ public JsonObject visitPermission(Permission permission) { public JsonObject visitProhibition(Prohibition prohibition) { var prohibitionBuilder = visitRule(prohibition); + var remedies = prohibition.getRemedies(); + if (remedies != null && !remedies.isEmpty()) { + var remediesJson = remedies.stream().map(this::visitDuty).collect(toJsonArray()); + prohibitionBuilder.add(ODRL_REMEDY_ATTRIBUTE, remediesJson); + } + return prohibitionBuilder.build(); } diff --git a/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformer.java b/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformer.java index dac4525947..bc6dd6ee66 100644 --- a/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformer.java +++ b/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformer.java @@ -18,6 +18,7 @@ import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer; import org.eclipse.edc.policy.model.Action; import org.eclipse.edc.policy.model.Constraint; +import org.eclipse.edc.policy.model.Duty; import org.eclipse.edc.policy.model.Prohibition; import org.eclipse.edc.transform.spi.TransformerContext; import org.jetbrains.annotations.NotNull; @@ -25,6 +26,7 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_CONSTRAINT_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REMEDY_ATTRIBUTE; /** * Converts from an ODRL prohibition as a {@link JsonObject} in JSON-LD expanded form to a {@link Prohibition}. @@ -39,15 +41,11 @@ public JsonObjectToProhibitionTransformer() { public @Nullable Prohibition transform(@NotNull JsonObject object, @NotNull TransformerContext context) { var builder = Prohibition.Builder.newInstance(); - visitProperties(object, key -> { - switch (key) { - case ODRL_ACTION_ATTRIBUTE: - return value -> builder.action(transformObject(value, Action.class, context)); - case ODRL_CONSTRAINT_ATTRIBUTE: - return value -> builder.constraints(transformArray(value, Constraint.class, context)); - default: - return doNothing(); - } + visitProperties(object, key -> switch (key) { + case ODRL_ACTION_ATTRIBUTE -> value -> builder.action(transformObject(value, Action.class, context)); + case ODRL_CONSTRAINT_ATTRIBUTE -> value -> builder.constraints(transformArray(value, Constraint.class, context)); + case ODRL_REMEDY_ATTRIBUTE -> value -> builder.remedies(transformArray(value, Duty.class, context)); + default -> doNothing(); }); return builderResult(builder::build, context); diff --git a/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformerTest.java b/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformerTest.java index 9d4e50f605..5494aa57b8 100644 --- a/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformerTest.java +++ b/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/from/JsonObjectFromPolicyTransformerTest.java @@ -69,6 +69,7 @@ import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_TYPE_SET; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_PROHIBITION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REFINEMENT_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REMEDY_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_RIGHT_OPERAND_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_XONE_CONSTRAINT_ATTRIBUTE; @@ -237,14 +238,17 @@ void transform_permissionWithConstraintAndDuty_returnJsonObject() { void transform_prohibitionWithConstraint_returnJsonObject() { var constraint = getConstraint(); var action = getAction(); + var remedy = Duty.Builder.newInstance().action(Action.Builder.newInstance().type("remedyAction").build()).build(); var prohibition = Prohibition.Builder.newInstance() .action(action) .constraint(constraint) + .remedy(remedy) .build(); var policy = Policy.Builder.newInstance().prohibition(prohibition).build(); var result = transformer.transform(policy, context); - + + assertThat(result).isNotNull(); var prohibitionJson = result.get(ODRL_PROHIBITION_ATTRIBUTE).asJsonArray().get(0).asJsonObject(); assertThat(prohibitionJson.getJsonArray(ODRL_CONSTRAINT_ATTRIBUTE)).hasSize(1); @@ -255,6 +259,12 @@ void transform_prohibitionWithConstraint_returnJsonObject() { .isEqualTo(constraint.getOperator().getOdrlRepresentation()); assertThat(constraintJson.getJsonObject(ODRL_RIGHT_OPERAND_ATTRIBUTE).getJsonString(VALUE).getString()) .isEqualTo(((LiteralExpression) constraint.getRightExpression()).getValue()); + + assertThat(prohibitionJson.getJsonArray(ODRL_REMEDY_ATTRIBUTE)).hasSize(1).first() + .extracting(JsonValue::asJsonObject).satisfies(remedyJson -> { + assertThat(remedyJson.getJsonObject(ODRL_ACTION_ATTRIBUTE).getString(ODRL_ACTION_TYPE_ATTRIBUTE)) + .isEqualTo("remedyAction"); + }); verify(context, never()).reportProblem(anyString()); } diff --git a/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformerTest.java b/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformerTest.java index 4492bceb74..cdc5249e0c 100644 --- a/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformerTest.java +++ b/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/odrl/to/JsonObjectToProhibitionTransformerTest.java @@ -19,19 +19,18 @@ import org.eclipse.edc.policy.model.Action; import org.eclipse.edc.policy.model.AtomicConstraint; import org.eclipse.edc.policy.model.Constraint; +import org.eclipse.edc.policy.model.Duty; import org.eclipse.edc.transform.spi.TransformerContext; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.Map; -import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.core.transform.transformer.TestInput.getExpanded; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_CONSTRAINT_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_CONSTRAINT_TYPE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REMEDY_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -43,59 +42,43 @@ import static org.mockito.Mockito.when; class JsonObjectToProhibitionTransformerTest { - private static final String TARGET = "target"; - - private final TransformerContext context = mock(TransformerContext.class); + private final TransformerContext context = mock(); private final Action action = Action.Builder.newInstance().type("type").build(); private final Constraint constraint = AtomicConstraint.Builder.newInstance().build(); - private JsonObjectToProhibitionTransformer transformer; + private final JsonObjectToProhibitionTransformer transformer = new JsonObjectToProhibitionTransformer(); @BeforeEach void setUp() { - transformer = new JsonObjectToProhibitionTransformer(); when(context.transform(isA(JsonObject.class), eq(Action.class))).thenReturn(action); when(context.transform(isA(JsonObject.class), eq(Constraint.class))).thenReturn(constraint); } - @ParameterizedTest - @MethodSource("jsonSource") - void transform_attributesAsObjects_returnPermission(JsonObject prohibition) { + @Test + void transform_attributesAsObjects_returnPermission() { + var remedy = Duty.Builder.newInstance().build(); + when(context.transform(isA(JsonObject.class), eq(Duty.class))).thenReturn(remedy); + var prohibition = Json.createObjectBuilder() + .add(ODRL_ACTION_ATTRIBUTE, Json.createObjectBuilder().add(TYPE, "Action")) + .add(ODRL_CONSTRAINT_ATTRIBUTE, Json.createObjectBuilder().add(TYPE, ODRL_CONSTRAINT_TYPE)) + .add(ODRL_REMEDY_ATTRIBUTE, Json.createObjectBuilder().add(ODRL_ACTION_ATTRIBUTE, "remedyAction")) + .add(ODRL_TARGET_ATTRIBUTE, "target") + .build(); + var result = transformer.transform(getExpanded(prohibition), context); assertThat(result).isNotNull(); assertThat(result.getAction()).isEqualTo(action); assertThat(result.getConstraints()).hasSize(1); assertThat(result.getConstraints().get(0)).isEqualTo(constraint); + assertThat(result.getRemedies()).containsOnly(remedy); verify(context, never()).reportProblem(anyString()); verify(context, times(1)).transform(isA(JsonObject.class), eq(Action.class)); verify(context, times(1)).transform(isA(JsonObject.class), eq(Constraint.class)); - } - - static Stream jsonSource() { - var jsonFactory = Json.createBuilderFactory(Map.of()); - var actionJson = jsonFactory.createObjectBuilder().add(TYPE, "action"); - var constraintJson = jsonFactory.createObjectBuilder().add(TYPE, "constraint"); - - return Stream.of( - // object - jsonFactory.createObjectBuilder() - .add(ODRL_ACTION_ATTRIBUTE, actionJson) - .add(ODRL_CONSTRAINT_ATTRIBUTE, constraintJson) - .add(ODRL_TARGET_ATTRIBUTE, TARGET) - .build(), - - // array version - jsonFactory.createObjectBuilder() - .add(ODRL_ACTION_ATTRIBUTE, jsonFactory.createArrayBuilder().add(actionJson)) - .add(ODRL_CONSTRAINT_ATTRIBUTE, jsonFactory.createArrayBuilder().add(constraintJson)) - .add(ODRL_TARGET_ATTRIBUTE, jsonFactory.createArrayBuilder().add(TARGET)) - .build() - - ); + verify(context, times(1)).transform(isA(JsonObject.class), eq(Duty.class)); } } diff --git a/spi/common/policy-model/src/main/java/org/eclipse/edc/policy/model/Prohibition.java b/spi/common/policy-model/src/main/java/org/eclipse/edc/policy/model/Prohibition.java index a43b04d723..9109875c67 100644 --- a/spi/common/policy-model/src/main/java/org/eclipse/edc/policy/model/Prohibition.java +++ b/spi/common/policy-model/src/main/java/org/eclipse/edc/policy/model/Prohibition.java @@ -15,6 +15,9 @@ package org.eclipse.edc.policy.model; +import java.util.ArrayList; +import java.util.List; + import static java.util.stream.Collectors.joining; /** @@ -22,11 +25,17 @@ */ public class Prohibition extends Rule { + private final List remedies = new ArrayList<>(); + @Override public R accept(Visitor visitor) { return visitor.visitProhibition(this); } + public List getRemedies() { + return remedies; + } + @Override public String toString() { return "Prohibition constraints: [" + getConstraints().stream().map(Object::toString).collect(joining(",")) + "]"; @@ -42,6 +51,16 @@ public static Builder newInstance() { return new Builder(); } + public Builder remedy(Duty remedy) { + rule.remedies.add(remedy); + return this; + } + + public Builder remedies(List remedies) { + rule.remedies.addAll(remedies); + return this; + } + public Prohibition build() { return rule; } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java index d2107595a2..7a5af22821 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/AssetApiEndToEndTest.java @@ -22,10 +22,10 @@ import org.eclipse.edc.spi.asset.AssetIndex; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.asset.Asset; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.UUID; @@ -38,6 +38,9 @@ import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; import static org.eclipse.edc.spi.CoreConstants.EDC_PREFIX; import static org.eclipse.edc.spi.query.Criterion.criterion; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -48,25 +51,30 @@ public class AssetApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); } + } @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } } abstract static class Tests extends ManagementApiEndToEndTestBase { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java index 9a9e50ac4d..3ae97a790c 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/CatalogApiEndToEndTest.java @@ -25,10 +25,10 @@ import org.eclipse.edc.spi.asset.AssetIndex; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.asset.Asset; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.UUID; @@ -40,13 +40,19 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; import static org.eclipse.edc.spi.CoreConstants.EDC_PREFIX; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.Matchers.is; public class CatalogApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); @@ -56,17 +62,17 @@ class InMemory extends Tests implements InMemoryRuntime { @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } - } abstract static class Tests extends ManagementApiEndToEndTestBase { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java index 0d4997759f..d901f53928 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractAgreementApiEndToEndTest.java @@ -23,10 +23,10 @@ import org.eclipse.edc.spi.types.domain.agreement.ContractAgreement; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.spi.types.domain.offer.ContractOffer; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.List; import java.util.Set; @@ -35,13 +35,19 @@ import static io.restassured.http.ContentType.JSON; import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiationStates.FINALIZED; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.Matchers.is; public class ContractAgreementApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); @@ -51,17 +57,17 @@ class InMemory extends Tests implements InMemoryRuntime { @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } - } abstract static class Tests extends ManagementApiEndToEndTestBase { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java index 9c4f1c1dad..5008a09e0f 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractDefinitionApiEndToEndTest.java @@ -22,10 +22,10 @@ import org.eclipse.edc.junit.annotations.EndToEndTest; import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.UUID; @@ -40,6 +40,9 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VOCAB; import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; import static org.eclipse.edc.spi.query.Criterion.criterion; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; @@ -48,7 +51,10 @@ public class ContractDefinitionApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); @@ -58,17 +64,17 @@ class InMemory extends Tests implements InMemoryRuntime { @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } - } abstract static class Tests extends ManagementApiEndToEndTestBase { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java index 85bdd6eda3..9c2f88f478 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java @@ -27,10 +27,10 @@ import org.eclipse.edc.spi.types.domain.agreement.ContractAgreement; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.spi.types.domain.offer.ContractOffer; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.List; import java.util.Map; @@ -52,13 +52,19 @@ import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.EVENTS; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.IS_TRANSACTIONAL; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.URI; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.Matchers.is; public class ContractNegotiationApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); @@ -68,17 +74,17 @@ class InMemory extends Tests implements InMemoryRuntime { @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } - } abstract static class Tests extends ManagementApiEndToEndTestBase { diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/InMemoryRuntime.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/InMemoryRuntime.java deleted file mode 100644 index cae02ac174..0000000000 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/InMemoryRuntime.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation - * - */ - -package org.eclipse.edc.test.e2e.managementapi; - -import org.eclipse.edc.junit.extensions.EdcClassRuntimesExtension; -import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.extension.RegisterExtension; - -import java.util.HashMap; - -import static org.eclipse.edc.util.io.Ports.getFreePort; - -public interface InMemoryRuntime { - - EdcRuntimeExtension RUNTIME = new EdcRuntimeExtension( - "control-plane", - inMemoryConfiguration(), - ":system-tests:management-api:management-api-test-runtime" - ); - - @RegisterExtension - EdcClassRuntimesExtension RUNTIMES = new EdcClassRuntimesExtension(RUNTIME); - - @NotNull - static HashMap inMemoryConfiguration() { - return new HashMap<>() { - { - put("web.http.path", "/"); - put("web.http.protocol.path", "/protocol"); - put("web.http.protocol.port", String.valueOf(ManagementApiEndToEndTestBase.PROTOCOL_PORT)); - put("edc.dsp.callback.address", "http://localhost:" + ManagementApiEndToEndTestBase.PROTOCOL_PORT + "/protocol"); - put("web.http.port", String.valueOf(getFreePort())); - put("web.http.management.path", "/management"); - put("web.http.management.port", String.valueOf(ManagementApiEndToEndTestBase.PORT)); - } - }; - } - -} diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java index 9249dd3c52..310b2fba64 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java @@ -20,11 +20,15 @@ import org.eclipse.edc.junit.annotations.EndToEndTest; import org.eclipse.edc.junit.annotations.PostgresqlIntegrationTest; import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; +import org.eclipse.edc.policy.model.Action; +import org.eclipse.edc.policy.model.Duty; import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; +import org.eclipse.edc.policy.model.Prohibition; +import org.eclipse.edc.policy.model.Rule; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.HashMap; import java.util.Map; @@ -34,6 +38,7 @@ import static jakarta.json.Json.createObjectBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.InstanceOfAssertFactories.MAP; +import static org.assertj.core.api.InstanceOfAssertFactories.list; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.CONTEXT; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; @@ -43,6 +48,9 @@ import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; import static org.eclipse.edc.spi.CoreConstants.EDC_PREFIX; import static org.eclipse.edc.spi.query.Criterion.criterion; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; @@ -50,7 +58,10 @@ public class PolicyDefinitionApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); @@ -60,17 +71,17 @@ class InMemory extends Tests implements InMemoryRuntime { @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } - } abstract static class Tests extends ManagementApiEndToEndTestBase { @@ -98,19 +109,24 @@ void shouldStorePolicyDefinition() { .extract().jsonPath().getString(ID); assertThat(store().findById(id)).isNotNull() - .extracting(PolicyDefinition::getPolicy).isNotNull() - .extracting(Policy::getPermissions).asList().hasSize(1); + .extracting(PolicyDefinition::getPolicy).isNotNull().satisfies(policy -> { + assertThat(policy.getPermissions()).hasSize(1); + assertThat(policy.getProhibitions()).hasSize(1).first() + .extracting(Prohibition::getRemedies).asInstanceOf(list(Duty.class)).first() + .extracting(Rule::getAction).extracting(Action::getType).isEqualTo(ODRL_SCHEMA + "anonymize"); + }); baseRequest() .get("/v2/policydefinitions/" + id) .then() + .log().ifValidationFails() .statusCode(200) .contentType(JSON) .body(ID, is(id)) .body(CONTEXT, hasEntry(EDC_PREFIX, EDC_NAMESPACE)) .body(CONTEXT, hasEntry(ODRL_PREFIX, ODRL_SCHEMA)) - .log().all() - .body("policy.'odrl:permission'.'odrl:constraint'.'odrl:operator'.@id", is("odrl:eq")); + .body("policy.'odrl:permission'.'odrl:constraint'.'odrl:operator'.@id", is("odrl:eq")) + .body("policy.'odrl:prohibition'.'odrl:remedy'.'odrl:action'.'odrl:type'", is(ODRL_SCHEMA + "anonymize")); } @Test @@ -323,6 +339,13 @@ private JsonObject sampleOdrlPolicy() { .add("rightOperand", "value")) .build()) .build()) + .add("prohibition", createArrayBuilder() + .add(createObjectBuilder() + .add("target", "http://example.com/data:77") + .add("action", "index") + .add("remedy", createObjectBuilder() + .add("action", "anonymize")) + )) .build(); } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PostgresRuntime.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PostgresRuntime.java deleted file mode 100644 index 1dd6eba75c..0000000000 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PostgresRuntime.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - * - * Contributors: - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation - * - */ - -package org.eclipse.edc.test.e2e.managementapi; - -import org.eclipse.edc.junit.extensions.EdcClassRuntimesExtension; -import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.jetbrains.annotations.NotNull; -import org.junit.jupiter.api.extension.RegisterExtension; - -import java.util.HashMap; - -import static org.eclipse.edc.test.e2e.managementapi.InMemoryRuntime.inMemoryConfiguration; - -public interface PostgresRuntime { - - EdcRuntimeExtension RUNTIME = new EdcRuntimeExtension( - "control-plane", - postgresqlConfiguration(), - ":system-tests:management-api:management-api-test-runtime", - ":extensions:control-plane:store:sql:control-plane-sql", - ":extensions:common:sql:sql-pool:sql-pool-apache-commons", - ":extensions:common:transaction:transaction-local" - ); - - @RegisterExtension - EdcClassRuntimesExtension RUNTIMES = new EdcClassRuntimesExtension(RUNTIME); - - @NotNull - static HashMap postgresqlConfiguration() { - var config = new HashMap() { - { - put("edc.datasource.default.url", PostgresqlEndToEndInstance.JDBC_URL_PREFIX + "runtime"); - put("edc.datasource.default.user", PostgresqlEndToEndInstance.USER); - put("edc.datasource.default.password", PostgresqlEndToEndInstance.PASSWORD); - } - }; - - config.putAll(inMemoryConfiguration()); - return config; - } - -} diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/Runtimes.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/Runtimes.java new file mode 100644 index 0000000000..fca190704d --- /dev/null +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/Runtimes.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +package org.eclipse.edc.test.e2e.managementapi; + +import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; +import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; + +import static org.eclipse.edc.util.io.Ports.getFreePort; + +public interface Runtimes { + + static EdcRuntimeExtension inMemoryRuntime() { + return new EdcRuntimeExtension( + "control-plane", + inMemoryConfiguration(), + ":system-tests:management-api:management-api-test-runtime" + ); + } + + static EdcRuntimeExtension postgresRuntime() { + return new EdcRuntimeExtension( + "control-plane", + postgresqlConfiguration(), + ":system-tests:management-api:management-api-test-runtime", + ":extensions:control-plane:store:sql:control-plane-sql", + ":extensions:common:sql:sql-pool:sql-pool-apache-commons", + ":extensions:common:transaction:transaction-local" + ); + } + + @NotNull + static HashMap inMemoryConfiguration() { + return new HashMap<>() { + { + put("web.http.path", "/"); + put("web.http.protocol.path", "/protocol"); + put("web.http.protocol.port", String.valueOf(ManagementApiEndToEndTestBase.PROTOCOL_PORT)); + put("edc.dsp.callback.address", "http://localhost:" + ManagementApiEndToEndTestBase.PROTOCOL_PORT + "/protocol"); + put("web.http.port", String.valueOf(getFreePort())); + put("web.http.management.path", "/management"); + put("web.http.management.port", String.valueOf(ManagementApiEndToEndTestBase.PORT)); + } + }; + } + + @NotNull + static HashMap postgresqlConfiguration() { + var config = new HashMap() { + { + put("edc.datasource.default.url", PostgresqlEndToEndInstance.JDBC_URL_PREFIX + "runtime"); + put("edc.datasource.default.user", PostgresqlEndToEndInstance.USER); + put("edc.datasource.default.password", PostgresqlEndToEndInstance.PASSWORD); + } + }; + + config.putAll(inMemoryConfiguration()); + return config; + } +} diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java index cbdadf3fde..7fd0a3bdbb 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java @@ -27,10 +27,10 @@ import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; -import org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.RegisterExtension; import java.util.List; import java.util.UUID; @@ -51,6 +51,9 @@ import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.EVENTS; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.IS_TRANSACTIONAL; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.URI; +import static org.eclipse.edc.sql.testfixtures.PostgresqlEndToEndInstance.createDatabase; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.inMemoryRuntime; +import static org.eclipse.edc.test.e2e.managementapi.Runtimes.postgresRuntime; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.Matchers.is; @@ -58,7 +61,10 @@ public class TransferProcessApiEndToEndTest { @Nested @EndToEndTest - class InMemory extends Tests implements InMemoryRuntime { + class InMemory extends Tests { + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = inMemoryRuntime(); InMemory() { super(RUNTIME); @@ -68,17 +74,17 @@ class InMemory extends Tests implements InMemoryRuntime { @Nested @PostgresqlIntegrationTest - class Postgres extends Tests implements PostgresRuntime { + class Postgres extends Tests { + + @RegisterExtension + static final BeforeAllCallback CREATE_DATABASE = context -> createDatabase("runtime"); + + @RegisterExtension + public static final EdcRuntimeExtension RUNTIME = postgresRuntime(); Postgres() { super(RUNTIME); } - - @BeforeAll - static void beforeAll() { - PostgresqlEndToEndInstance.createDatabase("runtime"); - } - } abstract static class Tests extends ManagementApiEndToEndTestBase {