Remove unused exceptions
[controller.git] / opendaylight / md-sal / sal-binding-dom-it / src / test / java / org / opendaylight / controller / sal / binding / test / connect / dom / CrossBrokerRpcTest.java
index d14bd72dafbf0758bf87438f987795b5f390826e..eb5cf21260b50a082c0fa2865cafb6f37e9b0581 100644 (file)
@@ -10,18 +10,23 @@ package org.opendaylight.controller.sal.binding.test.connect.dom;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
 import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.controller.md.sal.dom.api.DOMRpcException;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcIdentifier;
-import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementation;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
@@ -29,6 +34,8 @@ import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.controller.sal.binding.test.util.BindingBrokerTestFactory;
 import org.opendaylight.controller.sal.binding.test.util.BindingTestContext;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.of.migration.test.model.rev150210.KnockKnockInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.of.migration.test.model.rev150210.KnockKnockInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.of.migration.test.model.rev150210.KnockKnockOutput;
@@ -44,7 +51,6 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class CrossBrokerRpcTest {
@@ -68,16 +74,18 @@ public class CrossBrokerRpcTest {
     public static final InstanceIdentifier<TopLevelList> BA_NODE_B_ID = NODES_PATH.child(TopLevelList.class, NODE_B);
     public static final InstanceIdentifier<TopLevelList> BA_NODE_C_ID = NODES_PATH.child(TopLevelList.class, NODE_C);
 
-    public static final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier BI_NODE_C_ID = createBINodeIdentifier(NODE_C);
+    public static final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier BI_NODE_C_ID =
+            createBINodeIdentifier(NODE_C);
 
 
     @Before
-    public void setup() {
+    public void setup() throws Exception {
         BindingBrokerTestFactory testFactory = new BindingBrokerTestFactory();
         testFactory.setExecutor(MoreExecutors.newDirectExecutorService());
-        testFactory.setStartWithParsedSchema(true);
         testContext = testFactory.getTestContext();
 
+        testContext.setSchemaModuleInfos(ImmutableSet.of(
+                BindingReflections.getModuleInfo(OpendaylightOfMigrationTestModelService.class)));
         testContext.start();
         providerRegistry = testContext.getBindingRpcRegistry();
         provisionRegistry = testContext.getDomRpcRegistry();
@@ -89,6 +97,58 @@ public class CrossBrokerRpcTest {
 
     }
 
+    @After
+    public void teardown() {
+        testContext.close();
+    }
+
+    @Test
+    public void testBindingRpcShortcutRegisteredViaLegacyAPI()
+            throws InterruptedException, ExecutionException, TimeoutException {
+        final ListenableFuture<RpcResult<KnockKnockOutput>> knockResult = knockResult(true, "open");
+        knockService.registerPath(TestContext.class, BA_NODE_A_ID).setKnockKnockResult(knockResult);
+
+        OpendaylightOfMigrationTestModelService baKnockInvoker =
+                providerRegistry.getRpcService(OpendaylightOfMigrationTestModelService.class);
+
+        final KnockKnockInput knockInput = knockKnock(BA_NODE_A_ID).setQuestion("Who's there?").build();
+        ListenableFuture<RpcResult<KnockKnockOutput>> future = baKnockInvoker.knockKnock(knockInput);
+
+        final RpcResult<KnockKnockOutput> rpcResult = future.get(5, TimeUnit.SECONDS);
+
+        assertEquals(knockResult.get().getResult().getClass(), rpcResult.getResult().getClass());
+        assertSame(knockResult.get().getResult(), rpcResult.getResult());
+        assertSame(knockInput, knockService.getReceivedKnocks().get(BA_NODE_A_ID).iterator().next());
+    }
+
+    @Test
+    public void testBindingRpcShortcutRegisteredViaMdsalAPI()
+            throws InterruptedException, ExecutionException, TimeoutException {
+        final ListenableFuture<RpcResult<KnockKnockOutput>> knockResult = knockResult(true, "open");
+
+        BindingDOMRpcProviderServiceAdapter mdsalServiceRegistry = new BindingDOMRpcProviderServiceAdapter(
+                testContext.getDelegateDomRouter().getRpcProviderService(), testContext.getCodec());
+
+        final Multimap<InstanceIdentifier<?>, KnockKnockInput> receivedKnocks = HashMultimap.create();
+        mdsalServiceRegistry.registerRpcImplementation(OpendaylightOfMigrationTestModelService.class,
+            (OpendaylightOfMigrationTestModelService) input -> {
+                receivedKnocks.put(input.getKnockerId(), input);
+                return knockResult;
+            }, ImmutableSet.of(BA_NODE_A_ID));
+
+        OpendaylightOfMigrationTestModelService baKnockInvoker =
+                providerRegistry.getRpcService(OpendaylightOfMigrationTestModelService.class);
+
+        final KnockKnockInput knockInput = knockKnock(BA_NODE_A_ID).setQuestion("Who's there?").build();
+        Future<RpcResult<KnockKnockOutput>> future = baKnockInvoker.knockKnock(knockInput);
+
+        final RpcResult<KnockKnockOutput> rpcResult = future.get(5, TimeUnit.SECONDS);
+
+        assertEquals(knockResult.get().getResult().getClass(), rpcResult.getResult().getClass());
+        assertSame(knockResult.get().getResult(), rpcResult.getResult());
+        assertSame(knockInput, receivedKnocks.get(BA_NODE_A_ID).iterator().next());
+    }
+
     @Test
     public void bindingRoutedRpcProvider_DomInvokerTest() throws Exception {
 
@@ -119,18 +179,15 @@ public class CrossBrokerRpcTest {
         builder.setAnswer("open");
         final KnockKnockOutput output = builder.build();
 
-        provisionRegistry.registerRpcImplementation(new DOMRpcImplementation() {
-
-            @Override
-            public CheckedFuture<DOMRpcResult, DOMRpcException> invokeRpc(final DOMRpcIdentifier rpc, final NormalizedNode<?, ?> input) {
-                ContainerNode result = testContext.getCodec().getCodecFactory().toNormalizedNodeRpcData(output);
-                return Futures.<DOMRpcResult, DOMRpcException>immediateCheckedFuture(new DefaultDOMRpcResult(result));
-            }
+        provisionRegistry.registerRpcImplementation((rpc, input) -> {
+            ContainerNode result = testContext.getCodec().getCodecFactory().toNormalizedNodeRpcData(output);
+            return Futures.immediateCheckedFuture(new DefaultDOMRpcResult(result));
         }, DOMRpcIdentifier.create(KNOCK_KNOCK_PATH, BI_NODE_C_ID));
 
         OpendaylightOfMigrationTestModelService baKnockInvoker =
                 providerRegistry.getRpcService(OpendaylightOfMigrationTestModelService.class);
-        Future<RpcResult<KnockKnockOutput>> baResult = baKnockInvoker.knockKnock((knockKnock(BA_NODE_C_ID).setQuestion("Who's there?").build()));
+        Future<RpcResult<KnockKnockOutput>> baResult = baKnockInvoker.knockKnock(knockKnock(BA_NODE_C_ID)
+            .setQuestion("Who's there?").build());
         assertNotNull(baResult);
         assertEquals(output, baResult.get().getResult());
     }
@@ -139,21 +196,18 @@ public class CrossBrokerRpcTest {
         return testContext.getCodec().getCodecFactory().toNormalizedNodeRpcData(addFlowA);
     }
 
-    @After
-    public void teardown() throws Exception {
-        testContext.close();
-    }
-
-    private static org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier createBINodeIdentifier(final TopLevelListKey listKey) {
+    private static org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier createBINodeIdentifier(
+            final TopLevelListKey listKey) {
         return org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.builder().node(Top.QNAME)
                 .node(TopLevelList.QNAME)
                 .nodeWithKey(TopLevelList.QNAME, NODE_ID_QNAME, listKey.getName()).build();
     }
 
-    private Future<RpcResult<KnockKnockOutput>> knockResult(final boolean success, final String answer) {
-        KnockKnockOutput output = new KnockKnockOutputBuilder() //
-                .setAnswer(answer).build();
-        RpcResult<KnockKnockOutput> result = RpcResultBuilder.<KnockKnockOutput>status(success).withResult(output).build();
+    private static ListenableFuture<RpcResult<KnockKnockOutput>> knockResult(final boolean success,
+            final String answer) {
+        KnockKnockOutput output = new KnockKnockOutputBuilder().setAnswer(answer).build();
+        RpcResult<KnockKnockOutput> result = RpcResultBuilder.<KnockKnockOutput>status(success).withResult(output)
+                .build();
         return Futures.immediateFuture(result);
     }