http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/14278ac1/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLineTest.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLineTest.java
 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLineTest.java
index 86000ce..9e1f160 100644
--- 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLineTest.java
+++ 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLineTest.java
@@ -34,71 +34,80 @@ public class HttpRequestStatusLineTest {
   private String serviceResolutionUri = "";
 
   @Test
-  public void testAbsolute() throws BatchDeserializerException {
-    final HttpRequestStatusLine line = 
parse("http://localhost/odata/Employee?$top=2";);
+  public void absolute() throws BatchDeserializerException {
+    final HttpRequestStatusLine line = 
parse("http://localhost/odata/ESAllPrim?$top=2";);
     assertEquals("$top=2", line.getRawQueryPath());
-    assertEquals("/Employee", line.getRawODataPath());
-    assertEquals("http://localhost/odata/Employee?$top=2";, 
line.getRawRequestUri());
+    assertEquals("/ESAllPrim", line.getRawODataPath());
+    assertEquals(baseUri + "/ESAllPrim?$top=2", line.getRawRequestUri());
     assertEquals(baseUri, line.getRawBaseUri());
     assertEquals(serviceResolutionUri, line.getRawServiceResolutionUri());
   }
 
   @Test
-  public void testAbsoluteWithRelativePath() throws BatchDeserializerException 
{
-    final HttpRequestStatusLine line = 
parse("http://localhost/odata/../../Employee?$top=2";);
-    assertEquals("/../../Employee", line.getRawODataPath());
+  public void absoluteWithRelativePath() throws BatchDeserializerException {
+    final HttpRequestStatusLine line = 
parse("http://localhost/odata/../../ESAllPrim?$top=2";);
+    assertEquals("/../../ESAllPrim", line.getRawODataPath());
     assertEquals("$top=2", line.getRawQueryPath());
-    assertEquals("http://localhost/odata/../../Employee?$top=2";, 
line.getRawRequestUri());
+    assertEquals(baseUri + "/../../ESAllPrim?$top=2", line.getRawRequestUri());
     assertEquals(baseUri, line.getRawBaseUri());
     assertEquals(serviceResolutionUri, line.getRawServiceResolutionUri());
   }
 
   @Test
-  public void testRelativeWithDots() throws BatchDeserializerException {
-    final HttpRequestStatusLine line = parse("../../Employee?$top=2");
-    assertEquals("/../../Employee", line.getRawODataPath());
-    assertEquals("$top=2", line.getRawQueryPath());
-    assertEquals("http://localhost/odata/../../Employee?$top=2";, 
line.getRawRequestUri());
+  public void absolutePath() throws BatchDeserializerException {
+    final HttpRequestStatusLine line = parse("/odata/ESAllPrim");
+    assertEquals("/ESAllPrim", line.getRawODataPath());
+    assertEquals(baseUri + "/ESAllPrim", line.getRawRequestUri());
     assertEquals(baseUri, line.getRawBaseUri());
     assertEquals(serviceResolutionUri, line.getRawServiceResolutionUri());
   }
 
   @Test
-  public void testRelative() throws BatchDeserializerException {
-    final HttpRequestStatusLine line = parse("Employee?$top=2");
+  public void relativeWithDots() throws BatchDeserializerException {
+    final HttpRequestStatusLine line = parse("../../ESAllPrim?$top=2");
+    assertEquals("/../../ESAllPrim", line.getRawODataPath());
     assertEquals("$top=2", line.getRawQueryPath());
-    assertEquals("/Employee", line.getRawODataPath());
-    assertEquals("http://localhost/odata/Employee?$top=2";, 
line.getRawRequestUri());
+    assertEquals(baseUri + "/../../ESAllPrim?$top=2", line.getRawRequestUri());
     assertEquals(baseUri, line.getRawBaseUri());
     assertEquals(serviceResolutionUri, line.getRawServiceResolutionUri());
   }
 
   @Test
-  public void testRelativeMultipleSegements() throws 
BatchDeserializerException {
-    final HttpRequestStatusLine line = 
parse("Employee/Manager/EmployeeName?$top=2");
+  public void relative() throws BatchDeserializerException {
+    final HttpRequestStatusLine line = parse("ESAllPrim?$top=2");
     assertEquals("$top=2", line.getRawQueryPath());
-    assertEquals("/Employee/Manager/EmployeeName", line.getRawODataPath());
-    
assertEquals("http://localhost/odata/Employee/Manager/EmployeeName?$top=2";, 
line.getRawRequestUri());
+    assertEquals("/ESAllPrim", line.getRawODataPath());
+    assertEquals(baseUri + "/ESAllPrim?$top=2", line.getRawRequestUri());
+    assertEquals(baseUri, line.getRawBaseUri());
+    assertEquals(serviceResolutionUri, line.getRawServiceResolutionUri());
+  }
+
+  @Test
+  public void relativeMultipleSegments() throws BatchDeserializerException {
+    final HttpRequestStatusLine line = 
parse("ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyComp");
+    assertEquals("", line.getRawQueryPath());
+    assertEquals("/ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyComp", 
line.getRawODataPath());
+    assertEquals(baseUri + 
"/ESKeyNav(1)/NavPropertyETTwoKeyNavOne/PropertyComp", line.getRawRequestUri());
     assertEquals(baseUri, line.getRawBaseUri());
     assertEquals(serviceResolutionUri, line.getRawServiceResolutionUri());
   }
 
   @Test
-  public void testOtherBaseUri() throws BatchDeserializerException {
-    parseFail("http://otherhost/odata/Employee?$top=2";, 
MessageKeys.INVALID_BASE_URI);
+  public void otherBaseUri() throws BatchDeserializerException {
+    parseFail("http://otherhost/odata/ESAllPrim";, 
MessageKeys.INVALID_BASE_URI);
   }
 
   @Test
-  public void testInvalidRelative() throws BatchDeserializerException {
-    parseFail("/Employee?$top=2", MessageKeys.INVALID_URI);
+  public void invalidRelative() throws BatchDeserializerException {
+    parseFail("/ESAllPrim", MessageKeys.INVALID_URI);
   }
 
-  HttpRequestStatusLine parse(final String uri) throws 
BatchDeserializerException {
+  private HttpRequestStatusLine parse(final String uri) throws 
BatchDeserializerException {
     Line statusline = new Line(HttpMethod.GET.name() + SPACE + uri + SPACE + 
HTTP_VERSION, 0);
     return new HttpRequestStatusLine(statusline, baseUri, 
serviceResolutionUri);
   }
 
-  void parseFail(final String uri, final MessageKeys messageKey) {
+  private void parseFail(final String uri, final MessageKeys messageKey) {
     try {
       parse(uri);
       fail("Expected exception");

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/14278ac1/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java
 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java
index 1f0d7a3..cf427bf 100644
--- 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java
+++ 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/BatchResponseSerializerTest.java
@@ -18,14 +18,17 @@
  */
 package org.apache.olingo.server.core.serializer;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Random;
 import java.util.UUID;
@@ -46,48 +49,42 @@ public class BatchResponseSerializerTest {
   private static final Charset CS_ISO_8859_1 = Charset.forName("iso-8859-1");
 
   @Test
-  public void testBatchResponse() throws Exception {
+  public void batchResponse() throws Exception {
     final List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.APPLICATION_JSON.toContentTypeString());
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.TEXT_PLAIN.toContentTypeString());
     response.setContent(IOUtils.toInputStream("Walter Winter" + CRLF));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     ODataResponse changeSetResponse = new ODataResponse();
     changeSetResponse.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
     changeSetResponse.setHeader(HttpHeader.CONTENT_ID, "1");
-    responses = new ArrayList<ODataResponse>(1);
-    responses.add(changeSetResponse);
-    parts.add(new ODataResponsePart(responses, true));
+    parts.add(new 
ODataResponsePart(Collections.singletonList(changeSetResponse), true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(24, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json" + CRLF, body.get(line++));
+    assertEquals("Content-Type: text/plain" + CRLF, body.get(line++));
     assertEquals("Content-Length: 15" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("Walter Winter" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
-    assertTrue(body.get(line++).contains("Content-Type: multipart/mixed; 
boundary=changeset_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
+    assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; 
boundary=changeset_"));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals("Content-ID: 1" + CRLF, body.get(line++));
@@ -96,54 +93,48 @@ public class BatchResponseSerializerTest {
     assertEquals("Content-Length: 0" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testBatchResponseUmlautsUtf8() throws Exception {
-    final List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+  public void batchResponseUmlautsUtf8() throws Exception {
+    List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setHeader(HttpHeader.CONTENT_TYPE,
-        ContentType.APPLICATION_JSON.toContentTypeString() + "; 
charset=UTF-8");
-    response.setContent(IOUtils.toInputStream("Wälter Winter" + CRLF));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.APPLICATION_JSON.toContentTypeString());
+    response.setContent(IOUtils.toInputStream("{\"name\":\"Wälter Winter\"}" 
+ CRLF));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     ODataResponse changeSetResponse = new ODataResponse();
     changeSetResponse.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
     changeSetResponse.setHeader(HttpHeader.CONTENT_ID, "1");
-    responses = new ArrayList<ODataResponse>(1);
-    responses.add(changeSetResponse);
-    parts.add(new ODataResponsePart(responses, true));
+    parts.add(new 
ODataResponsePart(Collections.singletonList(changeSetResponse), true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(24, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json; charset=UTF-8" + CRLF, 
body.get(line++));
-    assertEquals("Content-Length: 16" + CRLF, body.get(line++));
+    assertEquals("Content-Type: application/json" + CRLF, body.get(line++));
+    assertEquals("Content-Length: 27" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertEquals("Wälter Winter" + CRLF, body.get(line++));
+    assertEquals("{\"name\":\"Wälter Winter\"}" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
-    assertTrue(body.get(line++).contains("Content-Type: multipart/mixed; 
boundary=changeset_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
+    assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; 
boundary=changeset_"));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals("Content-ID: 1" + CRLF, body.get(line++));
@@ -152,57 +143,50 @@ public class BatchResponseSerializerTest {
     assertEquals("Content-Length: 0" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testBatchResponseUmlautsUtf8BodyIsoHeader() throws Exception {
-    final List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+  public void batchResponseUmlautsUtf8BodyIsoHeader() throws Exception {
+    List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
     response.setHeader(HttpHeader.CONTENT_TYPE,
-        ContentType.APPLICATION_JSON.toContentTypeString() + "; 
charset=UTF-8");
+        ContentType.create(ContentType.TEXT_PLAIN, 
ContentType.PARAMETER_CHARSET, "UTF-8").toContentTypeString());
     response.setContent(IOUtils.toInputStream("Wälter Winter" + CRLF));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     ODataResponse changeSetResponse = new ODataResponse();
     changeSetResponse.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
     changeSetResponse.setHeader(HttpHeader.CONTENT_ID, "1");
-
-    byte[] umlauts = "äüö".getBytes(CS_ISO_8859_1);
-    changeSetResponse.setHeader("Custom-Header", new String(umlauts, 
CS_ISO_8859_1));
-    responses = new ArrayList<ODataResponse>(1);
-    responses.add(changeSetResponse);
-    parts.add(new ODataResponsePart(responses, true));
+    changeSetResponse.setHeader("Custom-Header", new 
String("äüö".getBytes(CS_ISO_8859_1), CS_ISO_8859_1));
+    parts.add(new 
ODataResponsePart(Collections.singletonList(changeSetResponse), true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(25, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json; charset=UTF-8" + CRLF, 
body.get(line++));
+    assertEquals("Content-Type: text/plain;charset=UTF-8" + CRLF, 
body.get(line++));
     assertEquals("Content-Length: 16" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("Wälter Winter" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
-    assertTrue(body.get(line++).contains("Content-Type: multipart/mixed; 
boundary=changeset_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
+    assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; 
boundary=changeset_"));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals("Content-ID: 1" + CRLF, body.get(line++));
@@ -212,39 +196,30 @@ public class BatchResponseSerializerTest {
     assertEquals("Content-Length: 0" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testBatchResponseUmlautsUtf8BodyAndHeader() throws Exception {
-    final List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+  public void batchResponseUmlautsUtf8BodyAndHeader() throws Exception {
+    List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setHeader(HttpHeader.CONTENT_TYPE,
-        ContentType.APPLICATION_JSON.toContentTypeString() + "; 
charset=UTF-8");
-    response.setContent(IOUtils.toInputStream("Wälter Winter" + CRLF));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.APPLICATION_JSON.toContentTypeString());
+    response.setContent(IOUtils.toInputStream("{\"name\":\"Wälter Winter\"}" 
+ CRLF));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     ODataResponse changeSetResponse = new ODataResponse();
     changeSetResponse.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
     changeSetResponse.setHeader(HttpHeader.CONTENT_ID, "1");
-
-    //    byte[] umlauts = "äüö".getBytes(CS_UTF_8);
-    //    changeSetResponse.setHeader("Custom-Header", new String(umlauts, 
CS_UTF_8));
     changeSetResponse.setHeader("Custom-Header", "äüö");
-    responses = new ArrayList<ODataResponse>(1);
-    responses.add(changeSetResponse);
-    parts.add(new ODataResponsePart(responses, true));
+    parts.add(new 
ODataResponsePart(Collections.singletonList(changeSetResponse), true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
@@ -256,50 +231,45 @@ public class BatchResponseSerializerTest {
   }
 
   @Test
-  public void testBatchResponseUmlautsIso() throws Exception {
-    final List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+  public void batchResponseUmlautsIso() throws Exception {
+    List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
     response.setHeader(HttpHeader.CONTENT_TYPE,
-        ContentType.APPLICATION_JSON.toContentTypeString() + "; 
charset=iso-8859-1");
-    byte[] payload = ("Wälter Winter" + CRLF).getBytes("iso-8859-1");
-    response.setContent(new ByteArrayInputStream(payload));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+        ContentType.create(ContentType.TEXT_PLAIN, 
ContentType.PARAMETER_CHARSET, CS_ISO_8859_1.name())
+            .toContentTypeString());
+    response.setContent(new ByteArrayInputStream(("Wälter Winter" + 
CRLF).getBytes(CS_ISO_8859_1)));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     ODataResponse changeSetResponse = new ODataResponse();
     changeSetResponse.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
     changeSetResponse.setHeader(HttpHeader.CONTENT_ID, "1");
-    responses = new ArrayList<ODataResponse>(1);
-    responses.add(changeSetResponse);
-    parts.add(new ODataResponsePart(responses, true));
+    parts.add(new 
ODataResponsePart(Collections.singletonList(changeSetResponse), true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(24, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json; charset=iso-8859-1" + CRLF, 
body.get(line++));
+    assertEquals("Content-Type: text/plain;charset=ISO-8859-1" + CRLF, 
body.get(line++));
     assertEquals("Content-Length: 15" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("Wälter Winter" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
-    assertTrue(body.get(line++).contains("Content-Type: multipart/mixed; 
boundary=changeset_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
+    assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; 
boundary=changeset_"));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals("Content-ID: 1" + CRLF, body.get(line++));
@@ -308,52 +278,47 @@ public class BatchResponseSerializerTest {
     assertEquals("Content-Length: 0" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testBatchResponseWithEndingCRLF() throws Exception {
-    final List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+  public void batchResponseWithEndingCRLF() throws Exception {
+    List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setHeader(HttpHeader.CONTENT_TYPE, "application/json");
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.TEXT_PLAIN.toContentTypeString());
     response.setContent(IOUtils.toInputStream("Walter Winter"));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     ODataResponse changeSetResponse = new ODataResponse();
     changeSetResponse.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
     changeSetResponse.setHeader(HttpHeader.CONTENT_ID, "1");
-    responses = new ArrayList<ODataResponse>(1);
-    responses.add(changeSetResponse);
-    parts.add(new ODataResponsePart(responses, true));
+    parts.add(new 
ODataResponsePart(Collections.singletonList(changeSetResponse), true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(23, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json" + CRLF, body.get(line++));
+    assertEquals("Content-Type: text/plain" + CRLF, body.get(line++));
     assertEquals("Content-Length: 13" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("Walter Winter" + CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
-    assertTrue(body.get(line++).contains("Content-Type: multipart/mixed; 
boundary=changeset_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
+    assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; 
boundary=changeset_"));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals("Content-ID: 1" + CRLF, body.get(line++));
@@ -362,108 +327,99 @@ public class BatchResponseSerializerTest {
     assertEquals("Content-Length: 0" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testResponse() throws Exception {
+  public void response() throws Exception {
     List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setHeader(HttpHeader.CONTENT_TYPE, "application/json");
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.TEXT_PLAIN.toContentTypeString());
     response.setContent(IOUtils.toInputStream("Walter Winter"));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     final BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
 
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(10, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json" + CRLF, body.get(line++));
+    assertEquals("Content-Type: text/plain" + CRLF, body.get(line++));
     assertEquals("Content-Length: 13" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("Walter Winter" + CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testBigResponse() throws Exception {
+  public void bigResponse() throws Exception {
     List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    response.setHeader(HttpHeader.CONTENT_TYPE, "application/json");
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.TEXT_PLAIN.toContentTypeString());
     String bigData = generateData(10000);
     response.setContent(IOUtils.toInputStream(bigData));
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, false));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
false));
 
     final BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
 
     assertNotNull(content);
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(10, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals("HTTP/1.1 200 OK" + CRLF, body.get(line++));
-    assertEquals("Content-Type: application/json" + CRLF, body.get(line++));
+    assertEquals("Content-Type: text/plain" + CRLF, body.get(line++));
     assertEquals("Content-Length: 10000" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(bigData + CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
   }
 
   @Test
-  public void testChangeSetResponse() throws Exception {
+  public void changeSetResponse() throws Exception {
     List<ODataResponsePart> parts = new ArrayList<ODataResponsePart>();
+
     ODataResponse response = new ODataResponse();
     response.setHeader(HttpHeader.CONTENT_ID, "1");
     response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
-
-    List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
-    responses.add(response);
-    parts.add(new ODataResponsePart(responses, true));
+    parts.add(new ODataResponsePart(Collections.singletonList(response), 
true));
 
     BatchResponseSerializer serializer = new BatchResponseSerializer();
     final InputStream content = serializer.serialize(parts, BOUNDARY);
 
     assertNotNull(content);
 
-    final BatchLineReader reader =
-        new BatchLineReader(content);
+    final BatchLineReader reader = new BatchLineReader(content);
     final List<String> body = reader.toList();
     reader.close();
 
     int line = 0;
     assertEquals(14, body.size());
-    assertTrue(body.get(line++).contains("--batch_"));
-    assertTrue(body.get(line++).contains("Content-Type: multipart/mixed; 
boundary=changeset_"));
+    assertEquals("--" + BOUNDARY + CRLF, body.get(line++));
+    assertTrue(body.get(line++).startsWith("Content-Type: multipart/mixed; 
boundary=changeset_"));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
     assertEquals("Content-Type: application/http" + CRLF, body.get(line++));
     assertEquals("Content-Transfer-Encoding: binary" + CRLF, body.get(line++));
     assertEquals("Content-ID: 1" + CRLF, body.get(line++));
@@ -472,8 +428,52 @@ public class BatchResponseSerializerTest {
     assertEquals("Content-Length: 0" + CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
     assertEquals(CRLF, body.get(line++));
-    assertTrue(body.get(line++).contains("--changeset_"));
-    assertTrue(body.get(line++).contains("--batch_"));
+    assertTrue(body.get(line++).startsWith("--changeset_"));
+    assertEquals("--" + BOUNDARY + "--" + CRLF, body.get(line++));
+  }
+
+  @Test
+  public void binaryResponse() throws Exception {
+    ODataResponse response = new ODataResponse();
+    response.setStatusCode(HttpStatusCode.OK.getStatusCode());
+    response.setHeader(HttpHeader.CONTENT_TYPE, 
ContentType.APPLICATION_OCTET_STREAM.toContentTypeString());
+    // binary content, not a valid UTF-8 representation of a string
+    byte[] content = new byte[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
+    for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
+      content[i - Byte.MIN_VALUE] = (byte) i;
+    }
+    ByteArrayOutputStream out = new ByteArrayOutputStream(Byte.MAX_VALUE - 
Byte.MIN_VALUE + 1);
+    out.write(content);
+    response.setContent(new ByteArrayInputStream(out.toByteArray()));
+
+    InputStream batchResponse = new BatchResponseSerializer().serialize(
+        Collections.singletonList(new 
ODataResponsePart(Collections.singletonList(response), false)),
+        BOUNDARY);
+    assertNotNull(batchResponse);
+
+    final String beforeExpected = "--" + BOUNDARY + CRLF
+        + "Content-Type: application/http" + CRLF
+        + "Content-Transfer-Encoding: binary" + CRLF
+        + CRLF
+        + "HTTP/1.1 200 OK" + CRLF
+        + "Content-Type: application/octet-stream" + CRLF
+        + "Content-Length: 256" + CRLF
+        + CRLF;
+    byte[] beforeContent = new byte[beforeExpected.length()];
+    batchResponse.read(beforeContent, 0, beforeExpected.length());
+    assertArrayEquals(beforeExpected.getBytes(CS_ISO_8859_1), beforeContent);
+
+    byte[] binaryContent = new byte[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
+    batchResponse.read(binaryContent, 0, binaryContent.length);
+    assertArrayEquals(content, binaryContent);
+
+    final String afterExpected = CRLF
+        + "--" + BOUNDARY + "--" + CRLF;
+    byte[] afterContent = new byte[afterExpected.length()];
+    batchResponse.read(afterContent, 0, afterExpected.length());
+    assertArrayEquals(afterExpected.getBytes(CS_ISO_8859_1), afterContent);
+
+    assertEquals(-1, batchResponse.read());
   }
 
   /**

Reply via email to