0d791c2a6d5d59df0b53040a3472b9cae1cdb9bf
[ccsdk/cds.git] / ms / blueprintsprocessor / functions / netconf-executor / src / test / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / functions / netconf / executor / utils / RpcMessageUtilsTest.kt
1 /*
2  * Copyright © 2017-2018 AT&T Intellectual Property.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.utils
17
18 import org.junit.Assert
19 import org.junit.Assert.assertTrue
20 import org.junit.Test
21 import org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.api.NetconfException
22 import kotlin.test.assertFailsWith
23 import kotlin.test.assertFalse
24 import kotlin.test.fail
25
26 class RpcMessageUtilsTest {
27
28     @Test
29     fun getConfig() {
30         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
31                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
32                 "<get-config><source><candidate/></source><filter type=\"subtree\">Test-Filter-Content</filter>" +
33                 "</get-config></rpc>")
34
35         val messageId = "Test-Message-ID"
36         val configType = NetconfDatastore.CANDIDATE.datastore
37         val filterContent = "Test-Filter-Content"
38
39         val result =
40             NetconfMessageUtils.getConfig(messageId, configType, filterContent).replace("[\n\r\t]".toRegex(), "")
41
42         assertTrue(NetconfMessageUtils.validateRPCXML(result))
43         Assert.assertEquals(checkString, result)
44     }
45
46     @Test
47     fun editConfig() {
48         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
49                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
50                 "<edit-config><target><candidate/></target><default-operation>Test-Default-Operation</default-operation>" +
51                 "<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">Test-Filter-Content</config></edit-config></rpc>")
52
53         val messageId = "Test-Message-ID"
54         val configType = NetconfDatastore.CANDIDATE.datastore
55         val filterContent = "Test-Filter-Content"
56         val defaultOperation = "Test-Default-Operation"
57
58         val result =
59             NetconfMessageUtils.editConfig(messageId, configType, defaultOperation, filterContent).replace("[\n\r\t]".toRegex(), "")
60
61         assertTrue(NetconfMessageUtils.validateRPCXML(result))
62         Assert.assertEquals(checkString, result)
63     }
64
65     @Test
66     fun validate() {
67         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
68                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
69                 "<validate><source><candidate/></source></validate></rpc>")
70
71         val messageId = "Test-Message-ID"
72         val configType = NetconfDatastore.CANDIDATE.datastore
73
74         val result = NetconfMessageUtils.validate(messageId, configType).replace("[\n\r\t]".toRegex(), "")
75
76         assertTrue(NetconfMessageUtils.validateRPCXML(result))
77         Assert.assertEquals(checkString, result)
78     }
79
80     @Test
81     fun cancelCommit() {
82         val checkString =
83             ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
84                     "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
85                     "<cancel-commit>" +
86                     "<persist-id>1234</persist-id>" +
87                     "</cancel-commit></rpc>")
88
89         val messageId = "Test-Message-ID"
90
91         val cancelCommitPersistId =
92             NetconfMessageUtils.cancelCommit(messageId, "1234").replace("[\n\r\t]".toRegex(), "")
93
94         assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitPersistId))
95         Assert.assertEquals(checkString, cancelCommitPersistId)
96     }
97
98     @Test
99     fun cancelCommitNoPersistId() {
100         val checkString =
101             ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
102                     "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
103                     "<cancel-commit>" +
104                     "</cancel-commit></rpc>")
105
106         val messageId = "Test-Message-ID"
107
108         val cancelCommitNoPersistId = NetconfMessageUtils.cancelCommit(messageId, "").replace("[\n\r\t]".toRegex(), "")
109
110         assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitNoPersistId))
111         Assert.assertEquals(checkString, cancelCommitNoPersistId)
112     }
113
114     @Test
115     fun commit() {
116         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
117                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
118                 "<commit></commit></rpc>")
119
120         val messageId = "Test-Message-ID"
121
122         val commit = NetconfMessageUtils.commit(messageId, false, 0, "", "").replace("[\n\r\t]".toRegex(), "")
123
124         val commitWithPersistButNotConfirmed =
125             NetconfMessageUtils.commit(messageId, false, 0, "1234", "").replace("[\n\r\t]".toRegex(), "")
126
127         assertTrue(NetconfMessageUtils.validateRPCXML(commit))
128         Assert.assertEquals(checkString, commit)
129         Assert.assertEquals(checkString, commitWithPersistButNotConfirmed)
130     }
131
132     @Test
133     fun commitPersistId() {
134         val checkString =
135             ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
136                     "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
137                     "<commit>" +
138                     "<persist-id>1234</persist-id>" +
139                     "</commit></rpc>")
140
141         val messageId = "Test-Message-ID"
142
143         val result = NetconfMessageUtils.commit(messageId, false, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
144         assertTrue(NetconfMessageUtils.validateRPCXML(result))
145         Assert.assertEquals(checkString, result)
146
147         try {
148             NetconfMessageUtils.commit(messageId, true, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
149         } catch (e: NetconfException) {
150             Assert.assertEquals(
151                 "Can't proceed <commit> with both confirmed flag and persistId(1234) specified. Only one should be specified.",
152                 e.message
153             )
154             return
155         }
156
157         fail()
158     }
159
160     @Test
161     fun commitPersist() {
162         val checkString =
163             ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
164                     "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
165                     "<commit>" +
166                     "<confirmed/>" +
167                     "<confirm-timeout>30</confirm-timeout>" +
168                     "<persist>1234</persist>" +
169                     "</commit></rpc>")
170
171         val messageId = "Test-Message-ID"
172
173         val result = NetconfMessageUtils.commit(messageId, true, 30, "1234", "").replace("[\n\r\t]".toRegex(), "")
174
175         assertTrue(NetconfMessageUtils.validateRPCXML(result))
176         Assert.assertEquals(checkString, result)
177
178         try {
179             NetconfMessageUtils.commit(messageId, false, 30, "1234", "1234").replace("[\n\r\t]".toRegex(), "")
180         } catch (e: NetconfException) {
181             Assert.assertEquals(
182                 "Can't proceed <commit> with both persist(1234) and persistId(1234) specified. Only one should be specified.",
183                 e.message
184             )
185             return
186         }
187         fail()
188     }
189
190     @Test
191     fun unlock() {
192         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
193                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
194                 "<unlock><target><candidate/></target></unlock></rpc>")
195
196         val messageId = "Test-Message-ID"
197         val configType = NetconfDatastore.CANDIDATE.datastore
198
199         val result = NetconfMessageUtils.unlock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
200
201         assertTrue(NetconfMessageUtils.validateRPCXML(result))
202         Assert.assertEquals(checkString, result)
203     }
204
205     @Test
206     fun deleteConfig() {
207         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
208                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
209                 "<delete-config><target><candidate/></target></delete-config></rpc>")
210
211         val messageId = "Test-Message-ID"
212         val netconfTargetConfig = NetconfDatastore.CANDIDATE.datastore
213
214         val result = NetconfMessageUtils.deleteConfig(messageId, netconfTargetConfig).replace("[\n\r\t]".toRegex(), "")
215
216         assertTrue(NetconfMessageUtils.validateRPCXML(result))
217         Assert.assertEquals(checkString, result)
218     }
219
220     @Test
221     fun deleteConfigThrowsNetconfExceptionOnRunningDataStore() {
222         assertFailsWith(exceptionClass = NetconfException::class) {
223             val netconfTargetConfig = NetconfDatastore.RUNNING.datastore
224             val msgId = "35"
225             NetconfMessageUtils.deleteConfig(msgId, netconfTargetConfig)
226         }
227     }
228
229     @Test
230     fun discardChanges() {
231         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
232                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
233                 "<discard-changes/></rpc>")
234
235         val messageId = "Test-Message-ID"
236
237         val result = NetconfMessageUtils.discardChanges(messageId).replace("[\n\r\t]".toRegex(), "")
238
239         assertTrue(NetconfMessageUtils.validateRPCXML(result))
240         Assert.assertEquals(checkString, result)
241     }
242
243     @Test
244     fun lock() {
245         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
246                 "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
247                 "<lock><target><candidate/></target></lock></rpc>")
248
249         val messageId = "Test-Message-ID"
250         val configType = NetconfDatastore.CANDIDATE.datastore
251         val result = NetconfMessageUtils.lock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
252
253         assertTrue(NetconfMessageUtils.validateRPCXML(result))
254         Assert.assertEquals(checkString, result)
255     }
256
257     @Test
258     fun getMsgId() {
259         val checkString = ("testmessage")
260
261         var messageId = "message-id=\"testmessage\""
262         var result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
263         Assert.assertEquals(checkString, result)
264
265         messageId = "message-id=\"hello\""
266         result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
267         Assert.assertEquals("hello", result)
268
269         messageId = "message-id"
270         result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
271         Assert.assertEquals("", result)
272     }
273
274     @Test
275     fun createHelloString() {
276         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">  " +
277                 "<capabilities>    <capability>hi</capability>    <capability>hello</capability>  </capabilities></hello>]]>]]>")
278
279         val capability = listOf<String>("hi", "hello")
280
281         val result = NetconfMessageUtils.createHelloString(capability).replace("[\n\r\t]".toRegex(), "")
282         Assert.assertEquals(checkString, result)
283     }
284
285     @Test
286     fun validateChunkedFraming() {
287         val reply = ("hello")
288         val result = NetconfMessageUtils.validateChunkedFraming(reply)
289         Assert.assertFalse(result)
290     }
291
292     @Test
293     fun `checkReply should return true on ok msg`() {
294         assertTrue(NetconfMessageUtils.checkReply("ok"))
295     }
296
297     @Test
298     fun `checkReply on rpc-error should return false`() {
299         assertFalse { NetconfMessageUtils.checkReply("something something rpc-error>") }
300     }
301
302     @Test
303     fun `checkReply on null input should return false`() {
304         assertFalse { NetconfMessageUtils.checkReply(null) }
305     }
306
307     @Test
308     fun formatRPCRequest() {
309         val checkString = ("#199" +
310                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">  <capabilities>    <capability>hi</capability>    <capability>hello</capability>  </capabilities></hello>" +
311                 "##")
312
313         val request = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">  " +
314                 "<capabilities>    <capability>hi</capability>    <capability>hello</capability>  </capabilities></hello>]]>]]>")
315
316         val messageId = "Test-Message-ID"
317
318         val capabilities = setOf<String>("hi", "hello", "urn:ietf:params:netconf:base:1.1")
319
320         val result = NetconfMessageUtils.formatRPCRequest(request, messageId, capabilities).replace("[\n\r\t]".toRegex(), "")
321         Assert.assertEquals(checkString, result)
322     }
323
324     @Test
325     fun `validateRPCXML on empty input returns false`() {
326         assertFalse { NetconfMessageUtils.validateRPCXML("") }
327     }
328
329     @Test
330     fun `validateRPCXML on bad input returns false`() {
331         println("Don't fear \"[Fatal Error] :1:1: Content is not allowed in prolog.\" TODO: adjust logging for NetconfMessageUtils")
332         assertFalse { NetconfMessageUtils.validateRPCXML("really bad XML ~~~input") }
333     }
334 }