Hide CallHomeMountSessionManager
[netconf.git] / apps / callhome-provider / src / test / java / org / opendaylight / netconf / callhome / mount / CallHomeMountDispatcherTest.java
1 /*
2  * Copyright (c) 2016 Brocade Communication Systems 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.netconf.callhome.mount;
9
10 import static org.junit.Assert.assertFalse;
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.ArgumentMatchers.eq;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17
18 import io.netty.util.concurrent.EventExecutor;
19 import io.netty.util.concurrent.Future;
20 import java.net.InetSocketAddress;
21 import java.net.UnknownHostException;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
25 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
26 import org.opendaylight.controller.config.threadpool.ThreadPool;
27 import org.opendaylight.mdsal.binding.api.DataBroker;
28 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
29 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
30 import org.opendaylight.netconf.callhome.protocol.CallHomeChannelActivator;
31 import org.opendaylight.netconf.callhome.protocol.CallHomeProtocolSessionContext;
32 import org.opendaylight.netconf.client.NetconfClientSession;
33 import org.opendaylight.netconf.client.NetconfClientSessionListener;
34 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
35 import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
36 import org.opendaylight.netconf.nettyutil.ReconnectStrategy;
37 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
38 import org.opendaylight.netconf.sal.connect.api.SchemaResourceManager;
39 import org.opendaylight.netconf.sal.connect.netconf.schema.mapping.BaseNetconfSchemas;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
42
43 public class CallHomeMountDispatcherTest {
44     private String topologyId;
45     private EventExecutor mockExecutor;
46     private ScheduledThreadPool mockKeepAlive;
47     private ThreadPool mockProcessingExecutor;
48     private SchemaResourceManager mockSchemaRepoProvider;
49
50     private CallHomeMountDispatcher instance;
51     private DataBroker mockDataBroker;
52     private DOMMountPointService mockMount;
53
54     private CallHomeMountSessionManager mockSessMgr;
55     private CallHomeTopology mockTopology;
56     private CallHomeProtocolSessionContext mockProtoSess;
57     private AAAEncryptionService mockEncryptionService;
58     private BaseNetconfSchemas mockBaseSchemas;
59
60     @Before
61     public void setup() {
62         topologyId = "";
63         mockExecutor = mock(EventExecutor.class);
64         mockKeepAlive = mock(ScheduledThreadPool.class);
65         mockProcessingExecutor = mock(ThreadPool.class);
66         mockSchemaRepoProvider = mock(SchemaResourceManager.class);
67         mockDataBroker = mock(DataBroker.class);
68         mockMount = mock(DOMMountPointService.class);
69         mockSessMgr = mock(CallHomeMountSessionManager.class);
70         mockTopology = mock(CallHomeTopology.class);
71         mockProtoSess = mock(CallHomeProtocolSessionContext.class);
72         mockEncryptionService = mock(AAAEncryptionService.class);
73         mockBaseSchemas = mock(BaseNetconfSchemas.class);
74
75         instance = new CallHomeMountDispatcher(topologyId, mockExecutor, mockKeepAlive,
76                 mockProcessingExecutor, mockSchemaRepoProvider, mockBaseSchemas, mockDataBroker, mockMount,
77                 mockEncryptionService) {
78             @Override
79             CallHomeMountSessionManager sessionManager() {
80                 return mockSessMgr;
81             }
82
83             @Override
84             void createTopology() {
85                 topology = mockTopology;
86             }
87         };
88     }
89
90     NetconfClientConfiguration someConfiguration(final InetSocketAddress address) {
91         // NetconfClientConfiguration has mostly final methods, making it un-mock-able
92
93         final NetconfClientConfiguration.NetconfClientProtocol protocol =
94                 NetconfClientConfiguration.NetconfClientProtocol.SSH;
95         final NetconfHelloMessageAdditionalHeader additionalHeader = mock(NetconfHelloMessageAdditionalHeader.class);
96         final NetconfClientSessionListener sessionListener = mock(NetconfClientSessionListener.class);
97         final ReconnectStrategy reconnectStrategy = mock(ReconnectStrategy.class);
98         final AuthenticationHandler authHandler = mock(AuthenticationHandler.class);
99
100         return NetconfClientConfigurationBuilder.create().withProtocol(protocol).withAddress(address)
101                 .withConnectionTimeoutMillis(0).withAdditionalHeader(additionalHeader)
102                 .withSessionListener(sessionListener).withReconnectStrategy(reconnectStrategy)
103                 .withAuthHandler(authHandler).build();
104     }
105
106     @Test
107     public void canCreateASessionFromAConfiguration() {
108         // given
109         final CallHomeMountSessionContext mockContext = mock(CallHomeMountSessionContext.class);
110         final InetSocketAddress someAddress = InetSocketAddress.createUnresolved("1.2.3.4", 123);
111         doReturn(mockContext).when(mockSessMgr).getByAddress(eq(someAddress));
112
113         final NetconfClientConfiguration someCfg = someConfiguration(someAddress);
114         // when
115         instance.createClient(someCfg);
116         // then
117         verify(mockContext, times(1)).activateNetconfChannel(any(NetconfClientSessionListener.class));
118     }
119
120     @Test
121     public void noSessionIsCreatedWithoutAContextAvailableForAGivenAddress() {
122         // given
123         final InetSocketAddress someAddress = InetSocketAddress.createUnresolved("1.2.3.4", 123);
124         final NetconfClientConfiguration someCfg = someConfiguration(someAddress);
125         // when
126         final Future<NetconfClientSession> future = instance.createClient(someCfg);
127         // then
128         assertFalse(future.isSuccess());
129     }
130
131     @Test
132     public void nodeIsInsertedIntoTopologyWhenSubsystemIsOpened() throws UnknownHostException {
133         // given
134         final NodeId mockNodeId = mock(NodeId.class);
135         final Node mockNode = mock(Node.class);
136         final CallHomeMountSessionContext mockDevCtxt = mock(CallHomeMountSessionContext.class);
137         doReturn(mockNodeId).when(mockDevCtxt).getId();
138         doReturn(mockNode).when(mockDevCtxt).getConfigNode();
139         doReturn(mockDevCtxt).when(mockSessMgr).createSession(any(CallHomeProtocolSessionContext.class),
140                 any(CallHomeChannelActivator.class), any(CallHomeMountSessionContext.CloseCallback.class));
141         final CallHomeChannelActivator activator = mock(CallHomeChannelActivator.class);
142         instance.createTopology();
143         // when
144         instance.onNetconfSubsystemOpened(mockProtoSess, activator);
145         // then
146         verify(instance.topology, times(1)).connectNode(any(NodeId.class), any(Node.class));
147     }
148 }