From 980e43a3efb0d5e5e54fd0211f9d4333508332f2 Mon Sep 17 00:00:00 2001 From: Paul Latzelsperger <43503240+paullatzelsperger@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:11:16 +0200 Subject: [PATCH] feat(ci): improve CI workflows (#295) * feat(ci): add stalebot * update dependabot, add cron * removed unused collection * fix tests * checkstyle --- .github/dependabot.yml | 17 +- .github/workflows/run-terraform.yml | 2 + .github/workflows/stale-bot.yml | 31 + deployment/assets/postgres/edc_schema.sql | 2 + deployment/postman/management_api_tests.json | 568 ------------------ .../tests/transfer/TransferEndToEndTest.java | 15 +- 6 files changed, 55 insertions(+), 580 deletions(-) create mode 100644 .github/workflows/stale-bot.yml delete mode 100644 deployment/postman/management_api_tests.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 32b46ffd..31680827 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -43,7 +43,7 @@ updates: - dependency-name: "org.eclipse.edc:edc-versions" - package-ecosystem: "terraform" - directory: "/mxd" + directory: "/deployment" schedule: interval: "weekly" open-pull-requests-limit: 5 @@ -51,11 +51,12 @@ updates: - "dependencies" - "terraform" - - package-ecosystem: "npm" - directory: "/edc-policy-playground" - schedule: - interval: "weekly" - open-pull-requests-limit: 5 + # Docker + - package-ecosystem: "docker" + target-branch: main + directory: "./launchers" labels: - - "dependencies" - - "npm" + - "dependabot" + - "docker" + schedule: + interval: "weekly" \ No newline at end of file diff --git a/.github/workflows/run-terraform.yml b/.github/workflows/run-terraform.yml index 8f83c8c8..8130d2ba 100644 --- a/.github/workflows/run-terraform.yml +++ b/.github/workflows/run-terraform.yml @@ -24,6 +24,8 @@ on: pull_request: branches: - main + schedule: + - cron: "0 0 * * *" # once a day (1:30 UTC) # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml new file mode 100644 index 00000000..588150f3 --- /dev/null +++ b/.github/workflows/stale-bot.yml @@ -0,0 +1,31 @@ +# +# Copyright (c) 2024 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +name: Close Inactive Issues + +on: + schedule: + - cron: "30 1 * * *" # once a day (1:30 UTC) + workflow_dispatch: # allow manual trigger + +jobs: + trigger-workflow: + uses: eclipse-edc/.github/.github/workflows/stale-bot.yml@main + secrets: + envGH: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/deployment/assets/postgres/edc_schema.sql b/deployment/assets/postgres/edc_schema.sql index 8e5428cc..6734fddb 100644 --- a/deployment/assets/postgres/edc_schema.sql +++ b/deployment/assets/postgres/edc_schema.sql @@ -131,6 +131,7 @@ CREATE TABLE IF NOT EXISTS edc_policydefinitions permissions JSON, prohibitions JSON, duties JSON, + profiles JSON, extensible_properties JSON, inherits_from VARCHAR, assigner VARCHAR, @@ -144,6 +145,7 @@ CREATE TABLE IF NOT EXISTS edc_policydefinitions COMMENT ON COLUMN edc_policydefinitions.permissions IS 'Java List serialized as JSON'; COMMENT ON COLUMN edc_policydefinitions.prohibitions IS 'Java List serialized as JSON'; COMMENT ON COLUMN edc_policydefinitions.duties IS 'Java List serialized as JSON'; +COMMENT ON COLUMN edc_policydefinitions.profiles IS 'Java List serialized as JSON'; COMMENT ON COLUMN edc_policydefinitions.extensible_properties IS 'Java Map serialized as JSON'; COMMENT ON COLUMN edc_policydefinitions.policy_type IS 'Java PolicyType serialized as JSON'; diff --git a/deployment/postman/management_api_tests.json b/deployment/postman/management_api_tests.json deleted file mode 100644 index 56690b65..00000000 --- a/deployment/postman/management_api_tests.json +++ /dev/null @@ -1,568 +0,0 @@ -{ - "info": { - "_postman_id": "f510a19c-4214-480b-a79a-55796d03d286", - "name": "MXD Management API 11-sep-2023", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "29243509" - }, - "item": [ - { - "name": "Create Assets BOB Management", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "pm.test(\"Asessts Created for BOB\", function () {", - " var jsonData = pm.response.json();", - " console.log(jsonData[\"@id\"]);", - " pm.expect(jsonData[\"@id\"]).to.eql(\"2222\")", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {},\n \"asset\": {\n \"@type\": \"Asset\",\n \"@id\": \"2222\", \n \"properties\": {\n \"description\": \"Product EDC Demo Asset 1\"\n }\n },\n \"dataAddress\": {\n \"@type\": \"DataAddress\",\n \"type\": \"HttpData\",\n \"baseUrl\": \"https://jsonplaceholder.typicode.com/todos\"\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/assets", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "assets" - ] - } - }, - "response": [] - }, - { - "name": "Create Asset Alice MANAGEMENT", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "pm.test(\"Asessts Created for Alice\", function () {", - " var jsonData = pm.response.json();", - " console.log(jsonData[\"@id\"]);", - " pm.expect(jsonData[\"@id\"]).to.eql(\"2222\")", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {},\n \"asset\": {\n \"@type\": \"Asset\",\n \"@id\": \"2222\", \n \"properties\": {\n \"description\": \"Product EDC Demo Asset 2\"\n }\n },\n \"dataAddress\": {\n \"@type\": \"DataAddress\",\n \"type\": \"HttpData\",\n \"baseUrl\": \"https://jsonplaceholder.typicode.com/todos\"\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{Alice_MANAGEMENT_URL}}/assets", - "host": [ - "{{Alice_MANAGEMENT_URL}}" - ], - "path": [ - "assets" - ] - } - }, - "response": [] - }, - { - "name": "Create Policy BOB_MANAGEMENT_URL", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "pm.test(\"Policy Created for BOB\", function () {", - " var jsonData = pm.response.json();", - " console.log(jsonData[\"@id\"]);", - " pm.expect(jsonData[\"@id\"]).to.eql(\"2222\")", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {\n \"odrl\": \"http://www.w3.org/ns/odrl/2/\"\n },\n \"@type\": \"PolicyDefinitionRequestDto\",\n \"@id\": \"2222\",\n \"policy\": {\n\t\t\"@type\": \"Policy\",\n\t\t\"odrl:permission\" : [{\n\t\t\t\"odrl:action\" : \"USE\",\n\t\t\t\"odrl:constraint\" : {\n\t\t\t\t\"@type\": \"LogicalConstraint\",\n\t\t\t\t\"odrl:or\" : [{\n\t\t\t\t\t\"@type\" : \"Constraint\",\n\t\t\t\t\t\"odrl:leftOperand\" : \"BusinessPartnerNumber\",\n\t\t\t\t\t\"odrl:operator\" : {\n \"@id\": \"odrl:eq\"\n },\n\t\t\t\t\t\"odrl:rightOperand\" : \"{{POLICY_BPN}}\"\n\t\t\t\t}]\n\t\t\t}\n\t\t}]\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/policydefinitions", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "policydefinitions" - ] - } - }, - "response": [] - }, - { - "name": "Create Policy Alice_MANAGEMENT_URL", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "pm.test(\"Policy Created for Alice\", function () {", - " var jsonData = pm.response.json();", - " console.log(jsonData[\"@id\"]);", - " pm.expect(jsonData[\"@id\"]).to.eql(\"2222\")", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {\n \"odrl\": \"http://www.w3.org/ns/odrl/2/\"\n },\n \"@type\": \"PolicyDefinitionRequestDto\",\n \"@id\": \"2222\",\n \"policy\": {\n\t\t\"@type\": \"Policy\",\n\t\t\"odrl:permission\" : [{\n\t\t\t\"odrl:action\" : \"USE\",\n\t\t\t\"odrl:constraint\" : {\n\t\t\t\t\"@type\": \"LogicalConstraint\",\n\t\t\t\t\"odrl:or\" : [{\n\t\t\t\t\t\"@type\" : \"Constraint\",\n\t\t\t\t\t\"odrl:leftOperand\" : \"BusinessPartnerNumber\",\n\t\t\t\t\t\"odrl:operator\" : {\n \"@id\": \"odrl:eq\"\n },\n\t\t\t\t\t\"odrl:rightOperand\" : \"{{POLICY_BPN}}\"\n\t\t\t\t}]\n\t\t\t}\n\t\t}]\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{Alice_MANAGEMENT_URL}}/policydefinitions", - "host": [ - "{{Alice_MANAGEMENT_URL}}" - ], - "path": [ - "policydefinitions" - ] - } - }, - "response": [] - }, - { - "name": "Create Contract Definition BOB_MANAGEMENT_URL", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "", - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "pm.test(\"Contract Definition for BOB\", function () {", - " var jsonData = pm.response.json();", - " console.log(jsonData[\"@id\"]);", - " pm.expect(jsonData[\"@id\"]).to.eql(\"2222\")", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {},\n \"@id\": \"2222\",\n \"@type\": \"ContractDefinition\",\n \"accessPolicyId\": \"1\",\n \"contractPolicyId\": \"1\",\n \"assetsSelector\" : {\n \"@type\" : \"CriterionDto\",\n \"operandLeft\": \"{{EDC_NAMESPACE}}id\",\n \"operator\": \"=\",\n \"operandRight\": \"1\"\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/contractdefinitions", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "contractdefinitions" - ] - } - }, - "response": [] - }, - { - "name": "Create Contract Definition Alice_MANAGEMENT_URL", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "pm.test(\"Contract Definition for Alice\", function () {", - " var jsonData = pm.response.json();", - " console.log(jsonData[\"@id\"]);", - " pm.expect(jsonData[\"@id\"]).to.eql(\"2222\")", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {},\n \"@id\": \"2222\",\n \"@type\": \"ContractDefinition\",\n \"accessPolicyId\": \"1\",\n \"contractPolicyId\": \"1\",\n \"assetsSelector\" : {\n \"@type\" : \"CriterionDto\",\n \"operandLeft\": \"{{EDC_NAMESPACE}}id\",\n \"operator\": \"=\",\n \"operandRight\": \"1\"\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{Alice_MANAGEMENT_URL}}/contractdefinitions", - "host": [ - "{{Alice_MANAGEMENT_URL}}" - ], - "path": [ - "contractdefinitions" - ] - } - }, - "response": [] - }, - { - "name": "Get all Policies", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "pm.test(\"Get the All Created Policies \", function () {\r", - " var jsonData = pm.response.json();\r", - " console.log(jsonData[0][\"@id\"]);\r", - " pm.expect(jsonData[0][\"@id\"]).to.eql(\"1\");\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "raw", - "raw": "{\n \"@context\": {\n \"odrl\": \"http://www.w3.org/ns/odrl/2/\"\n },\n \"id\": \"{{POLICY_ID}}\",\n \"policy\": {\n \"prohibitions\": [],\n \"obligations\": [],\n \"permissions\": [\n {\n \"edctype\": \"dataspaceconnector:permission\",\n \"action\": {\n \"type\": \"USE\"\n },\n \"constraints\": []\n }\n ]\n }\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/policydefinitions/request", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "policydefinitions", - "request" - ] - } - }, - "response": [] - }, - { - "name": "Get all Assets", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "pm.test(\"Get the All Created Policies\", function () {\r", - " var jsonData = pm.response.json();\r", - " console.log(jsonData[0][\"@id\"]);\r", - " pm.expect(jsonData[0][\"@id\"]).to.eql(\"1\");\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/assets/request", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "assets", - "request" - ] - } - }, - "response": [] - }, - { - "name": "Query Catalog Bob to Alice", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "\r", - "pm.test(\"Query Catalog Fetch Successful\", function () {\r", - " var jsonData = pm.response.json();\r", - " console.log(jsonData[\"dcat:dataset\"][0][\"@id\"]);\r", - " pm.expect(jsonData[\"dcat:dataset\"][0][\"@id\"]).to.eql(\"1\");\r", - "});\r", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "X-Api-Key", - "value": "password", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"@context\": {\r\n \"edc\": \"https://w3id.org/edc/v0.0.1/ns/\"\r\n },\r\n \"@type\": \"CatalogRequest\",\r\n \"providerUrl\": \"\",\r\n \"counterPartyAddress\":\"{{Alice_PROVIDER_PROTOCOL_URL}}\",\r\n \"protocol\": \"dataspace-protocol-http\",\r\n \"querySpec\": {\r\n \"offset\": 0,\r\n \"limit\": 50\r\n }\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/catalog/request", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "catalog", - "request" - ] - } - }, - "response": [] - }, - { - "name": "Query Catalog Alice to BOB", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {\r", - " pm.response.to.have.status(200);\r", - "});\r", - "pm.test(\"Query Catalog Fetch Successful\", function () {\r", - " var jsonData = pm.response.json();\r", - " console.log(jsonData[\"dcat:dataset\"][0][\"@id\"]);\r", - " pm.expect(jsonData[\"dcat:dataset\"][0][\"@id\"]).to.eql(\"1\");\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "X-Api-Key", - "value": "password", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\r\n \"@context\": {\r\n \"edc\": \"https://w3id.org/edc/v0.0.1/ns/\"\r\n },\r\n \"@type\": \"CatalogRequest\",\r\n \"providerUrl\": \"\",\r\n \"counterPartyAddress\":\"{{Alice_PROVIDER_PROTOCOL_URL}}\",\r\n \"protocol\": \"dataspace-protocol-http\",\r\n \"querySpec\": {\r\n \"offset\": 0,\r\n \"limit\": 50\r\n }\r\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{BOB_MANAGEMENT_URL}}/catalog/request", - "host": [ - "{{BOB_MANAGEMENT_URL}}" - ], - "path": [ - "catalog", - "request" - ] - } - }, - "response": [] - } - ], - "auth": { - "type": "apikey", - "apikey": [ - { - "key": "value", - "value": "password", - "type": "string" - }, - { - "key": "key", - "value": "X-Api-Key", - "type": "string" - } - ] - }, - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "ASSET_ID", - "value": "1", - "type": "default" - }, - { - "key": "POLICY_ID", - "value": "1", - "type": "default" - }, - { - "key": "CONTRACT_POLICY_ID", - "value": "1", - "type": "default" - }, - { - "key": "ACCESS_POLICY_ID", - "value": "1", - "type": "default" - }, - { - "key": "CONTRACT_DEFINITION_ID", - "value": "1", - "type": "default" - }, - { - "key": "POLICY_BPN", - "value": "BPNBOB", - "type": "default" - }, - { - "key": "BACKEND_SERVICE", - "value": "http://backend:8080", - "type": "string" - }, - { - "key": "PROVIDER_ID", - "value": "BPNPLATO", - "type": "string" - }, - { - "key": "EDC_NAMESPACE", - "value": "https://w3id.org/edc/v0.0.1/ns/", - "type": "string" - }, - { - "key": "CONSUMER_ADAPTER_URL", - "value": "http://localhost:31364/management", - "type": "string" - }, - { - "key": "BOB_MANAGEMENT_URL", - "value": "http://localhost/bob/management/v2", - "type": "string" - }, - { - "key": "Alice_MANAGEMENT_URL", - "value": "http://localhost/alice/management/v2", - "type": "string" - }, - { - "key": "BOB_PROVIDER_PROTOCOL_URL", - "value": "http://bob-controlplane:8084/api/v1/dsp", - "type": "string" - }, - { - "key": "Alice_PROVIDER_PROTOCOL_URL", - "value": "http://alice-controlplane:8084/api/v1/dsp", - "type": "string" - } - ] -} \ No newline at end of file diff --git a/tests/end2end/src/test/java/org/eclipse/edc/demo/tests/transfer/TransferEndToEndTest.java b/tests/end2end/src/test/java/org/eclipse/edc/demo/tests/transfer/TransferEndToEndTest.java index cecaf038..e853b000 100644 --- a/tests/end2end/src/test/java/org/eclipse/edc/demo/tests/transfer/TransferEndToEndTest.java +++ b/tests/end2end/src/test/java/org/eclipse/edc/demo/tests/transfer/TransferEndToEndTest.java @@ -14,6 +14,7 @@ package org.eclipse.edc.demo.tests.transfer; +import io.restassured.path.json.JsonPath; import io.restassured.specification.RequestSpecification; import jakarta.json.Json; import org.eclipse.edc.junit.annotations.EndToEndTest; @@ -44,7 +45,8 @@ public class TransferEndToEndTest { private static final String PROVIDER_ID = "did:web:provider-identityhub%3A7083:provider"; // public API endpoint of the provider-qna connector, goes through the incress controller private static final String PROVIDER_PUBLIC_URL = "http://127.0.0.1/provider-qna/public"; - private static final Duration TEST_TIMEOUT_DURATION = Duration.ofSeconds(60); + private static final Duration TEST_TIMEOUT_DURATION = Duration.ofSeconds(30); + private static final Duration TEST_POLL_DELAY = Duration.ofSeconds(2); private static RequestSpecification baseRequest() { return given() @@ -62,6 +64,7 @@ void transferData() { var offerId = new AtomicReference(); // get catalog, extract offer ID await().atMost(TEST_TIMEOUT_DURATION) + .pollDelay(TEST_POLL_DELAY) .untilAsserted(() -> { var oid = baseRequest() .body(emptyQueryBody) @@ -70,10 +73,11 @@ void transferData() { .log().ifError() .statusCode(200) // yes, it's a bit brittle with the hardcoded indexes, but it appears to work. - .extract().body().jsonPath().getString("[0]['http://www.w3.org/ns/dcat#dataset'][1]['http://www.w3.org/ns/dcat#dataset'][0]['odrl:hasPolicy']['@id']"); + .extract().body().asString(); + var jp = new JsonPath(oid).getString("[0]['dcat:dataset'][1]['dcat:dataset'][0]['odrl:hasPolicy']['@id']"); - assertThat(oid).isNotNull(); - offerId.set(oid); + assertThat(jp).isNotNull(); + offerId.set(jp); }); // initiate negotiation @@ -93,6 +97,7 @@ void transferData() { //wait until negotiation is FINALIZED var agreementId = new AtomicReference(); await().atMost(TEST_TIMEOUT_DURATION) + .pollDelay(TEST_POLL_DELAY) .untilAsserted(() -> { var jp = baseRequest() .get(CONSUMER_MANAGEMENT_URL + "/api/management/v3/contractnegotiations/" + negotiationId) @@ -123,11 +128,13 @@ void transferData() { var endpoint = new AtomicReference(); var token = new AtomicReference(); await().atMost(TEST_TIMEOUT_DURATION) + .pollDelay(TEST_POLL_DELAY) .untilAsserted(() -> { var jp = baseRequest() .get(CONSUMER_MANAGEMENT_URL + "/api/management/v3/edrs/%s/dataaddress".formatted(transferProcessId)) .then() .statusCode(200) + .onFailMessage("Expected to find an EDR with transfer ID %s but did not!".formatted(transferProcessId)) .extract().body().jsonPath(); endpoint.set(jp.getString("endpoint"));