/**
* 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.After;
import org.junit.Before;
import org.junit.Test;
import util.TestAny;
import com.barchart.udt.util.HelpUDT;
public class TestEpollWait extends TestAny {
/** explore read/write */
@Test(timeout = 5 * 1000)
public void epollWait0_Accept0() 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(true);
accept.bind0(localSocketAddress());
SocketUDT.epollAdd0(epollID, accept.id(), EpollUDT.Opt.BOTH.code);
socketAwait(accept, StatusUDT.OPENED);
log.info("accept OPENED");
{
// no events
}
final SocketUDT client = new SocketUDT(TypeUDT.DATAGRAM);
client.setBlocking(true);
client.bind0(localSocketAddress());
SocketUDT.epollAdd0(epollID, client.id(), EpollUDT.Opt.BOTH.code);
socketAwait(client, StatusUDT.OPENED);
log.info("client OPENED");
{
// no events
}
accept.listen0(1);
socketAwait(accept, StatusUDT.LISTENING);
log.info("accept LISTENING");
{
// no events
}
client.connect0(accept.getLocalSocketAddress());
socketAwait(client, StatusUDT.CONNECTED);
log.info("client CONNECTED");
{
// accept: r/w
// client: w
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, SocketUDT.TIMEOUT_INFINITE);
log.info("readyCount : {}", readyCount);
assertEquals(3, readyCount);
assertEquals(1, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(2, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
assertTrue(socketPresent(accept, readBuffer));
assertTrue(socketPresent(accept, writeBuffer));
assertTrue(socketPresent(client, writeBuffer));
}
final SocketUDT server = accept.accept0();
assertNotNull(server);
server.setBlocking(true);
SocketUDT.epollAdd0(epollID, server.id(), EpollUDT.Opt.BOTH.code);
socketAwait(server, StatusUDT.CONNECTED);
log.info("server CONNECTED");
{
// accept: w
// client: w
// server: w
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, SocketUDT.TIMEOUT_INFINITE);
log.info("readyCount : {}", readyCount);
assertEquals(3, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(3, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
assertTrue(socketPresent(accept, writeBuffer));
assertTrue(socketPresent(client, writeBuffer));
assertTrue(socketPresent(server, writeBuffer));
}
final int testSize = 3;
final int sendCount = client.send(new byte[testSize]);
assertEquals(testSize, sendCount);
Thread.sleep(1000); // FIXME test can time out
{
// accept: w
// client: w
// server: r/w
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, SocketUDT.TIMEOUT_INFINITE);
log.info("readyCount : {}", readyCount);
assertEquals(4, readyCount);
assertEquals(1, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(3, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
assertTrue(socketPresent(server, readBuffer));
assertTrue(socketPresent(accept, writeBuffer));
assertTrue(socketPresent(client, writeBuffer));
assertTrue(socketPresent(server, writeBuffer));
logBuffer("read ", readBuffer);
logBuffer("write", writeBuffer);
}
final int recvCount = server.receive(new byte[10]);
assertEquals(testSize, recvCount);
server.close();
client.close();
accept.close();
SocketUDT.epollRelease0(epollID);
}
/** explore read only */
@Test(timeout = 5 * 1000)
public void epollWait0_Accept1() 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(true);
accept.bind0(localSocketAddress());
accept.listen0(1);
socketAwait(accept, StatusUDT.LISTENING);
log.info("accept listen : {}", accept.id());
final SocketUDT client = new SocketUDT(TypeUDT.DATAGRAM);
client.setBlocking(true);
client.bind0(localSocketAddress());
SocketUDT.epollAdd0(epollID, accept.id(), EpollUDT.Opt.READ.code);
SocketUDT.epollAdd0(epollID, client.id(), EpollUDT.Opt.NONE.code);
// SocketUDT
// .epollUpdate0(epollID, accept.socketID, EpollUDT.Opt.NONE.code);
// SocketUDT
// .epollUpdate0(epollID, client.socketID, EpollUDT.Opt.NONE.code);
client.connect0(accept.getLocalSocketAddress());
socketAwait(client, StatusUDT.CONNECTED);
log.info("client connect : {}", client.id());
{
// accept : r
// client : none
clear(readBuffer);
clear(readBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, SocketUDT.TIMEOUT_INFINITE);
log.info("readyCount : {}", readyCount);
logBuffer("read: ", readBuffer);
logBuffer("write:", writeBuffer);
assertEquals(1, readyCount);
assertEquals(1, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
assertTrue(socketPresent(accept, readBuffer));
}
final SocketUDT server = accept.accept0();
assertNotNull(server);
server.setBlocking(true);
SocketUDT.epollAdd0(epollID, server.id(), EpollUDT.Opt.ERROR.code);
socketAwait(server, StatusUDT.CONNECTED);
log.info("server connect : {}", server.id());
{
// accept : none
// client : none
// server : none
clear(readBuffer);
clear(readBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, 1000);
assertEquals(0, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
}
server.close();
client.close();
accept.close();
SocketUDT.epollRelease0(epollID);
}
/**
* fixed in SocketuUDT.cpp
* <p>
* http://udt.sourceforge.net/udt4/doc/epoll.htm
* <p>
* "Finally, for epoll_wait, negative timeout value will make the function
* to waituntil an event happens. If the timeout value is 0, then the
* function returns immediately with any sockets associated an IO event. If
* timeout occurs before any event happens, the function returns 0."
*
*/
@Test
public void epollWait0_ZeroTimeout() throws Exception {
final int epollID = SocketUDT.epollCreate0();
final IntBuffer readBuffer = HelpUDT.newDirectIntBufer(10);
final IntBuffer writeBuffer = HelpUDT.newDirectIntBufer(10);
final IntBuffer sizeBuffer = HelpUDT.newDirectIntBufer(10);
final long millisTimeout = 0;
final int readyCount = SocketUDT.epollWait0( //
epollID, readBuffer, writeBuffer, sizeBuffer, millisTimeout);
assertEquals(0, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_EXCEPT_INDEX));
SocketUDT.epollRelease0(epollID);
}
@Test(expected = ExceptionUDT.class, timeout = 3 * 1000)
public void epollWati0_Exception() throws Exception {
final int epollID = -1; // invalid
final IntBuffer readBuffer = HelpUDT.newDirectIntBufer(10);
final IntBuffer writeBuffer = HelpUDT.newDirectIntBufer(10);
final IntBuffer sizeBuffer = HelpUDT
.newDirectIntBufer(SocketUDT.UDT_SIZE_COUNT);
final long millisTimeout = 1 * 1000;
SocketUDT.epollWait0( //
epollID, readBuffer, writeBuffer, sizeBuffer, millisTimeout);
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
/** emulate jdk selector */
@Test(timeout = 5 * 1000)
public void epollWait0_Accept2() 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(true);
accept.bind0(localSocketAddress());
accept.listen0(10);
socketAwait(accept, StatusUDT.LISTENING);
log.info("accept : {}", accept);
final SocketUDT client = new SocketUDT(TypeUDT.DATAGRAM);
client.setBlocking(true);
client.bind0(localSocketAddress());
client.connect0(accept.getLocalSocketAddress());
socketAwait(client, StatusUDT.CONNECTED);
log.info("client {}", client);
final SocketUDT server = accept.accept();
socketAwait(server, StatusUDT.CONNECTED);
log.info("server {}", server);
SocketUDT.epollAdd0(epollID, accept.id(), EpollUDT.Opt.READ.code);
SocketUDT.epollAdd0(epollID, client.id(), EpollUDT.Opt.BOTH.code);
SocketUDT.epollAdd0(epollID, server.id(), EpollUDT.Opt.BOTH.code);
{
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, SocketUDT.TIMEOUT_INFINITE);
log.info("readyCount : {}", readyCount);
logBuffer("read: ", readBuffer);
logBuffer("write:", writeBuffer);
assertEquals(2, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(2, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
}
{
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.epollWait0(epollID, readBuffer,
writeBuffer, sizeBuffer, SocketUDT.TIMEOUT_INFINITE);
log.info("readyCount : {}", readyCount);
logBuffer("read: ", readBuffer);
logBuffer("write:", writeBuffer);
assertEquals(2, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(2, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
}
SocketUDT.epollRemove0(epollID, client.id());
SocketUDT.epollRemove0(epollID, server.id());
{
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.selectEpoll(epollID, readBuffer,
writeBuffer, sizeBuffer, 0);
log.info("readyCount : {}", readyCount);
logBuffer("read: ", readBuffer);
logBuffer("write:", writeBuffer);
assertEquals(0, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
}
SocketUDT.epollAdd0(epollID, client.id(), EpollUDT.Opt.BOTH.code);
SocketUDT.epollAdd0(epollID, server.id(), EpollUDT.Opt.BOTH.code);
{
clear(readBuffer);
clear(writeBuffer);
final int readyCount = SocketUDT.selectEpoll(epollID, readBuffer,
writeBuffer, sizeBuffer, 0);
log.info("readyCount : {}", readyCount);
logBuffer("read: ", readBuffer);
logBuffer("write:", writeBuffer);
assertEquals(2, readyCount);
assertEquals(0, sizeBuffer.get(SocketUDT.UDT_READ_INDEX));
assertEquals(2, sizeBuffer.get(SocketUDT.UDT_WRITE_INDEX));
}
server.close();
client.close();
accept.close();
SocketUDT.epollRelease0(epollID);
}
}