import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+
import org.eclipse.jgit.junit.TestRng;
+import org.eclipse.jgit.util.TemporaryBuffer.Block;
import org.junit.Test;
public class TemporaryBufferTest {
assertEquals("In-memory buffer limit exceeded", e.getMessage());
}
}
+
+ @Test
+ public void testHeapWithEstimatedSize() throws IOException {
+ int sz = 2 * Block.SZ;
+ try (TemporaryBuffer b = new TemporaryBuffer.Heap(sz / 2, sz)) {
+ for (int i = 0; i < sz; i++) {
+ b.write('x');
+ }
+ try {
+ b.write(1);
+ fail("accepted too many bytes of data");
+ } catch (IOException e) {
+ assertEquals("In-memory buffer limit exceeded", e.getMessage());
+ }
+
+ try (InputStream in = b.openInputStream()) {
+ for (int i = 0; i < sz; i++) {
+ assertEquals('x', in.read());
+ }
+ assertEquals(-1, in.read());
+ }
+ }
+ }
}
*/
private int inCoreLimit;
+ /** Initial size of block list. */
+ private int initialBlocks;
+
/** If {@link #inCoreLimit} has been reached, remainder goes here. */
private OutputStream overflow;
*
* @param limit
* maximum number of bytes to store in memory before entering the
- * overflow output path.
+ * overflow output path; also used as the estimated size.
*/
protected TemporaryBuffer(final int limit) {
- inCoreLimit = limit;
+ this(limit, limit);
+ }
+
+ /**
+ * Create a new empty temporary buffer.
+ *
+ * @param estimatedSize
+ * estimated size of storage used, to size the initial list of
+ * block pointers.
+ * @param limit
+ * maximum number of bytes to store in memory before entering the
+ * overflow output path.
+ * @since 4.0
+ */
+ protected TemporaryBuffer(final int estimatedSize, final int limit) {
+ if (estimatedSize > limit)
+ throw new IllegalArgumentException();
+ this.inCoreLimit = limit;
+ this.initialBlocks = (estimatedSize - 1) / Block.SZ + 1;
reset();
}
blocks = new ArrayList<Block>(1);
blocks.add(new Block(inCoreLimit));
} else {
- blocks = new ArrayList<Block>(inCoreLimit / Block.SZ);
+ blocks = new ArrayList<Block>(initialBlocks);
blocks.add(new Block());
}
}
* Create a new heap buffer with a maximum storage limit.
*
* @param limit
+ * maximum number of bytes that can be stored in this buffer;
+ * also used as the estimated size. Storing beyond this many
+ * will cause an IOException to be thrown during write.
+ */
+ public Heap(final int limit) {
+ super(limit);
+ }
+
+ /**
+ * Create a new heap buffer with a maximum storage limit.
+ *
+ * @param estimatedSize
+ * estimated size of storage used, to size the initial list of
+ * block pointers.
+ * @param limit
* maximum number of bytes that can be stored in this buffer.
* Storing beyond this many will cause an IOException to be
* thrown during write.
+ * @since 4.0
*/
- public Heap(final int limit) {
- super(limit);
+ public Heap(final int estimatedSize, final int limit) {
+ super(estimatedSize, limit);
}
@Override