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)
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>")
54 val messageId = "Test-Message-ID"
55 val configType = NetconfDatastore.CANDIDATE.datastore
56 val filterContent = "Test-Filter-Content"
57 val defaultOperation = "Test-Default-Operation"
60 NetconfMessageUtils.editConfig(messageId, configType, defaultOperation, filterContent).replace("[\n\r\t]".toRegex(), "")
62 assertTrue(NetconfMessageUtils.validateRPCXML(result))
63 Assert.assertEquals(checkString, result)
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>")
72 val messageId = "Test-Message-ID"
73 val configType = NetconfDatastore.CANDIDATE.datastore
75 val result = NetconfMessageUtils.validate(messageId, configType).replace("[\n\r\t]".toRegex(), "")
77 assertTrue(NetconfMessageUtils.validateRPCXML(result))
78 Assert.assertEquals(checkString, result)
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\">" +
87 "<persist-id>1234</persist-id>" +
88 "</cancel-commit></rpc>")
90 val messageId = "Test-Message-ID"
92 val cancelCommitPersistId =
93 NetconfMessageUtils.cancelCommit(messageId, "1234").replace("[\n\r\t]".toRegex(), "")
95 assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitPersistId))
96 Assert.assertEquals(checkString, cancelCommitPersistId)
100 fun cancelCommitNoPersistId() {
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\">" +
105 "</cancel-commit></rpc>")
107 val messageId = "Test-Message-ID"
109 val cancelCommitNoPersistId = NetconfMessageUtils.cancelCommit(messageId, "").replace("[\n\r\t]".toRegex(), "")
111 assertTrue(NetconfMessageUtils.validateRPCXML(cancelCommitNoPersistId))
112 Assert.assertEquals(checkString, cancelCommitNoPersistId)
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>")
121 val messageId = "Test-Message-ID"
123 val commit = NetconfMessageUtils.commit(messageId, false, 0, "", "").replace("[\n\r\t]".toRegex(), "")
125 val commitWithPersistButNotConfirmed =
126 NetconfMessageUtils.commit(messageId, false, 0, "1234", "").replace("[\n\r\t]".toRegex(), "")
128 assertTrue(NetconfMessageUtils.validateRPCXML(commit))
129 Assert.assertEquals(checkString, commit)
130 Assert.assertEquals(checkString, commitWithPersistButNotConfirmed)
135 fun commitPersistId() {
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\">" +
140 "<persist-id>1234</persist-id>" +
143 val messageId = "Test-Message-ID"
145 val result = NetconfMessageUtils.commit(messageId, false, 30, "", "1234").replace("[\n\r\t]".toRegex(), "")
146 assertTrue(NetconfMessageUtils.validateRPCXML(result))
147 Assert.assertEquals(checkString, result)
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.",
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) {
181 Assert.assertEquals("Can't proceed <commit> with both persist(1234) and persistId(1234) specified. Only one should be specified.",
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>")
194 val messageId = "Test-Message-ID"
195 val configType = NetconfDatastore.CANDIDATE.datastore
197 val result = NetconfMessageUtils.unlock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
199 assertTrue(NetconfMessageUtils.validateRPCXML(result))
200 Assert.assertEquals(checkString, result)
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>")
209 val messageId = "Test-Message-ID"
210 val netconfTargetConfig = NetconfDatastore.CANDIDATE.datastore
212 val result = NetconfMessageUtils.deleteConfig(messageId, netconfTargetConfig).replace("[\n\r\t]".toRegex(), "")
214 assertTrue(NetconfMessageUtils.validateRPCXML(result))
215 Assert.assertEquals(checkString, result)
219 fun deleteConfigThrowsNetconfExceptionOnRunningDataStore() {
220 assertFailsWith(exceptionClass = NetconfException::class) {
221 val netconfTargetConfig = NetconfDatastore.RUNNING.datastore
223 NetconfMessageUtils.deleteConfig(msgId, netconfTargetConfig)
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>")
233 val messageId = "Test-Message-ID"
235 val result = NetconfMessageUtils.discardChanges(messageId).replace("[\n\r\t]".toRegex(), "")
237 assertTrue(NetconfMessageUtils.validateRPCXML(result))
238 Assert.assertEquals(checkString, result)
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>")
247 val messageId = "Test-Message-ID"
248 val configType = NetconfDatastore.CANDIDATE.datastore
249 val result = NetconfMessageUtils.lock(messageId, configType).replace("[\n\r\t]".toRegex(), "")
251 assertTrue(NetconfMessageUtils.validateRPCXML(result))
252 Assert.assertEquals(checkString, result)
257 val checkString = ("testmessage")
259 var messageId = "message-id=\"testmessage\""
260 var result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
261 Assert.assertEquals(checkString, result)
263 messageId = "message-id=\"hello\""
264 result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
265 Assert.assertEquals("hello", result)
267 messageId = "message-id"
268 result = NetconfMessageUtils.getMsgId(messageId).replace("[\n\r\t]".toRegex(), "")
269 Assert.assertEquals("", result)
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>]]>]]>")
277 val capability = listOf<String>("hi", "hello")
279 val result = NetconfMessageUtils.createHelloString(capability).replace("[\n\r\t]".toRegex(), "")
280 Assert.assertEquals(checkString, result)
284 fun validateChunkedFraming() {
285 val reply = ("hello")
286 val result = NetconfMessageUtils.validateChunkedFraming(reply)
287 Assert.assertFalse(result)
291 fun `checkReply should return true on ok msg`() {
292 assertTrue(NetconfMessageUtils.checkReply("ok"))
296 fun `checkReply on rpc-error should return false`() {
297 assertFalse { NetconfMessageUtils.checkReply("something something rpc-error>") }
301 fun `checkReply on null input should return false`() {
302 assertFalse { NetconfMessageUtils.checkReply(null) }
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>" +
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>]]>]]>")
314 val messageId = "Test-Message-ID"
316 val capabilities = setOf<String>("hi", "hello","urn:ietf:params:netconf:base:1.1")
318 val result = NetconfMessageUtils.formatRPCRequest(request,messageId,capabilities).replace("[\n\r\t]".toRegex(), "")
319 Assert.assertEquals(checkString, result)
323 fun `validateRPCXML on empty input returns false`() {
324 assertFalse { NetconfMessageUtils.validateRPCXML("") }
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") }