From e9634a520a9052ffec1c99f25d70cafc2feebeb8 Mon Sep 17 00:00:00 2001 From: Gematik Date: Tue, 26 Nov 2024 16:55:45 +0100 Subject: [PATCH] 0.6.4 --- .env | 16 ++++-- Dockerfile | 18 ++++-- README.adoc | 40 +++++++++---- ReleaseNotes.md | 13 ++++- dc-testsuite.yml | 11 ++-- pom.xml | 10 ++-- settings.xml | 25 +++++++++ .../test/tiger/glue/ConfigureAsRoutes.java | 56 ++++++++++--------- 8 files changed, 133 insertions(+), 56 deletions(-) create mode 100644 settings.xml diff --git a/.env b/.env index 6600dd3..8feeddf 100644 --- a/.env +++ b/.env @@ -1,5 +1,11 @@ -KOB_KVNR=Z1234567891 -KOB_EMLTYPE=PDF -KOB_STARTBROWSER=false -KOB_TIGERPROXYURL=http://host.docker.internal:8086 -KOB_PSURL=http://host.docker.internal:8080 \ No newline at end of file +# select tests to run ps-testsuite e.g.: +# - @information-record-status +# - @information-consent-decisions +# - @login +# - @entitlement +# KOB test against both health record systems +# - @KOB +# KOB test against single health record system +# - @IBM +# - @RISE +TESTSUITE_TESTS=@KOB diff --git a/Dockerfile b/Dockerfile index 4933153..bb9e752 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,8 @@ # # Docker Rules from https://wiki.gematik.de/display/DEV/Docker+Rules -FROM maven:3-eclipse-temurin-17-alpine +# used java 21 image due to different m2 respository location +FROM maven:3-eclipse-temurin-21-alpine ARG COMMIT_HASH ARG VERSION @@ -30,7 +31,8 @@ LABEL de.gematik.version=$VERSION ARG USERID=10000 ARG GROUPID=10000 -RUN mkdir -p /.m2/repository && chown -R "$USERID":"$GROUPID" /.m2/repository +RUN mkdir -p /.m2/repository +RUN chown -R $USERID:$GROUPID /.m2/repository # Run as User (not root) USER $USERID:$GROUPID @@ -38,7 +40,13 @@ USER $USERID:$GROUPID # Default Working directory WORKDIR /app -COPY src /app/src -COPY pom.xml /app/pom.xml +# Defining default Healthcheck e.g. when run without docker-compose or without healthcheck definition in it +HEALTHCHECK --interval=15s --timeout=10s --start-period=15s \ + CMD ["wget", "--quiet", "--tries=1", "--output-document", "-", "http://localhost:8080/actuator/health"] -RUN mvn pre-integration-test +# Copy the resource to the destination folder and assign permissions +COPY --chown=$USERID:$GROUPID src /app/src +COPY --chown=$USERID:$GROUPID pom.xml /app/pom.xml + +# Command to be executed. +ENTRYPOINT ["mvn", "clean", "verify"] diff --git a/README.adoc b/README.adoc index f4b4d0f..417f6b3 100644 --- a/README.adoc +++ b/README.adoc @@ -120,6 +120,25 @@ Beispiel, wenn das Primärsystem auf dem gleichen Rechner läuft, wie die Testsu Diese Einträge sollten nach der Durchführung der KOB-Testsuite wieder entfernt werden, da es ansonsten zu einem unbeabsichtigten Fehlverhalten führt, wenn die KOB-Testsuite nicht mehr aktiv läuft und somit die Nachrichten nicht mehr an die Aktensysteme weitergeleitet werden. ==== +=== Proxy Konfiguration für Maven (Docker) + +Da der KOB-Testsuite Container während der Ausführung Maven-Artefakte bezieht, muss das Internet für den Container erreichbar sein. Sollte das Internet nur über einen Proxy-Server erreichbar sein, müssen die Einstellungen in der [./settings.xml](./settings.xml) für die Ausführung des PS-Testsuite Containers angepasst werden. Bitte beachten Sie, dass der Parameter `true` gesetzt werden muss, um die Einstellungen zu aktivieren und das Docker-Volume `kob-testsuite-maven` gelöscht werden muss, um die Änderungen zu übernehmen. + +Dazu müssen die folgenden Einträge angepasst werden: + +```xml + + optional + true + https + proxy.example.com + 8080 + user + password + localhost|127.0.0.1 + +``` + == Testausführung Die KOB-Testsuite kann entweder lokal per Maven oder in einem Docker-Container ausgeführt werden. @@ -129,24 +148,24 @@ Die KOB-Testsuite kann entweder lokal per Maven oder in einem Docker-Container a Für die lokale Ausführung werden folgende Software-Versionen empfohlen: * Maven Version >= 3.9 -* JAVA Version 21 +* JAVA Version >= 17 Ist dies gegeben, reicht ein einfaches Kommando `mvn clean install` im Root-Verzeichnis des Projekts. Um nur die Testfälle für die KOB EPA 3.0 auszuführen, können die folgenden Befehle verwendet werden: -* `mvn clean verify -Dcucumber.filter.tags="@KOB"` für den Test gegen beide Aktensysteme -* `mvn clean verify -Dcucumber.filter.tags="@KOB and @IBM"` für den Test gegen das IBM Aktensystem -* `mvn clean verify -Dcucumber.filter.tags="@KOB and @RISE"` für den Test gegen das RISE Aktensystem +* `mvn clean verify -Dcucumber.filter.tags=@KOB` für den Test gegen beide Aktensysteme +* `mvn clean verify -Dcucumber.filter.tags=@IBM` für den Test gegen das IBM Aktensystem +* `mvn clean verify -Dcucumber.filter.tags=@RISE` für den Test gegen das RISE Aktensystem Um optionale Testfälle auszuführen, können die folgenden Befehle verwendet werden: -* `mvn clean verify -Dcucumber.filter.tags="@login"` +* `mvn clean verify -Dcucumber.filter.tags=@login` Aufbau einer User-Session bei einem der beiden Aktensysteme -* `mvn clean verify -Dcucumber.filter.tags="@information-record-status"` +* `mvn clean verify -Dcucumber.filter.tags=@information-record-status` Aktenkontolokalisierung bei einem der beiden Aktensysteme -* `mvn clean verify -Dcucumber.filter.tags="@information-consent-decisions"` +* `mvn clean verify -Dcucumber.filter.tags=@information-consent-decisions` Abfrage der Zustimmung für ein Aktenkonto bei einem der beiden Aktensysteme -* `mvn clean verify -Dcucumber.filter.tags="@entitlement"` +* `mvn clean verify -Dcucumber.filter.tags=@entitlement` Einstellen einer Befugnis für ein Aktenkonto bei einem der beiden Aktensysteme Ohne diesen Filter werden alle Tests ausgeführt. @@ -154,7 +173,8 @@ Ohne diesen Filter werden alle Tests ausgeführt. === Lokal (Docker) Die Testsuite kann mit einem Docker-Compose gestartet werden. -Diese Variante startet per Default momentan nur die verpflichtenden KOB-Testfälle. Siehe dc-testsuite.yml. +Diese Variante startet per Default momentan nur die verpflichtenden KOB-Testfälle. Siehe `.env` Datei. +Hier können dann auch die optionalen Testfälle, wenn gewünscht, konfiguriert werden. [source,bash] ---- @@ -164,7 +184,7 @@ docker compose -f dc-testsuite.yml up === WorkflowUI Die Durchführung der Testsuite geschieht über die von der KOB-Testsuite bereitgestellte Webseite der WorkflowUI. -Hierzu wird die folgende Adresse im Browser aufgerufen, wenn sich die Testsuite auf dem lokalen Rechner gestartet wurde: https://localhost:9010. +Hierzu wird die folgende Adresse im Browser aufgerufen, wenn sich die Testsuite auf dem lokalen Rechner gestartet wurde: http://localhost:9010. Beim Starten über Maven versucht die Testsuite diese Seite automatisch im Default-Browser zu öffnen. Beim Starten als Docker Container wird der entsprechende Link im Log ausgegeben, sobald die Seite aufrufbar ist. diff --git a/ReleaseNotes.md b/ReleaseNotes.md index e3c4523..ad0b501 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,16 @@ # Release Notes KOB Testsuite +## Release 0.6.4 + +* Bugfix for IP-Selector +* Selected test for docker container is configured via `.env` file +* Fixed docker execution issues + * missing user rights inside docker container (throwing exception) + - different user than root is used due to security reasons + * added settings.xml to optional configure a proxy server for maven inside the container + & thus added new section in ReadMe +* Fixed error message when checking availability of health record system IPs + ## Release 0.6.3 * Added TLS-RU-certificates for AS-servers @@ -9,7 +20,7 @@ * run KOB testcase at least against one health record system (IBM and/or RISE) * Necessary to define one KVNR for each health record system (kob.yml) * Refactor optional testcases - * modified to match at least on e health record system + * modified to match at least one health record system ## Release 0.6.2 diff --git a/dc-testsuite.yml b/dc-testsuite.yml index d67a779..2b5135f 100644 --- a/dc-testsuite.yml +++ b/dc-testsuite.yml @@ -2,9 +2,10 @@ name: dc-testsuite-kob services: kob-testsuite: - image: gematik1/kob-testsuite:0.6.3 + image: gematik1/kob-testsuite:0.6.4 container_name: kob-testsuite environment: + - MAVEN_OPTS=-Dcucumber.filter.tags=${TESTSUITE_TESTS} - KOB_STARTBROWSER=false - KOB_PSURL=http://host.docker.internal:8080 # URL to connect PS with test driver interface if available - KOB_ASURL=https://host.docker.internal:8443 # ULR to connect ePA mock services to run tests, e.g. vau handshake test @@ -13,10 +14,12 @@ services: - "9011:9011" - "443:443" volumes: + - ./tiger.yaml:/app/tiger.yaml + - ./kob.yaml:/app/kob.yaml + - ./ca.p12:/app/ca.p12 - kob-testsuite-maven:/.m2 - - ./:/app - command: 'mvn clean verify -Dcucumber.filter.tags="@KOB"' - + # has to be 'copied' AFTER the volume is mounted + - ./settings.xml:/.m2/settings.xml volumes: kob-testsuite-maven: name: kob-testsuite-maven diff --git a/pom.xml b/pom.xml index 6bf02fe..0b31a87 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,8 @@ de.gematik kob-testsuite - 0.6.3 + 0.6.4 + jar KOB Testsuite fuer PS Hersteller @@ -30,12 +31,9 @@ 17 UTF-8 3.5.2 - 3.4.5 3.5.2 - 3.0.13 - 2.17.1 + 3.4.5 0.8.12 - 6.1.14 @@ -185,7 +183,7 @@ org.openapitools openapi-generator-maven-plugin - 7.9.0 + 7.10.0 diff --git a/settings.xml b/settings.xml new file mode 100644 index 0000000..afbd3df --- /dev/null +++ b/settings.xml @@ -0,0 +1,25 @@ + + + + + + + + optional + false + https + proxy.example.com + 8080 + user + password + localhost|127.0.0.1 + + + + diff --git a/src/main/java/de/gematik/test/tiger/glue/ConfigureAsRoutes.java b/src/main/java/de/gematik/test/tiger/glue/ConfigureAsRoutes.java index 0f59926..ea03f0c 100644 --- a/src/main/java/de/gematik/test/tiger/glue/ConfigureAsRoutes.java +++ b/src/main/java/de/gematik/test/tiger/glue/ConfigureAsRoutes.java @@ -20,6 +20,7 @@ import de.gematik.test.tiger.lib.TigerDirector; import de.gematik.test.tiger.proxy.TigerProxy; import de.gematik.test.tiger.testenvmgr.util.InsecureTrustAllManager; +import de.gematik.test.tiger.testenvmgr.util.TigerTestEnvException; import de.gematik.test.tiger.util.NoProxyUtils; import io.cucumber.java.BeforeAll; import java.io.IOException; @@ -28,6 +29,10 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.security.GeneralSecurityException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.time.Duration; import java.util.List; @@ -54,12 +59,13 @@ public static void configureRoutes() { private static void selectOnlineIpForRouteWithHost( String hostPartialHit, List potentialIpAdresses) { + log.info("Selecting target for host {} from list", hostPartialHit, potentialIpAdresses); tigerProxy.getRoutes().stream() .filter(route -> route.getHosts().stream().anyMatch(host -> host.contains(hostPartialHit))) .findFirst() .ifPresentOrElse( route -> { - log.info("Selecting online IP for route {}", route); + log.info("Selecting online IP for route {}", route.createShortDescription()); route.setTo("https://" + findFirstOnlineHost(potentialIpAdresses)); }, () -> @@ -76,41 +82,41 @@ private static String findFirstOnlineHost(List potentialIpAdresses) { private static boolean isReachable(String destination) { try { - HttpClient.Builder clientBuilder = - HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)); - + log.info("\ttrying to reach {}...", destination); + HttpURLConnection connection = + (HttpURLConnection) new URL("https://" + destination).openConnection(); if (forwardProxyInfo != null) { final InetAddress targetHost = InetAddress.getByName(forwardProxyInfo.getHostname()); if (NoProxyUtils.shouldUseProxyForHost(targetHost, forwardProxyInfo.getNoProxyHosts())) { - clientBuilder.proxy( - ProxySelector.of(new InetSocketAddress(targetHost, forwardProxyInfo.getPort()))); + final InetSocketAddress inetSocketAddress = + new InetSocketAddress(targetHost, forwardProxyInfo.getPort()); + connection = + (HttpURLConnection) + new URL("https://" + destination).openConnection(new Proxy(Type.HTTP, inetSocketAddress)); } } - SSLParameters sslParameters = new SSLParameters(); - sslParameters.setEndpointIdentificationAlgorithm(null); - clientBuilder.sslParameters(sslParameters); - clientBuilder.sslContext(insecureSSLContext()); - - HttpClient client = clientBuilder.build(); - HttpRequest request = - HttpRequest.newBuilder() - .uri(URI.create("https://" + destination)) - .method("HEAD", HttpRequest.BodyPublishers.noBody()) - .timeout(Duration.ofSeconds(5)) - .build(); - - client.send(request, HttpResponse.BodyHandlers.discarding()); - //client.close(); JAVA 21 only + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setInstanceFollowRedirects(false); + connection.setRequestMethod("HEAD"); + disableTlsVerificationFor(connection); + connection.connect(); + log.info("\tsuccesfully reached {}", destination); return true; } catch (IOException e) { - log.atInfo().addArgument(e.getMessage()).log("Error checking host: {}"); - return false; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + log.atInfo().log("Error checking host {}: {}", destination, e.getMessage()); return false; } } + private static void disableTlsVerificationFor(HttpURLConnection urlConnection) { + if (urlConnection instanceof HttpsURLConnection httpsURLConnection) { + SSLContext context = insecureSSLContext(); + httpsURLConnection.setSSLSocketFactory(context.getSocketFactory()); + httpsURLConnection.setHostnameVerifier((hostname, sslSession) -> true); + } + } + private static SSLContext insecureSSLContext() { try { SSLContext sslContext = SSLContext.getInstance("TLS");