Teach sal-remoterpc-connector to route actions
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / src / test / java / org / opendaylight / controller / remote / rpc / AbstractOpsTest.java
diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/AbstractOpsTest.java b/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/AbstractOpsTest.java
new file mode 100644 (file)
index 0000000..4d96770
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2014 Brocade Communications Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.remote.rpc;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.testkit.javadsl.TestKit;
+import java.net.URI;
+import java.util.Collection;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DOMActionService;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMRpcResult;
+import org.opendaylight.mdsal.dom.api.DOMRpcService;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity;
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
+
+/**
+ * Base class for RPC tests.
+ *
+ * @author Thomas Pantelis
+ */
+public class AbstractOpsTest {
+    static final String TEST_REV = "2014-08-28";
+    static final String TEST_NS = "urn:test";
+    static final URI TEST_URI = URI.create(TEST_NS);
+    static final QName TEST_RPC = QName.create(TEST_NS, TEST_REV, "test-something");
+    static final QName TEST_RPC_INPUT = QName.create(TEST_NS, TEST_REV, "input");
+    static final QName TEST_RPC_INPUT_DATA = QName.create(TEST_NS, TEST_REV, "input-data");
+    static final QName TEST_RPC_OUTPUT = QName.create(TEST_NS, TEST_REV, "output");
+
+
+    static final SchemaPath TEST_RPC_TYPE = SchemaPath.create(true, TEST_RPC);
+    static final YangInstanceIdentifier TEST_PATH = YangInstanceIdentifier.create(
+            new YangInstanceIdentifier.NodeIdentifier(TEST_RPC));
+    public static final DOMRpcIdentifier TEST_RPC_ID = DOMRpcIdentifier.create(TEST_RPC_TYPE, TEST_PATH);
+    public static final DOMDataTreeIdentifier TEST_DATA_TREE_ID = new DOMDataTreeIdentifier(
+            LogicalDatastoreType.OPERATIONAL, TEST_PATH);
+
+    static ActorSystem node1;
+    static ActorSystem node2;
+    static RemoteOpsProviderConfig config1;
+    static RemoteOpsProviderConfig config2;
+
+    protected ActorRef rpcInvoker1;
+    protected TestKit rpcRegistry1Probe;
+    protected ActorRef rpcInvoker2;
+    protected TestKit rpcRegistry2Probe;
+    protected SchemaContext schemaContext;
+    protected RemoteRpcImplementation remoteRpcImpl1;
+    protected RemoteRpcImplementation remoteRpcImpl2;
+    protected RemoteActionImplementation remoteActionImpl1;
+    protected RemoteActionImplementation remoteActionImpl2;
+
+    @Mock
+    protected DOMRpcService domRpcService1;
+    @Mock
+    protected DOMActionService domActionService1;
+    @Mock
+    protected DOMRpcService domRpcService2;
+    @Mock
+    protected DOMActionService domActionService2;
+
+    @BeforeClass
+    public static void setup() {
+        config1 = new RemoteOpsProviderConfig.Builder("memberA").build();
+        config2 = new RemoteOpsProviderConfig.Builder("memberB").build();
+        node1 = ActorSystem.create("opendaylight-rpc", config1.get());
+        node2 = ActorSystem.create("opendaylight-rpc", config2.get());
+    }
+
+    @AfterClass
+    public static void teardown() {
+        TestKit.shutdownActorSystem(node1);
+        TestKit.shutdownActorSystem(node2);
+        node1 = null;
+        node2 = null;
+    }
+
+    @Before
+    public void setUp() {
+        schemaContext = YangParserTestUtils.parseYangResources(AbstractOpsTest.class, "/test-rpc.yang");
+
+        MockitoAnnotations.initMocks(this);
+
+        rpcRegistry1Probe = new TestKit(node1);
+        rpcInvoker1 = node1.actorOf(OpsInvoker.props(domRpcService1, domActionService1));
+        rpcRegistry2Probe = new TestKit(node2);
+        rpcInvoker2 = node2.actorOf(OpsInvoker.props(domRpcService2, domActionService2));
+        remoteRpcImpl1 = new RemoteRpcImplementation(rpcInvoker2, config1);
+        remoteRpcImpl2 = new RemoteRpcImplementation(rpcInvoker1, config2);
+        remoteActionImpl1 = new RemoteActionImplementation(rpcInvoker2, config1);
+        remoteActionImpl2 = new RemoteActionImplementation(rpcInvoker1, config2);
+    }
+
+    static void assertRpcErrorEquals(final RpcError rpcError, final ErrorSeverity severity,
+                                     final ErrorType errorType, final String tag, final String message,
+                                     final String applicationTag, final String info, final String causeMsg) {
+        assertEquals("getSeverity", severity, rpcError.getSeverity());
+        assertEquals("getErrorType", errorType, rpcError.getErrorType());
+        assertEquals("getTag", tag, rpcError.getTag());
+        assertTrue("getMessage contains " + message, rpcError.getMessage().contains(message));
+        assertEquals("getApplicationTag", applicationTag, rpcError.getApplicationTag());
+        assertEquals("getInfo", info, rpcError.getInfo());
+
+        if (causeMsg == null) {
+            assertNull("Unexpected cause " + rpcError.getCause(), rpcError.getCause());
+        } else {
+            assertEquals("Cause message", causeMsg, rpcError.getCause().getMessage());
+        }
+    }
+
+    static void assertCompositeNodeEquals(final NormalizedNode<? , ?> exp, final NormalizedNode<? , ?> actual) {
+        assertEquals(exp, actual);
+    }
+
+    public static ContainerNode makeRPCInput(final String data) {
+        return Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(TEST_RPC_INPUT))
+                .withChild(ImmutableNodes.leafNode(TEST_RPC_INPUT_DATA, data)).build();
+
+    }
+
+    public static ContainerNode makeRPCOutput(final String data) {
+        return Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(TEST_RPC_OUTPUT))
+                .withChild(ImmutableNodes.leafNode(TEST_RPC_OUTPUT, data)).build();
+    }
+
+    static void assertFailedRpcResult(final DOMRpcResult rpcResult, final ErrorSeverity severity,
+                                      final ErrorType errorType, final String tag, final String message,
+                                      final String applicationTag, final String info, final String causeMsg) {
+        assertNotNull("RpcResult was null", rpcResult);
+        final Collection<? extends RpcError> rpcErrors = rpcResult.getErrors();
+        assertEquals("RpcErrors count", 1, rpcErrors.size());
+        assertRpcErrorEquals(rpcErrors.iterator().next(), severity, errorType, tag, message,
+                applicationTag, info, causeMsg);
+    }
+
+    static void assertSuccessfulRpcResult(final DOMRpcResult rpcResult,
+                                          final NormalizedNode<? , ?> expOutput) {
+        assertNotNull("RpcResult was null", rpcResult);
+        assertCompositeNodeEquals(expOutput, rpcResult.getResult());
+    }
+
+    static class TestException extends Exception {
+        private static final long serialVersionUID = 1L;
+
+        static final String MESSAGE = "mock error";
+
+        TestException() {
+            super(MESSAGE);
+        }
+    }
+}