You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/12/15 14:57:06 UTC
olingo-odata2 git commit: [OLINGO-521] Fix BatchResponseWriter
Repository: olingo-odata2
Updated Branches:
refs/heads/master 4bab6aab0 -> 14c534ee3
[OLINGO-521] Fix BatchResponseWriter
Signed-off-by: Christian Amend <ch...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/14c534ee
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/14c534ee
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/14c534ee
Branch: refs/heads/master
Commit: 14c534ee3bc265f6a9bc5b32ca87ad199371d627
Parents: 4bab6aa
Author: Christian Holzer <c....@sap.com>
Authored: Thu Dec 11 14:27:36 2014 +0100
Committer: Christian Amend <ch...@apache.org>
Committed: Mon Dec 15 14:55:08 2014 +0100
----------------------------------------------------------------------
.../odata2/core/batch/BatchResponseWriter.java | 31 +--
.../core/batch/BatchRequestWriterITTest.java | 243 +++++++++++++++++++
.../core/batch/BatchResponseParserTest.java | 57 ++++-
.../odata2/core/batch/BatchResponseTest.java | 2 +-
.../core/batch/BatchResponseWriterITTest.java | 179 ++++++++++++++
5 files changed, 496 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14c534ee/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
index be189d3..3840cdf 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/batch/BatchResponseWriter.java
@@ -33,7 +33,7 @@ import org.apache.olingo.odata2.api.processor.ODataResponse;
public class BatchResponseWriter {
private static final String COLON = ":";
private static final String SP = " ";
- private static final String LF = "\r\n";
+ private static final String CRLF = "\r\n";
private ResponseWriter writer = new ResponseWriter();
public ODataResponse writeResponse(final List<BatchResponsePart> batchResponseParts) throws BatchException {
@@ -49,18 +49,18 @@ public class BatchResponseWriter {
private void appendChangeSet(final BatchResponsePart batchResponsePart) throws BatchException {
String boundary = BatchHelper.generateBoundary("changeset");
writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP)
- .append("multipart/mixed; boundary=" + boundary).append(LF).append(LF);
+ .append("multipart/mixed; boundary=" + boundary).append(CRLF).append(CRLF);
for (ODataResponse response : batchResponsePart.getResponses()) {
- writer.append("--").append(boundary).append(LF);
+ writer.append("--").append(boundary).append(CRLF);
appendResponsePartBody(response);
}
- writer.append("--").append(boundary).append("--").append(LF).append(LF);
+ writer.append("--").append(boundary).append("--").append(CRLF);
}
private void appendResponsePart(final List<BatchResponsePart> batchResponseParts, final String boundary)
throws BatchException {
for (BatchResponsePart batchResponsePart : batchResponseParts) {
- writer.append("--").append(boundary).append(LF);
+ writer.append("--").append(boundary).append(CRLF);
if (batchResponsePart.isChangeSet()) {
appendChangeSet(batchResponsePart);
} else {
@@ -73,16 +73,16 @@ public class BatchResponseWriter {
private void appendResponsePartBody(final ODataResponse response) throws BatchException {
writer.append(HttpHeaders.CONTENT_TYPE).append(COLON).append(SP)
- .append(HttpContentType.APPLICATION_HTTP).append(LF);
+ .append(HttpContentType.APPLICATION_HTTP).append(CRLF);
writer.append(BatchHelper.HTTP_CONTENT_TRANSFER_ENCODING).append(COLON).append(SP)
- .append(BatchHelper.BINARY_ENCODING).append(LF);
+ .append(BatchHelper.BINARY_ENCODING).append(CRLF);
if (response.getHeader(BatchHelper.MIME_HEADER_CONTENT_ID) != null) {
writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP)
- .append(response.getHeader(BatchHelper.MIME_HEADER_CONTENT_ID)).append(LF);
+ .append(response.getHeader(BatchHelper.MIME_HEADER_CONTENT_ID)).append(CRLF);
}
- writer.append(LF);
+ writer.append(CRLF);
writer.append("HTTP/1.1").append(SP).append(String.valueOf(response.getStatus().getStatusCode())).append(SP)
- .append(response.getStatus().getInfo()).append(LF);
+ .append(response.getStatus().getInfo()).append(CRLF);
appendHeader(response);
if (!HttpStatusCodes.NO_CONTENT.equals(response.getStatus())) {
String body;
@@ -93,20 +93,23 @@ public class BatchResponseWriter {
body = response.getEntity().toString();
}
writer.append(HttpHeaders.CONTENT_LENGTH).append(COLON).append(SP)
- .append(String.valueOf(BatchHelper.getBytes(body).length)).append(LF).append(LF);
+ .append(String.valueOf(BatchHelper.getBytes(body).length)).append(CRLF).append(CRLF);
writer.append(body);
+ } else {
+ // No header if status code equals to 204 (No content)
+ writer.append(CRLF);
}
- writer.append(LF).append(LF);
+ writer.append(CRLF);
}
private void appendHeader(final ODataResponse response) {
for (String name : response.getHeaderNames()) {
if (!BatchHelper.MIME_HEADER_CONTENT_ID.equalsIgnoreCase(name)
&& !BatchHelper.REQUEST_HEADER_CONTENT_ID.equalsIgnoreCase(name)) {
- writer.append(name).append(COLON).append(SP).append(response.getHeader(name)).append(LF);
+ writer.append(name).append(COLON).append(SP).append(response.getHeader(name)).append(CRLF);
} else if (BatchHelper.REQUEST_HEADER_CONTENT_ID.equalsIgnoreCase(name)) {
writer.append(BatchHelper.HTTP_CONTENT_ID).append(COLON).append(SP)
- .append(response.getHeader(name)).append(LF);
+ .append(response.getHeader(name)).append(CRLF);
}
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14c534ee/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
new file mode 100644
index 0000000..b153596
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterITTest.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * 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.odata2.core.batch;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.olingo.odata2.api.batch.BatchException;
+import org.apache.olingo.odata2.api.batch.BatchRequestPart;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+import org.apache.olingo.odata2.api.client.batch.BatchPart;
+import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
+import org.apache.olingo.odata2.api.commons.HttpHeaders;
+import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties;
+import org.apache.olingo.odata2.api.processor.ODataRequest;
+import org.apache.olingo.odata2.core.PathInfoImpl;
+import org.apache.olingo.odata2.core.batch.v2.BatchParser;
+import org.apache.olingo.odata2.core.batch.v2.BufferedReaderIncludingLineEndings;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class BatchRequestWriterITTest {
+ private static final String POST = "POST";
+ private static final String GET = "GET";
+ private static final String BOUNDARY = "batch_123";
+ private static final String CONTENT_TYPE = "multipart/mixed ;boundary=" + BOUNDARY;
+ private static final String SERVICE_ROOT = "http://localhost/odata/";
+ private static EntityProviderBatchProperties batchProperties;
+
+ @BeforeClass
+ public static void setProperties() throws URISyntaxException {
+ PathInfoImpl pathInfo = new PathInfoImpl();
+ pathInfo.setServiceRoot(new URI(SERVICE_ROOT));
+ batchProperties = EntityProviderBatchProperties.init().pathInfo(pathInfo).build();
+ }
+
+ @Test
+ public void testQueryPart() throws Exception {
+ List<BatchPart> batch = new ArrayList<BatchPart>();
+ Map<String, String> headers = new HashMap<String, String>();
+ headers.put("Accept", "application/json");
+ BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).build();
+ batch.add(request);
+
+ BatchRequestWriter writer = new BatchRequestWriter();
+ InputStream stream = writer.writeBatchRequest(batch, BOUNDARY);
+
+ List<BatchRequestPart> parsedRequestParts = parseBatchRequest(stream);
+ assertEquals(1, parsedRequestParts.size());
+ BatchRequestPart part = parsedRequestParts.get(0);
+
+ assertFalse(part.isChangeSet());
+ assertEquals(1, part.getRequests().size());
+ ODataRequest oDataRequest = part.getRequests().get(0);
+ assertEquals("Employees", oDataRequest.getPathInfo().getODataSegments().get(0).getPath());
+ assertEquals("application/json", oDataRequest.getAcceptHeaders().get(0));
+ }
+
+ @Test
+ public void testChangeSet() throws Exception {
+ List<BatchPart> batch = new ArrayList<BatchPart>();
+ Map<String, String> headers = new HashMap<String, String>();
+ headers.put("Accept", "application/json");
+ BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).contentId("000").build();
+ batch.add(request);
+
+ Map<String, String> changeSetHeaders = new HashMap<String, String>();
+ changeSetHeaders.put("content-type", "application/json");
+ String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA";
+ BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST)
+ .uri("Employees")
+ .body(body)
+ .headers(changeSetHeaders)
+ .contentId("111")
+ .build();
+ BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
+ changeSet.add(changeRequest);
+ batch.add(changeSet);
+ BatchRequestWriter writer = new BatchRequestWriter();
+ InputStream stream = writer.writeBatchRequest(batch, BOUNDARY);
+
+ final List<BatchRequestPart> parsedRequestParts = parseBatchRequest(stream);
+ assertEquals(2, parsedRequestParts.size());
+
+ // Get Request
+ final BatchRequestPart partGet = parsedRequestParts.get(0);
+ assertFalse(partGet.isChangeSet());
+ assertEquals(1, partGet.getRequests().size());
+ final ODataRequest oDataRequestGet = partGet.getRequests().get(0);
+ assertEquals("Employees", oDataRequestGet.getPathInfo().getODataSegments().get(0).getPath());
+ assertEquals("application/json", oDataRequestGet.getAcceptHeaders().get(0));
+
+ // Change set
+ final BatchRequestPart partChangeSet = parsedRequestParts.get(1);
+ assertTrue(partChangeSet.isChangeSet());
+ assertEquals(1, partChangeSet.getRequests().size());
+ final ODataRequest oDataRequestPost = partChangeSet.getRequests().get(0);
+ assertEquals("Employees", oDataRequestGet.getPathInfo().getODataSegments().get(0).getPath());
+ assertEquals("111", oDataRequestPost.getRequestHeaderValue(BatchHelper.MIME_HEADER_CONTENT_ID));
+ assertEquals(body, streamToString(oDataRequestPost.getBody()));
+ assertEquals("application/json", oDataRequestPost.getRequestHeaderValue(HttpHeaders.CONTENT_TYPE));
+ }
+
+ @Test
+ public void testTwoChangeSets() throws Exception {
+ List<BatchPart> batch = new ArrayList<BatchPart>();
+
+ // Get request
+ Map<String, String> headers = new HashMap<String, String>();
+ headers.put("Accept", "application/json");
+ BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).contentId("000").build();
+ batch.add(request);
+
+ Map<String, String> headerPostRequest = new HashMap<String, String>();
+ headerPostRequest.put("content-type", "application/json");
+
+ // Changeset 1
+ String bodyEmployee = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA";
+ BatchChangeSetPart postRequest = BatchChangeSetPart.method(POST)
+ .uri("Employees")
+ .body(bodyEmployee)
+ .headers(headerPostRequest)
+ .contentId("111")
+ .build();
+
+ String bodyEmployee2 = "TestString\r\n";
+ BatchChangeSetPart postRequest2 = BatchChangeSetPart.method(POST)
+ .uri("Employees")
+ .body(bodyEmployee2)
+ .headers(headerPostRequest)
+ .contentId("222")
+ .build();
+ BatchChangeSet changeSet = BatchChangeSet.newBuilder().build();
+ changeSet.add(postRequest);
+ changeSet.add(postRequest2);
+ batch.add(changeSet);
+
+ // Changeset 2
+ BatchChangeSet changeSet2 = BatchChangeSet.newBuilder().build();
+ postRequest2 = BatchChangeSetPart.method(POST)
+ .uri("Employees")
+ .body(bodyEmployee2)
+ .headers(headerPostRequest)
+ .contentId("222")
+ .build();
+ changeSet2.add(postRequest2);
+ postRequest = BatchChangeSetPart.method(POST)
+ .uri("Employees")
+ .body(bodyEmployee)
+ .headers(headerPostRequest)
+ .contentId("111")
+ .build();
+ changeSet2.add(postRequest);
+ batch.add(changeSet2);
+
+ // Write requests
+ BatchRequestWriter writer = new BatchRequestWriter();
+ InputStream stream = writer.writeBatchRequest(batch, BOUNDARY);
+ // Read requests
+ final List<BatchRequestPart> parsedRequestParts = parseBatchRequest(stream);
+ assertEquals(3, parsedRequestParts.size());
+
+ // Get request
+ final BatchRequestPart partGet = parsedRequestParts.get(0);
+ assertFalse(partGet.isChangeSet());
+ assertEquals(1, partGet.getRequests().size());
+ final ODataRequest oDataRequestGet = partGet.getRequests().get(0);
+ assertEquals("Employees", oDataRequestGet.getPathInfo().getODataSegments().get(0).getPath());
+ assertEquals("application/json", oDataRequestGet.getAcceptHeaders().get(0));
+
+ // Changeset 1
+ BatchRequestPart parsedChangeSet1 = parsedRequestParts.get(1);
+ assertTrue(parsedChangeSet1.isChangeSet());
+ assertEquals(2, parsedChangeSet1.getRequests().size());
+ ODataRequest oDataRequestPost1 = parsedChangeSet1.getRequests().get(0);
+ assertEquals("111", oDataRequestPost1.getRequestHeaderValue(BatchHelper.MIME_HEADER_CONTENT_ID));
+ assertEquals(bodyEmployee, streamToString(oDataRequestPost1.getBody()));
+ assertEquals("application/json", oDataRequestPost1.getRequestHeaderValue(HttpHeaders.CONTENT_TYPE));
+
+ ODataRequest oDataRequestPost12 = parsedChangeSet1.getRequests().get(1);
+ assertEquals("222", oDataRequestPost12.getRequestHeaderValue(BatchHelper.MIME_HEADER_CONTENT_ID));
+ assertEquals(bodyEmployee2, streamToString(oDataRequestPost12.getBody()));
+ assertEquals("application/json", oDataRequestPost12.getRequestHeaderValue(HttpHeaders.CONTENT_TYPE));
+
+ // Changeset 2
+ BatchRequestPart parsedChangeSet2 = parsedRequestParts.get(2);
+ assertTrue(parsedChangeSet2.isChangeSet());
+ assertEquals(2, parsedChangeSet2.getRequests().size());
+ ODataRequest oDataRequestPost21 = parsedChangeSet2.getRequests().get(0);
+ assertEquals("222", oDataRequestPost21.getRequestHeaderValue(BatchHelper.MIME_HEADER_CONTENT_ID));
+ assertEquals(bodyEmployee2, streamToString(oDataRequestPost21.getBody()));
+ assertEquals("application/json", oDataRequestPost21.getRequestHeaderValue(HttpHeaders.CONTENT_TYPE));
+
+ ODataRequest oDataRequestPost22 = parsedChangeSet2.getRequests().get(1);
+ assertEquals("111", oDataRequestPost22.getRequestHeaderValue(BatchHelper.MIME_HEADER_CONTENT_ID));
+ assertEquals(bodyEmployee, streamToString(oDataRequestPost22.getBody()));
+ assertEquals("application/json", oDataRequestPost22.getRequestHeaderValue(HttpHeaders.CONTENT_TYPE));
+ }
+
+ private List<BatchRequestPart> parseBatchRequest(InputStream batchRequest) throws BatchException {
+ final BatchParser parser = new BatchParser(CONTENT_TYPE, batchProperties, true);
+ return parser.parseBatchRequest(batchRequest);
+ }
+
+ private String streamToString(final InputStream in) throws IOException {
+ final BufferedReaderIncludingLineEndings reader = new BufferedReaderIncludingLineEndings(new InputStreamReader(in));
+ final StringBuilder builder = new StringBuilder();
+ String line;
+
+ while ((line = reader.readLine()) != null) {
+ builder.append(line);
+ }
+
+ reader.close();
+ return builder.toString();
+ }
+}
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14c534ee/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 feaa50d..e107db5 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
@@ -64,6 +64,61 @@ public class BatchResponseParserTest {
assertEquals("text/plain;charset=utf-8", response.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("22", response.getHeaders().get("Content-length"));
assertEquals("1", response.getContentId());
+ assertEquals("Frederic Fall MODIFIED", response.getBody());
+ }
+ }
+
+ @Test
+ public void testSimpleBatchResponseWithLinebreak() throws BatchException {
+ String getResponse = "--batch_123" + 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-Type: text/plain;charset=utf-8" + CRLF
+ + "Content-length: 24" + CRLF
+ + CRLF
+ + "Frederic Fall MODIFIED" + CRLF
+ + CRLF
+ + "--batch_123--";
+
+ InputStream in = new ByteArrayInputStream(getResponse.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("text/plain;charset=utf-8", response.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+ assertEquals("24", response.getHeaders().get("Content-length"));
+ assertEquals("1", response.getContentId());
+ assertEquals("Frederic Fall MODIFIED\r\n", response.getBody());
+ }
+ }
+
+ @Test
+ public void testNoContentResponse() throws Exception {
+ String responseContent =
+ "--ejjeeffe1\r\n" +
+ "Content-Type: application/http\r\n" +
+ "Content-Length: 96\r\n" +
+ "content-transfer-encoding: binary\r\n" +
+ "\r\n" +
+ "HTTP/1.1 204 No Content\r\n" +
+ "Content-Type: text/html\r\n" +
+ "dataserviceversion: 2.0\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "--ejjeeffe1--\r\n";
+
+ InputStream in = new ByteArrayInputStream(responseContent.getBytes());
+ BatchParser parser = new BatchParser("multipart/mixed;boundary=ejjeeffe1", true);
+ List<BatchSingleResponse> responses = parser.parseBatchResponse(in);
+ for (BatchSingleResponse response : responses) {
+ assertEquals("204", response.getStatusCode());
+ assertEquals("No Content", response.getStatusInfo());
+ assertEquals("text/html", response.getHeaders().get(HttpHeaders.CONTENT_TYPE));
}
}
@@ -119,7 +174,7 @@ public class BatchResponseParserTest {
@Test
public void testResponseToChangeSetNoContentButContentLength() throws BatchException {
String putResponse =
- "--batch_123" + CRLF
+ "--batch_123" + CRLF
+ "Content-Type: " + HttpContentType.MULTIPART_MIXED + ";boundary=changeset_12ks93js84d" + CRLF
+ CRLF
+ "--changeset_12ks93js84d" + CRLF
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14c534ee/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
index 2f8b7f8..4076a25 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
@@ -140,6 +140,6 @@ public class BatchResponseTest {
StringHelper.Stream content = StringHelper.toStream(body);
List<BatchSingleResponse> result = parser.parseBatchResponse(content.asStream());
assertEquals(2, result.size());
- assertEquals("Failing content:\n" + content.asString(), 20, content.linesCount());
+ assertEquals("Failing content:\n" + content.asString(), 19, content.linesCount());
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14c534ee/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
new file mode 100644
index 0000000..df84f39
--- /dev/null
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseWriterITTest.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * 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.odata2.core.batch;
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.odata2.api.batch.BatchResponsePart;
+import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse;
+import org.apache.olingo.odata2.api.commons.HttpHeaders;
+import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
+import org.apache.olingo.odata2.api.processor.ODataResponse;
+import org.apache.olingo.odata2.core.batch.v2.BatchParser;
+import org.apache.olingo.odata2.core.commons.ContentType;
+import org.junit.Test;
+
+public class BatchResponseWriterITTest {
+
+ @Test
+ public void testSimpleRequest() throws Exception {
+ // Create batch response
+ List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+ ODataResponse response =
+ ODataResponse.entity("Walter Winter").status(HttpStatusCodes.OK).contentHeader("application/json").build();
+ List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+ responses.add(response);
+ parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
+ BatchResponseWriter writer = new BatchResponseWriter();
+ ODataResponse batchResponse = writer.writeResponse(parts);
+
+ assertEquals(202, batchResponse.getStatus().getStatusCode());
+ assertNotNull(batchResponse.getEntity());
+ String body = (String) batchResponse.getEntity();
+ // Get boundary
+ int lineEndingIndex = body.indexOf("\r\n");
+ String boundary = body.substring(2, lineEndingIndex);
+
+ // Parse response and test outputs
+ final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
+ List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
+ for (BatchSingleResponse parserResponse : parserResponses) {
+ assertEquals("200", parserResponse.getStatusCode());
+ assertEquals("OK", parserResponse.getStatusInfo());
+ assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+ assertEquals("13", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+ assertEquals("Walter Winter", parserResponse.getBody());
+ }
+ }
+
+ @Test
+ public void testNoContent() throws Exception {
+ // Create batch response
+ List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+ ODataResponse response =
+ ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
+ List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+ responses.add(response);
+ parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
+ BatchResponseWriter writer = new BatchResponseWriter();
+ ODataResponse batchResponse = writer.writeResponse(parts);
+
+ assertEquals(202, batchResponse.getStatus().getStatusCode());
+ assertNotNull(batchResponse.getEntity());
+ String body = (String) batchResponse.getEntity();
+ // Get boundary
+ int lineEndingIndex = body.indexOf("\r\n");
+ String boundary = body.substring(2, lineEndingIndex);
+
+ // Parse response and test outputs
+ final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
+ List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
+ for (BatchSingleResponse parserResponse : parserResponses) {
+ assertEquals("204", parserResponse.getStatusCode());
+ assertEquals("No Content", parserResponse.getStatusInfo());
+ }
+ }
+
+ @Test
+ public void testChangeSet() throws Exception {
+ List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
+ ODataResponse response = ODataResponse.entity("Walter Winter")
+ .status(HttpStatusCodes.OK)
+ .contentHeader("application/json")
+ .build();
+ List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
+ responses.add(response);
+ parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
+
+ ODataResponse changeSetResponse =
+ ODataResponse.status(HttpStatusCodes.NO_CONTENT).header(BatchHelper.MIME_HEADER_CONTENT_ID, "1").build();
+ responses = new ArrayList<ODataResponse>(2);
+ ODataResponse changeSetResponseEntity =
+ ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+ .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+ .entity("Test\r\n").build();
+ ODataResponse changeSetResponseEntity2 =
+ ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+ .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+ .entity("Test\n").build();
+ ODataResponse changeSetResponseEntity3 =
+ ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
+ .header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
+ .entity("Test").build();
+ responses.add(changeSetResponse);
+ responses.add(changeSetResponseEntity);
+ responses.add(changeSetResponseEntity2);
+ responses.add(changeSetResponseEntity3);
+
+ parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
+
+ BatchResponseWriter writer = new BatchResponseWriter();
+ ODataResponse batchResponse = writer.writeResponse(parts);
+
+ assertEquals(202, batchResponse.getStatus().getStatusCode());
+ assertNotNull(batchResponse.getEntity());
+ String body = (String) batchResponse.getEntity();
+
+ // Get boundary
+ int lineEndingIndex = body.indexOf("\r\n");
+ String boundary = body.substring(2, lineEndingIndex);
+
+ // Parse response and test outputs
+ final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
+ List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
+ assertEquals(5, parserResponses.size());
+
+ BatchSingleResponse parserResponse = parserResponses.get(0);
+ assertEquals("200", parserResponse.getStatusCode());
+ assertEquals("OK", parserResponse.getStatusInfo());
+ assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+ assertEquals("13", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+ assertEquals("Walter Winter", parserResponse.getBody());
+
+ parserResponse = parserResponses.get(1);
+ assertEquals("204", parserResponse.getStatusCode());
+ assertEquals("1", parserResponse.getContentId());
+ assertEquals("No Content", parserResponse.getStatusInfo());
+
+ parserResponse = parserResponses.get(2);
+ assertEquals("200", parserResponse.getStatusCode());
+ assertEquals("OK", parserResponse.getStatusInfo());
+ assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+ assertEquals("6", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+ assertEquals("Test\r\n", parserResponse.getBody());
+
+ parserResponse = parserResponses.get(3);
+ assertEquals("200", parserResponse.getStatusCode());
+ assertEquals("OK", parserResponse.getStatusInfo());
+ assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+ assertEquals("5", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+ assertEquals("Test\n", parserResponse.getBody());
+
+ parserResponse = parserResponses.get(4);
+ assertEquals("200", parserResponse.getStatusCode());
+ assertEquals("OK", parserResponse.getStatusInfo());
+ assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
+ assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
+ assertEquals("Test", parserResponse.getBody());
+ }
+}