/** * 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.camel.component.milo; import org.apache.camel.EndpointInject; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; 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.eclipse.milo.opcua.stack.core.types.builtin.Variant; import org.junit.Test; import static org.apache.camel.component.milo.NodeIds.nodeValue; /** * Unit tests for writing from the client side */ public class WriteClientTest extends AbstractMiloServerTest { private static final String DIRECT_START_1 = "direct:start1"; private static final String DIRECT_START_2 = "direct:start2"; private static final String DIRECT_START_3 = "direct:start3"; private static final String DIRECT_START_4 = "direct:start4"; private static final String MILO_SERVER_ITEM_1 = "milo-server:myitem1"; private static final String MILO_SERVER_ITEM_2 = "milo-server:myitem2"; private static final String MILO_CLIENT_BASE_C1 = "milo-client:tcp://foo:bar@localhost:12685"; private static final String MILO_CLIENT_BASE_C2 = "milo-client:tcp://foo2:bar2@localhost:12685"; private static final String MILO_CLIENT_ITEM_C1_1 = MILO_CLIENT_BASE_C1 + "?node=" + nodeValue(MiloServerComponent.DEFAULT_NAMESPACE_URI, "items-myitem1"); private static final String MILO_CLIENT_ITEM_C1_2 = MILO_CLIENT_BASE_C1 + "?node=" + nodeValue(MiloServerComponent.DEFAULT_NAMESPACE_URI, "items-myitem2"); private static final String MILO_CLIENT_ITEM_C2_1 = MILO_CLIENT_BASE_C2 + "?node=" + nodeValue(MiloServerComponent.DEFAULT_NAMESPACE_URI, "items-myitem1"); private static final String MILO_CLIENT_ITEM_C2_2 = MILO_CLIENT_BASE_C2 + "?node=" + nodeValue(MiloServerComponent.DEFAULT_NAMESPACE_URI, "items-myitem2"); private static final String MOCK_TEST_1 = "mock:test1"; private static final String MOCK_TEST_2 = "mock:test2"; @EndpointInject(uri = MOCK_TEST_1) protected MockEndpoint test1Endpoint; @EndpointInject(uri = MOCK_TEST_2) protected MockEndpoint test2Endpoint; @Produce(uri = DIRECT_START_1) protected ProducerTemplate producer1; @Produce(uri = DIRECT_START_2) protected ProducerTemplate producer2; @Produce(uri = DIRECT_START_3) protected ProducerTemplate producer3; @Produce(uri = DIRECT_START_4) protected ProducerTemplate producer4; @Override protected RoutesBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from(MILO_SERVER_ITEM_1).to(MOCK_TEST_1); from(MILO_SERVER_ITEM_2).to(MOCK_TEST_2); from(DIRECT_START_1).to(MILO_CLIENT_ITEM_C1_1); from(DIRECT_START_2).to(MILO_CLIENT_ITEM_C1_2); from(DIRECT_START_3).to(MILO_CLIENT_ITEM_C2_1); from(DIRECT_START_4).to(MILO_CLIENT_ITEM_C2_2); } }; } @Test public void testWrite1() throws Exception { // item 1 this.test1Endpoint.setExpectedCount(2); testBody(this.test1Endpoint.message(0), assertGoodValue("Foo1")); testBody(this.test1Endpoint.message(1), assertGoodValue("Foo2")); // item 2 this.test2Endpoint.setExpectedCount(0); // send sendValue(this.producer1, new Variant("Foo1")); sendValue(this.producer1, new Variant("Foo2")); // assert this.assertMockEndpointsSatisfied(); } @Test public void testWrite2() throws Exception { // item 1 this.test1Endpoint.setExpectedCount(0); // item 2 this.test2Endpoint.setExpectedCount(2); testBody(this.test2Endpoint.message(0), assertGoodValue("Foo1")); testBody(this.test2Endpoint.message(1), assertGoodValue("Foo2")); // send sendValue(this.producer2, new Variant("Foo1")); sendValue(this.producer2, new Variant("Foo2")); // assert this.assertMockEndpointsSatisfied(); } @Test public void testWrite3() throws Exception { // item 1 this.test1Endpoint.setExpectedCount(2); testBody(this.test1Endpoint.message(0), assertGoodValue("Foo1")); testBody(this.test1Endpoint.message(1), assertGoodValue("Foo3")); // item 1 this.test2Endpoint.setExpectedCount(2); testBody(this.test2Endpoint.message(0), assertGoodValue("Foo2")); testBody(this.test2Endpoint.message(1), assertGoodValue("Foo4")); // send sendValue(this.producer1, new Variant("Foo1")); sendValue(this.producer2, new Variant("Foo2")); sendValue(this.producer3, new Variant("Foo3")); sendValue(this.producer4, new Variant("Foo4")); // assert assertMockEndpointsSatisfied(); } private static void sendValue(final ProducerTemplate producerTemplate, final Variant variant) { // we always write synchronously since we do need the message order producerTemplate.sendBodyAndHeader(variant, "await", true); } }