/* * Copyright (C) 2014 Red Hat, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.ovsdb.lib.jsonrpc; import static io.netty.buffer.Unpooled.copiedBuffer; import static org.junit.Assert.assertEquals; import com.google.common.io.Resources; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.handler.codec.DecoderException; import io.netty.util.CharsetUtil; import java.net.URL; import java.nio.charset.StandardCharsets; import org.junit.Before; import org.junit.Test; public class JsonRpcDecoderTest { static int testJson_BYTES = 179; String testJson; String prettyTestJson; static final String PREAMBLE = " "; static final String PARTIAL_START = "{\"foo\":"; static final String PARTIAL_END = "{\"bar\":\"baz\"}}"; JsonRpcDecoder decoder; EmbeddedChannel ch; @Before public void setUp() throws Exception { decoder = new JsonRpcDecoder(1000); ch = new EmbeddedChannel(decoder); URL testJsonUrl = Resources.getResource(JsonRpcDecoderTest.class, "test.json"); testJson = Resources.toString(testJsonUrl, StandardCharsets.UTF_8); URL prettyTestJsoUrl = Resources.getResource(JsonRpcDecoderTest.class, "pretty-test.json"); prettyTestJson = Resources.toString(prettyTestJsoUrl, StandardCharsets.UTF_8); } /** * Test decoding the Stringified Json text in test.json to * individual Json node objects. */ @Test public void testDecode() throws Exception { for (int i = 0; i < 10; i++) { ch.writeInbound(copiedBuffer(testJson, CharsetUtil.UTF_8)); } ch.readInbound(); assertEquals(10, decoder.getRecordsRead()); ch.finish(); } /** * Test decoding the Stringified Json text in pretty-test.json to * individual Json node objects. */ @Test public void testDecodePrettyJson() throws Exception { ch.writeInbound(copiedBuffer(prettyTestJson, CharsetUtil.UTF_8)); ch.readInbound(); assertEquals(1, decoder.getRecordsRead()); ch.finish(); } /** * Test decoding the Stringified Json text with large spaces to * individual Json node objects. */ @Test public void testDecodeSkipSpaces() throws Exception { ch.writeInbound(copiedBuffer(PREAMBLE + testJson + PREAMBLE + testJson, CharsetUtil.UTF_8)); ch.readInbound(); assertEquals(2, decoder.getRecordsRead()); ch.finish(); } /** * Test whether phased decoding is allowed with JsonRpcDecoder by * writing Json string over two separate iterations, and checking if * the decoder collates the record appropriately. */ @Test public void testDecodePartial() throws Exception { ch.writeInbound(copiedBuffer(PARTIAL_START, CharsetUtil.UTF_8)); ch.readInbound(); Thread.sleep(10); ch.writeInbound(copiedBuffer(PARTIAL_END, CharsetUtil.UTF_8)); ch.readInbound(); assertEquals(1, decoder.getRecordsRead()); ch.finish(); } /** * Test whether decoder throws appropriate DecoderException when * passing a Json string using an unsupported (i.e., UTF-16) * character set. */ @Test(expected = DecoderException.class) public void testDecodeInvalidEncoding() throws Exception { ch.writeInbound(copiedBuffer(testJson, CharsetUtil.UTF_16)); ch.finish(); } /* Disabling this test as the limit was changed * from exception to a log warning... /** * Test whether decoder throws appropriate TooLongFrameException * when passing a Json string longer than the decoder's maximum * frame length. * @throws Exception */ /* @Test(expected=TooLongFrameException.class) public void testDecodeFrameLengthExceed() { decoder = new JsonRpcDecoder(testJson_BYTES -1); ch = new EmbeddedChannel(decoder); ch.writeInbound(copiedBuffer(testJson, CharsetUtil.UTF_8)); ch.finish(); }*/ }