2 * Copyright (c) 2014, 2015 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.sal.connect.netconf.listener;
10 import static org.hamcrest.CoreMatchers.hasItem;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
14 import static org.junit.Assert.assertTrue;
16 import java.util.List;
17 import org.junit.Test;
18 import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
20 public class NetconfSessionPreferencesTest {
22 public void testMerge() {
23 final var sessionCaps1 = NetconfSessionPreferences.fromStrings(List.of(
24 "namespace:1?module=module1&revision=2012-12-12",
25 "namespace:2?module=module2&revision=2012-12-12",
26 "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring"
27 + "&revision=2010-10-04",
28 "urn:ietf:params:netconf:base:1.0",
29 "urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
30 assertCaps(sessionCaps1, 2, 3);
32 final var sessionCaps2 = NetconfSessionPreferences.fromStrings(List.of(
33 "namespace:3?module=module3&revision=2012-12-12",
34 "namespace:4?module=module4&revision=2012-12-12",
35 "randomNonModuleCap"));
36 assertCaps(sessionCaps2, 1, 2);
38 final var merged = sessionCaps1.addModuleCaps(sessionCaps2);
39 assertCaps(merged, 2, 2 + 1 /*Preserved monitoring*/ + 2 /*already present*/);
40 for (var qname : sessionCaps2.getModuleBasedCaps()) {
41 assertThat(merged.getModuleBasedCaps(), hasItem(qname));
43 assertThat(merged.getModuleBasedCaps(), hasItem(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING));
45 assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:base:1.0"));
46 assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
50 public void testReplace() throws Exception {
51 final var sessionCaps1 = NetconfSessionPreferences.fromStrings(List.of(
52 "namespace:1?module=module1&revision=2012-12-12",
53 "namespace:2?module=module2&revision=2012-12-12",
54 "urn:ietf:params:xml:ns:yang:"
55 + "ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04",
56 "urn:ietf:params:netconf:base:1.0",
57 "urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
58 assertCaps(sessionCaps1, 2, 3);
60 final var sessionCaps2 = NetconfSessionPreferences.fromStrings(List.of(
61 "namespace:3?module=module3&revision=2012-12-12",
62 "namespace:4?module=module4&revision=2012-12-12",
63 "randomNonModuleCap"));
64 assertCaps(sessionCaps2, 1, 2);
65 assertCaps(sessionCaps1.replaceModuleCaps(sessionCaps2), 2, 2);
69 public void testNonModuleMerge() throws Exception {
70 final var sessionCaps1 = NetconfSessionPreferences.fromStrings(List.of(
71 "namespace:1?module=module1&revision=2012-12-12",
72 "namespace:2?module=module2&revision=2012-12-12",
73 "urn:ietf:params:xml:ns:yang:"
74 + "ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04",
75 "urn:ietf:params:netconf:base:1.0",
76 "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
77 "urn:ietf:params:netconf:capability:candidate:1.0"));
78 assertCaps(sessionCaps1, 3, 3);
79 assertTrue(sessionCaps1.isCandidateSupported());
81 final var sessionCaps2 = NetconfSessionPreferences.fromStrings(List.of(
82 "namespace:3?module=module3&revision=2012-12-12",
83 "namespace:4?module=module4&revision=2012-12-12",
84 "urn:ietf:params:netconf:capability:writable-running:1.0",
85 "urn:ietf:params:netconf:capability:notification:1.0"));
86 assertCaps(sessionCaps2, 2, 2);
87 assertTrue(sessionCaps2.isRunningWritable());
89 final var merged = sessionCaps1.addNonModuleCaps(sessionCaps2);
91 assertCaps(merged, 3 + 2, 3);
92 sessionCaps2.getNonModuleCaps().forEach(
93 capability -> assertThat(merged.getNonModuleCaps(), hasItem(capability)));
95 assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:base:1.0"));
96 assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
97 assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:writable-running:1.0"));
98 assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:notification:1.0"));
100 assertTrue(merged.isCandidateSupported());
101 assertTrue(merged.isRunningWritable());
105 public void testNonmoduleReplace() throws Exception {
106 final var sessionCaps1 = NetconfSessionPreferences.fromStrings(List.of(
107 "namespace:1?module=module1&revision=2012-12-12",
108 "namespace:2?module=module2&revision=2012-12-12",
109 "urn:ietf:params:xml:ns:yang:"
110 + "ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04",
111 "urn:ietf:params:netconf:base:1.0",
112 "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
113 "urn:ietf:params:netconf:capability:candidate:1.0"));
114 assertCaps(sessionCaps1, 3, 3);
115 assertTrue(sessionCaps1.isCandidateSupported());
117 final var sessionCaps2 = NetconfSessionPreferences.fromStrings(List.of(
118 "namespace:3?module=module3&revision=2012-12-12",
119 "namespace:4?module=module4&revision=2012-12-12",
120 "randomNonModuleCap",
121 "urn:ietf:params:netconf:capability:writable-running:1.0"));
122 assertCaps(sessionCaps2, 2, 2);
123 assertTrue(sessionCaps2.isRunningWritable());
125 final var replaced = sessionCaps1.replaceNonModuleCaps(sessionCaps2);
126 assertCaps(replaced, 2, 3);
127 assertFalse(replaced.isCandidateSupported());
128 assertTrue(replaced.isRunningWritable());
132 public void testCapabilityNoRevision() throws Exception {
133 assertCaps(NetconfSessionPreferences.fromStrings(List.of(
134 "namespace:2?module=module2",
135 "namespace:2?module=module2&revision=2012-12-12",
136 "namespace:2?module=module1&RANDOMSTRING;revision=2013-12-12",
137 // Revision parameter present, but no revision defined
138 "namespace:2?module=module4&RANDOMSTRING;revision=",
139 // This one should be ignored(same as first), since revision is in wrong format
140 "namespace:2?module=module2&RANDOMSTRING;revision=2013-12-12")),
144 private static void assertCaps(final NetconfSessionPreferences sessionCaps1, final int nonModuleCaps,
145 final int moduleCaps) {
146 assertEquals(nonModuleCaps, sessionCaps1.getNonModuleCaps().size());
147 assertEquals(moduleCaps, sessionCaps1.getModuleBasedCaps().size());