2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.nettyutil.handler;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertTrue;
15 import io.netty.buffer.Unpooled;
16 import java.util.ArrayList;
17 import org.junit.Test;
18 import org.opendaylight.netconf.api.messages.NetconfMessage;
19 import org.xml.sax.SAXParseException;
21 public class NetconfXMLToMessageDecoderTest {
24 public void testDecodeNoMoreContent() throws Exception {
25 final ArrayList<Object> out = new ArrayList<>();
26 new NetconfXMLToMessageDecoder().decode(null, Unpooled.buffer(), out);
27 assertEquals(0, out.size());
31 public void testDecode() throws Exception {
32 final ArrayList<Object> out = new ArrayList<>();
33 new NetconfXMLToMessageDecoder().decode(null, Unpooled.wrappedBuffer("<msg/>".getBytes()), out);
34 assertEquals(1, out.size());
38 public void testDecodeWithLeadingLFAndXmlDecl() throws Exception {
39 /* Test that we accept XML documents with a line feed (0x0a) before the
40 * XML declaration in the XML prologue.
41 * A leading LF is the case reported in BUG-2838.
43 final ArrayList<Object> out = new ArrayList<>();
44 new NetconfXMLToMessageDecoder().decode(null,
45 Unpooled.wrappedBuffer("\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><msg/>".getBytes()), out);
46 assertEquals(1, out.size());
50 public void testDecodeWithLeadingCRLFAndXmlDecl() throws Exception {
51 /* Test that we accept XML documents with both a carriage return and
52 * line feed (0x0d 0x0a) before the XML declaration in the XML prologue.
53 * Leading CRLF can be seen with some Cisco routers
54 * (eg CSR1000V running IOS 15.4(1)S)
56 final ArrayList<Object> out = new ArrayList<>();
57 new NetconfXMLToMessageDecoder().decode(null,
58 Unpooled.wrappedBuffer("\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><msg/>".getBytes()), out);
59 assertEquals(1, out.size());
63 public void testDecodeGibberish() throws Exception {
64 /* Test that we reject inputs where we cannot find the xml start '<' character */
65 final ArrayList<Object> out = new ArrayList<>();
66 new NetconfXMLToMessageDecoder().decode(null, Unpooled.wrappedBuffer("\r\n?xml version>".getBytes()), out);
67 assertEquals(1, out.size());
68 assertTrue((out.get(0) instanceof SAXParseException));
72 public void testDecodeOnlyWhitespaces() throws Exception {
73 /* Test that we handle properly a bunch of whitespaces.
75 final ArrayList<Object> out = new ArrayList<>();
76 new NetconfXMLToMessageDecoder().decode(null, Unpooled.wrappedBuffer("\r\n".getBytes()), out);
77 assertEquals(0, out.size());
81 public void testDecodeWithAllWhitespaces() throws Exception {
82 /* Test that every whitespace we want to skip is actually skipped.
85 final ArrayList<Object> out = new ArrayList<>();
86 byte[] whitespaces = {' ', '\t', '\n', '\r', '\f', 0x0b /* vertical tab */};
87 new NetconfXMLToMessageDecoder().decode(
89 Unpooled.copiedBuffer(
90 Unpooled.wrappedBuffer(whitespaces),
91 Unpooled.wrappedBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?><msg/>".getBytes())),
93 assertEquals(1, out.size());
97 public void testDecodeAfterInvalidXml() throws Exception {
98 /* Test that decoding of the next message after an invalid XML is successful.
100 final var out = new ArrayList<>();
101 final var decoder = new NetconfXMLToMessageDecoder();
102 final var buffer = Unpooled.buffer();
104 buffer.writeBytes("<?xml version=\"1.0\"\u0006 encoding=\"UTF-8\"?><msg/>".getBytes());
105 decoder.decode(null, buffer, out);
106 assertEquals(1, out.size());
107 assertThat(out.get(0), instanceOf(SAXParseException.class));
109 buffer.writeBytes("<msg/>".getBytes());
110 decoder.decode(null, buffer, out);
111 assertEquals(2, out.size());
112 assertThat(out.get(1), instanceOf(NetconfMessage.class));