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