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
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
26 class RpcMessageUtilsTest {
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>")
35 val messageId = "Test-Message-ID"
36 val configType = NetconfDatastore.CANDIDATE.datastore
37 val filterContent = "Test-Filter-Content"
40 NetconfMessageUtils.getConfig(messageId, configType, filterContent).replace("[\n\r\t]".toRegex(), "")
42 assertTrue(NetconfMessageUtils.validateRPCXML(result))
43 Assert.assertEquals(checkString, result)
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>")
53 val messageId = "Test-Message-ID"
54 val configType = NetconfDatastore.CANDIDATE.datastore
55 val filterContent = "Test-Filter-Content"
56 val defaultOperation = "Test-Default-Operation"
59 NetconfMessageUtils.editConfig(messageId, configType, defaultOperation, filterContent).replace("[\n\r\t]".toRegex(), "")
61 assertTrue(NetconfMessageUtils.validateRPCXML(result))
62 Assert.assertEquals(checkString, result)
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>")
71 val messageId = "Test-Message-ID"
72 val configType = NetconfDatastore.CANDIDATE.datastore
74 val result = NetconfMessageUtils.validate(messageId, configType).replace("[\n\r\t]".toRegex(), "")
76 assertTrue(NetconfMessageUtils.validateRPCXML(result))
77 Assert.assertEquals(checkString, result)
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\">" +
86 "<persist-id>1234</persist-id>" +
87 "</cancel-commit></rpc>")
89 val messageId = "Test-Message-ID"
91 val cancelCommitPersistId =
92 NetconfMessageUtils.cancelCommit(messageId, "1234").replace("[\n\r\t]".toRegex(), "")
94 assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitPersistId))
95 Assert.assertEquals(checkString, cancelCommitPersistId)
99 fun cancelCommitNoPersistId() {
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\">" +
104 "</cancel-commit></rpc>")
106 val messageId = "Test-Message-ID"
108 val cancelCommitNoPersistId = NetconfMessageUtils.cancelCommit(messageId, "").replace("[\n\r\t]".toRegex(), "")
110 assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitNoPersistId))
111 Assert.assertEquals(checkString, cancelCommitNoPersistId)
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>")
120 val messageId = "Test-Message-ID"
122 val commit = NetconfMessageUtils.commit(messageId, false, 0, "", "").replace("[\n\r\t]".toRegex(), "")
124 val commitWithPersistButNotConfirmed =
125 NetconfMessageUtils.commit(messageId, false, 0, "1234", "").replace("[\n\r\t]".toRegex(), "")
127 assertTrue(NetconfMessageUtils.validateRPCXML(commit))
128 Assert.assertEquals(checkString, commit)
129 Assert.assertEquals(checkString, commitWithPersistButNotConfirmed)
133 fun commitPersistId() {
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\">" +
138 "<persist-id>1234</persist-id>" +
141 val messageId = "Test-Message-ID"
143 val result = NetconfMessageUtils.commit(messageId, false, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
144 assertTrue(NetconfMessageUtils.validateRPCXML(result))
145 Assert.assertEquals(checkString, result)
148 NetconfMessageUtils.commit(messageId, true, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
149 } catch (e: NetconfException) {
151 "Can't proceed <commit> with both confirmed flag and persistId(1234) specified. Only one should be specified.",
161 fun commitPersist() {
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\">" +
167 "<confirm-timeout>30</confirm-timeout>" +
168 "<persist>1234</persist>" +
171 val messageId = "Test-Message-ID"
173 val result = NetconfMessageUtils.commit(messageId, true, 30, "1234", "").replace("[\n\r\t]".toRegex(), "")
175 assertTrue(NetconfMessageUtils.validateRPCXML(result))
176 Assert.assertEquals(checkString, result)
179 NetconfMessageUtils.commit(messageId, false, 30, "1234", "1234").replace("[\n\r\t]".toRegex(), "")
180 } catch (e: NetconfException) {
182 "Can't proceed <commit> with both persist(1234) and persistId(1234) specified. Only one should be specified.",
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>")
196 val messageId = "Test-Message-ID"
197 val configType = NetconfDatastore.CANDIDATE.datastore
199 val result = NetconfMessageUtils.unlock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
201 assertTrue(NetconfMessageUtils.validateRPCXML(result))
202 Assert.assertEquals(checkString, result)
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>")
211 val messageId = "Test-Message-ID"
212 val netconfTargetConfig = NetconfDatastore.CANDIDATE.datastore
214 val result = NetconfMessageUtils.deleteConfig(messageId, netconfTargetConfig).replace("[\n\r\t]".toRegex(), "")
216 assertTrue(NetconfMessageUtils.validateRPCXML(result))
217 Assert.assertEquals(checkString, result)
221 fun deleteConfigThrowsNetconfExceptionOnRunningDataStore() {
222 assertFailsWith(exceptionClass = NetconfException::class) {
223 val netconfTargetConfig = NetconfDatastore.RUNNING.datastore
225 NetconfMessageUtils.deleteConfig(msgId, netconfTargetConfig)
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>")
235 val messageId = "Test-Message-ID"
237 val result = NetconfMessageUtils.discardChanges(messageId).replace("[\n\r\t]".toRegex(), "")
239 assertTrue(NetconfMessageUtils.validateRPCXML(result))
240 Assert.assertEquals(checkString, result)
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>")
249 val messageId = "Test-Message-ID"
250 val configType = NetconfDatastore.CANDIDATE.datastore
251 val result = NetconfMessageUtils.lock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
253 assertTrue(NetconfMessageUtils.validateRPCXML(result))
254 Assert.assertEquals(checkString, result)
259 val checkString = ("testmessage")
261 var messageId = "message-id=\"testmessage\""
262 var result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
263 Assert.assertEquals(checkString, result)
265 messageId = "message-id=\"hello\""
266 result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
267 Assert.assertEquals("hello", result)
269 messageId = "message-id"
270 result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
271 Assert.assertEquals("", result)
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>]]>]]>")
279 val capability = listOf<String>("hi", "hello")
281 val result = NetconfMessageUtils.createHelloString(capability).replace("[\n\r\t]".toRegex(), "")
282 Assert.assertEquals(checkString, result)
286 fun validateChunkedFraming() {
287 val reply = ("hello")
288 val result = NetconfMessageUtils.validateChunkedFraming(reply)
289 Assert.assertFalse(result)
293 fun `checkReply should return true on ok msg`() {
294 assertTrue(NetconfMessageUtils.checkReply("ok"))
298 fun `checkReply on rpc-error should return false`() {
299 assertFalse { NetconfMessageUtils.checkReply("something something rpc-error>") }
303 fun `checkReply on null input should return false`() {
304 assertFalse { NetconfMessageUtils.checkReply(null) }
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>" +
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>]]>]]>")
316 val messageId = "Test-Message-ID"
318 val capabilities = setOf<String>("hi", "hello", "urn:ietf:params:netconf:base:1.1")
320 val result = NetconfMessageUtils.formatRPCRequest(request, messageId, capabilities).replace("[\n\r\t]".toRegex(), "")
321 Assert.assertEquals(checkString, result)
325 fun `validateRPCXML on empty input returns false`() {
326 assertFalse { NetconfMessageUtils.validateRPCXML("") }
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") }