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