Hide BindingReflections.getModuleInfo()
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / Mdsal500Test.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.dom.adapter;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNotSame;
13 import static org.junit.Assert.assertSame;
14 import static org.junit.Assert.assertTrue;
15
16 import com.google.common.collect.HashMultimap;
17 import com.google.common.collect.Multimap;
18 import com.google.common.util.concurrent.Futures;
19 import com.google.common.util.concurrent.ListenableFuture;
20 import com.google.common.util.concurrent.MoreExecutors;
21 import java.util.Set;
22 import java.util.concurrent.ExecutionException;
23 import java.util.concurrent.Future;
24 import java.util.concurrent.TimeUnit;
25 import java.util.concurrent.TimeoutException;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
29 import org.opendaylight.mdsal.binding.api.RpcProviderService;
30 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingBrokerTestFactory;
31 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingTestContext;
32 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
33 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
34 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
35 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
36 import org.opendaylight.mdsal.dom.api.DOMRpcService;
37 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
38 import org.opendaylight.yang.gen.v1.rpc.norev.Mdsal500Service;
39 import org.opendaylight.yang.gen.v1.rpc.norev.SwitchInput;
40 import org.opendaylight.yang.gen.v1.rpc.norev.SwitchInputBuilder;
41 import org.opendaylight.yang.gen.v1.rpc.norev.SwitchOutput;
42 import org.opendaylight.yang.gen.v1.rpc.norev.SwitchOutputBuilder;
43 import org.opendaylight.yangtools.concepts.ObjectRegistration;
44 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
45 import org.opendaylight.yangtools.yang.common.QName;
46 import org.opendaylight.yangtools.yang.common.RpcResult;
47 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
48 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
49
50 public class Mdsal500Test {
51     private static final String FOO = "foo";
52
53     private static final QName SWITCH_QNAME = QName.create(SwitchOutput.QNAME, "switch");
54
55     private RpcProviderService baRpcProviderService;
56     private RpcConsumerRegistry baRpcConsumerService;
57     private DOMRpcProviderService biRpcProviderService;
58     private BindingTestContext testContext;
59     private DOMRpcService biRpcService;
60     private final Mdsal500ServiceImpl switchRpcImpl = new Mdsal500ServiceImpl();
61
62     @Before
63     public void setup() throws Exception {
64         BindingBrokerTestFactory testFactory = new BindingBrokerTestFactory();
65         testFactory.setExecutor(MoreExecutors.newDirectExecutorService());
66         testContext = testFactory.getTestContext();
67
68         testContext.setSchemaModuleInfos(Set.of(
69             BindingRuntimeHelpers.getYangModuleInfo(Mdsal500Service.class)));
70         testContext.start();
71         baRpcProviderService = testContext.getBindingRpcProviderRegistry();
72         baRpcConsumerService = testContext.getBindingRpcConsumerRegistry();
73         biRpcProviderService = testContext.getDomRpcRegistry();
74         biRpcService = testContext.getDomRpcInvoker();
75     }
76
77     @Test
78     public void testBindingRegistrationWithDOMInvocation() throws Exception {
79         switchRpcImpl.registerTo(baRpcProviderService).setSwitchResult(switchResult(true));
80
81         final Mdsal500Service baSwitchService = baRpcConsumerService.getRpcService(Mdsal500Service.class);
82         assertNotSame(switchRpcImpl, baSwitchService);
83
84         SwitchInput baSwitchInput = switchBuilder(FOO).build();
85
86         ContainerNode biSwitchInput = toDOMSwitchInput(baSwitchInput);
87         DOMRpcResult domResult = biRpcService.invokeRpc(SWITCH_QNAME, biSwitchInput).get(5, TimeUnit.SECONDS);
88         assertNotNull(domResult);
89         assertNotNull(domResult.value());
90         assertTrue("Binding KnockKnock service was not invoked",
91                 switchRpcImpl.getReceivedSwitch().containsKey(FOO));
92         assertEquals(baSwitchInput, switchRpcImpl.getReceivedSwitch().get(FOO).iterator().next());
93     }
94
95     @Test
96     public void testDOMRegistrationWithBindingInvocation()
97             throws InterruptedException, ExecutionException, TimeoutException {
98         SwitchOutput baSwitchOutput = new SwitchOutputBuilder().build();
99
100         biRpcProviderService.registerRpcImplementation((rpc, input) ->
101             FluentFutures.immediateFluentFuture(new DefaultDOMRpcResult(testContext.getCodec().currentSerializer()
102                     .toNormalizedNodeRpcData(baSwitchOutput))),
103             DOMRpcIdentifier.create(SWITCH_QNAME));
104
105         final Mdsal500Service baSwitchService =
106                 baRpcConsumerService.getRpcService(Mdsal500Service.class);
107         Future<RpcResult<SwitchOutput>> baResult = baSwitchService.switch$(switchBuilder(FOO)
108             .build());
109         assertNotNull(baResult);
110         assertEquals(baSwitchOutput, baResult.get(5, TimeUnit.SECONDS).getResult());
111     }
112
113     @Test
114     public void testBindingRpcShortcut() throws InterruptedException, ExecutionException, TimeoutException {
115         final ListenableFuture<RpcResult<SwitchOutput>> baSwitchResult = switchResult(true);
116         switchRpcImpl.registerTo(baRpcProviderService).setSwitchResult(baSwitchResult);
117
118         final Mdsal500Service baSwitchService = baRpcConsumerService.getRpcService(Mdsal500Service.class);
119
120         SwitchInput baSwitchInput = switchBuilder(FOO).build();
121         ListenableFuture<RpcResult<SwitchOutput>> future = baSwitchService.switch$(baSwitchInput);
122
123         final RpcResult<SwitchOutput> rpcResult = future.get(5, TimeUnit.SECONDS);
124
125         assertEquals(baSwitchResult.get().getResult().getClass(), rpcResult.getResult().getClass());
126         assertSame(baSwitchResult.get().getResult(), rpcResult.getResult());
127         assertSame(baSwitchInput, switchRpcImpl.getReceivedSwitch().get(FOO).iterator().next());
128     }
129
130     private static ListenableFuture<RpcResult<SwitchOutput>> switchResult(final boolean success) {
131         return Futures.immediateFuture(RpcResultBuilder.<SwitchOutput>status(success)
132             .withResult(new SwitchOutputBuilder().build())
133             .build());
134     }
135
136     private static SwitchInputBuilder switchBuilder(final String foo) {
137         return new SwitchInputBuilder().setFoo(foo);
138     }
139
140     private ContainerNode toDOMSwitchInput(final SwitchInput from) {
141         return testContext.getCodec().currentSerializer().toNormalizedNodeRpcData(from);
142     }
143
144     private static class Mdsal500ServiceImpl implements Mdsal500Service {
145         private ListenableFuture<RpcResult<SwitchOutput>> switchResult;
146         private final Multimap<String, SwitchInput> receivedSwitch = HashMultimap.create();
147
148         Mdsal500ServiceImpl setSwitchResult(final ListenableFuture<RpcResult<SwitchOutput>> switchOutput) {
149             switchResult = switchOutput;
150             return this;
151         }
152
153         Multimap<String, SwitchInput> getReceivedSwitch() {
154             return receivedSwitch;
155         }
156
157         Mdsal500ServiceImpl registerTo(final RpcProviderService registry) {
158             final ObjectRegistration<Mdsal500ServiceImpl> registration =
159                     registry.registerRpcImplementation(Mdsal500Service.class, this);
160             assertNotNull(registration);
161             return this;
162         }
163
164         @Override
165         public ListenableFuture<RpcResult<SwitchOutput>> switch$(final SwitchInput switchInput) {
166             receivedSwitch.put(switchInput.getFoo(), switchInput);
167             return switchResult;
168         }
169     }
170
171 }