Refresh IETF client/server models
[netconf.git] / protocol / netconf-client / src / test / java / org / opendaylight / netconf / client / NetconfClientConfigurationTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. 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.client;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertSame;
12 import static org.junit.jupiter.api.Assertions.assertThrows;
13 import static org.opendaylight.netconf.client.conf.NetconfClientConfiguration.NetconfClientProtocol.SSH;
14 import static org.opendaylight.netconf.client.conf.NetconfClientConfiguration.NetconfClientProtocol.TCP;
15 import static org.opendaylight.netconf.client.conf.NetconfClientConfiguration.NetconfClientProtocol.TLS;
16
17 import java.util.List;
18 import org.junit.jupiter.api.Test;
19 import org.junit.jupiter.api.extension.ExtendWith;
20 import org.junit.jupiter.params.ParameterizedTest;
21 import org.junit.jupiter.params.provider.Arguments;
22 import org.junit.jupiter.params.provider.MethodSource;
23 import org.mockito.Mock;
24 import org.mockito.junit.jupiter.MockitoExtension;
25 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
26 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
27 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration.NetconfClientProtocol;
28 import org.opendaylight.netconf.client.conf.NetconfClientConfigurationBuilder;
29 import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
30 import org.opendaylight.netconf.transport.tls.SslHandlerFactory;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.client.rev240208.SshClientGrouping;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tcp.client.rev240208.TcpClientGrouping;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tls.client.rev240208.TlsClientGrouping;
35
36 @ExtendWith(MockitoExtension.class)
37 class NetconfClientConfigurationTest {
38     private static final String NAME = "name";
39     private static final long TIMEOUT_MILLIS = 123456L;
40     private static final int MAX_CHUNK_SIZE = 6789;
41     private static final List<Uri> CAPABILITIES = List.of(new Uri("test::uri"));
42     private static final Class<? extends Throwable> NPE = NullPointerException.class;
43     private static final Class<? extends Throwable> IAE = IllegalArgumentException.class;
44
45     @Mock
46     private TcpClientGrouping tcpParams;
47     @Mock
48     private TlsClientGrouping tlsParams;
49     @Mock
50     private SslHandlerFactory sslHandlerFactory;
51     @Mock
52     private SshClientGrouping sshParams;
53     @Mock
54     private ClientFactoryManagerConfigurator sshConfigurator;
55     @Mock
56     private NetconfHelloMessageAdditionalHeader additionalHeader;
57     @Mock
58     private NetconfClientSessionListener sessionListener;
59
60     @Test
61     void tcpClientConfiguration() {
62         final var cfg = baseBuilder(TCP).build();
63         assertBaseConf(cfg, TCP);
64     }
65
66     @Test
67     void tlsClientConfig() {
68         final var cfg1 = baseBuilder(TLS).withTlsParameters(tlsParams).build();
69         assertBaseConf(cfg1, TLS);
70         assertSame(tlsParams, cfg1.getTlsParameters());
71
72         final var cfg2 = baseBuilder(TLS).withSslHandlerFactory(sslHandlerFactory).build();
73         assertBaseConf(cfg2, TLS);
74         assertSame(sslHandlerFactory, cfg2.getSslHandlerFactory());
75     }
76
77     @Test
78     void sshClientConfig() {
79         final var cfg = baseBuilder(SSH).withSshParameters(sshParams)
80             .withSshConfigurator(sshConfigurator).build();
81         assertBaseConf(cfg, SSH);
82         assertSame(sshParams, cfg.getSshParameters());
83         assertSame(sshConfigurator, cfg.getSshConfigurator());
84     }
85
86     @ParameterizedTest(name = "Invalid configuration: {0}")
87     @MethodSource
88     void invalidConfig(final String testDesc, final NetconfClientProtocol protocol,
89             final BuilderModification modification, final Class<? extends Throwable> expected) {
90         assertThrows(expected, () -> modification.modify(baseBuilder(protocol)).build());
91     }
92
93     private static List<Arguments> invalidConfig() {
94         return List.of(
95             Arguments.of("No Protocol", TCP, (BuilderModification) builder -> builder.withProtocol(null), NPE),
96             Arguments.of("No Netconf Session Listener",
97                 TCP, (BuilderModification) builder -> builder.withSessionListener(null), NPE),
98             Arguments.of("No TCP params", TCP, (BuilderModification) builder -> builder.withTcpParameters(null), NPE),
99             Arguments.of("No TLS params", TLS, (BuilderModification) builder -> builder, IAE),
100             Arguments.of("No SSH params", SSH, (BuilderModification) builder -> builder, NPE)
101         );
102     }
103
104     private NetconfClientConfigurationBuilder baseBuilder(final NetconfClientProtocol protocol) {
105         return NetconfClientConfigurationBuilder.create()
106             .withProtocol(protocol)
107             .withTcpParameters(tcpParams)
108             .withName(NAME)
109             .withAdditionalHeader(additionalHeader)
110             .withSessionListener(sessionListener)
111             .withOdlHelloCapabilities(CAPABILITIES)
112             .withConnectionTimeoutMillis(TIMEOUT_MILLIS)
113             .withMaximumIncomingChunkSize(MAX_CHUNK_SIZE);
114     }
115
116     private void assertBaseConf(final NetconfClientConfiguration cfg, final NetconfClientProtocol protocol) {
117         assertEquals(protocol, cfg.getProtocol());
118         assertSame(tcpParams, cfg.getTcpParameters());
119         assertEquals(NAME, cfg.getName());
120         assertSame(additionalHeader, cfg.getAdditionalHeader().orElseThrow());
121         assertSame(sessionListener, cfg.getSessionListener());
122         assertEquals(CAPABILITIES, cfg.getOdlHelloCapabilities());
123         assertEquals(TIMEOUT_MILLIS, cfg.getConnectionTimeoutMillis());
124         assertEquals(MAX_CHUNK_SIZE, cfg.getMaximumIncomingChunkSize());
125     }
126
127     @FunctionalInterface
128     private interface BuilderModification {
129         NetconfClientConfigurationBuilder modify(NetconfClientConfigurationBuilder builder);
130     }
131 }