package org.bouncycastle.crypto.tls.test; import java.io.IOException; import java.net.DatagramPacket; import java.util.Vector; import org.bouncycastle.crypto.tls.DatagramTransport; public class MockDatagramAssociation { private int mtu; private MockDatagramTransport client, server; public MockDatagramAssociation(int mtu) { this.mtu = mtu; Vector clientQueue = new Vector(); Vector serverQueue = new Vector(); this.client = new MockDatagramTransport(clientQueue, serverQueue); this.server = new MockDatagramTransport(serverQueue, clientQueue); } public DatagramTransport getClient() { return client; } public DatagramTransport getServer() { return server; } private class MockDatagramTransport implements DatagramTransport { private Vector receiveQueue, sendQueue; MockDatagramTransport(Vector receiveQueue, Vector sendQueue) { this.receiveQueue = receiveQueue; this.sendQueue = sendQueue; } public int getReceiveLimit() throws IOException { return mtu; } public int getSendLimit() throws IOException { return mtu; } public int receive(byte[] buf, int off, int len, int waitMillis) throws IOException { synchronized (receiveQueue) { if (receiveQueue.isEmpty()) { try { receiveQueue.wait(waitMillis); } catch (InterruptedException e) { // TODO Keep waiting until full wait expired? } if (receiveQueue.isEmpty()) { return -1; } } DatagramPacket packet = (DatagramPacket)receiveQueue.remove(0); int copyLength = Math.min(len, packet.getLength()); System.arraycopy(packet.getData(), packet.getOffset(), buf, off, copyLength); return copyLength; } } public void send(byte[] buf, int off, int len) throws IOException { if (len > mtu) { // TODO Simulate rejection? } byte[] copy = new byte[len]; System.arraycopy(buf, off, copy, 0, len); DatagramPacket packet = new DatagramPacket(copy, len); synchronized (sendQueue) { sendQueue.addElement(packet); sendQueue.notify(); } } public void close() throws IOException { // TODO? } } }