package edu.brown.net;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ByteChannel;
import java.util.ArrayList;
public class MockByteChannel implements ByteChannel {
private ByteBuffer nextRead;
public boolean end = false;
public boolean closed = false;
public final ArrayList<byte[]> lastWrites = new ArrayList<byte[]>();
public boolean writeCalled = false;
public int numBytesToAccept = -1;
public void setNextRead(byte[] data) {
nextRead = ByteBuffer.wrap(data);
}
public byte[] dequeueWrite() {
byte[] out = lastWrites.get(0);
lastWrites.remove(0);
return out;
}
public int read(ByteBuffer buffer) {
if (nextRead == null) {
if (end) return -1;
return 0;
}
int copied = 0;
if (nextRead.remaining() > buffer.remaining()) {
// limited copy
copied = buffer.remaining();
assert nextRead.limit() == nextRead.capacity();
nextRead.limit(nextRead.position() + copied);
assert nextRead.remaining() == buffer.remaining();
buffer.put(nextRead);
assert buffer.remaining() == 0;
nextRead.limit(nextRead.capacity());
assert nextRead.remaining() > 0;
} else {
copied = nextRead.remaining();
buffer.put(nextRead);
assert nextRead.remaining() == 0;
nextRead = null;
}
return copied;
}
@Override
public boolean isOpen() { return !closed; }
@Override
public void close() {
assert !closed;
closed = true;
end = true;
}
@Override
public int write(ByteBuffer buffer) throws IOException {
assert buffer.remaining() > 0;
writeCalled = true;
// Figure out how many bytes to take
int bytesToAccept = numBytesToAccept;
if (bytesToAccept == -1) {
bytesToAccept = buffer.remaining();
} else {
if (buffer.remaining() < bytesToAccept) {
bytesToAccept = buffer.remaining();
}
numBytesToAccept -= bytesToAccept;
}
byte[] lastWrite = new byte[bytesToAccept];
buffer.get(lastWrite);
lastWrites.add(lastWrite);
return bytesToAccept;
}
public void clear() {
lastWrites.clear();
writeCalled = false;
}
}