You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2008/05/20 13:57:32 UTC
svn commit: r658213 [2/2] - in /mina/branches/buffer/core/src:
main/java/org/apache/mina/queue/ main/java/org/apache/mina/util/byteaccess/
test/java/org/apache/mina/common/
Added: mina/branches/buffer/core/src/test/java/org/apache/mina/common/ByteAccessTest.java
URL: http://svn.apache.org/viewvc/mina/branches/buffer/core/src/test/java/org/apache/mina/common/ByteAccessTest.java?rev=658213&view=auto
==============================================================================
--- mina/branches/buffer/core/src/test/java/org/apache/mina/common/ByteAccessTest.java (added)
+++ mina/branches/buffer/core/src/test/java/org/apache/mina/common/ByteAccessTest.java Tue May 20 04:57:32 2008
@@ -0,0 +1,373 @@
+package org.apache.mina.common;
+
+import static org.easymock.EasyMock.*;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.mina.util.byteaccess.BufferByteArray;
+import org.apache.mina.util.byteaccess.ByteArray;
+import org.apache.mina.util.byteaccess.CompositeByteArray;
+import org.apache.mina.util.byteaccess.CompositeByteArrayRelativeReader;
+import org.apache.mina.util.byteaccess.CompositeByteArrayRelativeWriter;
+import org.apache.mina.util.byteaccess.IoAbsoluteReader;
+import org.apache.mina.util.byteaccess.IoAbsoluteWriter;
+import org.apache.mina.util.byteaccess.IoRelativeReader;
+import org.apache.mina.util.byteaccess.IoRelativeWriter;
+import org.apache.mina.util.byteaccess.SimpleByteArrayFactory;
+import org.apache.mina.util.byteaccess.ByteArray.Cursor;
+import org.apache.mina.util.byteaccess.CompositeByteArray.CursorListener;
+import org.apache.mina.util.byteaccess.CompositeByteArrayRelativeWriter.ChunkedExpander;
+import org.apache.mina.util.byteaccess.CompositeByteArrayRelativeWriter.Flusher;
+import org.easymock.IMocksControl;
+
+/**
+ * Tests classes in the <code>byteaccess</code> package.
+ */
+public class ByteAccessTest extends TestCase {
+
+ private final List<String> operations = new ArrayList<String>();
+
+ private void resetOperations() {
+ operations.clear();
+ }
+
+ private void assertOperationCountEquals(int expectedCount) {
+ assertEquals("Operations: " + operations, expectedCount, operations.size());
+ }
+
+ private void addOperation(String description) {
+ operations.add(description);
+ }
+
+ public void testBufferByteArray() throws Exception {
+ ByteArray ba = getByteArrayFactory().create(1000);
+ testAbsoluteReaderAndWriter(0, 1000, ba, ba);
+ testAbsoluteReaderAndWriter(0, 1000, ba, ba);
+ Cursor readCursor = ba.cursor();
+ Cursor writeCursor = ba.cursor();
+ testRelativeReaderAndWriter(1000, readCursor, writeCursor);
+ }
+
+ public void testCompositeAddAndRemove() throws Exception {
+ CompositeByteArray cba = new CompositeByteArray();
+ assertEquals(0, cba.first());
+ assertEquals(0, cba.last());
+ cba.addFirst(getByteArrayFactory().create(100));
+ assertEquals(-100, cba.first());
+ assertEquals(0, cba.last());
+ cba.addFirst(getByteArrayFactory().create(100));
+ assertEquals(-200, cba.first());
+ assertEquals(0, cba.last());
+ cba.addLast(getByteArrayFactory().create(100));
+ assertEquals(-200, cba.first());
+ assertEquals(100, cba.last());
+ cba.removeFirst();
+ assertEquals(-100, cba.first());
+ assertEquals(100, cba.last());
+ cba.addLast(getByteArrayFactory().create(100));
+ assertEquals(-100, cba.first());
+ assertEquals(200, cba.last());
+ cba.removeLast();
+ assertEquals(-100, cba.first());
+ assertEquals(100, cba.last());
+ cba.removeFirst();
+ assertEquals(0, cba.first());
+ assertEquals(100, cba.last());
+ cba.removeFirst();
+ assertEquals(100, cba.first());
+ assertEquals(100, cba.last());
+ cba.addLast(getByteArrayFactory().create(100));
+ assertEquals(100, cba.first());
+ assertEquals(200, cba.last());
+ }
+
+ public void testCompositeCursor() throws Exception {
+ IMocksControl mc = createStrictControl();
+
+ ByteArray ba1 = getByteArrayFactory().create(10);
+ ByteArray ba2 = getByteArrayFactory().create(10);
+ ByteArray ba3 = getByteArrayFactory().create(10);
+
+
+ CompositeByteArray cba = new CompositeByteArray();
+ cba.addLast(ba1);
+ cba.addLast(ba2);
+ cba.addLast(ba3);
+
+ CursorListener cl = mc.createMock(CursorListener.class);
+
+ mc.reset();
+ mc.replay();
+ Cursor cursor = cba.cursor(cl);
+ mc.verify();
+
+ mc.reset();
+ cl.enteredFirstComponent(0, ba1);
+ mc.replay();
+ cursor.get();
+ mc.verify();
+
+ mc.reset();
+ mc.replay();
+ cursor.setIndex(10);
+ mc.verify();
+
+ mc.reset();
+ cl.enteredNextComponent(10, ba2);
+ mc.replay();
+ cursor.put((byte) 55);
+ mc.verify();
+
+ mc.reset();
+ mc.replay();
+ cursor.setIndex(9);
+ mc.verify();
+
+ mc.reset();
+ cl.enteredPreviousComponent(0, ba1);
+ cl.enteredNextComponent(10, ba2);
+ mc.replay();
+ cursor.putInt(66);
+ mc.verify();
+
+ mc.reset();
+ cl.enteredNextComponent(20, ba3);
+ mc.replay();
+ cursor.setIndex(29);
+ cursor.get();
+ mc.verify();
+
+ cba.removeLast(); // Force cursor to relocate itself.
+
+ mc.reset();
+ cl.enteredLastComponent(10, ba2);
+ mc.replay();
+ cursor.setIndex(15);
+ cursor.get();
+ mc.verify();
+
+ mc.reset();
+ cl.enteredPreviousComponent(0, ba1);
+ mc.replay();
+ cursor.setIndex(0);
+ cursor.get();
+ mc.verify();
+ }
+
+ public void testCompositeByteArray() throws Exception {
+ CompositeByteArray ba = new CompositeByteArray();
+ for (int i = 0; i < 1000; i += 100) {
+ ba.addLast(getByteArrayFactory().create(100));
+ }
+ resetOperations();
+ testAbsoluteReaderAndWriter(0, 1000, ba, ba);
+ testAbsoluteReaderAndWriter(0, 1000, ba, ba);
+ assertOperationCountEquals(0);
+ Cursor readCursor = ba.cursor();
+ Cursor writeCursor = ba.cursor();
+ testRelativeReaderAndWriter(1000, readCursor, writeCursor);
+ assertOperationCountEquals(0);
+ }
+
+ public void testCompositeByteArrayRelativeReaderAndWriter() throws Exception {
+ CompositeByteArray cba = new CompositeByteArray();
+ CompositeByteArrayRelativeReader cbarr = new CompositeByteArrayRelativeReader(cba, true);
+ CompositeByteArrayRelativeWriter cbarw = new CompositeByteArrayRelativeWriter(cba, getExpander(100), getFlusher(), false);
+ resetOperations();
+ testRelativeReaderAndWriter(10, cbarr, cbarw);
+ assertOperationCountEquals(2);
+ resetOperations();
+ testRelativeReaderAndWriter(100, cbarr, cbarw);
+ assertOperationCountEquals(3);
+ resetOperations();
+ testRelativeReaderAndWriter(1000, cbarr, cbarw);
+ assertOperationCountEquals(30);
+ resetOperations();
+ testRelativeReaderAndWriter(10000, cbarr, cbarw);
+ assertOperationCountEquals(300);
+ resetOperations();
+ testRelativeReaderAndWriter(90, cbarr, cbarw);
+ assertOperationCountEquals(0); // Last free doesn't occur, since cursor only moves lazily.
+ }
+
+ public void testCompositeByteArrayRelativeReaderAndWriterWithFlush() throws Exception {
+ CompositeByteArray cba = new CompositeByteArray();
+ CompositeByteArrayRelativeReader cbarr = new CompositeByteArrayRelativeReader(cba, true);
+ CompositeByteArrayRelativeWriter cbarw = new CompositeByteArrayRelativeWriter(cba, getExpander(100), getFlusher(), true);
+ resetOperations();
+ testRelativeReaderAndWriter(10, cbarr, cbarw);
+ assertOperationCountEquals(2);
+ resetOperations();
+ testRelativeReaderAndWriter(100, cbarr, cbarw);
+ assertOperationCountEquals(4);
+ resetOperations();
+ testRelativeReaderAndWriter(1000, cbarr, cbarw);
+ assertOperationCountEquals(40);
+ resetOperations();
+ testRelativeReaderAndWriter(10000, cbarr, cbarw);
+ assertOperationCountEquals(400);
+ resetOperations();
+ testRelativeReaderAndWriter(90, cbarr, cbarw);
+ assertOperationCountEquals(0); // Last free doesn't occur, since cursor only moves lazily.
+ }
+
+ public void testCompositeRemoveTo() throws Exception {
+ CompositeByteArray cba = new CompositeByteArray();
+ {
+ // Remove nothing.
+ resetOperations();
+ ByteArray removed = cba.removeTo(0);
+ assertEquals(0, removed.first());
+ assertEquals(0, removed.last());
+ assertEquals(0, cba.first());
+ assertEquals(0, cba.last());
+ removed.free();
+ assertOperationCountEquals(0);
+ }
+ cba.addLast(getByteArrayFactory().create(100));
+ {
+ // Remove nothing.
+ resetOperations();
+ ByteArray removed = cba.removeTo(0);
+ assertEquals(0, removed.first());
+ assertEquals(0, removed.last());
+ assertEquals(0, cba.first());
+ assertEquals(100, cba.last());
+ removed.free();
+ assertOperationCountEquals(0);
+ }
+ {
+ // Remove entire component.
+ resetOperations();
+ ByteArray removed = cba.removeTo(100);
+ assertEquals(0, removed.first());
+ assertEquals(100, removed.last());
+ assertEquals(100, cba.first());
+ assertEquals(100, cba.last());
+ removed.free();
+ assertOperationCountEquals(1);
+ }
+ {
+ // Remove nothing.
+ resetOperations();
+ ByteArray removed = cba.removeTo(100);
+ assertEquals(0, removed.first());
+ assertEquals(0, removed.last());
+ assertEquals(100, cba.first());
+ assertEquals(100, cba.last());
+ removed.free();
+ assertOperationCountEquals(0);
+ }
+ cba.addLast(getByteArrayFactory().create(100));
+ {
+ // Remove nothing.
+ resetOperations();
+ ByteArray removed = cba.removeTo(100);
+ assertEquals(0, removed.first());
+ assertEquals(0, removed.last());
+ assertEquals(100, cba.first());
+ assertEquals(200, cba.last());
+ removed.free();
+ assertOperationCountEquals(0);
+ }
+ {
+ // Remove half a component.
+ resetOperations();
+ ByteArray removed = cba.removeTo(150);
+ assertEquals(0, removed.first());
+ assertEquals(50, removed.last());
+ assertEquals(150, cba.first());
+ assertEquals(200, cba.last());
+ removed.free();
+ assertOperationCountEquals(0); // Doesn't free until component finished.
+ }
+ {
+ // Remove nothing.
+ resetOperations();
+ ByteArray removed = cba.removeTo(150);
+ assertEquals(0, removed.first());
+ assertEquals(0, removed.last());
+ assertEquals(150, cba.first());
+ assertEquals(200, cba.last());
+ removed.free();
+ assertOperationCountEquals(0);
+ }
+ {
+ // Remove other half.
+ resetOperations();
+ ByteArray removed = cba.removeTo(200);
+ assertEquals(0, removed.first());
+ assertEquals(50, removed.last());
+ assertEquals(200, cba.first());
+ assertEquals(200, cba.last());
+ removed.free();
+ assertOperationCountEquals(1); // Frees ByteArray behind both buffers.
+ }
+ }
+
+ private ChunkedExpander getExpander(final int chunkSize) {
+ return new ChunkedExpander(getByteArrayFactory(), chunkSize) {
+ @Override
+ public void expand(CompositeByteArray cba, int minSize) {
+ addOperation("ChunkedExpander(" + chunkSize + ").expand(" + cba + "," + minSize + ")");
+ super.expand(cba, minSize);
+ }
+ };
+ }
+
+ private Flusher getFlusher() {
+ return new CompositeByteArrayRelativeWriter.Flusher() {
+
+ public void flush(ByteArray ba) {
+ addOperation("Flusher().flush(" + ba + ")");
+ ba.free();
+ }
+
+ };
+ }
+
+ private SimpleByteArrayFactory getByteArrayFactory() {
+ return new SimpleByteArrayFactory() {
+ @Override
+ public ByteArray create(final int size) {
+ if (size < 0) {
+ throw new IllegalArgumentException(
+ "Buffer size must not be negative:" + size);
+ }
+ ByteBuffer bb = ByteBuffer.allocate(size);
+ ByteArray ba = new BufferByteArray(bb) {
+
+ @Override
+ public void free() {
+ addOperation(this + ".free()");
+ // Nothing to do.
+ }
+
+ };
+ addOperation("SimpleByteArrayFactory().create(" + size + ") = " + ba);
+ return ba;
+ }
+ };
+ }
+
+ private void testRelativeReaderAndWriter(int length, IoRelativeReader reader, IoRelativeWriter writer) {
+ for (int i = 0; i < length; i++) {
+ byte b = (byte) (i % 67);
+ writer.put(b);
+ assertEquals(b, reader.get());
+ }
+ }
+
+ private void testAbsoluteReaderAndWriter(int start, int length, IoAbsoluteReader reader, IoAbsoluteWriter writer) {
+ for (int i = start; i < length; i++) {
+ byte b = (byte) (i % 67);
+ writer.put(i, b);
+ assertEquals(b, reader.get(i));
+ }
+ }
+
+}
Propchange: mina/branches/buffer/core/src/test/java/org/apache/mina/common/ByteAccessTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: mina/branches/buffer/core/src/test/java/org/apache/mina/common/ByteAccessTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date