Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(tests): adds SSI E2E test for ContractNegotiation failure #529

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* 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.tractusx.edc.tests.negotiation;

import jakarta.json.Json;
import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiationStates;
import org.eclipse.tractusx.edc.lifecycle.Participant;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.time.Duration;
import java.util.Map;

import static java.time.Duration.ofSeconds;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE;
import static org.eclipse.tractusx.edc.helpers.PolicyHelperFunctions.businessPartnerNumberPolicy;
import static org.eclipse.tractusx.edc.helpers.PolicyHelperFunctions.frameworkPolicy;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.PLATO_BPN;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.PLATO_NAME;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.SOKRATES_BPN;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.SOKRATES_NAME;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.platoConfiguration;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.sokratesConfiguration;

public abstract class AbstractContractNegotiateTest {

protected static final Participant SOKRATES = new Participant(SOKRATES_NAME, SOKRATES_BPN, sokratesConfiguration());
protected static final Participant PLATO = new Participant(PLATO_NAME, PLATO_BPN, platoConfiguration());
private static final Duration ASYNC_TIMEOUT = ofSeconds(45);
private static final Duration ASYNC_POLL_INTERVAL = ofSeconds(1);

@Test
@DisplayName("Verify contract negotiation fails with wrong policy")
void contractNegotiation_shouldFail_whenPolicyEvaluationFails() {
var assetId = "api-asset-1";
var authCodeHeaderName = "test-authkey";
var authCode = "test-authcode";

PLATO.createAsset(assetId, Json.createObjectBuilder().build(), Json.createObjectBuilder()
.add(EDC_NAMESPACE + "type", "HttpData")
.add(EDC_NAMESPACE + "contentType", "application/json")
.add(EDC_NAMESPACE + "baseUrl", "http://testurl")
.add(EDC_NAMESPACE + "authKey", authCodeHeaderName)
.add(EDC_NAMESPACE + "authCode", authCode)
.build());

PLATO.createPolicy(businessPartnerNumberPolicy("policy-1", SOKRATES.getBpn()));
PLATO.createPolicy(frameworkPolicy("policy-2", Map.of("Dismantler", "active")));
PLATO.createContractDefinition(assetId, "def-1", "policy-1", "policy-2");

var negotiationId = SOKRATES.negotiateContract(PLATO, assetId);

// wait for the failed contract negotiation
await().pollInterval(ASYNC_POLL_INTERVAL)
.atMost(ASYNC_TIMEOUT)
.untilAsserted(() -> {
var negotiationState = SOKRATES.getNegotiationState(negotiationId);
assertThat(negotiationState).isEqualTo(ContractNegotiationStates.TERMINATED.toString());
var error = SOKRATES.getContractNegotiationError(negotiationId);

assertThat(error).isNotNull();
assertThat(error).contains("Contract offer is not valid: Policy policy-2 not fulfilled");
});
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* 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.tractusx.edc.tests.negotiation;

import okhttp3.mockwebserver.MockWebServer;
import org.eclipse.edc.junit.annotations.EndToEndTest;
import org.eclipse.tractusx.edc.lifecycle.ParticipantRuntime;
import org.eclipse.tractusx.edc.token.KeycloakDispatcher;
import org.eclipse.tractusx.edc.token.MiwDispatcher;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.RegisterExtension;

import java.io.IOException;

import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.MIW_PLATO_PORT;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.MIW_SOKRATES_PORT;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.OAUTH_PORT;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.PLATO_BPN;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.PLATO_DSP_CALLBACK;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.PLATO_NAME;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.SOKRATES_BPN;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.SOKRATES_DSP_CALLBACK;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.SOKRATES_NAME;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.platoSsiConfiguration;
import static org.eclipse.tractusx.edc.lifecycle.TestRuntimeConfiguration.sokratesSsiConfiguration;

@EndToEndTest
public class SsiContractNegotiationInMemoryTest extends AbstractContractNegotiateTest {
public static final String SUMMARY_VC_TEMPLATE = "summary-vc-no-dismantler.json";

@RegisterExtension
protected static final ParticipantRuntime PLATO_RUNTIME = new ParticipantRuntime(
":edc-tests:runtime:runtime-memory-ssi",
PLATO_NAME,
PLATO_BPN,
platoSsiConfiguration()
);

@RegisterExtension
protected static final ParticipantRuntime SOKRATES_RUNTIME = new ParticipantRuntime(
":edc-tests:runtime:runtime-memory-ssi",
SOKRATES_NAME,
SOKRATES_BPN,
sokratesSsiConfiguration()
);
MockWebServer miwSokratesServer;
MockWebServer miwPlatoServer;
MockWebServer oauthServer;


@BeforeEach
void setup() throws IOException {
miwSokratesServer = new MockWebServer();
miwPlatoServer = new MockWebServer();
oauthServer = new MockWebServer();

miwSokratesServer.start(MIW_SOKRATES_PORT);
miwSokratesServer.setDispatcher(new MiwDispatcher(SOKRATES_BPN, SUMMARY_VC_TEMPLATE, PLATO_DSP_CALLBACK));

miwPlatoServer.start(MIW_PLATO_PORT);
miwPlatoServer.setDispatcher(new MiwDispatcher(PLATO_BPN, SUMMARY_VC_TEMPLATE, SOKRATES_DSP_CALLBACK));

oauthServer.start(OAUTH_PORT);
oauthServer.setDispatcher(new KeycloakDispatcher());
}

@AfterEach
void teardown() throws IOException {
miwSokratesServer.shutdown();
miwPlatoServer.shutdown();
oauthServer.shutdown();
}
}