X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-impl%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fimpl%2FMessageParserTest.java;h=baf2d7d761373a4dfb00895eed62a4d16b0470ee;hp=7e9318e0d69796eeaf4b54fe8080e7eef8ff395f;hb=3a186f6f164122ab47f816b5761ef526f939f946;hpb=397cc9012f67596848019ca7874f3a303523b7e6 diff --git a/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/MessageParserTest.java b/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/MessageParserTest.java index 7e9318e0d6..baf2d7d761 100644 --- a/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/MessageParserTest.java +++ b/opendaylight/netconf/netconf-impl/src/test/java/org/opendaylight/controller/netconf/impl/MessageParserTest.java @@ -10,82 +10,101 @@ package org.opendaylight.controller.netconf.impl; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; -import java.io.IOException; +import java.util.Queue; -import javax.xml.parsers.ParserConfigurationException; +import io.netty.buffer.ByteBuf; +import io.netty.channel.embedded.EmbeddedChannel; -import org.custommonkey.xmlunit.XMLAssert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.util.handler.FramingMechanismHandlerFactory; +import org.opendaylight.controller.netconf.util.handler.NetconfMessageAggregator; +import org.opendaylight.controller.netconf.util.handler.NetconfMessageChunkDecoder; import org.opendaylight.controller.netconf.util.messages.FramingMechanism; +import org.opendaylight.controller.netconf.util.messages.NetconfMessageConstants; import org.opendaylight.controller.netconf.util.messages.NetconfMessageFactory; +import org.opendaylight.controller.netconf.util.messages.NetconfMessageHeader; import org.opendaylight.controller.netconf.util.test.XmlFileLoader; -import org.opendaylight.controller.netconf.util.xml.XmlUtil; -import org.opendaylight.protocol.framework.DeserializerException; -import org.opendaylight.protocol.framework.DocumentedException; -import org.opendaylight.protocol.util.ByteArray; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; +import org.opendaylight.protocol.framework.ProtocolMessageDecoder; +import org.opendaylight.protocol.framework.ProtocolMessageEncoder; public class MessageParserTest { - private NetconfMessageFactory parser = null; + private NetconfMessage msg; + private NetconfMessageFactory msgFactory = new NetconfMessageFactory(); @Before - public void setUp() { - this.parser = new NetconfMessageFactory(); + public void setUp() throws Exception { + this.msg = XmlFileLoader.xmlFileToNetconfMessage("netconfMessages/getConfig.xml"); } @Test - public void testPutEOM() throws IOException, SAXException, ParserConfigurationException { - final NetconfMessage msg = XmlFileLoader.xmlFileToNetconfMessage("netconfMessages/client_hello.xml"); - final byte[] bytes = this.parser.put(msg); - assertArrayEquals(NetconfMessageFactory.endOfMessage, ByteArray.subByte(bytes, bytes.length - - NetconfMessageFactory.endOfMessage.length, NetconfMessageFactory.endOfMessage.length)); - } + public void testChunkedFramingMechanismOnPipeline() throws Exception { + EmbeddedChannel testChunkChannel = new EmbeddedChannel( + FramingMechanismHandlerFactory.createHandler(FramingMechanism.CHUNK), + new ProtocolMessageEncoder(msgFactory), - @Ignore - @Test - // TODO not working on WINDOWS - // arrays first differed at element [4]; expected:<49> but was:<53> - // at - // org.junit.internal.ComparisonCriteria.arrayEquals(ComparisonCriteria.java:52) - public void testPutChunk() throws IOException, SAXException, ParserConfigurationException { - final NetconfMessage msg = XmlFileLoader.xmlFileToNetconfMessage("netconfMessages/client_hello.xml"); - this.parser.setFramingMechanism(FramingMechanism.CHUNK); - final byte[] bytes = this.parser.put(msg); - final byte[] header = new byte[] { (byte) 0x0a, (byte) 0x23 , (byte) 0x32, (byte) 0x31, (byte) 0x31, (byte) 0x0a}; - assertArrayEquals(header, ByteArray.subByte(bytes, 0, header.length)); - assertArrayEquals(NetconfMessageFactory.endOfChunk, ByteArray.subByte(bytes, bytes.length - - NetconfMessageFactory.endOfChunk.length, NetconfMessageFactory.endOfChunk.length)); - } + new NetconfMessageAggregator(FramingMechanism.CHUNK), new NetconfMessageChunkDecoder(), + new ProtocolMessageDecoder(msgFactory)); - @Test - public void testParseEOM() throws IOException, SAXException, DeserializerException, DocumentedException, - ParserConfigurationException { - final Document msg = XmlFileLoader.xmlFileToDocument("netconfMessages/client_hello.xml"); - final byte[] bytes = this.parser.put(new NetconfMessage(msg)); - final Document doc = this.parser - .parse(ByteArray.subByte(bytes, 0, bytes.length - NetconfMessageFactory.endOfMessage.length)) - .getDocument(); - assertEquals(XmlUtil.toString(msg), XmlUtil.toString(doc)); - XMLAssert.assertXMLEqual(msg, doc); + testChunkChannel.writeOutbound(this.msg); + Queue messages = testChunkChannel.outboundMessages(); + assertFalse(messages.isEmpty()); + + int msgLength = this.msgFactory.put(this.msg).length; + int chunkCount = msgLength / NetconfMessageConstants.MAX_CHUNK_SIZE; + if ((msgLength % NetconfMessageConstants.MAX_CHUNK_SIZE) != 0) { + chunkCount++; + } + for (int i = 1; i <= chunkCount; i++) { + ByteBuf recievedOutbound = (ByteBuf) messages.poll(); + int exptHeaderLength = NetconfMessageConstants.MAX_CHUNK_SIZE; + if (i == chunkCount) { + exptHeaderLength = msgLength - (NetconfMessageConstants.MAX_CHUNK_SIZE * (i - 1)); + byte[] eom = new byte[NetconfMessageConstants.endOfChunk.length]; + recievedOutbound.getBytes(recievedOutbound.readableBytes() - NetconfMessageConstants.endOfChunk.length, + eom); + assertArrayEquals(NetconfMessageConstants.endOfChunk, eom); + } + + byte[] header = new byte[String.valueOf(exptHeaderLength).length() + + NetconfMessageConstants.MIN_HEADER_LENGTH - 1]; + recievedOutbound.getBytes(0, header); + NetconfMessageHeader messageHeader = new NetconfMessageHeader(); + messageHeader.fromBytes(header); + assertEquals(exptHeaderLength, messageHeader.getLength()); + + testChunkChannel.writeInbound(recievedOutbound); + } + assertTrue(messages.isEmpty()); + + NetconfMessage receivedMessage = (NetconfMessage) testChunkChannel.readInbound(); + assertNotNull(receivedMessage); + assertTrue(this.msg.getDocument().isEqualNode(receivedMessage.getDocument())); } @Test - public void testParseChunk() throws IOException, SAXException, DeserializerException, DocumentedException, - ParserConfigurationException { - final Document msg = XmlFileLoader.xmlFileToDocument("netconfMessages/client_hello.xml"); - this.parser.setFramingMechanism(FramingMechanism.CHUNK); - final byte[] bytes = this.parser.put(new NetconfMessage(msg)); - final Document doc = this.parser - .parse(ByteArray.subByte(bytes, 6, bytes.length - NetconfMessageFactory.endOfChunk.length - 6)) - .getDocument(); - assertEquals(XmlUtil.toString(msg), XmlUtil.toString(doc)); - XMLAssert.assertXMLEqual(msg, doc); - } + public void testEOMFramingMechanismOnPipeline() throws Exception { + EmbeddedChannel testChunkChannel = new EmbeddedChannel( + FramingMechanismHandlerFactory.createHandler(FramingMechanism.EOM), + new ProtocolMessageEncoder(msgFactory), new NetconfMessageAggregator( + FramingMechanism.EOM), new ProtocolMessageDecoder(msgFactory)); + testChunkChannel.writeOutbound(this.msg); + ByteBuf recievedOutbound = (ByteBuf) testChunkChannel.readOutbound(); + + byte[] eom = new byte[NetconfMessageConstants.endOfMessage.length]; + recievedOutbound.getBytes(recievedOutbound.readableBytes() - NetconfMessageConstants.endOfMessage.length, eom); + assertArrayEquals(NetconfMessageConstants.endOfMessage, eom); + + testChunkChannel.writeInbound(recievedOutbound); + NetconfMessage receivedMessage = (NetconfMessage) testChunkChannel.readInbound(); + assertNotNull(receivedMessage); + assertTrue(this.msg.getDocument().isEqualNode(receivedMessage.getDocument())); + } }