b80dc2d885efba5ecbd65afcf7885638fc8e5f26
[ccsdk/cds.git] /
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
47     @Test
48     fun editConfig() {
49         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
50                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
51                 + "<edit-config><target><candidate/></target><default-operation>Test-Default-Operation</default-operation>"
52                 + "<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">Test-Filter-Content</config></edit-config></rpc>")
53
54         val messageId = "Test-Message-ID"
55         val configType = NetconfDatastore.CANDIDATE.datastore
56         val filterContent = "Test-Filter-Content"
57         val defaultOperation = "Test-Default-Operation"
58
59         val result =
60                 NetconfMessageUtils.editConfig(messageId, configType, defaultOperation, filterContent).replace("[\n\r\t]".toRegex(), "")
61
62         assertTrue(NetconfMessageUtils.validateRPCXML(result))
63         Assert.assertEquals(checkString, result)
64     }
65
66     @Test
67     fun validate() {
68         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
69                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
70                 + "<validate><source><candidate/></source></validate></rpc>")
71
72         val messageId = "Test-Message-ID"
73         val configType = NetconfDatastore.CANDIDATE.datastore
74
75         val result = NetconfMessageUtils.validate(messageId, configType).replace("[\n\r\t]".toRegex(), "")
76
77         assertTrue(NetconfMessageUtils.validateRPCXML(result))
78         Assert.assertEquals(checkString, result)
79     }
80
81     @Test
82     fun cancelCommit() {
83         val checkString =
84                 ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
85                         "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
86                         "<cancel-commit>" +
87                         "<persist-id>1234</persist-id>" +
88                         "</cancel-commit></rpc>")
89
90         val messageId = "Test-Message-ID"
91
92         val cancelCommitPersistId =
93                 NetconfMessageUtils.cancelCommit(messageId, "1234").replace("[\n\r\t]".toRegex(), "")
94
95         assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitPersistId))
96         Assert.assertEquals(checkString, cancelCommitPersistId)
97     }
98
99     @Test
100     fun cancelCommitNoPersistId() {
101         val checkString =
102                 ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
103                         "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
104                         "<cancel-commit>" +
105                         "</cancel-commit></rpc>")
106
107         val messageId = "Test-Message-ID"
108
109         val cancelCommitNoPersistId = NetconfMessageUtils.cancelCommit(messageId, "").replace("[\n\r\t]".toRegex(), "")
110
111         assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitNoPersistId))
112         Assert.assertEquals(checkString, cancelCommitNoPersistId)
113     }
114
115     @Test
116     fun commit() {
117         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
118                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
119                 + "<commit></commit></rpc>")
120
121         val messageId = "Test-Message-ID"
122
123         val commit = NetconfMessageUtils.commit(messageId, false, 0, "", "").replace("[\n\r\t]".toRegex(), "")
124
125         val commitWithPersistButNotConfirmed =
126                 NetconfMessageUtils.commit(messageId, false, 0, "1234", "").replace("[\n\r\t]".toRegex(), "")
127
128         assertTrue(NetconfMessageUtils.validateRPCXML(commit))
129         Assert.assertEquals(checkString, commit)
130         Assert.assertEquals(checkString, commitWithPersistButNotConfirmed)
131
132     }
133
134     @Test
135     fun commitPersistId() {
136         val checkString =
137                 ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
138                         "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" +
139                         "<commit>" +
140                         "<persist-id>1234</persist-id>" +
141                         "</commit></rpc>")
142
143         val messageId = "Test-Message-ID"
144
145         val result = NetconfMessageUtils.commit(messageId, false, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
146         assertTrue(NetconfMessageUtils.validateRPCXML(result))
147         Assert.assertEquals(checkString, result)
148
149         try {
150             NetconfMessageUtils.commit(messageId, true, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
151         } catch (e: NetconfException) {
152             Assert.assertEquals("Can't proceed <commit> with both confirmed flag and persistId(1234) specified. Only one should be specified.",
153                     e.message)
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("Can't proceed <commit> with both persist(1234) and persistId(1234) specified. Only one should be specified.",
182                     e.message)
183             return
184         }
185         fail()
186     }
187
188     @Test
189     fun unlock() {
190         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
191                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
192                 + "<unlock><target><candidate/></target></unlock></rpc>")
193
194         val messageId = "Test-Message-ID"
195         val configType = NetconfDatastore.CANDIDATE.datastore
196
197         val result = NetconfMessageUtils.unlock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
198
199         assertTrue(NetconfMessageUtils.validateRPCXML(result))
200         Assert.assertEquals(checkString, result)
201     }
202
203     @Test
204     fun deleteConfig() {
205         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
206                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
207                 + "<delete-config><target><candidate/></target></delete-config></rpc>")
208
209         val messageId = "Test-Message-ID"
210         val netconfTargetConfig = NetconfDatastore.CANDIDATE.datastore
211
212         val result = NetconfMessageUtils.deleteConfig(messageId, netconfTargetConfig).replace("[\n\r\t]".toRegex(), "")
213
214         assertTrue(NetconfMessageUtils.validateRPCXML(result))
215         Assert.assertEquals(checkString, result)
216     }
217
218     @Test
219     fun deleteConfigThrowsNetconfExceptionOnRunningDataStore() {
220         assertFailsWith(exceptionClass = NetconfException::class) {
221             val netconfTargetConfig = NetconfDatastore.RUNNING.datastore
222             val msgId = "35"
223             NetconfMessageUtils.deleteConfig(msgId, netconfTargetConfig)
224         }
225     }
226
227     @Test
228     fun discardChanges() {
229         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
230                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
231                 + "<discard-changes/></rpc>")
232
233         val messageId = "Test-Message-ID"
234
235         val result = NetconfMessageUtils.discardChanges(messageId).replace("[\n\r\t]".toRegex(), "")
236
237         assertTrue(NetconfMessageUtils.validateRPCXML(result))
238         Assert.assertEquals(checkString, result)
239     }
240
241     @Test
242     fun lock() {
243         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
244                 + "<rpc message-id=\"Test-Message-ID\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">"
245                 + "<lock><target><candidate/></target></lock></rpc>")
246
247         val messageId = "Test-Message-ID"
248         val configType = NetconfDatastore.CANDIDATE.datastore
249         val result = NetconfMessageUtils.lock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
250
251         assertTrue(NetconfMessageUtils.validateRPCXML(result))
252         Assert.assertEquals(checkString, result)
253     }
254
255     @Test
256     fun getMsgId() {
257         val checkString = ("testmessage")
258
259         var messageId = "message-id=\"testmessage\""
260         var result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
261         Assert.assertEquals(checkString, result)
262
263         messageId = "message-id=\"hello\""
264         result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
265         Assert.assertEquals("hello", result)
266
267         messageId = "message-id"
268         result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
269         Assert.assertEquals("", result)
270     }
271
272     @Test
273     fun createHelloString() {
274         val checkString = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">  "
275                 +"<capabilities>    <capability>hi</capability>    <capability>hello</capability>  </capabilities></hello>]]>]]>")
276
277         val capability = listOf<String>("hi", "hello")
278
279         val result = NetconfMessageUtils.createHelloString(capability).replace("[\n\r\t]".toRegex(), "")
280         Assert.assertEquals(checkString, result)
281     }
282
283     @Test
284     fun validateChunkedFraming() {
285         val reply = ("hello")
286         val result = NetconfMessageUtils.validateChunkedFraming(reply)
287         Assert.assertFalse(result)
288     }
289
290     @Test
291     fun `checkReply should return true on ok msg`() {
292         assertTrue(NetconfMessageUtils.checkReply("ok"))
293     }
294
295     @Test
296     fun `checkReply on rpc-error should return false`() {
297         assertFalse { NetconfMessageUtils.checkReply("something something rpc-error>") }
298     }
299
300     @Test
301     fun `checkReply on null input should return false`() {
302         assertFalse { NetconfMessageUtils.checkReply(null) }
303     }
304
305     @Test
306     fun formatRPCRequest(){
307         val checkString = ("#199" +
308                 "<?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>" +
309                 "##")
310
311         val request = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">  "
312                 +"<capabilities>    <capability>hi</capability>    <capability>hello</capability>  </capabilities></hello>]]>]]>")
313
314         val messageId = "Test-Message-ID"
315
316         val capabilities = setOf<String>("hi", "hello","urn:ietf:params:netconf:base:1.1")
317
318         val result = NetconfMessageUtils.formatRPCRequest(request,messageId,capabilities).replace("[\n\r\t]".toRegex(), "")
319         Assert.assertEquals(checkString, result)
320     }
321
322     @Test
323     fun `validateRPCXML on empty input returns false`() {
324         assertFalse { NetconfMessageUtils.validateRPCXML("") }
325     }
326
327     @Test
328     fun `validateRPCXML on bad input returns false`() {
329         println("Don't fear \"[Fatal Error] :1:1: Content is not allowed in prolog.\" TODO: adjust logging for NetconfMessageUtils")
330         assertFalse { NetconfMessageUtils.validateRPCXML("really bad XML ~~~input") }
331     }
332
333 }