NetconfSessionPreferences is a record
[netconf.git] / netconf / sal-netconf-connector / src / test / java / org / opendaylight / netconf / sal / connect / netconf / listener / NetconfSessionPreferencesTest.java
1 /*
2  * Copyright (c) 2014, 2015 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.sal.connect.netconf.listener;
9
10 import static org.hamcrest.MatcherAssert.assertThat;
11 import static org.hamcrest.collection.IsMapContaining.hasKey;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
14 import static org.junit.Assert.assertTrue;
15
16 import java.util.List;
17 import org.junit.Test;
18 import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
19
20 public class NetconfSessionPreferencesTest {
21     @Test
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);
31
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);
37
38         final var merged = sessionCaps1.addModuleCaps(sessionCaps2);
39         assertCaps(merged, 2, 2 + 1 /*Preserved monitoring*/ + 2 /*already present*/);
40         for (var qname : sessionCaps2.moduleBasedCaps().keySet()) {
41             assertThat(merged.moduleBasedCaps(), hasKey(qname));
42         }
43         assertThat(merged.moduleBasedCaps(), hasKey(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING));
44
45         assertThat(merged.nonModuleCaps(), hasKey("urn:ietf:params:netconf:base:1.0"));
46         assertThat(merged.nonModuleCaps(), hasKey("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
47     }
48
49     @Test
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);
59
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);
66     }
67
68     @Test
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());
80
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());
88
89         final var merged = sessionCaps1.addNonModuleCaps(sessionCaps2);
90
91         assertCaps(merged, 3 + 2, 3);
92         sessionCaps2.nonModuleCaps().forEach(
93             (capability, origin) -> assertThat(merged.nonModuleCaps(), hasKey(capability)));
94
95         assertThat(merged.nonModuleCaps(), hasKey("urn:ietf:params:netconf:base:1.0"));
96         assertThat(merged.nonModuleCaps(), hasKey("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
97         assertThat(merged.nonModuleCaps(), hasKey("urn:ietf:params:netconf:capability:writable-running:1.0"));
98         assertThat(merged.nonModuleCaps(), hasKey("urn:ietf:params:netconf:capability:notification:1.0"));
99
100         assertTrue(merged.isCandidateSupported());
101         assertTrue(merged.isRunningWritable());
102     }
103
104     @Test
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());
116
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());
124
125         final var replaced = sessionCaps1.replaceNonModuleCaps(sessionCaps2);
126         assertCaps(replaced, 2, 3);
127         assertFalse(replaced.isCandidateSupported());
128         assertTrue(replaced.isRunningWritable());
129     }
130
131     @Test
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")),
141             0, 4);
142     }
143
144     private static void assertCaps(final NetconfSessionPreferences sessionCaps1, final int nonModuleCaps,
145             final int moduleCaps) {
146         assertEquals(nonModuleCaps, sessionCaps1.nonModuleCaps().size());
147         assertEquals(moduleCaps, sessionCaps1.moduleBasedCaps().size());
148     }
149 }