Skip to content

Commit

Permalink
0.6.4
Browse files Browse the repository at this point in the history
  • Loading branch information
Gematik-Entwicklung committed Nov 26, 2024
1 parent db063d4 commit e9634a5
Show file tree
Hide file tree
Showing 8 changed files with 133 additions and 56 deletions.
16 changes: 11 additions & 5 deletions .env
Original file line number Diff line number Diff line change
@@ -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
# 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
18 changes: 13 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -30,15 +31,22 @@ 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

# 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"]
40 changes: 30 additions & 10 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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 `<active>true</active>` 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
<proxy>
<id>optional</id>
<active>true</active>
<protocol>https</protocol>
<host>proxy.example.com</host>
<port>8080</port>
<username>user</username>
<password>password</password>
<nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
</proxy>
```

== Testausführung

Die KOB-Testsuite kann entweder lokal per Maven oder in einem Docker-Container ausgeführt werden.
Expand All @@ -129,32 +148,33 @@ 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.

=== 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]
----
Expand All @@ -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.

Expand Down
13 changes: 12 additions & 1 deletion ReleaseNotes.md
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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

Expand Down
11 changes: 7 additions & 4 deletions dc-testsuite.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
10 changes: 4 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,18 @@

<groupId>de.gematik</groupId>
<artifactId>kob-testsuite</artifactId>
<version>0.6.3</version>
<version>0.6.4</version>
<packaging>jar</packaging>
<description>KOB Testsuite fuer PS Hersteller</description>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<version.maven-surefire-plugin>3.5.2</version.maven-surefire-plugin>
<version.tiger>3.4.5</version.tiger>
<version.maven-failsafe-plugin>3.5.2</version.maven-failsafe-plugin>
<spring.boot.version>3.0.13</spring.boot.version>
<jackson.version>2.17.1</jackson.version>
<version.tiger>3.4.5</version.tiger>
<jacoco.version>0.8.12</jacoco.version>
<spring.framework.version>6.1.14</spring.framework.version>
</properties>

<dependencyManagement>
Expand Down Expand Up @@ -185,7 +183,7 @@
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>7.9.0</version>
<version>7.10.0</version>
<executions>
<execution>
<goals>
Expand Down
25 changes: 25 additions & 0 deletions settings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<!-- proxies
| This is a list of proxies which can be used on this machine to connect to the network.
| Unless otherwise specified (by system property or command-line switch), the first proxy
| specification in this list marked as active will be used.
|-->
<proxies>

<proxy>
<id>optional</id>
<active>false</active>
<protocol>https</protocol>
<host>proxy.example.com</host>
<port>8080</port>
<username>user</username>
<password>password</password>
<nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
</proxy>

</proxies>
</settings>
56 changes: 31 additions & 25 deletions src/main/java/de/gematik/test/tiger/glue/ConfigureAsRoutes.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -54,12 +59,13 @@ public static void configureRoutes() {

private static void selectOnlineIpForRouteWithHost(
String hostPartialHit, List<String> 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));
},
() ->
Expand All @@ -76,41 +82,41 @@ private static String findFirstOnlineHost(List<String> 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");
Expand Down

0 comments on commit e9634a5

Please sign in to comment.