package org.threadly.litesockets.udp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.HashSet;
import java.util.concurrent.ExecutionException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.threadly.concurrent.PriorityScheduler;
import org.threadly.concurrent.future.SettableListenableFuture;
import org.threadly.litesockets.SocketExecuter;
import org.threadly.litesockets.ThreadedSocketExecuter;
import org.threadly.litesockets.UDPClient;
import org.threadly.litesockets.UDPServer;
import org.threadly.litesockets.UDPServer.UDPFilterMode;
import org.threadly.litesockets.UDPServer.UDPReader;
import org.threadly.litesockets.utils.PortUtils;
import org.threadly.test.concurrent.TestCondition;
public class UDPTest {
PriorityScheduler PS;
int port = PortUtils.findUDPPort();
final String GET = "hello";
SocketExecuter SE;
UDPServer server;
FakeUDPServerClient serverFC;
@Before
public void start() throws IOException {
PS = new PriorityScheduler(5);
SE = new ThreadedSocketExecuter(PS);
SE.start();
serverFC = new FakeUDPServerClient(SE);
server = SE.createUDPServer("127.0.0.1", port);
server.setClientAcceptor(serverFC);
server.start();
}
@After
public void stop() {
SE.stopListening(server);
SE.stop();
PS.shutdownNow();
System.gc();
System.out.println("Used Memory:"
+ (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024*1024));
}
@Test
public void simpleSetReader() throws IOException, InterruptedException, ExecutionException {
int newPort = PortUtils.findUDPPort();
FakeUDPServerClient newFC = new FakeUDPServerClient(SE);
UDPServer newServer = SE.createUDPServer("localhost", newPort);
newFC.AddUDPServer(newServer);
UDPClient c = newServer.createUDPClient("127.0.0.1", port);
newFC.accept(c);
final SettableListenableFuture<Boolean> slf = new SettableListenableFuture<Boolean>();
server.setUDPReader(new UDPReader() {
@Override
public boolean onUDPRead(ByteBuffer bb, InetSocketAddress isa) {
slf.setResult(true);
return false;
}});
c.write(ByteBuffer.wrap(GET.getBytes()));
slf.get();
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 0;
}
}.blockTillTrue(5000);
server.setUDPReader(new UDPReader() {
@Override
public boolean onUDPRead(ByteBuffer bb, InetSocketAddress isa) {
return true;
}});
c.write(ByteBuffer.wrap(GET.getBytes()));
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 1;
}
}.blockTillTrue(5000);
final UDPClient rc = serverFC.clientList.get(0);
new TestCondition(){
@Override
public boolean get() {
return serverFC.clients.get(rc).remaining() > 0;
}
}.blockTillTrue(5000);
assertEquals(GET, serverFC.clients.get(rc).getAsString(serverFC.clients.get(rc).remaining()));
newServer.close();
c.close();
newServer.close();
}
@Test
public void simpleUDPTest() throws IOException {
int newPort = PortUtils.findUDPPort();
FakeUDPServerClient newFC = new FakeUDPServerClient(SE);
UDPServer newServer = SE.createUDPServer("localhost", newPort);
newFC.AddUDPServer(newServer);
UDPClient c = newServer.createUDPClient("127.0.0.1", port);
newFC.accept(c);
c.write(ByteBuffer.wrap(GET.getBytes()));
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 1;
}
}.blockTillTrue(5000);
final UDPClient rc = serverFC.clientList.get(0);
new TestCondition(){
@Override
public boolean get() {
return serverFC.clients.get(rc).remaining() > 0;
}
}.blockTillTrue(5000);
System.out.println(serverFC.clients.get(rc).remaining());
assertEquals(GET, serverFC.clients.get(rc).getAsString(serverFC.clients.get(rc).remaining()));
newServer.close();
c.close();
newServer.close();
}
@Test
public void udpWhiteListTest() throws IOException, InterruptedException {
int whitePort = PortUtils.findUDPPort();
FakeUDPServerClient whiteFC = new FakeUDPServerClient(SE);
UDPServer whiteServer = SE.createUDPServer("127.0.0.1", whitePort);
whiteServer.start();
whiteFC.AddUDPServer(whiteServer);
UDPClient whiteC = whiteServer.createUDPClient("127.0.0.1", port);
whiteFC.accept(whiteC);
int blackPort = PortUtils.findUDPPort();
FakeUDPServerClient blackFC = new FakeUDPServerClient(SE);
UDPServer blackServer = SE.createUDPServer("127.0.0.1", blackPort);
blackServer.start();
blackFC.AddUDPServer(blackServer);
UDPClient blackC = blackServer.createUDPClient("127.0.0.1", port);
blackFC.accept(blackC);
server.setFilterMode(UDPFilterMode.WhiteList);
server.filterHost(new InetSocketAddress("127.0.0.1", whitePort));
for(int i=0; i<100; i++) {
blackC.write(ByteBuffer.wrap(GET.getBytes()));
assertEquals(0, serverFC.clientList.size());
}
assertEquals(0, serverFC.clientList.size());
whiteC.write(ByteBuffer.wrap(GET.getBytes()));
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 1;
}
}.blockTillTrue(500);
final UDPClient rc = serverFC.clientList.get(0);
new TestCondition(){
@Override
public boolean get() {
return serverFC.clients.get(rc).remaining() > 0;
}
}.blockTillTrue(5000);
System.out.println(serverFC.clients.get(rc).remaining());
assertEquals(GET, serverFC.clients.get(rc).getAsString(serverFC.clients.get(rc).remaining()));
blackServer.close();
whiteServer.close();
}
@Test
public void udpBlackListTest() throws IOException, InterruptedException {
int whitePort = PortUtils.findUDPPort();
FakeUDPServerClient whiteFC = new FakeUDPServerClient(SE);
UDPServer whiteServer = SE.createUDPServer("127.0.0.1", whitePort);
whiteServer.start();
whiteFC.AddUDPServer(whiteServer);
UDPClient whiteC = whiteServer.createUDPClient("127.0.0.1", port);
whiteFC.accept(whiteC);
int blackPort = PortUtils.findUDPPort();
FakeUDPServerClient blackFC = new FakeUDPServerClient(SE);
UDPServer blackServer = SE.createUDPServer("127.0.0.1", blackPort);
blackServer.start();
blackFC.AddUDPServer(blackServer);
UDPClient blackC = blackServer.createUDPClient("127.0.0.1", port);
blackFC.accept(blackC);
server.setFilterMode(UDPFilterMode.BlackList);
server.filterHost(new InetSocketAddress("127.0.0.1", whitePort));
for(int i=0; i<100; i++) {
whiteC.write(ByteBuffer.wrap(GET.getBytes()));
assertEquals(0, serverFC.clientList.size());
}
blackC.write(ByteBuffer.wrap(GET.getBytes()));
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 1;
}
}.blockTillTrue(500);
final UDPClient rc = serverFC.clientList.get(0);
new TestCondition(){
@Override
public boolean get() {
return serverFC.clients.get(rc).remaining() > 0;
}
}.blockTillTrue(5000);
System.out.println(serverFC.clients.get(rc).remaining());
assertEquals(GET, serverFC.clients.get(rc).getAsString(serverFC.clients.get(rc).remaining()));
blackServer.close();
whiteServer.close();
}
@Test
public void changeBufferSize() throws IOException, InterruptedException, ExecutionException {
int newPort = PortUtils.findUDPPort();
FakeUDPServerClient newFC = new FakeUDPServerClient(SE);
UDPServer newServer = SE.createUDPServer("localhost", newPort);
newFC.AddUDPServer(newServer);
UDPClient c = newServer.createUDPClient("127.0.0.1", port);
assertEquals(0, c.getTimeout());
c.connect().get();
newFC.accept(c);
c.clientOptions().setMaxClientReadBuffer(2);
assertEquals(c.getClientsSocketExecuter(), SE);
c.write(ByteBuffer.wrap(GET.getBytes()));
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 1;
}
}.blockTillTrue(5000);
final UDPClient rc = serverFC.clientList.get(0);
new TestCondition(){
@Override
public boolean get() {
return serverFC.clients.get(rc).remaining() > 0;
}
}.blockTillTrue(5000);
System.out.println(serverFC.clients.get(rc).remaining());
assertEquals(GET, serverFC.clients.get(rc).getAsString(serverFC.clients.get(rc).remaining()));
newServer.close();
c.close();
newServer.close();
}
@Test
public void manyUDPConnects() throws IOException, InterruptedException {
FakeUDPServerClient newFC = new FakeUDPServerClient(SE);
for(int i=0; i<10; i++) {
int newPort = PortUtils.findUDPPort();
UDPServer newServer = SE.createUDPServer("localhost", newPort);
newServer.start();
newFC.AddUDPServer(newServer);
UDPClient c = newServer.createUDPClient("127.0.0.1", port);
newFC.accept(c);
c.write(ByteBuffer.wrap(GET.getBytes()));
Thread.sleep(10);
c.write(ByteBuffer.wrap(GET.getBytes()));
Thread.sleep(10);
c.write(ByteBuffer.wrap(GET.getBytes()));
Thread.sleep(10);
System.out.println("Used Memory:"
+ (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024*1024));
}
new TestCondition(){
@Override
public boolean get() {
System.out.println(serverFC.clientList.size()+":"+serverFC);
System.out.println("Used Memory:"
+ (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024*1024));
return serverFC.clientList.size() == 10;
}
}.blockTillTrue(50000, 100);
new TestCondition(){
@Override
public boolean get() {
boolean test = true;
for(final UDPClient rc: serverFC.clientList) {
if(serverFC.clients.get(rc).remaining() < GET.getBytes().length*3) {
test = false;
}
}
System.gc();
System.out.println("Used Memory:"
+ (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024*1024));
return test;
}
}.blockTillTrue(50000);
for(int i=0; i<10; i++) {
assertEquals(GET, serverFC.clients.get(serverFC.clientList.get(i)).getAsString(GET.getBytes().length));
assertEquals(GET, serverFC.clients.get(serverFC.clientList.get(i)).getAsString(GET.getBytes().length));
assertEquals(GET, serverFC.clients.get(serverFC.clientList.get(i)).getAsString(GET.getBytes().length));
}
HashSet<UDPServer> x = new HashSet<UDPServer>(newFC.servers);
for(UDPServer s: x) {
s.close();
}
}
@Test
public void checkClients() throws IOException {
int newPort = PortUtils.findUDPPort();
FakeUDPServerClient newFC = new FakeUDPServerClient(SE);
UDPServer newServer = SE.createUDPServer("localhost", newPort);
newFC.AddUDPServer(newServer);
UDPClient c = newServer.createUDPClient("127.0.0.1", port);
newFC.accept(c);
c.write(ByteBuffer.wrap(GET.getBytes()));
new TestCondition(){
@Override
public boolean get() {
return serverFC.clientList.size() == 1;
}
}.blockTillTrue(5000);
final UDPClient rc = serverFC.clientList.get(0);
UDPClient newc = server.createUDPClient("127.0.0.1", newPort);
assertEquals(rc, newc);
assertFalse(c.equals(newc));
c.close();
newServer.close();
}
@Test
public void tryAddClient() throws IOException {
int newPort = PortUtils.findUDPPort();
FakeUDPServerClient newFC = new FakeUDPServerClient(SE);
UDPServer newServer = SE.createUDPServer("localhost", newPort);
newFC.AddUDPServer(newServer);
UDPClient c = newServer.createUDPClient("127.0.0.1", port);
newFC.accept(c);
assertEquals(0, SE.getClientCount());
c.close();
newServer.close();
}
public void printBA(byte[] ba) {
printBB(ByteBuffer.wrap(ba));
}
public void printBB(ByteBuffer bb) {
ByteBuffer bb2 = bb.duplicate();
byte[] ba = new byte[bb2.remaining()];
bb2.get(ba);
StringBuilder sb = new StringBuilder(ba.length * 2);
for(byte b: ba) {
sb.append(String.format("%02x", b & 0xff));
}
System.out.println(sb.toString());
}
}