This is an automated email from the ASF dual-hosted git repository.
ldywicki pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new 886c1e72ce fix(plc4j): Use pre-provisioned security keys for OPC-UA
tests.
886c1e72ce is described below
commit 886c1e72ce7987621811c2d558fef7998797d82e
Author: Łukasz Dywicki <[email protected]>
AuthorDate: Tue Oct 22 13:01:17 2024 +0200
fix(plc4j): Use pre-provisioned security keys for OPC-UA tests.
Signed-off-by: Łukasz Dywicki <[email protected]>
---
.../apache/plc4x/java/opcua/KeystoreGenerator.java | 115 +++++++++++++++++
.../apache/plc4x/java/opcua/MiloTestContainer.java | 9 +-
.../plc4x/java/opcua/OpcuaPlcDriverTest.java | 143 +++++++++++++--------
.../protocol/OpcuaSubscriptionHandleTest.java | 25 +---
.../milo/examples/server/TestMiloServer.java | 2 -
.../opcua/src/test/resources/logback-test.xml | 4 +-
6 files changed, 223 insertions(+), 75 deletions(-)
diff --git
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/KeystoreGenerator.java
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/KeystoreGenerator.java
new file mode 100644
index 0000000000..c16f0b80e0
--- /dev/null
+++
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/KeystoreGenerator.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://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.
+ */
+
+package org.apache.plc4x.java.opcua;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.KeyPair;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+import java.util.Base64;
+import java.util.Set;
+import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder;
+import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
+
+/**
+ * Utility to generate server certificate - based on Eclipse Milo stuff.
+ */
+public class KeystoreGenerator {
+
+ private final String password;
+ private final KeyStore keyStore;
+ private final X509Certificate certificate;
+
+ public KeystoreGenerator(String password, int length, String
applicationUri) {
+ this(password, length, applicationUri, "server-ai", "Milo Server");
+ }
+
+ public KeystoreGenerator(String password, int length, String
applicationUri, String entryName, String commonName) {
+ this.password = password;
+ try {
+ this.keyStore = generate(password, length, applicationUri,
entryName, commonName);
+
+ Key serverPrivateKey = keyStore.getKey(entryName,
password.toCharArray());
+ if (serverPrivateKey instanceof PrivateKey) {
+ this.certificate = (X509Certificate)
keyStore.getCertificate(entryName);
+ } else {
+ throw new IllegalStateException("Unexpected keystore entry,
expected private key");
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private KeyStore generate(String password, int length, String
applicationUri, String entryName, String commonName) throws Exception {
+ KeyStore keyStore = KeyStore.getInstance("PKCS12");
+ keyStore.load(null, password.toCharArray());
+ KeyPair keyPair =
SelfSignedCertificateGenerator.generateRsaKeyPair(length);
+ SelfSignedCertificateBuilder builder = (new
SelfSignedCertificateBuilder(
+ keyPair)).setCommonName(commonName)
+ .setOrganization("Apache Software Foundation")
+ .setOrganizationalUnit("PLC4X")
+ .setLocalityName("PLC4J")
+ .setStateName("CA")
+ .setCountryCode("US")
+ .setApplicationUri(applicationUri);
+
+ Set<String> hostnames = Set.of("127.0.0.1");
+
+ for (String hostname : hostnames) {
+ if (hostname.startsWith("\\d+\\.")) {
+ builder.addIpAddress(hostname);
+ } else {
+ builder.addDnsName(hostname);
+ }
+ }
+
+ X509Certificate certificate = builder.build();
+ keyStore.setKeyEntry(entryName, keyPair.getPrivate(),
password.toCharArray(), new X509Certificate[]{ certificate });
+ return keyStore;
+ }
+
+ public KeyStore getKeyStore() {
+ return keyStore;
+ }
+
+ public X509Certificate getCertificate() {
+ return certificate;
+ }
+
+ public void writeKeyStoreTo(OutputStream stream) throws IOException,
GeneralSecurityException {
+ keyStore.store(stream, password.toCharArray());
+ stream.flush();
+ }
+
+ public void writeCertificateTo(OutputStream stream) throws IOException,
CertificateEncodingException {
+ String data = "-----BEGIN CERTIFICATE-----\n" +
+ Base64.getMimeEncoder(64,
"\n".getBytes()).encodeToString(certificate.getEncoded()) + "\n" +
+ "-----END CERTIFICATE-----";
+
+ stream.write(data.getBytes());
+ stream.flush();
+ }
+
+}
diff --git
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/MiloTestContainer.java
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/MiloTestContainer.java
index db13a936ae..43989e2659 100644
---
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/MiloTestContainer.java
+++
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/MiloTestContainer.java
@@ -36,8 +36,15 @@ public class MiloTestContainer extends
GenericContainer<MiloTestContainer> {
public MiloTestContainer() {
super(IMAGE);
- waitingFor(Wait.forLogMessage("Server started\\s*", 1));
+ waitingFor(Wait.forLogMessage("Server started\\s*", 1))
+ // Uncomment below to debug Milo server
+ //.withStartupTimeout(Duration.ofMinutes(10))
+ ;
addExposedPort(12686);
+
+ // Uncomment below to enable server debug
+ //withEnv("JAVA_TOOL_OPTIONS",
"-agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=y");
+ //addFixedExposedPort(8000, 8000);
}
private static ImageFromDockerfile inlineImage() {
diff --git
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
index 01432165a0..1205a1875b 100644
---
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
+++
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
@@ -18,6 +18,8 @@
*/
package org.apache.plc4x.java.opcua;
+import java.io.File;
+import java.io.FileOutputStream;
import java.lang.reflect.Array;
import java.net.URLEncoder;
import java.nio.charset.Charset;
@@ -45,10 +47,8 @@ import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.opcua.security.MessageSecurity;
import org.apache.plc4x.java.opcua.security.SecurityPolicy;
import org.apache.plc4x.java.opcua.tag.OpcuaTag;
-import org.apache.plc4x.test.DisableOnJenkinsFlag;
import org.assertj.core.api.Condition;
import org.assertj.core.api.SoftAssertions;
-import org.eclipse.milo.examples.server.TestMiloServer;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
@@ -59,15 +59,9 @@ import org.slf4j.LoggerFactory;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.concurrent.ExecutionException;
import java.util.stream.Stream;
-import org.testcontainers.containers.BindMode;
-import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.containers.wait.strategy.Wait;
-import org.testcontainers.images.builder.ImageFromDockerfile;
-import org.testcontainers.jib.JibImage;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -81,11 +75,18 @@ public class OpcuaPlcDriverTest {
private static final Logger LOGGER =
LoggerFactory.getLogger(OpcuaPlcDriverTest.class);
+ private static final String APPLICATION_URI = "urn:org.apache:plc4x";
+ private static final KeystoreGenerator SERVER_KEY_STORE_GENERATOR = new
KeystoreGenerator("password", 2048, APPLICATION_URI);
+ private static final KeystoreGenerator CLIENT_KEY_STORE_GENERATOR = new
KeystoreGenerator("changeit", 2048, APPLICATION_URI, "plc4x_plus_milo",
"client");
+
@Container
- public final GenericContainer milo = new MiloTestContainer()
+ public final MiloTestContainer milo = new MiloTestContainer()
//.withCreateContainerCmdModifier(cmd ->
cmd.withHostName("test-opcua-server"))
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
- .withFileSystemBind("target/tmp/server/security",
"/tmp/server/security", BindMode.READ_WRITE);
+ .withFileSystemBind(SECURITY_DIR.getAbsolutePath(),
"/tmp/server/security")
+ //.withEnv("JAVA_TOOL_OPTIONS",
"-agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=y")
+// .withCommand("java -cp '/opt/milo/*:/opt/milo/'
org.eclipse.milo.examples.server.TestMiloServer")
+ ;
// Read only variables of milo example server of version 3.6
private static final String BOOL_IDENTIFIER_READ_WRITE =
"ns=2;s=HelloWorld/ScalarTypes/Boolean";
@@ -142,8 +143,8 @@ public class OpcuaPlcDriverTest {
//Tcp pattern of OPC UA
private final String opcPattern = "opcua:tcp://";
- private final String paramSectionDivider = "?";
- private final String paramDivider = "&";
+ private static final String PARAM_SECTION_DIVIDER = "?";
+ private static final String PARAM_DIVIDER = "&";
private final String discoveryValidParamTrue = "discovery=true";
private final String discoveryValidParamFalse = "discovery=false";
@@ -155,35 +156,39 @@ public class OpcuaPlcDriverTest {
final List<String> discoveryParamValidSet =
List.of(discoveryValidParamTrue, discoveryValidParamFalse);
List<String> discoveryParamCorruptedSet =
List.of(discoveryCorruptedParamWrongValueNum, discoveryCorruptedParamWrongName);
-
- @BeforeEach
- public void startUp() {
- //System.out.println(milo.getMappedPort(12686));
- tcpConnectionAddress = String.format(opcPattern + miloLocalAddress,
milo.getHost(), milo.getMappedPort(12686)) + "?endpoint-port=12686";
- connectionStringValidSet = List.of(tcpConnectionAddress);
- }
+ private static File SECURITY_DIR;
+ private static File CLIENT_KEY_STORE;
@BeforeAll
- public static void setup() throws Exception {
- // When switching JDK versions from a newer to an older version,
- // this can cause the server to not start correctly.
- // Deleting the directory makes sure the key-store is initialized
correctly.
-// Path securityBaseDir =
Paths.get(System.getProperty("java.io.tmpdir"), "server", "security");
-// try {
-// Files.delete(securityBaseDir);
-// } catch (Exception e) {
-// // Ignore this ...
-// }
-//
-// exampleServer = new TestMiloServer();
-// exampleServer.startup().get();
+ public static void prepare() throws Exception {
+ Path tempDirectory = Files.createTempDirectory("plc4x_opcua_client");
+
+ SECURITY_DIR = new File(tempDirectory.toFile().getAbsolutePath(),
"server/security");
+ File pkiDir = new File(SECURITY_DIR, "pki");
+ File trustedCerts = new File(pkiDir, "trusted/certs");
+ if (!pkiDir.mkdirs() || !trustedCerts.mkdirs()) {
+ throw new IllegalStateException("Could not start test - missing
permissions to create temporary files");
+ }
+
+ // pre-provisioned server certificate
+ try (FileOutputStream bos = new FileOutputStream(new
File(pkiDir.getParentFile(), "example-server.pfx"))) {
+ SERVER_KEY_STORE_GENERATOR.writeKeyStoreTo(bos);
+ }
+
+ // pre-provisioned client certificate, doing it here because server
might be slow in picking up them, and we don't want to wait with our tests
+ CLIENT_KEY_STORE = Files.createTempFile("plc4x_opcua_client_",
".p12").toAbsolutePath().toFile();
+ try (FileOutputStream outputStream = new
FileOutputStream(CLIENT_KEY_STORE)) {
+ CLIENT_KEY_STORE_GENERATOR.writeKeyStoreTo(outputStream);
+ }
+ try (FileOutputStream outputStream = new FileOutputStream(new
File(trustedCerts, "plc4x.crt"))) {
+ CLIENT_KEY_STORE_GENERATOR.writeCertificateTo(outputStream);
+ }
}
- @AfterAll
- public static void tearDown() throws Exception {
-// if (exampleServer != null) {
-// exampleServer.shutdown().get();
-// }
+ @BeforeEach
+ public void startUp() throws Exception {
+ tcpConnectionAddress = String.format(opcPattern + miloLocalAddress,
milo.getHost(), milo.getMappedPort(12686)) + "?endpoint-port=12686";
+ connectionStringValidSet = List.of(tcpConnectionAddress);
}
@Nested
@@ -276,7 +281,7 @@ public class OpcuaPlcDriverTest {
return connectionStringValidSet.stream()
.map(connectionAddress ->
DynamicContainer.dynamicContainer(connectionAddress, () ->
discoveryParamValidSet.stream().map(discoveryParam ->
DynamicTest.dynamicTest(discoveryParam, () -> {
- String connectionString = connectionAddress +
paramDivider + discoveryParam;
+ String connectionString = connectionAddress +
PARAM_DIVIDER + discoveryParam;
PlcConnection opcuaConnection = new
DefaultPlcDriverManager().getConnection(connectionString);
Condition<PlcConnection> is_connected = new
Condition<>(PlcConnection::isConnected, "is connected");
assertThat(opcuaConnection).is(is_connected);
@@ -340,6 +345,39 @@ public class OpcuaPlcDriverTest {
assertThat(response.getResponseCode("String")).isEqualTo(PlcResponseCode.OK);
}
}
+
+ @Test
+ void staticConfig() throws Exception {
+ DefaultPlcDriverManager driverManager = new
DefaultPlcDriverManager();
+
+ File certificateFile = Files.createTempFile("plc4x_opcua_server_",
".crt").toAbsolutePath().toFile();
+ try (FileOutputStream outputStream = new
FileOutputStream(certificateFile)) {
+ SERVER_KEY_STORE_GENERATOR.writeCertificateTo(outputStream);
+ }
+
+ String options = params(
+ entry("discovery", "false"),
+ entry("server-certificate-file",
certificateFile.toString().replace("\\", "/")),
+ entry("key-store-file",
CLIENT_KEY_STORE.toString().replace("\\", "/")), // handle windows paths
+ entry("key-store-password", "changeit"),
+ entry("key-store-type", "pkcs12"),
+ entry("security-policy", SecurityPolicy.Basic256Sha256.name()),
+ entry("message-security", MessageSecurity.SIGN.name())
+ );
+ try (PlcConnection opcuaConnection =
driverManager.getConnection(tcpConnectionAddress + PARAM_DIVIDER
+ + options)) {
+ Condition<PlcConnection> is_connected = new
Condition<>(PlcConnection::isConnected, "is connected");
+ assertThat(opcuaConnection).is(is_connected);
+
+ PlcReadRequest.Builder builder =
opcuaConnection.readRequestBuilder()
+ .addTagAddress("String", STRING_IDENTIFIER_READ_WRITE);
+
+ PlcReadRequest request = builder.build();
+ PlcReadResponse response = request.execute().get();
+
+
assertThat(response.getResponseCode("String")).isEqualTo(PlcResponseCode.OK);
+ }
+ }
}
@Nested
@@ -533,7 +571,7 @@ public class OpcuaPlcDriverTest {
assert !opcuaConnection.isConnected();
}
- private String getConnectionString(SecurityPolicy policy, MessageSecurity
messageSecurity) {
+ private String getConnectionString(SecurityPolicy policy, MessageSecurity
messageSecurity) throws Exception {
switch (policy) {
case NONE:
return tcpConnectionAddress;
@@ -543,18 +581,15 @@ public class OpcuaPlcDriverTest {
case Basic256Sha256:
case Aes128_Sha256_RsaOaep:
case Aes256_Sha256_RsaPss:
- // this file and its contents should be populated by milo
container
- Path keyStoreFile =
Paths.get("target/tmp/server/security/example-server.pfx");
- String connectionParams = Stream.of(
- entry("key-store-file",
keyStoreFile.toAbsolutePath().toString().replace("\\", "/")), // handle windows
paths
- entry("key-store-password", "password"),
- entry("security-policy", policy.name()),
- entry("message-security", messageSecurity.name())
- )
- .map(tuple -> tuple.getKey() + "=" +
URLEncoder.encode(tuple.getValue(), Charset.defaultCharset()))
- .collect(Collectors.joining(paramDivider));
-
- return tcpConnectionAddress + paramDivider + connectionParams;
+ String connectionParams = params(
+ entry("key-store-file",
CLIENT_KEY_STORE.getAbsoluteFile().toString().replace("\\", "/")), // handle
windows paths
+ entry("key-store-password", "changeit"),
+ entry("key-store-type", "pkcs12"),
+ entry("security-policy", policy.name()),
+ entry("message-security", messageSecurity.name())
+ );
+
+ return tcpConnectionAddress + PARAM_DIVIDER + connectionParams;
default:
throw new IllegalStateException();
}
@@ -582,4 +617,10 @@ public class OpcuaPlcDriverTest {
Arguments.of(SecurityPolicy.Aes256_Sha256_RsaPss,
MessageSecurity.SIGN_ENCRYPT)
);
}
+
+ private static String params(Entry<String, String> ... entries) {
+ return Stream.of(entries)
+ .map(entry -> entry.getKey() + "=" +
URLEncoder.encode(entry.getValue(), Charset.defaultCharset()))
+ .collect(Collectors.joining(PARAM_DIVIDER));
+ }
}
diff --git
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
index 094e09bb3b..c0d8ad2ebf 100644
---
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
+++
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.plc4x.java.opcua.protocol;
+import java.io.ByteArrayOutputStream;
import java.util.concurrent.CountDownLatch;
import java.util.stream.Stream;
import org.apache.plc4x.java.DefaultPlcDriverManager;
@@ -27,8 +28,7 @@ import
org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.opcua.MiloTestContainer;
import org.apache.plc4x.java.opcua.OpcuaPlcDriverTest;
-import org.apache.plc4x.test.DisableOnJenkinsFlag;
-import org.apache.plc4x.test.DisableOnParallelsVmFlag;
+import org.apache.plc4x.java.opcua.KeystoreGenerator;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
@@ -36,13 +36,9 @@ import org.junit.jupiter.params.provider.MethodSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;
-import org.testcontainers.containers.BindMode;
-import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.images.builder.Transferable;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -64,10 +60,8 @@ public class OpcuaSubscriptionHandleTest {
private static final Logger LOGGER =
LoggerFactory.getLogger(OpcuaPlcDriverTest.class);
@Container
- public final GenericContainer milo = new MiloTestContainer()
- //.withCreateContainerCmdModifier(cmd ->
cmd.withHostName("test-opcua-server"))
- .withLogConsumer(new Slf4jLogConsumer(LOGGER))
- .withFileSystemBind("target/tmp/server/security",
"/tmp/server/security", BindMode.READ_WRITE);
+ public final MiloTestContainer milo = new MiloTestContainer()
+ .withLogConsumer(new Slf4jLogConsumer(LOGGER));
// Address of local milo server
private static final String miloLocalAddress = "%s:%d/milo";
@@ -102,16 +96,7 @@ public class OpcuaSubscriptionHandleTest {
// When switching JDK versions from a newer to an older version,
// this can cause the server to not start correctly.
// Deleting the directory makes sure the key-store is initialized
correctly.
-
String tcpConnectionAddress = String.format(opcPattern +
miloLocalAddress, milo.getHost(), milo.getMappedPort(12686)) +
"?endpoint-port=12686";
-
- Path securityBaseDir = Paths.get(System.getProperty("java.io.tmpdir"),
"server", "security");
- try {
- Files.delete(securityBaseDir);
- } catch (Exception e) {
- // Ignore this ...
- }
-
//Connect
opcuaConnection = new
DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
assertThat(opcuaConnection).extracting(PlcConnection::isConnected).isEqualTo(true);
diff --git
a/plc4j/drivers/opcua/src/test/java/org/eclipse/milo/examples/server/TestMiloServer.java
b/plc4j/drivers/opcua/src/test/java/org/eclipse/milo/examples/server/TestMiloServer.java
index 872afbfb0f..d886afb11c 100644
---
a/plc4j/drivers/opcua/src/test/java/org/eclipse/milo/examples/server/TestMiloServer.java
+++
b/plc4j/drivers/opcua/src/test/java/org/eclipse/milo/examples/server/TestMiloServer.java
@@ -123,8 +123,6 @@ public class TestMiloServer {
);
DefaultTrustListManager trustListManager = new
DefaultTrustListManager(pkiDir);
- trustListManager.setTrustedCertificates(new
ArrayList<>(certificateManager.getCertificates()));
-
DefaultServerCertificateValidator certificateValidator =
new DefaultServerCertificateValidator(trustListManager);
diff --git a/plc4j/drivers/opcua/src/test/resources/logback-test.xml
b/plc4j/drivers/opcua/src/test/resources/logback-test.xml
index 695109a532..6e19a9fcfb 100644
--- a/plc4j/drivers/opcua/src/test/resources/logback-test.xml
+++ b/plc4j/drivers/opcua/src/test/resources/logback-test.xml
@@ -27,9 +27,11 @@
</encoder>
</appender>
- <root level="warn">
+ <root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
<logger name="org.apache.plc4x.java.spi.codegen" level="warn" />
+ <logger name="com.github.dockerjava" level="WARN"/>
+ <logger
name="com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.wire"
level="OFF"/>
</configuration>