net.solarnetwork.node.io.serial.rxtx.test.SerialConnectionTests.java Source code

Java tutorial

Introduction

Here is the source code for net.solarnetwork.node.io.serial.rxtx.test.SerialConnectionTests.java

Source

/* ==================================================================
 * SerialConnectionTests.java - Oct 27, 2014 7:12:50 AM
 * 
 * Copyright 2007-2014 SolarNetwork.net Dev Team
 * 
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License as 
 * published by the Free Software Foundation; either version 2 of 
 * the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
 * 02111-1307 USA
 * ==================================================================
 */

package net.solarnetwork.node.io.serial.rxtx.test;

import gnu.io.SerialPort;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import net.solarnetwork.node.LockTimeoutException;
import net.solarnetwork.node.io.serial.SerialUtils;
import net.solarnetwork.node.io.serial.rxtx.SerialPortConnection;
import net.solarnetwork.node.support.SerialPortBeanParameters;
import net.solarnetwork.node.test.AbstractNodeTest;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.util.FileCopyUtils;

/**
 * Test cases for the {@link SerialPortConnection} class.
 * 
 * @author matt
 * @version 1.0
 */
public class SerialConnectionTests extends AbstractNodeTest {

    private ExecutorService executor;

    @Before
    public void setup() {
        executor = Executors.newCachedThreadPool();
    }

    @After
    public void shutdown() {
        executor.shutdown();
    }

    @Test
    public void readMarkedMessageSmallChunks() throws IOException {
        final byte[] xml = FileCopyUtils.copyToByteArray(getClass().getResourceAsStream("message-1.xml"));
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public InputStream getInputStream() throws IOException {
                return new TestSerialPortInputStream(new ByteArrayInputStream(xml), 0, 4, 0);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, new SerialPortBeanParameters(),
                executor);
        byte[] result = conn.readMarkedMessage("<msg>".getBytes(SerialUtils.ASCII_CHARSET),
                "</msg>".getBytes(SerialUtils.ASCII_CHARSET));
        Assert.assertArrayEquals(xml, result);
    }

    @Test
    public void readMarkedMessageLargeChunks() throws IOException {
        final byte[] xml = FileCopyUtils.copyToByteArray(getClass().getResourceAsStream("message-1.xml"));
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public InputStream getInputStream() throws IOException {
                return new TestSerialPortInputStream(new ByteArrayInputStream(xml), 0, 64, 0);
            }
        };
        SerialPortBeanParameters serialParams = new SerialPortBeanParameters();
        serialParams.setReceiveThreshold(64);
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, serialParams, executor);
        byte[] result = conn.readMarkedMessage("<msg>".getBytes(SerialUtils.ASCII_CHARSET),
                "</msg>".getBytes(SerialUtils.ASCII_CHARSET));
        Assert.assertArrayEquals(xml, result);
    }

    @Test
    public void readMarkedMessageMessy() throws IOException {
        final byte[] xml = FileCopyUtils.copyToByteArray(getClass().getResourceAsStream("message-1.xml"));
        final byte[] msg = FileCopyUtils.copyToByteArray(getClass().getResourceAsStream("message-2.txt"));
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public InputStream getInputStream() throws IOException {
                return new TestSerialPortInputStream(new ByteArrayInputStream(msg), 0, 4, 0);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, new SerialPortBeanParameters(),
                executor);
        byte[] result = conn.readMarkedMessage("<msg>".getBytes(SerialUtils.ASCII_CHARSET),
                "</msg>".getBytes(SerialUtils.ASCII_CHARSET));
        Assert.assertArrayEquals(xml, result);
    }

    @Test
    public void readFixedMarkedMessage() throws IOException {
        final byte[] msg = { 'T', 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public InputStream getInputStream() throws IOException {
                return new TestSerialPortInputStream(new ByteArrayInputStream(msg), 0, 4, 0);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, new SerialPortBeanParameters(),
                executor);
        byte[] result = conn.readMarkedMessage(new byte[] { msg[0] }, 10);
        Assert.assertArrayEquals(msg, result);
    }

    @Test(expected = LockTimeoutException.class)
    public void readFixedMarkedMessageWithTimeout() throws IOException {
        final byte[] msg = { 'T', 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        final SerialPortBeanParameters serialParams = serialParamsWithTimeout();
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public InputStream getInputStream() throws IOException {
                return new TestSerialPortInputStream(new ByteArrayInputStream(msg), 1000, 4, 0);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, serialParams, executor);
        conn.readMarkedMessage(new byte[] { msg[0] }, 10);
    }

    @Test
    public void drainInputBuffer() throws IOException {
        final byte[] msg = { 1, 2, 3 };
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public InputStream getInputStream() throws IOException {
                return new TestSerialPortInputStream(new ByteArrayInputStream(msg), 0, 4, 0);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, new SerialPortBeanParameters(),
                executor);
        byte[] result = conn.drainInputBuffer();
        Assert.assertArrayEquals(msg, result);
    }

    @Test
    public void writeMessage() throws IOException {
        final byte[] msg = { 'T', 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        final ByteArrayOutputStream byos = new ByteArrayOutputStream();
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public OutputStream getOutputStream() throws IOException {
                return byos;
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, new SerialPortBeanParameters(),
                executor);
        conn.writeMessage(msg);
        Assert.assertArrayEquals(msg, byos.toByteArray());
    }

    private SerialPortBeanParameters serialParamsWithTimeout() {
        final SerialPortBeanParameters serialParams = new SerialPortBeanParameters();
        serialParams.setMaxWait(500);
        return serialParams;
    }

    @Test
    public void writeMessageWithTimeout() throws IOException {
        final byte[] msg = { 'T', 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        final ByteArrayOutputStream byos = new ByteArrayOutputStream();
        final SerialPortBeanParameters serialParams = serialParamsWithTimeout();
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public OutputStream getOutputStream() throws IOException {
                return new TestSerialPortOutputStream(new BufferedOutputStream(byos), 0);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, serialParams, executor);
        conn.writeMessage(msg);
        Assert.assertArrayEquals(msg, byos.toByteArray());
    }

    @Test(expected = LockTimeoutException.class)
    public void writeMessageWithTimeoutThrown() throws IOException {
        final byte[] msg = { 'T', 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        final ByteArrayOutputStream byos = new ByteArrayOutputStream();
        final SerialPortBeanParameters serialParams = serialParamsWithTimeout();
        final SerialPort serialPort = new TestSerialPort() {

            @Override
            public OutputStream getOutputStream() throws IOException {
                return new TestSerialPortOutputStream(new BufferedOutputStream(byos), 1000);
            }
        };
        TestSerialPortConnection conn = new TestSerialPortConnection(serialPort, serialParams, executor);
        conn.writeMessage(msg);
        Assert.assertArrayEquals(msg, byos.toByteArray());
    }

}