/** * Copyright (C) 2009-2013 Barchart, Inc. <http://www.barchart.com/> * * All rights reserved. Licensed under the OSI BSD License. * * http://www.opensource.org/licenses/bsd-license.php */ package com.barchart.udt; import static org.junit.Assert.*; import java.net.InetSocketAddress; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; import util.TestAny; import util.UnitHelp; public abstract class TestSendRecvAbstract<T> extends TestAny { final static int TEST_TIMEOUT = 30; // seconds final static int SIZE = 1460; final static int COUNT = 1000; final static int THREADS = 4; volatile SocketUDT server; volatile SocketUDT connector; volatile SocketUDT client; volatile InetSocketAddress serverAddress; volatile InetSocketAddress clientAddress; volatile ExecutorService service; volatile CyclicBarrier barrier; volatile BlockingQueue<T> serverQueue; volatile BlockingQueue<T> clientQueue; final Random generator = new Random(); // protected abstract void doServerReader() throws Exception; protected abstract void doServerWriter() throws Exception; protected abstract void doClientReader() throws Exception; protected abstract void doClientWriter() throws Exception; // final Runnable serverReader = new Runnable() { @Override public void run() { try { log.info("server reader start"); server.bind(serverAddress); server.listen(1); // blocks here connector = server.accept(); for (int k = 0; k < COUNT; k++) { doServerReader(); } log.info("server reader finish"); } catch (final Exception e) { log.error("", e); fail(e.getMessage()); } try { barrier.await(); } catch (final Exception e) { log.error("", e); } } }; final Runnable serverWriter = new Runnable() { @Override public void run() { try { log.info("server writer start"); for (int k = 0; k < COUNT; k++) { doServerWriter(); } log.info("server writer finish"); } catch (final Exception e) { log.error("", e); fail(e.getMessage()); } try { barrier.await(); } catch (final Exception e) { log.error("", e); } } }; final Runnable clientWriter = new Runnable() { @Override public void run() { try { log.info("client writer start"); client.bind(clientAddress); // blocks here client.connect(serverAddress); for (int k = 0; k < COUNT; k++) { doClientWriter(); } log.info("client writer finish"); } catch (final Exception e) { log.error("", e); fail(e.getMessage()); } try { barrier.await(); } catch (final Exception e) { log.error("", e); } } }; final Runnable clientReader = new Runnable() { @Override public void run() { try { log.info("client reader start"); for (int k = 0; k < COUNT; k++) { doClientReader(); } log.info("client reader finish"); } catch (final Exception e) { log.error("", e); fail(e.getMessage()); } try { barrier.await(); } catch (final Exception e) { log.error("", e); } } }; @Before public void setUp() throws Exception { log.info("started {}", System.getProperty("os.arch")); serverQueue = new LinkedBlockingQueue<T>(); clientQueue = new LinkedBlockingQueue<T>(); server = new SocketUDT(TypeUDT.DATAGRAM); client = new SocketUDT(TypeUDT.DATAGRAM); server.setBlocking(true); client.setBlocking(true); serverAddress = UnitHelp.localSocketAddress(); clientAddress = UnitHelp.localSocketAddress(); log.info("serverAddress={} clientAddress={}", serverAddress, clientAddress); service = Executors.newFixedThreadPool(THREADS); barrier = new CyclicBarrier(THREADS + 1); } @After public void tearDown() throws Exception { client.close(); server.close(); service.shutdownNow(); barrier.reset(); } @Test public void testSend0Receive0() { log.info("testSend0Receive0"); try { service.execute(serverReader); service.execute(serverWriter); service.execute(clientReader); service.execute(clientWriter); barrier.await(TEST_TIMEOUT, TimeUnit.SECONDS); } catch (final Exception e) { log.error("", e); fail(e.getMessage()); } } }