2 * Copyright (c) 2014 Cisco Systems, Inc. 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.netconf.client;
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;
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.rev231228.SshClientGrouping;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tcp.client.rev231228.TcpClientGrouping;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tls.client.rev231228.TlsClientGrouping;
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;
46 private TcpClientGrouping tcpParams;
48 private TlsClientGrouping tlsParams;
50 private SslHandlerFactory sslHandlerFactory;
52 private SshClientGrouping sshParams;
54 private ClientFactoryManagerConfigurator sshConfigurator;
56 private NetconfHelloMessageAdditionalHeader additionalHeader;
58 private NetconfClientSessionListener sessionListener;
61 void tcpClientConfiguration() {
62 final var cfg = baseBuilder(TCP).build();
63 assertBaseConf(cfg, TCP);
67 void tlsClientConfig() {
68 final var cfg1 = baseBuilder(TLS).withTlsParameters(tlsParams).build();
69 assertBaseConf(cfg1, TLS);
70 assertSame(tlsParams, cfg1.getTlsParameters());
72 final var cfg2 = baseBuilder(TLS).withSslHandlerFactory(sslHandlerFactory).build();
73 assertBaseConf(cfg2, TLS);
74 assertSame(sslHandlerFactory, cfg2.getSslHandlerFactory());
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());
86 @ParameterizedTest(name = "Invalid configuration: {0}")
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());
93 private static List<Arguments> invalidConfig() {
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)
104 private NetconfClientConfigurationBuilder baseBuilder(final NetconfClientProtocol protocol) {
105 return NetconfClientConfigurationBuilder.create()
106 .withProtocol(protocol)
107 .withTcpParameters(tcpParams)
109 .withAdditionalHeader(additionalHeader)
110 .withSessionListener(sessionListener)
111 .withOdlHelloCapabilities(CAPABILITIES)
112 .withConnectionTimeoutMillis(TIMEOUT_MILLIS)
113 .withMaximumIncomingChunkSize(MAX_CHUNK_SIZE);
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());
128 private interface BuilderModification {
129 NetconfClientConfigurationBuilder modify(NetconfClientConfigurationBuilder builder);