Bug-6346: Allow over-ride of non-module capabilities
[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
9 package org.opendaylight.netconf.sal.connect.netconf.listener;
10
11 import static org.hamcrest.CoreMatchers.hasItem;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
14 import static org.junit.Assert.assertThat;
15 import static org.junit.Assert.assertTrue;
16
17 import com.google.common.collect.Lists;
18 import java.util.List;
19 import org.junit.Test;
20 import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
21 import org.opendaylight.yangtools.yang.common.QName;
22
23 public class NetconfSessionPreferencesTest {
24
25     @Test
26     public void testMerge() throws Exception {
27         final List<String> caps1 = Lists.newArrayList(
28                 "namespace:1?module=module1&revision=2012-12-12",
29                 "namespace:2?module=module2&amp;revision=2012-12-12",
30                 "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;revision=2010-10-04",
31                 "urn:ietf:params:netconf:base:1.0",
32                 "urn:ietf:params:netconf:capability:rollback-on-error:1.0"
33         );
34         final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
35         assertCaps(sessionCaps1, 2, 3);
36
37         final List<String> caps2 = Lists.newArrayList(
38                 "namespace:3?module=module3&revision=2012-12-12",
39                 "namespace:4?module=module4&revision=2012-12-12",
40                 "randomNonModuleCap"
41         );
42         final NetconfSessionPreferences sessionCaps2 = NetconfSessionPreferences.fromStrings(caps2);
43         assertCaps(sessionCaps2, 1, 2);
44
45         final NetconfSessionPreferences merged = sessionCaps1.addModuleCaps(sessionCaps2);
46         assertCaps(merged, 2, 2 + 1 /*Preserved monitoring*/ + 2 /*already present*/);
47         for (final QName qName : sessionCaps2.getModuleBasedCaps()) {
48             assertThat(merged.getModuleBasedCaps(), hasItem(qName));
49         }
50         assertThat(merged.getModuleBasedCaps(), hasItem(NetconfMessageTransformUtil.IETF_NETCONF_MONITORING));
51
52         assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:base:1.0"));
53         assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
54     }
55
56     @Test
57     public void testReplace() throws Exception {
58         final List<String> caps1 = Lists.newArrayList(
59                 "namespace:1?module=module1&revision=2012-12-12",
60                 "namespace:2?module=module2&amp;revision=2012-12-12",
61                 "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;revision=2010-10-04",
62                 "urn:ietf:params:netconf:base:1.0",
63                 "urn:ietf:params:netconf:capability:rollback-on-error:1.0"
64         );
65         final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
66         assertCaps(sessionCaps1, 2, 3);
67
68         final List<String> caps2 = Lists.newArrayList(
69                 "namespace:3?module=module3&revision=2012-12-12",
70                 "namespace:4?module=module4&revision=2012-12-12",
71                 "randomNonModuleCap"
72         );
73         final NetconfSessionPreferences sessionCaps2 = NetconfSessionPreferences.fromStrings(caps2);
74         assertCaps(sessionCaps2, 1, 2);
75
76         final NetconfSessionPreferences replaced = sessionCaps1.replaceModuleCaps(sessionCaps2);
77         assertCaps(replaced, 2, 2);
78     }
79
80     @Test
81     public void testNonModuleMerge() throws Exception {
82         final List<String> caps1 = Lists.newArrayList(
83                 "namespace:1?module=module1&revision=2012-12-12",
84                 "namespace:2?module=module2&amp;revision=2012-12-12",
85                 "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;revision=2010-10-04",
86                 "urn:ietf:params:netconf:base:1.0",
87                 "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
88                 "urn:ietf:params:netconf:capability:candidate:1.0"
89         );
90         final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
91         assertCaps(sessionCaps1, 3, 3);
92         assertTrue(sessionCaps1.isCandidateSupported());
93
94         final List<String> caps2 = Lists.newArrayList(
95                 "namespace:3?module=module3&revision=2012-12-12",
96                 "namespace:4?module=module4&revision=2012-12-12",
97                 "urn:ietf:params:netconf:capability:writable-running:1.0",
98                 "urn:ietf:params:netconf:capability:notification:1.0"
99         );
100         final NetconfSessionPreferences sessionCaps2 = NetconfSessionPreferences.fromStrings(caps2);
101         assertCaps(sessionCaps2, 2, 2);
102         assertTrue(sessionCaps2.isRunningWritable());
103
104         final NetconfSessionPreferences merged = sessionCaps1.addNonModuleCaps(sessionCaps2);
105
106         assertCaps(merged, 3+2, 3);
107         for (final String capability : sessionCaps2.getNonModuleCaps()) {
108             assertThat(merged.getNonModuleCaps(), hasItem(capability));
109         }
110
111         assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:base:1.0"));
112         assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
113         assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:writable-running:1.0"));
114         assertThat(merged.getNonModuleCaps(), hasItem("urn:ietf:params:netconf:capability:notification:1.0"));
115
116         assertTrue(merged.isCandidateSupported());
117         assertTrue(merged.isRunningWritable());
118     }
119
120     @Test
121     public void testNonmoduleReplace() throws Exception {
122         final List<String> caps1 = Lists.newArrayList(
123                 "namespace:1?module=module1&revision=2012-12-12",
124                 "namespace:2?module=module2&amp;revision=2012-12-12",
125                 "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;revision=2010-10-04",
126                 "urn:ietf:params:netconf:base:1.0",
127                 "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
128                 "urn:ietf:params:netconf:capability:candidate:1.0"
129         );
130         final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
131         assertCaps(sessionCaps1, 3, 3);
132         assertTrue(sessionCaps1.isCandidateSupported());
133
134         final List<String> caps2 = Lists.newArrayList(
135                 "namespace:3?module=module3&revision=2012-12-12",
136                 "namespace:4?module=module4&revision=2012-12-12",
137                 "randomNonModuleCap",
138                 "urn:ietf:params:netconf:capability:writable-running:1.0"
139         );
140         final NetconfSessionPreferences sessionCaps2 = NetconfSessionPreferences.fromStrings(caps2);
141         assertCaps(sessionCaps2, 2, 2);
142         assertTrue(sessionCaps2.isRunningWritable());
143
144         final NetconfSessionPreferences replaced = sessionCaps1.replaceNonModuleCaps(sessionCaps2);
145         assertCaps(replaced, 2, 3);
146         assertFalse(replaced.isCandidateSupported());
147         assertTrue(replaced.isRunningWritable());
148     }
149
150     @Test
151     public void testCapabilityNoRevision() throws Exception {
152         final List<String> caps1 = Lists.newArrayList(
153                 "namespace:2?module=module2",
154                 "namespace:2?module=module2&amp;revision=2012-12-12",
155                 "namespace:2?module=module1&amp;RANDOMSTRING;revision=2013-12-12",
156                 // Revision parameter present, but no revision defined
157                 "namespace:2?module=module4&amp;RANDOMSTRING;revision=",
158                 // This one should be ignored(same as first), since revision is in wrong format
159                 "namespace:2?module=module2&amp;RANDOMSTRING;revision=2013-12-12"
160         );
161
162         final NetconfSessionPreferences sessionCaps1 = NetconfSessionPreferences.fromStrings(caps1);
163         assertCaps(sessionCaps1, 0, 4);
164     }
165
166     private void assertCaps(final NetconfSessionPreferences sessionCaps1, final int nonModuleCaps, final int moduleCaps) {
167         assertEquals(nonModuleCaps, sessionCaps1.getNonModuleCaps().size());
168         assertEquals(moduleCaps, sessionCaps1.getModuleBasedCaps().size());
169     }
170 }