/**
* 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 util.UnitHelp;
import com.barchart.udt.util.HelpUDT;
public class TestEpollClose extends TestAny {
/**
* Verify how closed socket is reported by epoll.
*/
@Test
public void epollWait0_Close() 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 {}", accept);
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 {} {}", client,
client.getOption(OptionUDT.Epoll_Event_Mask));
client.connect(accept.getLocalSocketAddress());
socketAwait(client, StatusUDT.CONNECTED);
log.info("client {} {}", client,
client.getOption(OptionUDT.Epoll_Event_Mask));
{
log.info("### 1 ###");
final int readyCount = SocketUDT.selectEpoll( //
epollID, readBuffer, writeBuffer, sizeBuffer, 0);
assertEquals("", 1, readyCount);
UnitHelp.logBuffer("read ", readBuffer);
UnitHelp.logBuffer("write", writeBuffer);
UnitHelp.clear(readBuffer);
UnitHelp.clear(writeBuffer);
}
client.close();
socketAwait(client, StatusUDT.CLOSED);
log.info("client {} {}", client, 0);
SocketUDT.epollRemove0(epollID, client.id());
{
log.info("### 2 ###");
final int readyCount = SocketUDT.selectEpoll( //
epollID, readBuffer, writeBuffer, sizeBuffer, 0);
assertEquals("", 0, readyCount);
UnitHelp.logBuffer("read ", readBuffer);
UnitHelp.logBuffer("write", writeBuffer);
UnitHelp.clear(readBuffer);
UnitHelp.clear(writeBuffer);
}
socketAwait(client, StatusUDT.NONEXIST);
log.info("client {} {}", client, 0);
{
log.info("### 3 ###");
final int readyCount = SocketUDT.selectEpoll( //
epollID, readBuffer, writeBuffer, sizeBuffer, 0);
assertEquals("", 0, readyCount);
UnitHelp.logBuffer("read ", readBuffer);
UnitHelp.logBuffer("write", writeBuffer);
UnitHelp.clear(readBuffer);
UnitHelp.clear(writeBuffer);
}
accept.close();
SocketUDT.epollRelease0(epollID);
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
}