2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.controller.remote.rpc;
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.ArgumentMatchers.eq;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.inOrder;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.verifyNoMoreInteractions;
17 import akka.actor.ActorRef;
18 import akka.actor.ActorSystem;
19 import akka.actor.Address;
20 import akka.actor.Props;
21 import akka.testkit.TestActorRef;
22 import akka.testkit.javadsl.TestKit;
23 import com.google.common.collect.ImmutableMap;
24 import java.util.Collections;
26 import java.util.Optional;
27 import org.junit.After;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.mockito.InOrder;
31 import org.mockito.Mock;
32 import org.mockito.MockitoAnnotations;
33 import org.opendaylight.controller.remote.rpc.registry.ActionRegistry.Messages.UpdateRemoteActionEndpoints;
34 import org.opendaylight.controller.remote.rpc.registry.ActionRegistry.RemoteActionEndpoint;
35 import org.opendaylight.controller.remote.rpc.registry.RpcRegistry.Messages.UpdateRemoteEndpoints;
36 import org.opendaylight.controller.remote.rpc.registry.RpcRegistry.RemoteRpcEndpoint;
37 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
38 import org.opendaylight.mdsal.dom.api.DOMActionInstance;
39 import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
40 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
41 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
42 import org.opendaylight.yangtools.concepts.ObjectRegistration;
43 import org.opendaylight.yangtools.concepts.Registration;
44 import org.opendaylight.yangtools.yang.common.QName;
45 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
46 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
48 public class OpsRegistrarTest {
50 private DOMRpcProviderService rpcService;
52 private DOMActionProviderService actionService;
54 private Registration oldReg;
56 private Registration newReg;
58 private ObjectRegistration<RemoteActionImplementation> oldActionReg;
60 private ObjectRegistration<RemoteActionImplementation> newActionReg;
62 private ActorSystem system;
63 private TestActorRef<OpsRegistrar> testActorRef;
64 private Address endpointAddress;
65 private RemoteRpcEndpoint firstEndpoint;
66 private RemoteRpcEndpoint secondEndpoint;
67 private RemoteActionEndpoint firstActionEndpoint;
68 private RemoteActionEndpoint secondActionEndpoint;
69 private OpsRegistrar opsRegistrar;
73 MockitoAnnotations.initMocks(this);
74 system = ActorSystem.create("test");
76 final TestKit testKit = new TestKit(system);
77 final RemoteOpsProviderConfig config = new RemoteOpsProviderConfig.Builder("system").build();
78 final Props props = OpsRegistrar.props(config, rpcService, actionService);
79 testActorRef = new TestActorRef<>(system, props, testKit.getRef(), "actorRef");
80 endpointAddress = new Address("http", "local");
82 final DOMRpcIdentifier firstEndpointId = DOMRpcIdentifier.create(QName.create("first:identifier", "foo"));
83 final DOMRpcIdentifier secondEndpointId = DOMRpcIdentifier.create(QName.create("second:identifier", "bar"));
84 final QName firstActionQName = QName.create("first:actionIdentifier", "fooAction");
86 final DOMActionInstance firstActionInstance = DOMActionInstance.of(Absolute.of(firstActionQName),
87 LogicalDatastoreType.OPERATIONAL,
88 YangInstanceIdentifier.create(new YangInstanceIdentifier.NodeIdentifier(firstActionQName)));
90 final DOMActionInstance secondActionInstance = DOMActionInstance.of(Absolute.of(firstActionQName),
91 LogicalDatastoreType.OPERATIONAL,
92 YangInstanceIdentifier.create(new YangInstanceIdentifier.NodeIdentifier(firstActionQName)));
94 final TestKit senderKit = new TestKit(system);
95 firstEndpoint = new RemoteRpcEndpoint(senderKit.getRef(), Collections.singletonList(firstEndpointId));
96 secondEndpoint = new RemoteRpcEndpoint(senderKit.getRef(), Collections.singletonList(secondEndpointId));
97 firstActionEndpoint = new RemoteActionEndpoint(senderKit.getRef(),
98 Collections.singletonList(firstActionInstance));
99 secondActionEndpoint = new RemoteActionEndpoint(senderKit.getRef(),
100 Collections.singletonList(secondActionInstance));
102 doReturn(oldReg).when(rpcService).registerRpcImplementation(any(RemoteRpcImplementation.class),
103 eq(firstEndpoint.getRpcs()));
104 doReturn(newReg).when(rpcService).registerRpcImplementation(any(RemoteRpcImplementation.class),
105 eq(secondEndpoint.getRpcs()));
107 doReturn(oldActionReg).when(actionService).registerActionImplementation(any(RemoteActionImplementation.class),
108 eq(secondActionEndpoint.getActions()));
109 doReturn(oldActionReg).when(actionService).registerActionImplementation(any(RemoteActionImplementation.class),
110 eq(secondActionEndpoint.getActions()));
112 opsRegistrar = testActorRef.underlyingActor();
116 public void tearDown() {
117 TestKit.shutdownActorSystem(system, true);
121 public void testHandleReceiveAddEndpoint() {
122 final Map<Address, Optional<RemoteRpcEndpoint>> endpoints = ImmutableMap.of(
123 endpointAddress, Optional.of(firstEndpoint));
124 testActorRef.tell(new UpdateRemoteEndpoints(endpoints), ActorRef.noSender());
126 verify(rpcService).registerRpcImplementation(any(RemoteRpcImplementation.class),
127 eq(firstEndpoint.getRpcs()));
128 verifyNoMoreInteractions(rpcService, oldReg, newReg);
132 public void testHandleReceiveRemoveEndpoint() {
133 final Map<Address, Optional<RemoteRpcEndpoint>> endpoints = ImmutableMap.of(
134 endpointAddress, Optional.empty());
135 testActorRef.tell(new UpdateRemoteEndpoints(endpoints), ActorRef.noSender());
136 verifyNoMoreInteractions(rpcService, oldReg, newReg);
140 public void testHandleReceiveUpdateRpcEndpoint() {
141 final InOrder inOrder = inOrder(rpcService, oldReg, newReg);
143 testActorRef.tell(new UpdateRemoteEndpoints(ImmutableMap.of(endpointAddress, Optional.of(firstEndpoint))),
144 ActorRef.noSender());
146 inOrder.verify(rpcService).registerRpcImplementation(any(RemoteRpcImplementation.class),
147 eq(firstEndpoint.getRpcs()));
149 testActorRef.tell(new UpdateRemoteEndpoints(ImmutableMap.of(endpointAddress, Optional.of(secondEndpoint))),
150 ActorRef.noSender());
152 inOrder.verify(rpcService).registerRpcImplementation(any(RemoteRpcImplementation.class),
153 eq(secondEndpoint.getRpcs()));
155 // verify first registration is closed
156 inOrder.verify(oldReg).close();
158 verifyNoMoreInteractions(rpcService, oldReg, newReg);
162 public void testHandleReceiveUpdateActionEndpoint() {
163 final InOrder inOrder = inOrder(actionService, oldActionReg, newActionReg);
165 testActorRef.tell(new UpdateRemoteActionEndpoints(ImmutableMap.of(endpointAddress,
166 Optional.of(firstActionEndpoint))), ActorRef.noSender());
168 inOrder.verify(actionService).registerActionImplementation(any(RemoteActionImplementation.class),
169 eq(firstActionEndpoint.getActions()));
171 testActorRef.tell(new UpdateRemoteActionEndpoints(ImmutableMap.of(endpointAddress,
172 Optional.of(secondActionEndpoint))), ActorRef.noSender());
174 inOrder.verify(actionService).registerActionImplementation(any(RemoteActionImplementation.class),
175 eq(secondActionEndpoint.getActions()));
177 // verify first registration is closed
178 inOrder.verify(oldActionReg).close();
180 verifyNoMoreInteractions(actionService, oldActionReg, newActionReg);