2 * Copyright © 2017-2018 AT&T Intellectual Property.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor.utils
18 import org.junit.Assert
19 import org.junit.Assert.assertTrue
20 import org.junit.Ignore
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
27 class RpcMessageUtilsTest {
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>")
36 val messageId = "Test-Message-ID"
37 val configType = NetconfDatastore.CANDIDATE.datastore
38 val filterContent = "Test-Filter-Content"
41 NetconfMessageUtils.getConfig(messageId, configType, filterContent).replace("[\n\r\t]".toRegex(), "")
43 assertTrue(NetconfMessageUtils.validateRPCXML(result))
44 Assert.assertEquals(checkString, result)
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>")
55 val messageId = "Test-Message-ID"
56 val configType = NetconfDatastore.CANDIDATE.datastore
57 val filterContent = "Test-Filter-Content"
58 val defaultOperation = "Test-Default-Operation"
61 NetconfMessageUtils.editConfig(messageId, configType, defaultOperation, filterContent).replace("[\n\r\t]".toRegex(), "")
63 assertTrue(NetconfMessageUtils.validateRPCXML(result))
64 Assert.assertEquals(checkString, result)
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>")
73 val messageId = "Test-Message-ID"
74 val configType = NetconfDatastore.CANDIDATE.datastore
76 val result = NetconfMessageUtils.validate(messageId, configType).replace("[\n\r\t]".toRegex(), "")
78 assertTrue(NetconfMessageUtils.validateRPCXML(result))
79 Assert.assertEquals(checkString, result)
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\">" +
88 "<persist-id>1234</persist-id>" +
89 "</cancel-commit></rpc>")
91 val messageId = "Test-Message-ID"
93 val cancelCommitPersistId =
94 NetconfMessageUtils.cancelCommit(messageId, "1234").replace("[\n\r\t]".toRegex(), "")
96 assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitPersistId))
97 Assert.assertEquals(checkString, cancelCommitPersistId)
101 fun cancelCommitNoPersistId() {
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\">" +
106 "</cancel-commit></rpc>")
108 val messageId = "Test-Message-ID"
110 val cancelCommitNoPersistId = NetconfMessageUtils.cancelCommit(messageId, "").replace("[\n\r\t]".toRegex(), "")
112 assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitNoPersistId))
113 Assert.assertEquals(checkString, cancelCommitNoPersistId)
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>")
122 val messageId = "Test-Message-ID"
124 val commit = NetconfMessageUtils.commit(messageId, false, 0, "", "").replace("[\n\r\t]".toRegex(), "")
126 val commitWithPersistButNotConfirmed =
127 NetconfMessageUtils.commit(messageId, false, 0, "1234", "").replace("[\n\r\t]".toRegex(), "")
129 assertTrue(NetconfMessageUtils.validateRPCXML(commit))
130 Assert.assertEquals(checkString, commit)
131 Assert.assertEquals(checkString, commitWithPersistButNotConfirmed)
136 fun commitPersistId() {
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\">" +
141 "<persist-id>1234</persist-id>" +
144 val messageId = "Test-Message-ID"
146 val result = NetconfMessageUtils.commit(messageId, false, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
147 assertTrue(NetconfMessageUtils.validateRPCXML(result))
148 Assert.assertEquals(checkString, result)
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.",
162 fun commitPersist() {
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\">" +
168 "<confirm-timeout>30</confirm-timeout>" +
169 "<persist>1234</persist>" +
172 val messageId = "Test-Message-ID"
174 val result = NetconfMessageUtils.commit(messageId, true, 30, "1234", "").replace("[\n\r\t]".toRegex(), "")
176 assertTrue(NetconfMessageUtils.validateRPCXML(result))
177 Assert.assertEquals(checkString, result)
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.",
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>")
195 val messageId = "Test-Message-ID"
196 val configType = NetconfDatastore.CANDIDATE.datastore
198 val result = NetconfMessageUtils.unlock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
200 assertTrue(NetconfMessageUtils.validateRPCXML(result))
201 Assert.assertEquals(checkString, result)
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>")
210 val messageId = "Test-Message-ID"
211 val netconfTargetConfig = NetconfDatastore.CANDIDATE.datastore
213 val result = NetconfMessageUtils.deleteConfig(messageId, netconfTargetConfig).replace("[\n\r\t]".toRegex(), "")
215 assertTrue(NetconfMessageUtils.validateRPCXML(result))
216 Assert.assertEquals(checkString, result)
220 fun deleteConfigThrowsNetconfExceptionOnRunningDataStore() {
221 assertFailsWith(exceptionClass = NetconfException::class) {
222 val netconfTargetConfig = NetconfDatastore.RUNNING.datastore
224 NetconfMessageUtils.deleteConfig(msgId, netconfTargetConfig)
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>")
234 val messageId = "Test-Message-ID"
236 val result = NetconfMessageUtils.discardChanges(messageId).replace("[\n\r\t]".toRegex(), "")
238 assertTrue(NetconfMessageUtils.validateRPCXML(result))
239 Assert.assertEquals(checkString, result)
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>")
248 val messageId = "Test-Message-ID"
249 val configType = NetconfDatastore.CANDIDATE.datastore
250 val result = NetconfMessageUtils.lock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
252 assertTrue(NetconfMessageUtils.validateRPCXML(result))
253 Assert.assertEquals(checkString, result)
258 val checkString = ("testmessage")
260 var messageId = "message-id=\"testmessage\""
261 var result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
262 Assert.assertEquals(checkString, result)
264 messageId = "message-id=\"hello\""
265 result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
266 Assert.assertEquals("hello", result)
268 messageId = "message-id"
269 result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
270 Assert.assertEquals("", result)
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>]]>]]>")
278 val capability = listOf<String>("hi", "hello")
280 val result = NetconfMessageUtils.createHelloString(capability).replace("[\n\r\t]".toRegex(), "")
281 Assert.assertEquals(checkString, result)
285 fun validateChunkedFraming() {
286 val reply = ("hello")
287 val result = NetconfMessageUtils.validateChunkedFraming(reply)
288 Assert.assertFalse(result)
292 fun `checkReply should return true on ok msg`() {
293 assertTrue(NetconfMessageUtils.checkReply("ok"))
297 fun `checkReply on rpc-error should return false`() {
298 assertFalse { NetconfMessageUtils.checkReply("something something rpc-error>") }
302 fun `checkReply on null input should return false`() {
303 assertFalse { NetconfMessageUtils.checkReply(null) }
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>" +
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>]]>]]>")
315 val messageId = "Test-Message-ID"
317 val capabilities = setOf<String>("hi", "hello","urn:ietf:params:netconf:base:1.1")
319 val result = NetconfMessageUtils.formatRPCRequest(request,messageId,capabilities).replace("[\n\r\t]".toRegex(), "")
320 Assert.assertEquals(checkString, result)
324 fun `validateRPCXML on empty input returns false`() {
325 assertFalse { NetconfMessageUtils.validateRPCXML("") }
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") }