/** * 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 static util.UnitHelp.*; import java.nio.IntBuffer; import org.junit.Test; import util.TestAny; import com.barchart.udt.util.HelpUDT; public class TestEpollConnection extends TestAny { static EpollUDT.Opt opt(final SocketUDT socket) throws ExceptionUDT { final int code = socket.getOption(OptionUDT.Epoll_Event_Mask); return EpollUDT.Opt.from(code); } static void logSize(final IntBuffer buffer) { log.info("# size read = {}", buffer.get(SocketUDT.UDT_READ_INDEX)); log.info("# size write = {}", buffer.get(SocketUDT.UDT_WRITE_INDEX)); log.info("# size except = {}", buffer.get(SocketUDT.UDT_EXCEPT_INDEX)); } /** * Verify how epoll reports connect/disconnect life cycle. */ @Test public void connectionCreateDelete() throws Exception { final IntBuffer readBuffer = HelpUDT.newDirectIntBufer(10); final IntBuffer writeBuffer = HelpUDT.newDirectIntBufer(10); final IntBuffer sizeBuffer = HelpUDT.newDirectIntBufer(10); final int epollID = SocketUDT.epollCreate0(); final SocketUDT accept = new SocketUDT(TypeUDT.DATAGRAM); accept.setBlocking(false); accept.bind0(localSocketAddress()); accept.listen0(1); socketAwait(accept, StatusUDT.LISTENING); log.info("accept {}", accept); final SocketUDT client = new SocketUDT(TypeUDT.DATAGRAM); client.setBlocking(false); client.bind0(localSocketAddress()); SocketUDT.epollAdd0(epollID, client.id(), EpollUDT.Opt.ALL.code); socketAwait(client, StatusUDT.OPENED); log.info("client {}", client); client.connect(accept.getLocalSocketAddress()); socketAwait(client, StatusUDT.CONNECTED); log.info("client {}", client); { log.info("### 1 ###"); final int readyCount = SocketUDT.selectEpoll( // epollID, readBuffer, writeBuffer, sizeBuffer, 0); logSize(sizeBuffer); logBuffer("read ", readBuffer); logBuffer("write", writeBuffer); assertEquals("", 1, readyCount); assertTrue(socketPresent(client, writeBuffer)); clear(readBuffer); clear(writeBuffer); } final SocketUDT server = accept.accept(); assertNotNull(server); SocketUDT.epollAdd0(epollID, server.id(), EpollUDT.Opt.ALL.code); socketAwait(server, StatusUDT.CONNECTED); log.info("server {}", server); { log.info("### 2 ###"); final int readyCount = SocketUDT.selectEpoll( // epollID, readBuffer, writeBuffer, sizeBuffer, 0); logSize(sizeBuffer); logBuffer("read ", readBuffer); logBuffer("write", writeBuffer); assertEquals("client=write server=write", 2, readyCount); assertTrue(socketPresent(client, writeBuffer)); assertTrue(socketPresent(server, writeBuffer)); clear(readBuffer); clear(writeBuffer); } client.close(); socketAwait(client, StatusUDT.CLOSED); socketAwait(server, StatusUDT.BROKEN); log.info("server opt {}", opt(server)); log.info("client {}", client); log.info("server {}", server); { log.info("### 3 ###"); final int readyCount = SocketUDT.selectEpoll( // epollID, readBuffer, writeBuffer, sizeBuffer, 0); logSize(sizeBuffer); logBuffer("read ", readBuffer); logBuffer("write", writeBuffer); assertEquals("client=error server=write", 3, readyCount); assertTrue(socketPresent(client, readBuffer)); assertTrue(socketPresent(client, writeBuffer)); assertTrue(socketPresent(server, writeBuffer)); clear(readBuffer); clear(writeBuffer); } log.info("client {}", client); log.info("server {}", server); { log.info("### 4 ###"); final int readyCount = SocketUDT.selectEpoll( // epollID, readBuffer, writeBuffer, sizeBuffer, 0); logSize(sizeBuffer); logBuffer("read ", readBuffer); logBuffer("write", writeBuffer); assertEquals("client=missing server=write", 1, readyCount); assertTrue(socketPresent(server, writeBuffer)); clear(readBuffer); clear(writeBuffer); } server.close(); socketAwait(server, StatusUDT.CLOSED); log.info("client {}", client); log.info("server {}", server); { log.info("### 5 ###"); final int readyCount = SocketUDT.selectEpoll( // epollID, readBuffer, writeBuffer, sizeBuffer, 0); logSize(sizeBuffer); logBuffer("read ", readBuffer); logBuffer("write", writeBuffer); assertEquals("server=error", 2, readyCount); assertTrue(socketPresent(server, readBuffer)); assertTrue(socketPresent(server, writeBuffer)); clear(readBuffer); clear(writeBuffer); } log.info("client {}", client); log.info("server {}", server); { log.info("### 6 ###"); final int readyCount = SocketUDT.selectEpoll( // epollID, readBuffer, writeBuffer, sizeBuffer, 0); logSize(sizeBuffer); logBuffer("read ", readBuffer); logBuffer("write", writeBuffer); assertEquals("server=missing", 0, readyCount); clear(readBuffer); clear(writeBuffer); } log.info("client {}", client); log.info("server {}", server); accept.close(); // UDT has 3 second close delay for acceptors. // socketAwait(accept, StatusUDT.CLOSED); SocketUDT.epollRelease0(epollID); } }