You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/09/08 18:39:34 UTC
[17/55] [abbrv] olingo-odata4 git commit: [OLINGO-659] Add CSB tests
[OLINGO-659] Add CSB tests
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/2a718c17
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/2a718c17
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/2a718c17
Branch: refs/heads/OLINGO-562_SpringExtension
Commit: 2a718c172b314a593d3d7c7df653bb15f777d2d5
Parents: d414dfb
Author: mibo <mi...@apache.org>
Authored: Mon Aug 31 13:04:50 2015 +0200
Committer: mibo <mi...@apache.org>
Committed: Mon Aug 31 14:36:01 2015 +0200
----------------------------------------------------------------------
.../serializer/utils/CircleStreamBuffer.java | 44 +--
.../utils/CircleStreamBufferTest.java | 310 +++++++++++++++++++
2 files changed, 335 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a718c17/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBuffer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBuffer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBuffer.java
index 8a450d8..20d9ca5 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBuffer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBuffer.java
@@ -47,8 +47,8 @@ public class CircleStreamBuffer {
private Queue<ByteBuffer> bufferQueue = new LinkedBlockingQueue<ByteBuffer>();
private ByteBuffer currentWriteBuffer;
- private InternalInputStream inStream;
- private InternalOutputStream outStream;
+ private final InternalInputStream inStream;
+ private final InternalOutputStream outStream;
/**
* Creates a {@link CircleStreamBuffer} with default buffer size.
@@ -58,12 +58,12 @@ public class CircleStreamBuffer {
}
/**
- * Create a {@link CircleStreamBuffer} with given buffer size in bytes.
+ * Create a {@link CircleStreamBuffer} with given initial buffer size.
*
- * @param bufferSize
+ * @param initialCapacity initial capacity of internal buffer
*/
- public CircleStreamBuffer(final int bufferSize) {
- currentAllocateCapacity = bufferSize;
+ public CircleStreamBuffer(final int initialCapacity) {
+ currentAllocateCapacity = initialCapacity;
createNewWriteBuffer();
inStream = new InternalInputStream(this);
outStream = new InternalOutputStream(this);
@@ -244,21 +244,27 @@ public class CircleStreamBuffer {
}
/**
+ * Allocate a new buffer with requested capacity
*
- * @param requestedCapacity
+ * @param requestedCapacity minimal capacity of new buffer
* @return the buffer
*/
private ByteBuffer allocateBuffer(final int requestedCapacity) {
- int allocateCapacity = requestedCapacity;
- if (allocateCapacity < currentAllocateCapacity) {
- allocateCapacity = currentAllocateCapacity * NEW_BUFFER_RESIZE_FACTOR;
+ if (requestedCapacity > MAX_CAPACITY) {
+ currentAllocateCapacity = MAX_CAPACITY;
+ return ByteBuffer.allocate(requestedCapacity);
}
- if (allocateCapacity > MAX_CAPACITY) {
- allocateCapacity = MAX_CAPACITY;
+
+ if (requestedCapacity <= currentAllocateCapacity) {
+ currentAllocateCapacity *= NEW_BUFFER_RESIZE_FACTOR;
+ if (currentAllocateCapacity > MAX_CAPACITY) {
+ currentAllocateCapacity = MAX_CAPACITY;
+ }
+ } else {
+ currentAllocateCapacity = requestedCapacity;
}
- // update current
- currentAllocateCapacity = allocateCapacity;
- return ByteBuffer.allocate(allocateCapacity);
+
+ return ByteBuffer.allocate(currentAllocateCapacity);
}
// #############################################
@@ -289,8 +295,8 @@ public class CircleStreamBuffer {
}
@Override
- public int read(final byte[] b, final int off, final int len) throws IOException {
- return inBuffer.read(b, off, len);
+ public int read(final byte[] buffer, final int off, final int len) throws IOException {
+ return inBuffer.read(buffer, off, len);
}
@Override
@@ -315,8 +321,8 @@ public class CircleStreamBuffer {
}
@Override
- public void write(final byte[] b, final int off, final int len) throws IOException {
- outBuffer.write(b, off, len);
+ public void write(final byte[] buffer, final int off, final int len) throws IOException {
+ outBuffer.write(buffer, off, len);
}
@Override
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a718c17/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBufferTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBufferTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBufferTest.java
new file mode 100644
index 0000000..9ac2c81
--- /dev/null
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/utils/CircleStreamBufferTest.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.olingo.server.core.serializer.utils;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+
+import org.junit.Test;
+
+/**
+ *
+ */
+public class CircleStreamBufferTest {
+
+ private static final Charset DEFAULT_CHARSET = Charset.forName("utf-8");
+
+ @Test
+ public void testSimpleWriteReadSignBySign() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream write = csb.getOutputStream();
+ byte[] writeData = "Test".getBytes(DEFAULT_CHARSET);
+ for (byte element : writeData) {
+ write.write(element);
+ }
+
+ InputStream inStream = csb.getInputStream();
+ byte[] buffer = new byte[4];
+ for (int i = 0; i < buffer.length; i++) {
+ buffer[i] = (byte) inStream.read();
+ }
+
+ String result = new String(buffer, DEFAULT_CHARSET);
+
+ assertEquals("Test", result);
+ }
+
+ @Test
+ public void testSimpleWriteReadSignBySignMoreThenBufferSize() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer(128);
+
+ OutputStream write = csb.getOutputStream();
+ int signs = 1024;
+ String testData = createTestString(signs);
+ byte[] writeData = testData.getBytes(DEFAULT_CHARSET);
+ for (byte element : writeData) {
+ write.write(element);
+ }
+
+ InputStream inStream = csb.getInputStream();
+ byte[] buffer = new byte[signs];
+ for (int i = 0; i < buffer.length; i++) {
+ buffer[i] = (byte) inStream.read();
+ }
+
+ String result = new String(buffer, DEFAULT_CHARSET);
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteReadOnce() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream write = csb.getOutputStream();
+ write.write("Test".getBytes(DEFAULT_CHARSET), 0, 4);
+
+ InputStream inStream = csb.getInputStream();
+
+ String result = readFrom(inStream);
+ assertEquals(4, result.length());
+ assertEquals("Test", result);
+ }
+
+ @Test
+ public void testSimpleWriteReadTwice() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+
+ // first writeInternal/read cycle
+ outStream.write("Test_1".getBytes(DEFAULT_CHARSET));
+ String firstResult = readFrom(inStream);
+ assertEquals("Test_1", firstResult);
+
+ // second writeInternal/read cycle
+ outStream.write("Test_2".getBytes(DEFAULT_CHARSET));
+ String secondResult = readFrom(inStream);
+ assertEquals("Test_2", secondResult);
+ }
+
+ @Test
+ public void testSimpleWriteReadOnce8k() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = 8192;
+
+ String testData = createTestString(signs);
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream);
+
+ assertEquals(signs, result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteExactOneCharacterMoreThenBufferSize() throws Exception {
+ int bufferSize = 4096;
+ CircleStreamBuffer csb = new CircleStreamBuffer(bufferSize);
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = bufferSize + 1;
+
+ String testData = createTestString(signs);
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream, bufferSize * 2);
+
+ assertEquals(signs, result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteReadOneCharacterMoreThenBufferSize() throws Exception {
+ int bufferSize = 4096;
+ CircleStreamBuffer csb = new CircleStreamBuffer(bufferSize);
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+
+ int signs = (1 + bufferSize) * 3;
+ String testData = createTestString(signs);
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream);
+
+ assertEquals(signs, result.length());
+ assertEquals(testData, result);
+ }
+
+
+ @Test
+ public void testSimpleWriteMoreThenDefaultBufferSize() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = 70110;
+
+ String testData = createTestString(signs);
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream);
+
+ assertEquals(signs, result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteMoreThenBufferSize() throws Exception {
+ int bufferSize = 4096;
+ CircleStreamBuffer csb = new CircleStreamBuffer(bufferSize);
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = bufferSize * 10;
+
+ String testData = createTestString(signs);
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream, bufferSize * 2);
+
+ assertEquals(signs, result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteMoreThenBufferSizeAndUmlauts() throws Exception {
+ int bufferSize = 4096;
+ CircleStreamBuffer csb = new CircleStreamBuffer(bufferSize);
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = bufferSize * 10;
+
+ String testData = createTestString(signs);
+ testData = "äüöÄÜÖ" + testData + "äüöÄÜÖ";
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream);
+
+ assertEquals(testData.length(), result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteMoreThenBufferSizeAndUmlautsIso() throws Exception {
+ int bufferSize = 4096;
+ CircleStreamBuffer csb = new CircleStreamBuffer(bufferSize);
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = bufferSize * 10;
+
+ String testData = createTestString(signs);
+ testData = "äüöÄÜÖ" + testData + "äüöÄÜÖ";
+ outStream.write(testData.getBytes("iso-8859-1"));
+ String result = readFrom(inStream, "iso-8859-1");
+
+ assertEquals(testData.length(), result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test
+ public void testSimpleWriteALotMoreThenBufferSize() throws Exception {
+ int bufferSize = 4096;
+ CircleStreamBuffer csb = new CircleStreamBuffer(bufferSize);
+
+ OutputStream outStream = csb.getOutputStream();
+ InputStream inStream = csb.getInputStream();
+ final int signs = bufferSize * 100;
+
+ String testData = createTestString(signs);
+ outStream.write(testData.getBytes(DEFAULT_CHARSET));
+ String result = readFrom(inStream, bufferSize * 2);
+
+ assertEquals(signs, result.length());
+ assertEquals(testData, result);
+ }
+
+ @Test(expected = IOException.class)
+ public void testCloseInputStream() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream write = csb.getOutputStream();
+ write.write("Test".getBytes(DEFAULT_CHARSET), 0, 4);
+
+ InputStream inStream = csb.getInputStream();
+ inStream.close();
+ byte[] buffer = new byte[4];
+ int count = inStream.read(buffer);
+ assertEquals(4, count);
+ }
+
+ @Test(expected = IOException.class)
+ public void testCloseOutputStream() throws Exception {
+ CircleStreamBuffer csb = new CircleStreamBuffer();
+
+ OutputStream write = csb.getOutputStream();
+ write.close();
+ write.write("Test".getBytes(DEFAULT_CHARSET), 0, 4);
+ }
+
+ // ###################################################
+ // #
+ // # Below here are test helper methods
+ // #
+ // ###################################################
+
+ private String readFrom(final InputStream stream) throws IOException {
+ return readFrom(stream, DEFAULT_CHARSET, 128);
+ }
+
+ private String readFrom(final InputStream stream, final String charset) throws IOException {
+ return readFrom(stream, Charset.forName(charset), 128);
+ }
+
+ private String readFrom(final InputStream stream, final int bufferSize) throws IOException {
+ return readFrom(stream, DEFAULT_CHARSET, bufferSize);
+ }
+
+ private String readFrom(final InputStream stream, final Charset charset, final int bufferSize) throws IOException {
+ StringBuilder b = new StringBuilder();
+ int count;
+ byte[] buffer = new byte[bufferSize];
+ while ((count = stream.read(buffer)) >= 0) {
+ b.append(new String(buffer, 0, count, charset));
+ }
+ return b.toString();
+ }
+
+ private String createTestString(final int signs) {
+ StringBuilder b = new StringBuilder();
+
+ for (int i = 0; i < signs; i++) {
+ int sign = (int) (32 + (Math.random() * 90));
+ b.append((char) sign);
+ }
+
+ return b.toString();
+ }
+}