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");