This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 71f4773eca00e7d25b565e3a508610efc9bb11bd Author: Klug Andreas (CI/XDM1) <[email protected]> AuthorDate: Wed May 25 15:54:26 2022 +0200 Milo 0.6.6 --- camel-dependencies/pom.xml | 2 +- components/camel-milo/pom.xml | 12 +++++ .../component/milo/client/MiloClientConsumer.java | 9 +++- .../component/milo/client/MiloClientEndpoint.java | 16 ++++++- .../milo/client/internal/SubscriptionManager.java | 4 +- .../component/milo/server/MiloServerComponent.java | 17 +++---- .../milo/server/internal/CamelNamespace.java | 38 ++++++++++----- .../milo/server/internal/CamelServerItem.java | 55 +++++++++++++--------- .../component/milo/AbstractMiloServerTest.java | 2 +- .../MiloClientCachingConnectionManagerTest.java | 11 ++++- .../milo/MonitorItemMultiConnectionsCertTest.java | 16 ++++++- .../milo/MonitorItemMultiConnectionsTest.java | 16 ++++++- .../camel/component/milo/MonitorItemTest.java | 38 +++++++++++---- .../camel/component/milo/ReadValuesClientTest.java | 16 ++++++- .../camel/component/milo/WriteClientTest.java | 18 ++++++- .../component/milo/browse/BrowseServerTest.java | 16 ++++++- .../camel/component/milo/call/CallClientTest.java | 33 ++++++++++++- .../component/milo/call/MockCamelNamespace.java | 30 ++++++++---- .../camel/component/milo/client/NodeIdTest.java | 16 ++++++- .../component/milo/converter/ConverterTest.java | 16 ++++++- .../component/milo/server/ServerLocalTest.java | 14 +++++- .../server/ServerSetCertificateManagerTest.java | 16 ++++++- .../milo/server/ServerSetSecurityPoliciesTest.java | 16 ++++++- 23 files changed, 348 insertions(+), 79 deletions(-) diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml index 78b2c318694..2674df36cc0 100644 --- a/camel-dependencies/pom.xml +++ b/camel-dependencies/pom.xml @@ -404,7 +404,7 @@ <microprofile-fault-tolerance-version>3.0</microprofile-fault-tolerance-version> <microprofile-metrics-version>3.0.1</microprofile-metrics-version> <milo-guava-version>26.0-jre</milo-guava-version> - <milo-version>0.3.7</milo-version> + <milo-version>0.6.6</milo-version> <mina-version>2.1.5</mina-version> <minidns-version>0.3.4</minidns-version> <minimal-json-version>0.9.5</minimal-json-version> diff --git a/components/camel-milo/pom.xml b/components/camel-milo/pom.xml index bc45a3c79c4..3a705ff7442 100644 --- a/components/camel-milo/pom.xml +++ b/components/camel-milo/pom.xml @@ -56,6 +56,18 @@ <version>${milo-version}</version> </dependency> + <dependency> + <groupId>org.eclipse.milo</groupId> + <artifactId>stack-core</artifactId> + <version>${milo-version}</version> + </dependency> + + <dependency> + <groupId>org.eclipse.milo</groupId> + <artifactId>dictionary-manager</artifactId> + <version>${milo-version}</version> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConsumer.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConsumer.java index 60689104638..15572a0cdd2 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConsumer.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConsumer.java @@ -35,11 +35,13 @@ public class MiloClientConsumer extends DefaultConsumer { private MonitorHandle handle; private ExpandedNodeId node; private Double samplingInterval; + private boolean omitNullValues; public MiloClientConsumer(final MiloClientEndpoint endpoint, final Processor processor) { super(endpoint, processor); this.node = endpoint.getNodeId(); this.samplingInterval = endpoint.getSamplingInterval(); + this.omitNullValues = endpoint.isOmitNullValues(); } @Override @@ -68,7 +70,12 @@ public class MiloClientConsumer extends DefaultConsumer { private void handleValueUpdate(final DataValue value) { LOG.debug("Handle item update - {} = {}", node, value); - + + if(omitNullValues && (value == null || value.getValue() == null || value.getValue().getValue() == null)){ + LOG.debug("Handle item update omitted due to null values (see omitNullValues parameter)"); + return; + } + final Exchange exchange = createExchange(true); try { mapToMessage(value, exchange.getMessage()); diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientEndpoint.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientEndpoint.java index a1b25db531c..e7a6de742f1 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientEndpoint.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientEndpoint.java @@ -77,7 +77,13 @@ public class MiloClientEndpoint extends DefaultEndpoint { */ @UriParam private boolean defaultAwaitWrites; - + + /** + * Omit notifications in case of null values + */ + @UriParam(defaultValue = "true") + private boolean omitNullValues = true; + @UriParam private MonitorFilterConfiguration monitorFilterConfiguration; @@ -189,4 +195,12 @@ public class MiloClientEndpoint extends DefaultEndpoint { public void setMonitorFilterType(MonitorFilterType monitorFilterType) { this.monitorFilterType = monitorFilterType; } + + public boolean isOmitNullValues() { + return omitNullValues; + } + + public void setOmitNullValues(boolean omitNullValues) { + this.omitNullValues = omitNullValues; + } } diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java index 0627485da42..d0748eda832 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java @@ -162,7 +162,7 @@ public class SubscriptionManager { return null; } final MonitoringFilter monitorFilter = this.monitorFilterConfiguration.createMonitoringFilter(); - return ExtensionObject.encode(client.getSerializationContext(), monitorFilter); + return ExtensionObject.encode(client.getStaticSerializationContext(), monitorFilter); } } @@ -203,7 +203,7 @@ public class SubscriptionManager { Double samplingInterval = s.getSamplingInterval(); final MonitoringParameters parameters = new MonitoringParameters( - entry.getKey(), samplingInterval, s.createMonitoringFilter(client), null, null); + entry.getKey(), samplingInterval, s.createMonitoringFilter(client), null, true); items.add(new MonitoredItemCreateRequest(itemId, MonitoringMode.Reporting, parameters)); } } diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java index d8c3b072ad0..f4013d5d2a7 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/MiloServerComponent.java @@ -54,7 +54,6 @@ import org.eclipse.milo.opcua.stack.core.UaException; import org.eclipse.milo.opcua.stack.core.security.CertificateManager; import org.eclipse.milo.opcua.stack.core.security.CertificateValidator; import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateManager; -import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateValidator; import org.eclipse.milo.opcua.stack.core.security.DefaultTrustListManager; import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; import org.eclipse.milo.opcua.stack.core.transport.TransportProfile; @@ -64,6 +63,8 @@ import org.eclipse.milo.opcua.stack.core.types.enumerated.UserTokenType; import org.eclipse.milo.opcua.stack.core.types.structured.BuildInfo; import org.eclipse.milo.opcua.stack.core.types.structured.UserTokenPolicy; import org.eclipse.milo.opcua.stack.server.EndpointConfiguration; +import org.eclipse.milo.opcua.stack.server.security.DefaultServerCertificateValidator; +import org.eclipse.milo.opcua.stack.server.security.ServerCertificateValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -119,7 +120,7 @@ public class MiloServerComponent extends DefaultComponent { @Metadata(label = "security") private String defaultCertificateValidator; @Metadata(label = "security") - private CertificateValidator certificateValidator; + private ServerCertificateValidator certificateValidator; @Metadata(label = "security") private X509Certificate certificate; @@ -324,19 +325,19 @@ public class MiloServerComponent extends DefaultComponent { .build(); } - private static final class DenyAllCertificateValidator implements CertificateValidator { - public static final CertificateValidator INSTANCE = new DenyAllCertificateValidator(); + private static final class DenyAllCertificateValidator implements ServerCertificateValidator { + public static final ServerCertificateValidator INSTANCE = new DenyAllCertificateValidator(); private DenyAllCertificateValidator() { } @Override - public void validate(final X509Certificate certificate) throws UaException { + public void validateCertificateChain(List<X509Certificate> list, String s) throws UaException { throw new UaException(StatusCodes.Bad_CertificateUseNotAllowed); } @Override - public void verifyTrustChain(List<X509Certificate> certificateChain) throws UaException { + public void validateCertificateChain(List<X509Certificate> list) throws UaException { throw new UaException(StatusCodes.Bad_CertificateUseNotAllowed); } } @@ -581,7 +582,7 @@ public class MiloServerComponent extends DefaultComponent { /** * Validator for client certificates */ - public void setCertificateValidator(final CertificateValidator certificateValidator) { + public void setCertificateValidator(final ServerCertificateValidator certificateValidator) { this.certificateValidator = certificateValidator; } @@ -592,7 +593,7 @@ public class MiloServerComponent extends DefaultComponent { this.defaultCertificateValidator = defaultCertificateValidator; try { DefaultTrustListManager trustListManager = new DefaultTrustListManager(new File(defaultCertificateValidator)); - this.certificateValidator = new DefaultCertificateValidator(trustListManager); + this.certificateValidator = new DefaultServerCertificateValidator(trustListManager); } catch (IOException e) { throw new RuntimeCamelException(e); } diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java index 924f2da7a95..2c7720501a6 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelNamespace.java @@ -23,8 +23,9 @@ import java.util.Map; import org.eclipse.milo.opcua.sdk.core.Reference; import org.eclipse.milo.opcua.sdk.server.OpcUaServer; import org.eclipse.milo.opcua.sdk.server.api.DataItem; -import org.eclipse.milo.opcua.sdk.server.api.ManagedNamespace; +import org.eclipse.milo.opcua.sdk.server.api.ManagedNamespaceWithLifecycle; import org.eclipse.milo.opcua.sdk.server.api.MonitoredItem; +import org.eclipse.milo.opcua.sdk.server.dtd.DataTypeDictionaryManager; import org.eclipse.milo.opcua.sdk.server.nodes.UaFolderNode; import org.eclipse.milo.opcua.sdk.server.nodes.UaObjectNode; import org.eclipse.milo.opcua.sdk.server.util.SubscriptionModel; @@ -32,8 +33,10 @@ import org.eclipse.milo.opcua.stack.core.Identifiers; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId; import org.eclipse.milo.opcua.stack.core.types.builtin.QualifiedName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class CamelNamespace extends ManagedNamespace { +public class CamelNamespace extends ManagedNamespaceWithLifecycle { private final SubscriptionModel subscriptionModel; @@ -41,16 +44,24 @@ public class CamelNamespace extends ManagedNamespace { private UaFolderNode folder; private final Map<String, CamelServerItem> itemMap = new HashMap<>(); - + + private final DataTypeDictionaryManager dictionaryManager; + + private final Logger log = LoggerFactory.getLogger(CamelNamespace.class); + public CamelNamespace(final String namespaceUri, final OpcUaServer server) { super(server, namespaceUri); - + this.subscriptionModel = new SubscriptionModel(server, this); + this.dictionaryManager = new DataTypeDictionaryManager(getNodeContext(), namespaceUri); + + getLifecycleManager().addLifecycle(dictionaryManager); + getLifecycleManager().addLifecycle(subscriptionModel); + + getLifecycleManager().addStartupTask(this::createNodes); } - - @Override - protected void onStartup() { - super.onStartup(); + + protected void createNodes() { // create structure final NodeId nodeId = newNodeId("camel"); @@ -63,13 +74,13 @@ public class CamelNamespace extends ManagedNamespace { final NodeId nodeId2 = newNodeId("items"); final QualifiedName name2 = newQualifiedName("items"); final LocalizedText displayName2 = LocalizedText.english("Items"); - - this.itemsObject = UaObjectNode.builder(getNodeContext()) + + this.itemsObject = UaObjectNode.build(getNodeContext(), builder -> builder .setNodeId(nodeId2) .setBrowseName(name2) .setDisplayName(displayName2) .setTypeDefinition(Identifiers.FolderType) - .build(); + .buildAndAdd()); this.folder.addComponent(this.itemsObject); this.getNodeManager().addNode(this.itemsObject); @@ -90,21 +101,25 @@ public class CamelNamespace extends ManagedNamespace { @Override public void onDataItemsCreated(final List<DataItem> dataItems) { + log.trace("onDataItemsCreated"); this.subscriptionModel.onDataItemsCreated(dataItems); } @Override public void onDataItemsModified(final List<DataItem> dataItems) { + log.trace("onDataItemsModified"); this.subscriptionModel.onDataItemsModified(dataItems); } @Override public void onDataItemsDeleted(final List<DataItem> dataItems) { + log.trace("onDataItemsDeleted"); this.subscriptionModel.onDataItemsDeleted(dataItems); } @Override public void onMonitoringModeChanged(final List<MonitoredItem> monitoredItems) { + log.trace("onMonitoringModeChanged"); this.subscriptionModel.onMonitoringModeChanged(monitoredItems); } @@ -114,5 +129,4 @@ public class CamelNamespace extends ManagedNamespace { k -> new CamelServerItem(itemId, getNodeContext(), getNamespaceIndex(), this.itemsObject)); } } - } diff --git a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java index a19a0bcc936..b19791f3dfd 100644 --- a/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java +++ b/components/camel-milo/src/main/java/org/apache/camel/component/milo/server/internal/CamelServerItem.java @@ -21,12 +21,16 @@ import java.util.LinkedList; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Consumer; +import java.util.function.Predicate; import org.apache.camel.RuntimeCamelException; import org.eclipse.milo.opcua.sdk.core.AccessLevel; import org.eclipse.milo.opcua.sdk.server.nodes.UaNodeContext; import org.eclipse.milo.opcua.sdk.server.nodes.UaObjectNode; import org.eclipse.milo.opcua.sdk.server.nodes.UaVariableNode; +import org.eclipse.milo.opcua.sdk.server.nodes.filters.AttributeFilter; +import org.eclipse.milo.opcua.sdk.server.nodes.filters.AttributeFilterContext; +import org.eclipse.milo.opcua.stack.core.AttributeId; import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue; import org.eclipse.milo.opcua.stack.core.types.builtin.DateTime; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; @@ -38,8 +42,6 @@ import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UShort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.ubyte; - public class CamelServerItem { private static final Logger LOG = LoggerFactory.getLogger(CamelServerItem.class); @@ -59,28 +61,37 @@ public class CamelServerItem { final NodeId nodeId = new NodeId(namespaceIndex, itemId); final QualifiedName qname = new QualifiedName(namespaceIndex, itemId); final LocalizedText displayName = LocalizedText.english(itemId); - + // create variable node - - this.item = new UaVariableNode(nodeContext, nodeId, qname, displayName) { - - @Override - public synchronized DataValue getValue() { - return getDataValue(); - } - - @Override - public synchronized void setValue(final DataValue value) { - setDataValue(value); - } - - }; - - this.item.setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE))); - this.item.setUserAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE))); - + + final Predicate<AttributeId> filter = AttributeId.Value::equals; + this.item = UaVariableNode.build(nodeContext, builder-> + builder + .setNodeId(nodeId) + .setBrowseName(qname) + .setDisplayName(displayName) + .setAccessLevel(AccessLevel.toValue(AccessLevel.READ_WRITE)) + .setUserAccessLevel(AccessLevel.toValue(AccessLevel.READ_WRITE)) + .addAttributeFilter(new AttributeFilter(){ + + @Override + public Object getAttribute(AttributeFilterContext.GetAttributeContext ctx, AttributeId attributeId){ + if(filter.test(attributeId) && ctx.getSession().isPresent()) { + return getDataValue(); + } + return ctx.getAttribute(attributeId); + } + + @Override + public void setAttribute(AttributeFilterContext.SetAttributeContext ctx, AttributeId attributeId, Object value){ + if(filter.test(attributeId) && ctx.getSession().isPresent()) { + setDataValue((DataValue)value); + } + ctx.setAttribute(attributeId, value); + }}) + .buildAndAdd()); + baseNode.addComponent(this.item); - nodeContext.getNodeManager().addNode(this.item); } public void dispose() { diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/AbstractMiloServerTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/AbstractMiloServerTest.java index c4677ba8642..15629de341b 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/AbstractMiloServerTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/AbstractMiloServerTest.java @@ -83,7 +83,7 @@ public abstract class AbstractMiloServerTest extends CamelTestSupport { final AssertionClause clause, final Class<T> bodyClass, final Consumer<T> valueConsumer) { clause.predicate(exchange -> { - final T body = exchange.getIn().getBody(bodyClass); + final T body = exchange.getMessage().getBody(bodyClass); valueConsumer.accept(body); return true; }); diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MiloClientCachingConnectionManagerTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MiloClientCachingConnectionManagerTest.java index 8822bd98ab4..3e11f89b733 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MiloClientCachingConnectionManagerTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MiloClientCachingConnectionManagerTest.java @@ -23,13 +23,22 @@ import org.apache.camel.component.milo.client.MonitorFilterConfiguration; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class MiloClientCachingConnectionManagerTest { + private static final Logger LOG = LoggerFactory.getLogger(MiloClientCachingConnectionManagerTest.class); + private MiloClientCachingConnectionManager instance; @BeforeEach - public void setup() { + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); instance = new MiloClientCachingConnectionManager(); } diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsCertTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsCertTest.java index 303a38e95c1..89d5cae692b 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsCertTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsCertTest.java @@ -29,7 +29,11 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.milo.server.MiloServerComponent; import org.apache.camel.component.mock.MockEndpoint; import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; @@ -65,6 +69,8 @@ public class MonitorItemMultiConnectionsCertTest extends AbstractMiloServerTest private static final String MOCK_TEST_2 = "mock:test2"; private static final String MOCK_TEST_3 = "mock:test3"; + private static final Logger LOG = LoggerFactory.getLogger(MonitorItemMultiConnectionsCertTest.class); + @EndpointInject(MOCK_TEST_1) protected MockEndpoint test1Endpoint; @@ -76,7 +82,15 @@ public class MonitorItemMultiConnectionsCertTest extends AbstractMiloServerTest @Produce(DIRECT_START_1) protected ProducerTemplate producer1; - + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Override protected void configureMiloServer(final MiloServerComponent server) throws Exception { super.configureMiloServer(server); diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsTest.java index 50ae33acb0c..a4a16818d54 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemMultiConnectionsTest.java @@ -23,7 +23,11 @@ import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.milo.server.MiloServerComponent; import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Testing monitoring items over multiple connections @@ -53,6 +57,8 @@ public class MonitorItemMultiConnectionsTest extends AbstractMiloServerTest { private static final String MOCK_TEST_2 = "mock:test2"; private static final String MOCK_TEST_3 = "mock:test3"; + private static final Logger LOG = LoggerFactory.getLogger(MonitorItemMultiConnectionsTest.class); + @EndpointInject(MOCK_TEST_1) protected MockEndpoint test1Endpoint; @@ -64,7 +70,15 @@ public class MonitorItemMultiConnectionsTest extends AbstractMiloServerTest { @Produce(DIRECT_START_1) protected ProducerTemplate producer1; - + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Override protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() { diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemTest.java index 36fe995023b..228fd9b9c0e 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/MonitorItemTest.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.milo; +import java.util.concurrent.TimeUnit; + import org.apache.camel.EndpointInject; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; @@ -23,7 +25,13 @@ import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.milo.server.MiloServerComponent; import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.apache.camel.LoggingLevel.INFO; /** * Testing the monitor functionality for item @@ -41,6 +49,8 @@ public class MonitorItemTest extends AbstractMiloServerTest { private static final String MOCK_TEST_1 = "mock:test1"; + private static final Logger LOG = LoggerFactory.getLogger(MonitorItemTest.class); + @EndpointInject(MOCK_TEST_1) protected MockEndpoint test1Endpoint; @@ -58,7 +68,15 @@ public class MonitorItemTest extends AbstractMiloServerTest { } }; } - + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + /** * Monitor multiple events */ @@ -68,17 +86,19 @@ public class MonitorItemTest extends AbstractMiloServerTest { * we will wait 2 * 1_000 milliseconds between server updates since the * default server update rate is 1_000 milliseconds */ - + final var time=2 * 1_000; + + // item 1 ... only this one receives + test1Endpoint.reset(); + test1Endpoint.setExpectedCount(3); + // set server values this.producer1.sendBody("Foo"); - Thread.sleep(2_000); + Thread.sleep(time); this.producer1.sendBody("Bar"); - Thread.sleep(2_000); + Thread.sleep(time); this.producer1.sendBody("Baz"); - Thread.sleep(2_000); - - // item 1 ... only this one receives - this.test1Endpoint.setExpectedCount(3); + Thread.sleep(time); // tests testBody(this.test1Endpoint.message(0), assertGoodValue("Foo")); @@ -86,6 +106,6 @@ public class MonitorItemTest extends AbstractMiloServerTest { testBody(this.test1Endpoint.message(2), assertGoodValue("Baz")); // assert - assertMockEndpointsSatisfied(); + assertMockEndpointsSatisfied(time,TimeUnit.MILLISECONDS); } } diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/ReadValuesClientTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/ReadValuesClientTest.java index 63cac63e7b1..a2b277ad2e8 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/ReadValuesClientTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/ReadValuesClientTest.java @@ -26,7 +26,11 @@ import org.apache.camel.ProducerTemplate; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ReadValuesClientTest extends AbstractMiloServerTest { @@ -40,6 +44,8 @@ public class ReadValuesClientTest extends AbstractMiloServerTest { private static final String MOCK_TEST_1 = "mock:test1"; + private static final Logger LOG = LoggerFactory.getLogger(ReadValuesClientTest.class); + @EndpointInject(MOCK_TEST_1) protected MockEndpoint test1Endpoint; @@ -48,7 +54,15 @@ public class ReadValuesClientTest extends AbstractMiloServerTest { @Produce(DIRECT_START_2) protected ProducerTemplate producer2; - + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Override protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() { diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/WriteClientTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/WriteClientTest.java index 345ccf73575..8158b032984 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/WriteClientTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/WriteClientTest.java @@ -24,7 +24,11 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.milo.server.MiloServerComponent; import org.apache.camel.component.mock.MockEndpoint; import org.eclipse.milo.opcua.stack.core.types.builtin.Variant; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.apache.camel.component.milo.NodeIds.nodeValue; @@ -60,7 +64,9 @@ public class WriteClientTest extends AbstractMiloServerTest { private static final String MOCK_TEST_1 = "mock:test1"; private static final String MOCK_TEST_2 = "mock:test2"; - + + private static final Logger LOG = LoggerFactory.getLogger(WriteClientTest.class); + @EndpointInject(MOCK_TEST_1) protected MockEndpoint test1Endpoint; @@ -96,7 +102,15 @@ public class WriteClientTest extends AbstractMiloServerTest { } }; } - + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Test public void testWrite1() throws Exception { // item 1 diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/browse/BrowseServerTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/browse/BrowseServerTest.java index 58a7093fb29..1a006c9a4a6 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/browse/BrowseServerTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/browse/BrowseServerTest.java @@ -39,7 +39,11 @@ import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.structured.BrowseResult; import org.eclipse.milo.opcua.stack.core.types.structured.ReferenceDescription; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied; import static org.junit.jupiter.api.Assertions.assertArrayEquals; @@ -102,6 +106,8 @@ public class BrowseServerTest extends AbstractMiloServerTest { private static final String MILO_BROWSE_NODE_VIA_ENDPOINT = MILO_BROWSE_ROOT + "&node=RAW(ns=0;i=86)"; + + private static final Logger LOG = LoggerFactory.getLogger(BrowseServerTest.class); @EndpointInject(MOCK_TEST_1) protected MockEndpoint mock1; @@ -156,7 +162,15 @@ public class BrowseServerTest extends AbstractMiloServerTest { @Produce(DIRECT_START_9) protected ProducerTemplate producer9; - + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Override protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() { diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java index 489987f9ef3..846f4140889 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/CallClientTest.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.milo.call; +import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.EnumSet; import java.util.LinkedHashSet; @@ -32,16 +33,20 @@ import org.eclipse.milo.opcua.sdk.server.OpcUaServer; import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig; import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfigBuilder; import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil; +import org.eclipse.milo.opcua.stack.core.UaException; import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateManager; -import org.eclipse.milo.opcua.stack.core.security.InsecureCertificateValidator; import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy; import org.eclipse.milo.opcua.stack.core.transport.TransportProfile; import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText; import org.eclipse.milo.opcua.stack.core.types.enumerated.MessageSecurityMode; import org.eclipse.milo.opcua.stack.core.types.structured.UserTokenPolicy; import org.eclipse.milo.opcua.stack.server.EndpointConfiguration; +import org.eclipse.milo.opcua.stack.server.security.ServerCertificateValidator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.apache.camel.component.milo.NodeIds.nodeValue; import static org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig.USER_TOKEN_POLICY_ANONYMOUS; @@ -61,12 +66,22 @@ public class CallClientTest extends AbstractMiloServerTest { = MILO_CLIENT_BASE_C1 + "?node=" + NodeIds.nodeValue(MockCamelNamespace.URI, MockCamelNamespace.FOLDER_ID) + "&method=" + nodeValue(MockCamelNamespace.URI, MockCamelNamespace.CALL_ID) + "&overrideHost=true"; + private static final Logger LOG = LoggerFactory.getLogger(CallClientTest.class); + private OpcUaServer server; private MockCamelNamespace namespace; private MockCallMethod callMethod; @Produce(DIRECT_START_1) private ProducerTemplate producer1; + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName=testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } @Override protected RoutesBuilder createRouteBuilder() { @@ -173,4 +188,20 @@ public class CallClientTest extends AbstractMiloServerTest { // we always write synchronously since we do need the message order producerTemplate.sendBodyAndHeader(input, "await", true); } + + private static final class InsecureCertificateValidator implements ServerCertificateValidator{ + + public static final ServerCertificateValidator INSTANCE = new CallClientTest.InsecureCertificateValidator(); + + private InsecureCertificateValidator() { + } + + @Override + public void validateCertificateChain(List<X509Certificate> list,String s) throws UaException { + } + + @Override + public void validateCertificateChain(List<X509Certificate> list) throws UaException{ + } + } } diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java index 70bbe26cf8d..b8240cf3b4b 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/call/MockCamelNamespace.java @@ -24,9 +24,10 @@ import java.util.function.Function; import org.apache.camel.component.milo.client.MiloClientConsumer; import org.apache.camel.component.milo.server.internal.CamelServerItem; import org.eclipse.milo.opcua.sdk.core.Reference; +import org.eclipse.milo.opcua.sdk.server.Lifecycle; import org.eclipse.milo.opcua.sdk.server.OpcUaServer; import org.eclipse.milo.opcua.sdk.server.api.DataItem; -import org.eclipse.milo.opcua.sdk.server.api.ManagedNamespace; +import org.eclipse.milo.opcua.sdk.server.api.ManagedNamespaceWithLifecycle; import org.eclipse.milo.opcua.sdk.server.api.MonitoredItem; import org.eclipse.milo.opcua.sdk.server.api.methods.AbstractMethodInvocationHandler; import org.eclipse.milo.opcua.sdk.server.nodes.UaFolderNode; @@ -39,7 +40,7 @@ import org.eclipse.milo.opcua.stack.core.types.builtin.QualifiedName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class MockCamelNamespace extends ManagedNamespace { +public class MockCamelNamespace extends ManagedNamespaceWithLifecycle{ public static final String URI = "urn:org:apache:camel:mock"; public static final int FOLDER_ID = 1; @@ -61,11 +62,24 @@ public class MockCamelNamespace extends ManagedNamespace { this.subscriptionModel = new SubscriptionModel(server, this); this.callMethodCreator = callMethodCreator; + + super.getLifecycleManager().addLifecycle(new Lifecycle() { + + @Override + public void startup() { + LOG.trace("CamelNamespace startup"); + createNodes(); + } + + @Override + public void shutdown() { + LOG.trace("CamelNamespace shutdown"); + } + }); } - - @Override - protected void onStartup() { - super.onStartup(); + + private void createNodes() { + // create structure final NodeId nodeId = newNodeId(FOLDER_ID); @@ -96,8 +110,8 @@ public class MockCamelNamespace extends ManagedNamespace { .build(); AbstractMethodInvocationHandler callMethod = callMethodCreator.apply(methodNode); - methodNode.setProperty(UaMethodNode.InputArguments, callMethod.getInputArguments()); - methodNode.setProperty(UaMethodNode.OutputArguments, callMethod.getOutputArguments()); + methodNode.setInputArguments(callMethod.getInputArguments()); + methodNode.setOutputArguments(callMethod.getOutputArguments()); methodNode.setInvocationHandler(callMethod); getNodeManager().addNode(methodNode); diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java index c98c12f344f..f5ad99980b9 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/client/NodeIdTest.java @@ -21,7 +21,11 @@ import java.io.Serializable; import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.component.milo.AbstractMiloServerTest; import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static com.google.common.net.UrlEscapers.urlFormParameterEscaper; import static org.apache.camel.component.milo.server.MiloServerComponent.DEFAULT_NAMESPACE_URI; @@ -35,7 +39,17 @@ import static org.junit.jupiter.api.Assertions.assertThrows; * Testing different ways to specify node IDs */ public class NodeIdTest extends AbstractMiloServerTest { - + + private static final Logger LOG = LoggerFactory.getLogger(NodeIdTest.class); + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName = testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Test public void testFull1() { final String s = String.format("nsu=%s;s=%s", DEFAULT_NAMESPACE_URI, "item-1"); diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/converter/ConverterTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/converter/ConverterTest.java index 03cdbf280ba..b771fec3043 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/converter/ConverterTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/converter/ConverterTest.java @@ -19,14 +19,28 @@ package org.apache.camel.component.milo.converter; import org.apache.camel.test.junit5.CamelTestSupport; import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue; import org.eclipse.milo.opcua.stack.core.types.builtin.Variant; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; public class ConverterTest extends CamelTestSupport { - + + private static final Logger LOG = LoggerFactory.getLogger(ConverterTest.class); + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName = testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Test public void testDataValueToVariant() { final Variant value = testConvertDataValue("Foo", Variant.class); diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerLocalTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerLocalTest.java index 2d00770477e..e757b707b96 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerLocalTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerLocalTest.java @@ -19,6 +19,7 @@ package org.apache.camel.component.milo.server; import org.apache.camel.EndpointInject; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.milo.converter.ConverterTest; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.AvailablePortFinder; import org.apache.camel.test.junit5.CamelTestSupport; @@ -27,6 +28,9 @@ import org.eclipse.milo.opcua.stack.core.types.builtin.Variant; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Unit tests for milo server component without using an actual connection @@ -36,12 +40,18 @@ public class ServerLocalTest extends CamelTestSupport { private static final String MILO_ITEM_1 = "milo-server:myitem1"; private static final String MOCK_TEST = "mock:test"; + + private static final Logger LOG = LoggerFactory.getLogger(ConverterTest.class); @EndpointInject(MOCK_TEST) protected MockEndpoint testEndpoint; - + @BeforeEach - public void pickFreePort() { + public void pickFreePort(TestInfo testInfo) { + final var displayName = testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); final MiloServerComponent component = context().getComponent("milo-server", MiloServerComponent.class); component.setPort(AvailablePortFinder.getNextAvailable()); } diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetCertificateManagerTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetCertificateManagerTest.java index 7a31039ebe8..e9b0840b613 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetCertificateManagerTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetCertificateManagerTest.java @@ -21,7 +21,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import org.apache.camel.component.milo.AbstractMiloServerTest; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; @@ -29,7 +33,17 @@ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; * Test setting the certificate manager */ public class ServerSetCertificateManagerTest extends AbstractMiloServerTest { - + + private static final Logger LOG = LoggerFactory.getLogger(ServerSetCertificateManagerTest.class); + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName = testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Override protected void configureMiloServer(final MiloServerComponent server) throws Exception { super.configureMiloServer(server); diff --git a/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetSecurityPoliciesTest.java b/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetSecurityPoliciesTest.java index c28ca63ae25..3156a7d4806 100644 --- a/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetSecurityPoliciesTest.java +++ b/components/camel-milo/src/test/java/org/apache/camel/component/milo/server/ServerSetSecurityPoliciesTest.java @@ -18,13 +18,27 @@ package org.apache.camel.component.milo.server; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Test setting security policies */ public class ServerSetSecurityPoliciesTest extends CamelTestSupport { - + + private static final Logger LOG = LoggerFactory.getLogger(ServerSetSecurityPoliciesTest.class); + + @BeforeEach + public void setup(TestInfo testInfo) { + final var displayName = testInfo.getDisplayName(); + LOG.info("********************************************************************************"); + LOG.info(displayName); + LOG.info("********************************************************************************"); + } + @Test public void testSetSecurityPolicies1() { final MiloServerComponent component = new MiloServerComponent();
