Repository: olingo-odata2 Updated Branches: refs/heads/master 14c534ee3 -> 2186daa31
[OLINGO-521] BatchResponseWriterTests and BatchRequestWriterTests improved Signed-off-by: Christian Amend <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/2186daa3 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/2186daa3 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/2186daa3 Branch: refs/heads/master Commit: 2186daa3164d714f8c01129bb76f80e80b81ab6d Parents: 14c534e Author: Christian Holzer <[email protected]> Authored: Mon Dec 15 15:28:10 2014 +0100 Committer: Christian Amend <[email protected]> Committed: Tue Dec 16 16:13:19 2014 +0100 ---------------------------------------------------------------------- .../odata2/core/batch/BatchRequestWriter.java | 3 +- .../odata2/core/batch/BatchRequestTest.java | 8 +- .../core/batch/BatchRequestWriterTest.java | 214 +++++++++++++------ .../core/batch/BatchResponseParserTest.java | 63 ++++++ .../core/batch/BatchResponseWriterTest.java | 128 +++++++---- 5 files changed, 304 insertions(+), 112 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2186daa3/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java index 9ec21cd..85242c6 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchRequestWriter.java @@ -59,7 +59,6 @@ public class BatchRequestWriter { request.getContentId()); } - writer.append(CRLF); // CRLF belongs to the boundary delimiter or boundary closing delimiter } writer.append("--").append(boundary).append("--"); InputStream batchRequestBody; @@ -109,6 +108,8 @@ public class BatchRequestWriter { if (body != null && !body.isEmpty()) { writer.append(body); + } else { + writer.append(CRLF); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2186daa3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java index f526920..7898a2c 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java @@ -101,7 +101,7 @@ public class BatchRequestTest { headers.put("content-type", "application/json"); BatchChangeSetPart request = BatchChangeSetPart.method(PUT) .uri("Employees('2')") - .body("{\"Ãâþ÷Ãâ¬Ã°Ã�Ãâ\":40}") + .body("{\"ÐозÑаÑÑ\":40}") .headers(headers) .contentId("111") .build(); @@ -121,8 +121,8 @@ public class BatchRequestTest { assertTrue(requestBody.contains("--batch_")); assertTrue(requestBody.contains("--changeset_")); assertTrue(requestBody.contains("PUT Employees('2') HTTP/1.1")); - assertTrue(requestBody.contains("{\"Ãâþ÷Ãâ¬Ã°Ã�Ãâ\":40}")); - assertEquals(16, batchRequestStream.linesCount()); + assertTrue(requestBody.contains("{\"ÐозÑаÑÑ\":40}")); + assertEquals(15, batchRequestStream.linesCount()); String contentType = "multipart/mixed; boundary=" + BOUNDARY; BatchParser parser = new BatchParser(contentType, parseProperties, true); @@ -162,7 +162,7 @@ public class BatchRequestTest { assertTrue(requestBody.contains("GET Employees HTTP/1.1")); assertTrue(requestBody.contains("POST Employees HTTP/1.1")); assertTrue(requestBody.contains(body)); - assertEquals(25, batchRequestStream.linesCount()); + assertEquals(24, batchRequestStream.linesCount()); String contentType = "multipart/mixed; boundary=" + BOUNDARY; BatchParser parser = new BatchParser(contentType, parseProperties, true); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2186daa3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java index e8f7cd4..395c2b8 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java @@ -19,7 +19,6 @@ package org.apache.olingo.odata2.core.batch; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -37,7 +36,6 @@ import org.apache.olingo.odata2.api.client.batch.BatchPart; import org.apache.olingo.odata2.api.client.batch.BatchQueryPart; import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings; import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings.Line; -import org.apache.olingo.odata2.testutil.helper.StringHelper; import org.junit.Test; public class BatchRequestWriterTest { @@ -48,11 +46,6 @@ public class BatchRequestWriterTest { private static final String BOUNDARY = "batch_123"; private static final Object CRLF = "\r\n"; - private void checkMimeHeaders(final String requestBody) { - assertTrue(requestBody.contains("Content-Type: application/http")); - assertTrue(requestBody.contains("Content-Transfer-Encoding: binary")); - } - @Test public void testBatchQueryPart() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>(); @@ -63,15 +56,22 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); - - String requestBody = StringHelper.toStream(batchRequest).asString(); - assertNotNull(batchRequest); - checkMimeHeaders(requestBody); - - assertTrue(requestBody.contains("--batch_")); - assertTrue(requestBody.contains("GET Employees HTTP/1.1")); - checkHeaders(headers, requestBody); - assertEquals(9, StringHelper.countLines(requestBody)); + + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Accept: application/json" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -81,7 +81,7 @@ public class BatchRequestWriterTest { headers.put("content-type", "application/json"); BatchChangeSetPart request = BatchChangeSetPart.method(PUT) .uri("Employees('2')") - .body("{\"ÐозÑаÑÑ\":40}") + .body("{\"Age\":40}") .headers(headers) .contentId("111") .build(); @@ -92,15 +92,27 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); - String requestBody = StringHelper.inputStreamToString(batchRequest, true); - assertNotNull(batchRequest); - checkMimeHeaders(requestBody); - checkHeaders(headers, requestBody); - - assertTrue(requestBody.contains("--batch_")); - assertTrue(requestBody.contains("--changeset_")); - assertTrue(requestBody.contains("PUT Employees('2') HTTP/1.1")); - assertTrue(requestBody.contains("{\"ÐозÑаÑÑ\":40}")); + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: 111" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("PUT Employees('2') HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 10" + CRLF, lines.get(index++).toString()); + assertEquals("content-type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("{\"Age\":40}" + CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -126,15 +138,37 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); - String requestBody = StringHelper.inputStreamToString(batchRequest, true); - assertNotNull(batchRequest); - checkMimeHeaders(requestBody); - - checkHeaders(headers, requestBody); - checkHeaders(changeSetHeaders, requestBody); - assertTrue(requestBody.contains("GET Employees HTTP/1.1")); - assertTrue(requestBody.contains("POST Employees HTTP/1.1")); - assertTrue(requestBody.contains(body)); + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: 000" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Accept: application/json" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: 111" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("POST Employees HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 68" + CRLF, lines.get(index++).toString()); + assertEquals("content-type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(body + CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -150,12 +184,12 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); - + BufferedReaderIncludingLineEndings reader = new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); List<Line> lines = reader.toList(); reader.close(); - + int line = 0; assertEquals("--" + BOUNDARY + CRLF, lines.get(line++).toString()); assertEquals("Content-Type: application/http" + CRLF, lines.get(line++).toString()); @@ -164,9 +198,9 @@ public class BatchRequestWriterTest { assertEquals(CRLF, lines.get(line++).toString()); assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(line++).toString()); assertEquals("Accept: application/json" + CRLF, lines.get(line++).toString()); - assertEquals(CRLF, lines.get(line++).toString()); // Belongs to the GET request [OData Protocol - 2.2.7.2.1] - - assertEquals(CRLF, lines.get(line++).toString()); // Belongs conceptually to the boundary [RFC 2046 - 5.1.1] + assertEquals(CRLF, lines.get(line++).toString()); // Belongs to the GET request [OData Protocol - 2.2.7.2.1] + + assertEquals(CRLF, lines.get(line++).toString()); // Belongs conceptually to the boundary [RFC 2046 - 5.1.1] assertEquals("--" + BOUNDARY + CRLF, lines.get(line++).toString()); assertEquals("Content-Type: application/http" + CRLF, lines.get(line++).toString()); assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(line++).toString()); @@ -174,9 +208,9 @@ public class BatchRequestWriterTest { assertEquals(CRLF, lines.get(line++).toString()); assertEquals("GET Employees HTTP/1.1" + CRLF, lines.get(line++).toString()); assertEquals("Accept: application/json" + CRLF, lines.get(line++).toString()); - assertEquals(CRLF, lines.get(line++).toString()); // Belongs to the GET request [OData Protocol - 2.2.7.2.1] - - assertEquals(CRLF, lines.get(line++).toString()); // Belongs conceptually to the boundary [RFC 2046 - 5.1.1] + assertEquals(CRLF, lines.get(line++).toString()); // Belongs to the GET request [OData Protocol - 2.2.7.2.1] + + assertEquals(CRLF, lines.get(line++).toString()); // Belongs conceptually to the boundary [RFC 2046 - 5.1.1] assertEquals("--" + BOUNDARY + "--", lines.get(line++).toString()); assertEquals(19, lines.size()); } @@ -200,7 +234,7 @@ public class BatchRequestWriterTest { changeSetHeaders = new HashMap<String, String>(); changeSetHeaders.put("content-type", "application/json;odata=verbose"); BatchChangeSetPart changeRequest2 = BatchChangeSetPart.method(PUT) - .uri("$/ManagerId") + .uri("$1/ManagerId") .body("{\"ManagerId\":1}") .headers(changeSetHeaders) .contentId("2") @@ -211,16 +245,39 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); - String requestBody = StringHelper.inputStreamToString(batchRequest); - assertNotNull(batchRequest); - checkMimeHeaders(requestBody); - - assertTrue(requestBody.contains("POST Employees('2') HTTP/1.1")); - assertTrue(requestBody.contains("PUT $/ManagerId HTTP/1.1")); - assertTrue(requestBody.contains(BatchHelper.HTTP_CONTENT_ID + ": 1")); - assertTrue(requestBody.contains(BatchHelper.HTTP_CONTENT_ID + ": 2")); - assertTrue(requestBody.contains(body)); + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: 1" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("POST Employees('2') HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 68" + CRLF, lines.get(index++).toString()); + assertEquals("content-type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(body + CRLF, lines.get(index++).toString()); + + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: 2" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("PUT $1/ManagerId HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 15" + CRLF, lines.get(index++).toString()); + assertEquals("content-type: application/json;odata=verbose" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("{\"ManagerId\":1}" + CRLF, lines.get(index++).toString()); + + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -254,22 +311,43 @@ public class BatchRequestWriterTest { BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); + + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(batchRequest)); + List<Line> lines = reader.toList(); + reader.close(); - String requestBody = StringHelper.inputStreamToString(batchRequest); - assertNotNull(batchRequest); - checkMimeHeaders(requestBody); - - assertTrue(requestBody.contains("POST Employees HTTP/1.1")); - assertTrue(requestBody.contains("PUT Employees('2')/ManagerId HTTP/1.1")); - - assertTrue(requestBody.contains(body)); - - } - - private void checkHeaders(final Map<String, String> headers, final String requestBody) { - for (Map.Entry<String, String> header : headers.entrySet()) { - assertTrue(requestBody.contains(header.getKey() + ": " + header.getValue())); - } + int index = 0; + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("POST Employees HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 68" + CRLF, lines.get(index++).toString()); + assertEquals("content-type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals("content-Id: 111" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(body + CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("PUT Employees('2')/ManagerId HTTP/1.1" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 15" + CRLF, lines.get(index++).toString()); + assertEquals("content-type: application/json;odata=verbose" + CRLF, lines.get(index++).toString()); + assertEquals("content-Id: 222" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("{\"ManagerId\":1}" + CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test(expected = IllegalArgumentException.class) http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2186daa3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java index e107db5..dacdb5a 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseParserTest.java @@ -170,7 +170,70 @@ public class BatchResponseParserTest { assertEquals("1", response.getContentId()); } } + + @Test + public void testResponseChangeSetBodyWithoutCRLF() throws BatchException { + String putResponse = "--batch_123" + CRLF + + "Content-Type: " + HttpContentType.MULTIPART_MIXED + ";boundary=changeset_12ks93js84d" + CRLF + + CRLF + + "--changeset_12ks93js84d" + CRLF + + "Content-Type: application/http" + CRLF + + "Content-Transfer-Encoding: binary" + CRLF + + "Content-ID: 1" + CRLF + + CRLF + + "HTTP/1.1 200 Ok" + CRLF + + "DataServiceVersion: 2.0" + CRLF + + "Content-Length: 19" + CRLF + + CRLF + + "TestBodyWithoutCRLF" + CRLF + + "--changeset_12ks93js84d--" + CRLF + + CRLF + + "--batch_123--"; + + InputStream in = new ByteArrayInputStream(putResponse.getBytes()); + BatchParser parser = new BatchParser("multipart/mixed;boundary=batch_123", true); + List<BatchSingleResponse> responses = parser.parseBatchResponse(in); + for (BatchSingleResponse response : responses) { + assertEquals("200", response.getStatusCode()); + assertEquals("Ok", response.getStatusInfo()); + assertEquals("19", response.getHeader(HttpHeaders.CONTENT_LENGTH)); + assertEquals("TestBodyWithoutCRLF", response.getBody()); + assertEquals("1", response.getContentId()); + } + } + + @Test + public void testResponseChangeSetBodyWithCRLF() throws BatchException { + String putResponse = "--batch_123" + CRLF + + "Content-Type: " + HttpContentType.MULTIPART_MIXED + ";boundary=changeset_12ks93js84d" + CRLF + + CRLF + + "--changeset_12ks93js84d" + CRLF + + "Content-Type: application/http" + CRLF + + "Content-Transfer-Encoding: binary" + CRLF + + "Content-ID: 1" + CRLF + + CRLF + + "HTTP/1.1 200 Ok" + CRLF + + "DataServiceVersion: 2.0" + CRLF + + "Content-Length: 18" + CRLF + + CRLF + + "TestBodyWithCRLF" + CRLF + + CRLF + + "--changeset_12ks93js84d--" + CRLF + + CRLF + + "--batch_123--"; + InputStream in = new ByteArrayInputStream(putResponse.getBytes()); + BatchParser parser = new BatchParser("multipart/mixed;boundary=batch_123", true); + List<BatchSingleResponse> responses = parser.parseBatchResponse(in); + for (BatchSingleResponse response : responses) { + assertEquals("200", response.getStatusCode()); + assertEquals("Ok", response.getStatusInfo()); + assertEquals("18", response.getHeader(HttpHeaders.CONTENT_LENGTH)); + assertEquals("TestBodyWithCRLF" + CRLF, response.getBody()); + assertEquals("1", response.getContentId()); + } + } + @Test public void testResponseToChangeSetNoContentButContentLength() throws BatchException { String putResponse = http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/2186daa3/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java index cc58159..ecc5e93 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterTest.java @@ -19,11 +19,12 @@ package org.apache.olingo.odata2.core.batch; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; @@ -31,10 +32,14 @@ import org.apache.olingo.odata2.api.batch.BatchException; import org.apache.olingo.odata2.api.batch.BatchResponsePart; import org.apache.olingo.odata2.api.commons.HttpStatusCodes; import org.apache.olingo.odata2.api.processor.ODataResponse; +import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings; +import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings.Line; import org.junit.Test; public class BatchResponseWriterTest { + private static final String CRLF = "\r\n"; + @Test public void testBatchResponse() throws BatchException, IOException { List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>(); @@ -57,16 +62,35 @@ public class BatchResponseWriterTest { assertEquals(202, batchResponse.getStatus().getStatusCode()); assertNotNull(batchResponse.getEntity()); String body = (String) batchResponse.getEntity(); - - assertTrue(body.contains("--batch")); - assertTrue(body.contains("--changeset")); - assertTrue(body.contains("HTTP/1.1 200 OK")); - assertTrue(body.contains("Content-Type: application/http")); - assertTrue(body.contains("Content-Transfer-Encoding: binary")); - assertTrue(body.contains("Walter Winter")); - assertTrue(body.contains("multipart/mixed; boundary=changeset")); - assertTrue(body.contains("HTTP/1.1 204 No Content")); + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(new ByteArrayInputStream(body.getBytes()))); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("HTTP/1.1 200 OK" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 13" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("Walter Winter" + CRLF, lines.get(index++).toString()); + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("HTTP/1.1 204 No Content" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -83,15 +107,23 @@ public class BatchResponseWriterTest { assertEquals(202, batchResponse.getStatus().getStatusCode()); assertNotNull(batchResponse.getEntity()); String body = (String) batchResponse.getEntity(); - - assertTrue(body.contains("--batch")); - assertFalse(body.contains("--changeset")); - assertTrue(body.contains("HTTP/1.1 200 OK" + "\r\n")); - assertTrue(body.contains("Content-Type: application/http" + "\r\n")); - assertTrue(body.contains("Content-Transfer-Encoding: binary" + "\r\n")); - assertTrue(body.contains("Walter Winter")); - assertFalse(body.contains("multipart/mixed; boundary=changeset")); - + + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(new ByteArrayInputStream(body.getBytes()))); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("HTTP/1.1 200 OK" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 13" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("Walter Winter" + CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -108,15 +140,25 @@ public class BatchResponseWriterTest { assertEquals(202, batchResponse.getStatus().getStatusCode()); assertNotNull(batchResponse.getEntity()); String body = (String) batchResponse.getEntity(); - assertTrue(body.contains("--batch")); - assertTrue(body.contains("--changeset")); - assertTrue(body.indexOf("--changeset") != body.lastIndexOf("--changeset")); - assertFalse(body.contains("HTTP/1.1 200 OK" + "\r\n")); - assertTrue(body.contains("Content-Type: application/http" + "\r\n")); - assertTrue(body.contains("Content-Transfer-Encoding: binary" + "\r\n")); - assertTrue(body.contains("HTTP/1.1 204 No Content" + "\r\n")); - assertTrue(body.contains("Content-Type: multipart/mixed; boundary=changeset")); - + + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(new ByteArrayInputStream(body.getBytes()))); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertTrue(lines.get(index++).toString().startsWith("Content-Type: multipart/mixed; boundary=changeset_")); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("HTTP/1.1 204 No Content" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--changeset")); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } @Test @@ -137,17 +179,25 @@ public class BatchResponseWriterTest { assertEquals(202, batchResponse.getStatus().getStatusCode()); assertNotNull(batchResponse.getEntity()); String body = (String) batchResponse.getEntity(); - - String mimeHeader = "Content-Type: application/http" + "\r\n" - + "Content-Transfer-Encoding: binary" + "\r\n" - + "Content-Id: mimeHeaderContentId123" + "\r\n"; - - String requestHeader = "Content-Id: requestHeaderContentId123" + "\r\n" - + "Content-Type: application/json" + "\r\n" - + "Content-Length: 13" + "\r\n"; - - assertTrue(body.contains(mimeHeader)); - assertTrue(body.contains(requestHeader)); + + BufferedReaderIncludingLineEndings reader = + new BufferedReaderIncludingLineEndings(new InputStreamReader(new ByteArrayInputStream(body.getBytes()))); + List<Line> lines = reader.toList(); + reader.close(); + int index = 0; + + assertTrue(lines.get(index++).toString().startsWith("--batch")); + assertEquals("Content-Type: application/http" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Transfer-Encoding: binary" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: mimeHeaderContentId123" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("HTTP/1.1 200 OK" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Id: requestHeaderContentId123" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Type: application/json" + CRLF, lines.get(index++).toString()); + assertEquals("Content-Length: 13" + CRLF, lines.get(index++).toString()); + assertEquals(CRLF, lines.get(index++).toString()); + assertEquals("Walter Winter" + CRLF, lines.get(index++).toString()); + assertTrue(lines.get(index++).toString().startsWith("--batch")); } }
