Skip to content

Commit 938a500

Browse files
committed
Add integration test covering the case where Request parameters are provided when querying the Data Plane public API
1 parent 14ad3cd commit 938a500

File tree

7 files changed

+58
-62
lines changed

7 files changed

+58
-62
lines changed

extensions/iam/decentralized-identity/identity-did-service/src/main/java/org/eclipse/dataspaceconnector/identity/DecentralizedIdentityService.java

+4-11
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,8 @@
2222
import org.eclipse.dataspaceconnector.iam.did.spi.credentials.CredentialsVerifier;
2323
import org.eclipse.dataspaceconnector.iam.did.spi.document.DidConstants;
2424
import org.eclipse.dataspaceconnector.iam.did.spi.document.DidDocument;
25-
import org.eclipse.dataspaceconnector.iam.did.spi.document.JwkPublicKey;
26-
import org.eclipse.dataspaceconnector.iam.did.spi.document.Service;
2725
import org.eclipse.dataspaceconnector.iam.did.spi.document.VerificationMethod;
2826
import org.eclipse.dataspaceconnector.iam.did.spi.key.PrivateKeyWrapper;
29-
import org.eclipse.dataspaceconnector.iam.did.spi.key.PublicKeyWrapper;
3027
import org.eclipse.dataspaceconnector.iam.did.spi.resolution.DidResolverRegistry;
3128
import org.eclipse.dataspaceconnector.spi.iam.ClaimToken;
3229
import org.eclipse.dataspaceconnector.spi.iam.IdentityService;
@@ -78,17 +75,17 @@ public Result<ClaimToken> verifyJwtToken(TokenRepresentation tokenRepresentation
7875
monitor.debug("Extracting public key");
7976

8077
// this will return the _first_ public key entry
81-
Optional<VerificationMethod> publicKey = getPublicKey(didResult.getContent());
78+
var publicKey = getPublicKey(didResult.getContent());
8279
if (publicKey.isEmpty()) {
8380
return Result.failure("Public Key not found in DID Document!");
8481
}
8582

8683
//convert the POJO into a usable PK-wrapper:
87-
JwkPublicKey publicKeyJwk = publicKey.get().getPublicKeyJwk();
88-
PublicKeyWrapper publicKeyWrapper = KeyConverter.toPublicKeyWrapper(publicKeyJwk, publicKey.get().getId());
84+
var publicKeyJwk = publicKey.get().getPublicKeyJwk();
85+
var publicKeyWrapper = KeyConverter.toPublicKeyWrapper(publicKeyJwk, publicKey.get().getId());
8986

9087
monitor.debug("Verifying JWT with public key...");
91-
Result<Void> verified = VerifiableCredentialFactory.verify(jwt, publicKeyWrapper, audience);
88+
var verified = VerifiableCredentialFactory.verify(jwt, publicKeyWrapper, audience);
9289
if (verified.failed()) {
9390
verified.getFailureMessages().forEach(m -> monitor.debug(() -> "Failure in token verification: " + m));
9491
return Result.failure("Token could not be verified!");
@@ -108,10 +105,6 @@ public Result<ClaimToken> verifyJwtToken(TokenRepresentation tokenRepresentation
108105
}
109106
}
110107

111-
String getHubUrl(DidDocument did) {
112-
return did.getService().stream().filter(service -> service.getType().equals(DidConstants.HUB_URL)).map(Service::getServiceEndpoint).findFirst().orElseThrow();
113-
}
114-
115108
@NotNull
116109
private Optional<VerificationMethod> getPublicKey(DidDocument did) {
117110
return did.getVerificationMethod().stream().filter(vm -> DidConstants.ALLOWED_VERIFICATION_TYPES.contains(vm.getType())).findFirst();

extensions/iam/decentralized-identity/identity-did-service/src/test/java/org/eclipse/dataspaceconnector/identity/DecentralizedIdentityServiceTest.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.junit.jupiter.api.BeforeEach;
3636
import org.junit.jupiter.api.Test;
3737

38-
import java.io.IOException;
3938
import java.time.Clock;
4039
import java.util.Map;
4140

@@ -52,15 +51,9 @@ abstract class DecentralizedIdentityServiceTest {
5251
private static final Faker FAKER = new Faker();
5352
private static final String DID_DOCUMENT = getResourceFileContentAsString("dids.json");
5453

55-
String didUrl = FAKER.internet().url();
54+
private final String didUrl = FAKER.internet().url();
5655
private DecentralizedIdentityService identityService;
5756

58-
@Test
59-
void verifyResolveHubUrl() throws IOException {
60-
var url = identityService.getHubUrl(new ObjectMapper().readValue(DID_DOCUMENT, DidDocument.class));
61-
assertEquals("https://myhub.com", url);
62-
}
63-
6457
@Test
6558
void generateAndVerifyJwtToken_valid() {
6659
var result = identityService.obtainClientCredentials(TokenParameters.Builder.newInstance()

system-tests/e2e-transfer-test/backend-service/src/main/java/org/eclipse/dataspaceconnector/test/e2e/BackendServiceTestExtension.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public String name() {
4141
public void initialize(ServiceExtensionContext context) {
4242
var exposedHttpPort = context.getConfig().getInteger("web.http.port");
4343
webService.registerResource(new ProviderBackendApiController());
44-
webService.registerResource(new ConsumerBackendServiceController(context.getMonitor(), okHttpClient));
44+
webService.registerResource(new ConsumerBackendServiceController(context.getMonitor()));
4545
webService.registerResource(new BackendServiceHttpProvisionerController(context.getMonitor(), okHttpClient, typeManager, exposedHttpPort));
4646
}
4747
}

system-tests/e2e-transfer-test/backend-service/src/main/java/org/eclipse/dataspaceconnector/test/e2e/ConsumerBackendServiceController.java

+12-27
Original file line numberDiff line numberDiff line change
@@ -20,50 +20,35 @@
2020
import jakarta.ws.rs.Path;
2121
import jakarta.ws.rs.Produces;
2222
import jakarta.ws.rs.core.MediaType;
23-
import okhttp3.OkHttpClient;
24-
import okhttp3.Request;
2523
import org.eclipse.dataspaceconnector.spi.monitor.Monitor;
2624
import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference;
2725

2826
import java.util.concurrent.atomic.AtomicReference;
2927

30-
import static java.lang.String.format;
31-
3228
@Path("/consumer")
3329
public class ConsumerBackendServiceController {
3430

3531
private final Monitor monitor;
36-
private final OkHttpClient httpClient;
3732
private final AtomicReference<String> data = new AtomicReference<>();
33+
private final AtomicReference<EndpointDataReference> dataReference = new AtomicReference<>();
3834

39-
public ConsumerBackendServiceController(Monitor monitor, OkHttpClient httpClient) {
35+
public ConsumerBackendServiceController(Monitor monitor) {
4036
this.monitor = monitor;
41-
this.httpClient = httpClient;
4237
}
4338

44-
@Path("/pull")
39+
@Path("/dataReference")
4540
@POST
4641
@Consumes({ MediaType.APPLICATION_JSON })
47-
public void pullData(EndpointDataReference dataReference) {
48-
String url = dataReference.getEndpoint();
49-
monitor.debug("Endpoint Data Reference received, will call data plane at " + url);
50-
var request = new Request.Builder()
51-
.url(url)
52-
.addHeader(dataReference.getAuthKey(), dataReference.getAuthCode())
53-
.build();
42+
public void pushDataReference(EndpointDataReference edr) {
43+
monitor.debug("Received new endpoint data reference with url " + edr.getEndpoint());
44+
dataReference.set(edr);
45+
}
5446

55-
try (var response = httpClient.newCall(request).execute()) {
56-
var body = response.body();
57-
var string = body.string();
58-
if (response.isSuccessful()) {
59-
monitor.info("Data plane responded correctly: " + string);
60-
data.set(string);
61-
} else {
62-
monitor.warning(format("Data plane responded with error: %s %s", response.code(), string));
63-
}
64-
} catch (Exception e) {
65-
monitor.severe(format("Error in calling the data plane at %s", url), e);
66-
}
47+
@Path("/dataReference")
48+
@GET
49+
@Produces({ MediaType.APPLICATION_JSON })
50+
public EndpointDataReference getDataReference() {
51+
return dataReference.get();
6752
}
6853

6954
@Path("/store")

system-tests/e2e-transfer-test/backend-service/src/main/java/org/eclipse/dataspaceconnector/test/e2e/ProviderBackendApiController.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@
1717
import jakarta.ws.rs.GET;
1818
import jakarta.ws.rs.Path;
1919
import jakarta.ws.rs.Produces;
20+
import jakarta.ws.rs.core.Context;
2021
import jakarta.ws.rs.core.MediaType;
22+
import jakarta.ws.rs.core.UriInfo;
2123

2224
import java.util.Map;
2325

2426
@Path("/provider")
2527
public class ProviderBackendApiController {
26-
28+
2729
@Path("/data")
2830
@GET
2931
@Produces(MediaType.APPLICATION_JSON)
30-
public Map<String, String> getData() {
32+
public Map<String, String> getData(@Context UriInfo uriInfo) {
3133
return Map.of("message", "some information");
3234
}
3335
}

system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/dataspaceconnector/test/e2e/AbstractEndToEndTransfer.java

+35-12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import org.eclipse.dataspaceconnector.spi.types.domain.DataAddress;
1818
import org.eclipse.dataspaceconnector.spi.types.domain.HttpDataAddress;
19+
import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference;
1920
import org.junit.jupiter.api.Test;
2021

2122
import java.time.Duration;
@@ -37,7 +38,7 @@ public abstract class AbstractEndToEndTransfer {
3738
void httpPullDataTransfer() {
3839
PROVIDER.registerDataPlane();
3940
CONSUMER.registerDataPlane();
40-
String definitionId = "1";
41+
var definitionId = "1";
4142
createAssetAndContractDefinitionOnProvider("asset-id", definitionId, "HttpData");
4243

4344
var catalog = CONSUMER.getCatalog(PROVIDER.idsEndpoint());
@@ -57,15 +58,26 @@ void httpPullDataTransfer() {
5758
assertThat(state).isEqualTo(COMPLETED.name());
5859
});
5960

60-
await().atMost(timeout).untilAsserted(() -> {
61-
given()
62-
.baseUri(CONSUMER.backendService().toString())
63-
.when()
64-
.get("/api/consumer/data")
65-
.then()
66-
.statusCode(200)
67-
.body("message", equalTo("some information"));
68-
});
61+
// retrieve the data reference
62+
var edr = given()
63+
.baseUri(CONSUMER.backendService().toString())
64+
.when()
65+
.get("/api/consumer/dataReference")
66+
.then()
67+
.statusCode(200)
68+
.extract()
69+
.body()
70+
.as(EndpointDataReference.class);
71+
72+
// pull the data
73+
await().atMost(timeout).untilAsserted(() -> given()
74+
.baseUri(edr.getEndpoint())
75+
.header(edr.getAuthKey(), edr.getAuthCode())
76+
.when()
77+
.get()
78+
.then()
79+
.statusCode(200)
80+
.body("message", equalTo("some information")));
6981
}
7082

7183
@Test
@@ -95,11 +107,22 @@ void httpPullDataTransferProvisioner() {
95107
assertThat(state).isEqualTo(COMPLETED.name());
96108
});
97109

110+
var edr = given()
111+
.baseUri(CONSUMER.backendService().toString())
112+
.when()
113+
.get("/api/consumer/dataReference")
114+
.then()
115+
.statusCode(200)
116+
.extract()
117+
.body()
118+
.as(EndpointDataReference.class);
119+
98120
await().atMost(timeout).untilAsserted(() -> {
99121
given()
100-
.baseUri(CONSUMER.backendService().toString())
122+
.baseUri(edr.getEndpoint())
123+
.header(edr.getAuthKey(), edr.getAuthCode())
101124
.when()
102-
.get("/api/consumer/data")
125+
.get()
103126
.then()
104127
.statusCode(200)
105128
.body("message", equalTo("some information"));

system-tests/e2e-transfer-test/runner/src/test/java/org/eclipse/dataspaceconnector/test/e2e/Participant.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public Map<String, String> controlPlaneConfiguration() {
264264
put("edc.keystore", resourceAbsolutePath("certs/cert.pfx"));
265265
put("edc.keystore.password", "123456");
266266
put("ids.webhook.address", idsEndpoint.toString());
267-
put("edc.receiver.http.endpoint", backendService + "/api/consumer/pull");
267+
put("edc.receiver.http.endpoint", backendService + "/api/consumer/dataReference");
268268
put("edc.transfer.proxy.token.signer.privatekey.alias", "1");
269269
put("edc.transfer.proxy.token.verifier.publickey.alias", "public-key");
270270
put("edc.transfer.proxy.endpoint", dataPlanePublic.toString());

0 commit comments

Comments
 (0)