You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/02/17 10:53:33 UTC

[19/35] olingo-odata4 git commit: [OLINGO-575] Removed V4 server code

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/batchhandler/MockedBatchHandlerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/batchhandler/MockedBatchHandlerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/batchhandler/MockedBatchHandlerTest.java
deleted file mode 100644
index 86c336e..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/batchhandler/MockedBatchHandlerTest.java
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.batchhandler;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.olingo.commons.api.http.HttpContentType;
-import org.apache.olingo.commons.api.http.HttpHeader;
-import org.apache.olingo.commons.api.http.HttpMethod;
-import org.apache.olingo.commons.api.http.HttpStatusCode;
-import org.apache.olingo.server.api.OData;
-import org.apache.olingo.server.api.ODataRequest;
-import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.ServiceMetadata;
-import org.apache.olingo.server.api.batch.BatchFacade;
-import org.apache.olingo.server.api.batch.exception.BatchDeserializerException;
-import org.apache.olingo.server.api.batch.exception.BatchSerializerException;
-import org.apache.olingo.server.api.deserializer.batch.BatchOptions;
-import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart;
-import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart;
-import org.apache.olingo.server.api.processor.BatchProcessor;
-import org.apache.olingo.server.core.ODataHandler;
-import org.apache.olingo.server.core.deserializer.batch.BatchParserCommon;
-import org.apache.olingo.server.core.deserializer.batch.BufferedReaderIncludingLineEndings;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class MockedBatchHandlerTest {
-
-  private static final String BATCH_CONTENT_TYPE = "multipart/mixed;boundary=batch_12345";
-  private static final String BATCH_ODATA_PATH = "/$batch";
-  private static final String BATCH_REQUEST_URI = "http://localhost:8080/odata/$batch";
-  private static final String BASE_URI = "http://localhost:8080/odata";
-  private static final String CRLF = "\r\n";
-  private ODataHandler oDataHandler;
-  private BatchHandler batchHandler;
-  private int entityCounter = 1;
-
-  @Before
-  public void setup() {
-    final BatchProcessor batchProcessor = new BatchTestProcessorImpl();
-    batchProcessor.init(OData.newInstance(), null);
-
-    entityCounter = 1;
-    oDataHandler = mock(ODataHandler.class);
-    batchHandler = new BatchHandler(oDataHandler, batchProcessor);
-  }
-
-  @Test
-  public void test() throws Exception {
-    final String content = "--batch_12345" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_12345" + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 3" + CRLF
-        + CRLF
-        + "PUT ESAllPrim(1) HTTP/1.1" + CRLF 
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 4" + CRLF
-        + CRLF
-        + "PUT $3/PropertyInt32 HTTP/1.1" + CRLF 
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "POST ESAllPrim HTTP/1.1" + CRLF 
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 5" + CRLF
-        + CRLF
-        + "POST http://localhost:8080/odata/$1/NavPropertyETTwoPrimMany HTTP/1.1" + CRLF 
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 2" + CRLF
-        + CRLF
-        + "POST $1/NavPropertyETTwoPrimMany HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 6" + CRLF
-        + CRLF
-        + "PUT ESAllPrim(1) HTTP/1.1" + CRLF 
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345--" + CRLF
-        + CRLF
-        + "--batch_12345--";
-    final Map<String, List<String>> header = getMimeHeader();
-    final ODataResponse response = new ODataResponse();
-    final ODataRequest request = buildODataRequest(content, header);
-
-    batchHandler.process(request, response, true);
-
-    BufferedReaderIncludingLineEndings reader =
-        new BufferedReaderIncludingLineEndings(new InputStreamReader(response.getContent()));
-
-    final List<String> responseContent = reader.toList();
-    reader.close();
-
-    int line = 0;
-    assertEquals(62, responseContent.size());
-
-    // Check change set
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertTrue(responseContent.get(line++).contains("Content-Type: multipart/mixed; boundary=changeset_"));
-
-    for (int i = 0; i < 6; i++) {
-      String contentId = checkChangeSetPartHeader(responseContent, line);
-      line += 6;
-
-      if ("1".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESAllPrim(1)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("2".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESTwoPrim(3)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("3".equals(contentId)) {
-        assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("4".equals(contentId)) {
-        assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("5".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESTwoPrim(2)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("6".equals(contentId)) {
-        assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else {
-        fail();
-      }
-      assertEquals(CRLF, responseContent.get(line++));
-    }
-
-    // Close body part (change set)
-    assertEquals(CRLF, responseContent.get(line++));
-    assertTrue(responseContent.get(line++).contains("--changeset_"));
-
-    // Close batch
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertEquals(62, line);
-  }
-
-  @Test
-  public void testGetRequest() throws Exception {
-    final String content = ""
-        + "--batch_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + CRLF
-        + "GET ESAllPrim(0) HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_12345--";
-
-    final Map<String, List<String>> header = getMimeHeader();
-    final ODataResponse response = new ODataResponse();
-    final ODataRequest request = buildODataRequest(content, header);
-
-    batchHandler.process(request, response, true);
-
-    BufferedReaderIncludingLineEndings reader =
-        new BufferedReaderIncludingLineEndings(new InputStreamReader(response.getContent()));
-
-    final List<String> responseContent = reader.toList();
-    int line = 0;
-
-    assertEquals(9, responseContent.size());
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertEquals("Content-Type: application/http" + CRLF, responseContent.get(line++));
-    assertEquals("Content-Transfer-Encoding: binary" + CRLF, responseContent.get(line++));
-    assertEquals(CRLF, responseContent.get(line++));
-    assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-    assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-    assertEquals(CRLF, responseContent.get(line++));
-    assertEquals(CRLF, responseContent.get(line++));
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-
-    assertEquals(9, line);
-
-    reader.close();
-  }
-
-  @Test
-  public void testMultipleChangeSets() throws Exception {
-    final String content = ""
-        + "--batch_12345" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_12345" + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "PUT ESAllPrim(1) HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 2" + CRLF
-        + CRLF
-        + "POST $1/NavPropertyETTwoPrimMany HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345--" + CRLF
-
-        + "--batch_12345" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_54321" + CRLF
-        + CRLF
-        + "--changeset_54321" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "PUT http://localhost:8080/odata/ESAllPrim(2) HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_54321" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 2" + CRLF
-        + CRLF
-        + "POST $1/NavPropertyETTwoPrimMany HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_54321--" + CRLF
-
-        + CRLF
-        + "--batch_12345--";
-    final Map<String, List<String>> header = getMimeHeader();
-    final ODataResponse response = new ODataResponse();
-    final ODataRequest request = buildODataRequest(content, header);
-
-    batchHandler.process(request, response, true);
-
-    BufferedReaderIncludingLineEndings reader =
-        new BufferedReaderIncludingLineEndings(new InputStreamReader(response.getContent()));
-
-    final List<String> responseContent = reader.toList();
-    reader.close();
-
-    int line = 0;
-    assertEquals(47, responseContent.size());
-
-    // Check first change set
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertTrue(responseContent.get(line++).contains("Content-Type: multipart/mixed; boundary=changeset_"));
-
-    for (int i = 0; i < 2; i++) {
-      String contentId = checkChangeSetPartHeader(responseContent, line);
-      line += 6;
-
-      if ("1".equals(contentId)) {
-        assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("2".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESTwoPrim(1)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else {
-        fail();
-      }
-
-      assertEquals(CRLF, responseContent.get(line++));
-    }
-    // Close body part (1st change set)
-    assertEquals(CRLF, responseContent.get(line++));
-    assertTrue(responseContent.get(line++).contains("--changeset_"));
-
-    // Check second change set
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertTrue(responseContent.get(line++).contains("Content-Type: multipart/mixed; boundary=changeset_"));
-
-    for (int i = 0; i < 2; i++) {
-      String contentId = checkChangeSetPartHeader(responseContent, line);
-      line += 6;
-
-      if ("1".equals(contentId)) {
-        assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("2".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESTwoPrim(2)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else {
-        fail();
-      }
-
-      assertEquals(CRLF, responseContent.get(line++));
-    }
-    // Close body part (2nd change set)
-    assertEquals(CRLF, responseContent.get(line++));
-    assertTrue(responseContent.get(line++).contains("--changeset_"));
-
-    // Close batch
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-
-    assertEquals(47, line);
-  }
-
-  @Test
-  public void testMineBodyPartTransitiv() throws Exception {
-    final String content = ""
-        + "--batch_12345" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_12345" + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "PUT ESAllPrim(1) HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 2" + CRLF
-        + CRLF
-        + "POST $1/NavPropertyETTwoPrimMany HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 3" + CRLF
-        + CRLF
-        + "POST $2/NavPropertyETAllPrimMany HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 4" + CRLF
-        + CRLF
-        + "POST $3/NavPropertyETTwoPrimOne HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345--" + CRLF
-
-        + CRLF
-        + "--batch_12345--";
-
-    final Map<String, List<String>> header = getMimeHeader();
-    final ODataResponse response = new ODataResponse();
-    final ODataRequest request = buildODataRequest(content, header);
-
-    batchHandler.process(request, response, true);
-
-    BufferedReaderIncludingLineEndings reader =
-        new BufferedReaderIncludingLineEndings(new InputStreamReader(response.getContent()));
-
-    final List<String> responseContent = reader.toList();
-    reader.close();
-
-    int line = 0;
-    assertEquals(44, responseContent.size());
-
-    // Check change set
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertTrue(responseContent.get(line++).contains("Content-Type: multipart/mixed; boundary=changeset_"));
-
-    for (int i = 0; i < 4; i++) {
-      String contentId = checkChangeSetPartHeader(responseContent, line);
-      line += 6;
-
-      if ("1".equals(contentId)) {
-        assertEquals("HTTP/1.1 200 OK" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("2".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESTwoPrim(1)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("3".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESAllPrim(2)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else if ("4".equals(contentId)) {
-        assertEquals("HTTP/1.1 201 Created" + CRLF, responseContent.get(line++));
-        assertEquals("Location: " + BASE_URI + "/ESTwoPrim(3)" + CRLF, responseContent.get(line++));
-        assertEquals("Content-Length: 0" + CRLF, responseContent.get(line++));
-      } else {
-        fail();
-      }
-
-      assertEquals(CRLF, responseContent.get(line++));
-    }
-
-    // Close body part (change set)
-    assertEquals(CRLF, responseContent.get(line++));
-    assertTrue(responseContent.get(line++).contains("--changeset_"));
-
-    // Close batch
-    assertTrue(responseContent.get(line++).contains("--batch_"));
-    assertEquals(44, line);
-  }
-
-  @Test(expected = BatchDeserializerException.class)
-  public void testInvalidMethod() throws Exception {
-    final String content = ""
-        + "--batch_12345" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_12345" + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "PUT ESAllPrim(1) HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345--" + CRLF
-        + CRLF
-        + "--batch_12345--";
-
-    final Map<String, List<String>> header = getMimeHeader();
-    final ODataResponse response = new ODataResponse();
-    final ODataRequest request = buildODataRequest(content, header);
-    request.setMethod(HttpMethod.GET);
-
-    batchHandler.process(request, response, true);
-  }
-
-  @Test(expected = BatchDeserializerException.class)
-  public void testInvalidContentType() throws Exception {
-    final String content = ""
-        + "--batch_12345" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_12345" + CRLF
-        + CRLF
-        + "--changeset_12345" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "PUT ESAllPrim(1) HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_12345--" + CRLF
-        + CRLF
-        + "--batch_12345--";
-
-    final Map<String, List<String>> header = new HashMap<String, List<String>>();
-    header.put(HttpHeader.CONTENT_TYPE, Arrays.asList(new String[] { "application/http" }));
-    final ODataResponse response = new ODataResponse();
-    final ODataRequest request = buildODataRequest(content, header);
-
-    batchHandler.process(request, response, true);
-  }
-
-  /*
-   * Helper methods
-   */
-  private String checkChangeSetPartHeader(final List<String> response, int line) {
-    assertEquals(CRLF, response.get(line++));
-    assertTrue(response.get(line++).contains("--changeset_"));
-    assertEquals("Content-Type: application/http" + CRLF, response.get(line++));
-    assertEquals("Content-Transfer-Encoding: binary" + CRLF, response.get(line++));
-
-    assertTrue(response.get(line).contains("Content-Id:"));
-    String contentId = response.get(line).split(":")[1].trim();
-    line++;
-
-    assertEquals(CRLF, response.get(line++));
-
-    return contentId;
-  }
-
-  private Map<String, List<String>> getMimeHeader() {
-    final Map<String, List<String>> header = new HashMap<String, List<String>>();
-    header.put(HttpHeader.CONTENT_TYPE, Arrays.asList(new String[] { BATCH_CONTENT_TYPE }));
-
-    return header;
-  }
-
-  private ODataRequest buildODataRequest(final String content, final Map<String, List<String>> header)
-      throws Exception {
-    final ODataRequest request = new ODataRequest();
-
-    for (final String key : header.keySet()) {
-      request.addHeader(key, header.get(key));
-    }
-
-    request.setMethod(HttpMethod.POST);
-    request.setRawBaseUri(BASE_URI);
-    request.setRawODataPath(BATCH_ODATA_PATH);
-    request.setRawQueryPath("");
-    request.setRawRequestUri(BATCH_REQUEST_URI);
-    request.setRawServiceResolutionUri("");
-
-    request.setBody(new ByteArrayInputStream(content.getBytes("UTF-8")));
-
-    return request;
-  }
-
-  /**
-   * Batch processor
-   */
-  private class BatchTestProcessorImpl implements BatchProcessor {
-
-    private OData odata;
-
-    @Override
-    public void init(OData odata, ServiceMetadata serviceMetadata) {
-      this.odata = odata;
-    }
-
-    @Override
-    public ODataResponsePart processChangeSet(BatchFacade fascade, List<ODataRequest> requests) {
-      List<ODataResponse> responses = new ArrayList<ODataResponse>();
-
-      for (ODataRequest request : requests) {
-        try {
-          responses.add(fascade.handleODataRequest(request));
-        } catch (Exception e) {
-          fail();
-        }
-      }
-
-      return new ODataResponsePart(responses, true);
-    }
-
-    @Override
-    public void processBatch(BatchFacade fascade, ODataRequest request, ODataResponse response)
-        throws BatchDeserializerException, BatchSerializerException {
-      final String boundary = getBoundary(request.getHeader(HttpHeader.CONTENT_TYPE));
-      final BatchOptions options = BatchOptions.with().isStrict(true).rawBaseUri(BASE_URI).build();
-      final List<BatchRequestPart> parts =
-          odata.createFixedFormatDeserializer().parseBatchRequest(request.getBody(), boundary, options);
-      final List<ODataResponsePart> responseParts = new ArrayList<ODataResponsePart>();
-
-      for (BatchRequestPart part : parts) {
-        for (final ODataRequest oDataRequest : part.getRequests()) {
-          // Mock the processor for a given requests
-          when(oDataHandler.process(oDataRequest)).then(new Answer<ODataResponse>() {
-            @Override
-            public ODataResponse answer(InvocationOnMock invocation) throws Throwable {
-              Object[] arguments = invocation.getArguments();
-
-              return buildResponse((ODataRequest) arguments[0]);
-            }
-          });
-        }
-
-        responseParts.add(fascade.handleBatchRequest(part));
-      }
-
-      final String responeBoundary = "batch_" + UUID.randomUUID().toString();
-      final InputStream responseStream =
-          odata.createFixedFormatSerializer().batchResponse(responseParts, responeBoundary);
-      
-      response.setStatusCode(HttpStatusCode.ACCEPTED.getStatusCode());
-      response.setHeader(HttpHeader.CONTENT_TYPE, HttpContentType.MULTIPART_MIXED + ";boundary=" + responeBoundary);
-      response.setContent(responseStream);
-    }
-
-    private String getBoundary(String contentType) throws BatchDeserializerException {
-      return BatchParserCommon.getBoundary(contentType, 0);
-    }
-  }
-
-  private ODataResponse buildResponse(ODataRequest request) {
-    final ODataResponse oDataResponse = new ODataResponse();
-
-    if (request.getMethod() == HttpMethod.POST) {
-      oDataResponse.setStatusCode(HttpStatusCode.CREATED.getStatusCode());
-      oDataResponse.setHeader(HttpHeader.LOCATION, createResourceUri(request));
-    } else {
-      oDataResponse.setStatusCode(HttpStatusCode.OK.getStatusCode());
-    }
-
-    final String contentId = request.getHeader(BatchParserCommon.HTTP_CONTENT_ID);
-    if (contentId != null) {
-      oDataResponse.setHeader(BatchParserCommon.HTTP_CONTENT_ID, contentId);
-    }
-
-    return oDataResponse;
-  }
-
-  private String createResourceUri(final ODataRequest request) {
-    final String parts[] = request.getRawODataPath().split("/");
-    String oDataPath = "";
-
-    if (parts.length == 2) {
-      // Entity Collection
-      oDataPath = parts[1];
-    } else {
-      // Navigation property
-
-      final String navProperty = parts[parts.length - 1];
-      if (navProperty.equals("NavPropertyETTwoPrimMany")) {
-        oDataPath = "ESTwoPrim";
-      } else if (navProperty.equals("NavPropertyETAllPrimMany")) {
-        oDataPath = "ESAllPrim";
-      } else if (navProperty.equals("NavPropertyETTwoPrimOne")) {
-        oDataPath = "ESTwoPrim";
-      }
-    }
-
-    return BASE_URI + "/" + oDataPath + "(" + entityCounter++ + ")";
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerTest.java
deleted file mode 100644
index 27f6a5d..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.deserializer;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.olingo.server.api.OData;
-import org.apache.olingo.server.api.deserializer.FixedFormatDeserializer;
-import org.apache.olingo.server.api.serializer.SerializerException;
-import org.junit.Test;
-
-public class FixedFormatDeserializerTest {
-
-  private final FixedFormatDeserializer deserializer;
-
-  public FixedFormatDeserializerTest() throws SerializerException {
-    deserializer = OData.newInstance().createFixedFormatDeserializer();
-  }
-
-  @Test
-  public void binary() throws Exception {
-    assertArrayEquals(new byte [] { 0x41, 0x42, 0x43 },
-        deserializer.binary(IOUtils.toInputStream("ABC")));
-  }
-
-  @Test
-  public void binaryLong() throws Exception {
-    assertEquals(4 * 3 * 26,
-        deserializer.binary(IOUtils.toInputStream(
-            "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
-            + "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
-            + "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
-            + "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ")).length);
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommonTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommonTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommonTest.java
deleted file mode 100644
index 294283f..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommonTest.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.deserializer.batch;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.olingo.commons.api.http.HttpHeader;
-import org.apache.olingo.server.core.deserializer.batch.BatchParserCommon;
-import org.apache.olingo.server.core.deserializer.batch.Header;
-import org.apache.olingo.server.core.deserializer.batch.Line;
-import org.junit.Test;
-
-public class BatchParserCommonTest {
-
-  private static final String CRLF = "\r\n";
-
-  @Test
-  public void testMultipleHeader() throws Exception {
-    String[] messageRaw = new String[] {
-        "Content-Id: 1" + CRLF,
-        "Content-Id: 2" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> contentIdHeaders = header.getHeaders(BatchParserCommon.HTTP_CONTENT_ID);
-    assertNotNull(contentIdHeaders);
-    assertEquals(2, contentIdHeaders.size());
-    assertEquals("1", contentIdHeaders.get(0));
-    assertEquals("2", contentIdHeaders.get(1));
-  }
-  
-  @Test
-  public void testMultipleHeaderSameValue() throws Exception {
-    String[] messageRaw = new String[] {
-        "Content-Id: 1" + CRLF,
-        "Content-Id: 1" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> contentIdHeaders = header.getHeaders(BatchParserCommon.HTTP_CONTENT_ID);
-    assertNotNull(contentIdHeaders);
-    assertEquals(1, contentIdHeaders.size());
-    assertEquals("1", contentIdHeaders.get(0));
-  }
-  
-  @Test
-  public void testHeaderSperatedByComma() throws Exception {
-    String[] messageRaw = new String[] {
-        "Content-Id: 1" + CRLF,
-        "Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> upgradeHeader = header.getHeaders("upgrade");
-    assertNotNull(upgradeHeader);
-    assertEquals(4, upgradeHeader.size());
-    assertEquals("HTTP/2.0", upgradeHeader.get(0));
-    assertEquals("SHTTP/1.3", upgradeHeader.get(1));
-    assertEquals("IRC/6.9", upgradeHeader.get(2));
-    assertEquals("RTA/x11", upgradeHeader.get(3));
-  }
-  
-  @Test
-  public void testMultipleAcceptHeader() throws Exception {
-    String[] messageRaw = new String[] {
-        "Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1" + CRLF,
-        "Accept: text/plain;q=0.3" + CRLF,
-        "Accept-Language:en-US,en;q=0.7,en-UK;q=0.9" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> acceptHeader = header.getHeaders(HttpHeader.ACCEPT);
-    assertNotNull(acceptHeader);
-    assertEquals(4, acceptHeader.size());
-  }
-  
-  @Test
-  public void testMultipleAcceptHeaderSameValue() throws Exception {
-    String[] messageRaw = new String[] {
-        "Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1" + CRLF,
-        "Accept: application/atomsvc+xml;q=0.8" + CRLF,
-        "Accept-Language:en-US,en;q=0.7,en-UK;q=0.9" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> acceptHeader = header.getHeaders(HttpHeader.ACCEPT);
-    assertNotNull(acceptHeader);
-    assertEquals(3, acceptHeader.size());
-  }
-  
-  @Test
-  public void testMultipleAccepLanguagetHeader() throws Exception {
-    String[] messageRaw = new String[] {
-        "Accept-Language:en-US,en;q=0.7,en-UK;q=0.9" + CRLF,
-        "Accept-Language: de-DE;q=0.3" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> acceptLanguageHeader = header.getHeaders(HttpHeader.ACCEPT_LANGUAGE);
-    assertNotNull(acceptLanguageHeader);
-    assertEquals(4, acceptLanguageHeader.size());
-  }
-  
-  @Test
-  public void testMultipleAccepLanguagetHeaderSameValue() throws Exception {
-    String[] messageRaw = new String[] {
-        "Accept-Language:en-US,en;q=0.7,en-UK;q=0.9" + CRLF,
-        "Accept-Language:en-US,en;q=0.7" + CRLF,
-        "content-type: Application/http" + CRLF,
-        "content-transfer-encoding: Binary" + CRLF
-      };
-    List<Line> message = toLineList(messageRaw);
-    
-    final Header header = BatchParserCommon.consumeHeaders(message);
-    assertNotNull(header);
-    
-    final List<String> acceptLanguageHeader = header.getHeaders(HttpHeader.ACCEPT_LANGUAGE);
-    assertNotNull(acceptLanguageHeader);
-    assertEquals(3, acceptLanguageHeader.size());
-  }
-  
-  @Test
-  public void testRemoveEndingCRLF() {
-    String line = "Test\r\n";
-    assertEquals("Test", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveLastEndingCRLF() {
-    String line = "Test\r\n\r\n";
-    assertEquals("Test\r\n", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveEndingCRLFWithWS() {
-    String line = "Test\r\n            ";
-    assertEquals("Test", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveEndingCRLFNothingToRemove() {
-    String line = "Hallo\r\nBla";
-    assertEquals("Hallo\r\nBla", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveEndingCRLFAll() {
-    String line = "\r\n";
-    assertEquals("", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveEndingCRLFSpace() {
-    String line = "\r\n                      ";
-    assertEquals("", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveLastEndingCRLFWithWS() {
-    String line = "Test            \r\n";
-    assertEquals("Test            ", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-
-  @Test
-  public void testRemoveLastEndingCRLFWithWSLong() {
-    String line = "Test            \r\nTest2    \r\n";
-    assertEquals("Test            \r\nTest2    ", BatchParserCommon.removeEndingCRLF(new Line(line,1)).toString());
-  }
-  
-  private List<Line> toLineList(String[] messageRaw) {
-    final List<Line> lineList = new ArrayList<Line>();
-    int counter = 1;
-    
-    for(final String currentLine : messageRaw) {
-      lineList.add(new Line(currentLine, counter++));
-    }
-    
-    return lineList;
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java
deleted file mode 100644
index 6282742..0000000
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestParserTest.java
+++ /dev/null
@@ -1,1291 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.server.core.deserializer.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 static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.olingo.commons.api.http.HttpHeader;
-import org.apache.olingo.commons.api.http.HttpMethod;
-import org.apache.olingo.server.api.ODataRequest;
-import org.apache.olingo.server.api.batch.exception.BatchDeserializerException;
-import org.apache.olingo.server.api.batch.exception.BatchDeserializerException.MessageKeys;
-import org.apache.olingo.server.api.deserializer.batch.BatchOptions;
-import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart;
-import org.apache.olingo.server.core.deserializer.batch.BatchParser;
-import org.apache.olingo.server.core.deserializer.batch.BatchParserCommon;
-import org.junit.Test;
-
-public class BatchRequestParserTest {
-
-  private static final String SERVICE_ROOT = "http://localhost/odata";
-  private static final String CRLF = "\r\n";
-  private static final String BOUNDARY = "batch_8194-cf13-1f56";
-  private static final String MIME_HEADERS = "Content-Type: application/http" + CRLF
-      + "Content-Transfer-Encoding: binary" + CRLF;
-  private static final String GET_REQUEST = ""
-      + MIME_HEADERS
-      + CRLF
-      + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-      + CRLF
-      + CRLF;
-
-  @Test
-  public void test() throws Exception {
-    final InputStream in = readFile("/batchWithPost.batch");
-    final List<BatchRequestPart> batchRequestParts = parse(in);
-
-    assertNotNull(batchRequestParts);
-    assertFalse(batchRequestParts.isEmpty());
-
-    for (BatchRequestPart object : batchRequestParts) {
-      if (!object.isChangeSet()) {
-        assertEquals(1, object.getRequests().size());
-        ODataRequest retrieveRequest = object.getRequests().get(0);
-        assertEquals(HttpMethod.GET, retrieveRequest.getMethod());
-
-        if (retrieveRequest.getHeaders(HttpHeader.ACCEPT_LANGUAGE) != null) {
-          assertEquals(3, retrieveRequest.getHeaders(HttpHeader.ACCEPT_LANGUAGE).size());
-        }
-
-        assertEquals(SERVICE_ROOT, retrieveRequest.getRawBaseUri());
-        assertEquals("/Employees('2')/EmployeeName", retrieveRequest.getRawODataPath());
-        assertEquals("http://localhost/odata/Employees('2')/EmployeeName?$format=json", retrieveRequest
-            .getRawRequestUri());
-        assertEquals("$format=json", retrieveRequest.getRawQueryPath());
-      } else {
-        List<ODataRequest> requests = object.getRequests();
-        for (ODataRequest request : requests) {
-
-          assertEquals(HttpMethod.PUT, request.getMethod());
-          assertEquals("100000", request.getHeader(HttpHeader.CONTENT_LENGTH));
-          assertEquals("application/json;odata=verbose", request.getHeader(HttpHeader.CONTENT_TYPE));
-
-          List<String> acceptHeader = request.getHeaders(HttpHeader.ACCEPT);
-          assertEquals(3, request.getHeaders(HttpHeader.ACCEPT).size());
-          assertEquals("application/atomsvc+xml;q=0.8", acceptHeader.get(0));
-          assertEquals("*/*;q=0.1", acceptHeader.get(2));
-
-          assertEquals("http://localhost/odata/Employees('2')/EmployeeName", request.getRawRequestUri());
-          assertEquals("http://localhost/odata", request.getRawBaseUri());
-          assertEquals("/Employees('2')/EmployeeName", request.getRawODataPath());
-          assertEquals("", request.getRawQueryPath()); // No query parameter
-        }
-      }
-    }
-  }
-
-  @Test
-  public void testImageInContent() throws Exception {
-    final InputStream contentInputStream = readFile("/batchWithContent.batch");
-    final String content = IOUtils.toString(contentInputStream);
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees?$filter=Age%20gt%2040 HTTP/1.1" + CRLF
-        + "Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + "content-type:     Application/http" + CRLF
-        + "content-transfer-encoding: Binary" + CRLF
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "POST Employees HTTP/1.1" + CRLF
-        + "Content-length: 100000" + CRLF
-        + "Content-type: application/octet-stream" + CRLF
-        + CRLF
-        + content
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + "--batch_8194-cf13-1f56--";
-    final List<BatchRequestPart> BatchRequestParts = parse(batch);
-
-    for (BatchRequestPart part : BatchRequestParts) {
-      if (!part.isChangeSet()) {
-        assertEquals(1, part.getRequests().size());
-        final ODataRequest retrieveRequest = part.getRequests().get(0);
-
-        assertEquals(HttpMethod.GET, retrieveRequest.getMethod());
-        assertEquals("http://localhost/odata/Employees?$filter=Age%20gt%2040", retrieveRequest.getRawRequestUri());
-        assertEquals("http://localhost/odata", retrieveRequest.getRawBaseUri());
-        assertEquals("/Employees", retrieveRequest.getRawODataPath());
-        assertEquals("$filter=Age%20gt%2040", retrieveRequest.getRawQueryPath());
-      } else {
-        final List<ODataRequest> requests = part.getRequests();
-        for (ODataRequest request : requests) {
-          assertEquals(HttpMethod.POST, request.getMethod());
-          assertEquals("100000", request.getHeader(HttpHeader.CONTENT_LENGTH));
-          assertEquals("1", request.getHeader(BatchParserCommon.HTTP_CONTENT_ID));
-          assertEquals("application/octet-stream", request.getHeader(HttpHeader.CONTENT_TYPE));
-
-          final InputStream body = request.getBody();
-          assertEquals(content, IOUtils.toString(body));
-        }
-      }
-    }
-  }
-
-  @Test
-  public void testPostWithoutBody() throws Exception {
-    final String batch = CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: changeRequest1" + CRLF
-        + CRLF
-        + "POST Employees('2') HTTP/1.1" + CRLF
-        + "Content-Length: 100" + CRLF
-        + "Content-Type: application/octet-stream" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-
-    for (BatchRequestPart object : batchRequestParts) {
-      if (object.isChangeSet()) {
-        final List<ODataRequest> requests = object.getRequests();
-
-        for (ODataRequest request : requests) {
-          assertEquals(HttpMethod.POST, request.getMethod());
-          assertEquals("100", request.getHeader(HttpHeader.CONTENT_LENGTH));
-          assertEquals("application/octet-stream", request.getHeader(HttpHeader.CONTENT_TYPE));
-          assertNotNull(request.getBody());
-        }
-      }
-    }
-  }
-  
-  @Test
-  public void testAbsoluteUri() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET http://localhost/odata/Employees('1')/EmployeeName?$top=1 HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-    
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-    
-    assertEquals(1, batchRequestParts.size());
-    final BatchRequestPart part = batchRequestParts.get(0);
-    
-    assertEquals(1, part.getRequests().size());
-    final ODataRequest request = part.getRequests().get(0);
-    
-    assertEquals("/Employees('1')/EmployeeName", request.getRawODataPath());
-    assertEquals("$top=1", request.getRawQueryPath());
-    assertEquals("http://localhost/odata/Employees('1')/EmployeeName?$top=1", request.getRawRequestUri());
-    assertEquals("http://localhost/odata", request.getRawBaseUri());
-  }
-  
-  @Test
-  public void testBoundaryParameterWithQuotas() throws Exception {
-    final String contentType = "multipart/mixed; boundary=\"batch_1.2+34:2j)0?\"";
-    final String boundary = BatchParserCommon.getBoundary(contentType, 0);
-    final String batch = ""
-        + "--batch_1.2+34:2j)0?" + CRLF
-        + GET_REQUEST
-        + "--batch_1.2+34:2j)0?--";
-    final BatchParser parser = new BatchParser();
-    final BatchOptions batchOptions = BatchOptions.with().isStrict(true).rawBaseUri(SERVICE_ROOT).build();
-    final List<BatchRequestPart> batchRequestParts =
-        parser.parseBatchRequest(IOUtils.toInputStream(batch), boundary, batchOptions);
-
-    assertNotNull(batchRequestParts);
-    assertFalse(batchRequestParts.isEmpty());
-  }
-
-  @Test
-  public void testBatchWithInvalidContentType() throws Exception {
-    final String invalidContentType = "multipart;boundary=batch_1740-bb84-2f7f";
-
-    try {
-      BatchParserCommon.getBoundary(invalidContentType, 0);
-      fail();
-    } catch (BatchDeserializerException e) {
-      assertMessageKey(e, BatchDeserializerException.MessageKeys.INVALID_CONTENT_TYPE);
-    }
-  }
-
-  @Test
-  public void testContentTypeCharset() throws Exception {
-    final String contentType = "multipart/mixed; charset=UTF-8;boundary=batch_14d1-b293-b99a";
-    final String boundary = BatchParserCommon.getBoundary(contentType, 0);
-
-    assertEquals("batch_14d1-b293-b99a", boundary);
-  }
-
-  @Test
-  public void testBatchWithoutBoundaryParameter() throws Exception {
-    final String invalidContentType = "multipart/mixed";
-
-    try {
-      BatchParserCommon.getBoundary(invalidContentType, 0);
-      fail();
-    } catch (BatchDeserializerException e) {
-      assertMessageKey(e, BatchDeserializerException.MessageKeys.INVALID_CONTENT_TYPE);
-    }
-  }
-
-  @Test
-  public void testBoundaryParameterWithoutQuota() throws Exception {
-    final String invalidContentType = "multipart/mixed;boundary=batch_1740-bb:84-2f7f";
-
-    try {
-      BatchParserCommon.getBoundary(invalidContentType, 0);
-      fail();
-    } catch (BatchDeserializerException e) {
-      assertMessageKey(e, BatchDeserializerException.MessageKeys.INVALID_BOUNDARY);
-    }
-  }
-
-  @Test
-  public void testWrongBoundaryString() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f5" + CRLF
-        + GET_REQUEST
-        + "--batch_8194-cf13-1f56--";
-
-    final List<BatchRequestPart> parts = parse(batch);
-    assertEquals(0, parts.size());
-  }
-
-  @Test
-  public void testMissingHttpVersion() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding:binary" + CRLF
-        + CRLF
-        + "GET Employees?$format=json" + CRLF
-        + "Host: localhost:8080" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_STATUS_LINE);
-  }
-
-  @Test
-  public void testMissingHttpVersion2() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding:binary" + CRLF
-        + CRLF
-        + "GET Employees?$format=json " + CRLF
-        + "Host: localhost:8080" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_HTTP_VERSION);
-  }
-
-  @Test
-  public void testMissingHttpVersion3() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding:binary" + CRLF
-        + CRLF
-        + "GET Employees?$format=json SMTP:3.1" + CRLF
-        + "Host: localhost:8080" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_HTTP_VERSION);
-  }
-
-  @Test
-  public void testBoundaryWithoutHyphen() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + GET_REQUEST
-        + "batch_8194-cf13-1f56" + CRLF
-        + GET_REQUEST
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_CONTENT);
-  }
-
-  @Test
-  public void testNoBoundaryString() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + GET_REQUEST
-        // + no boundary string
-        + GET_REQUEST
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_CONTENT);
-  }
-
-  @Test
-  public void testBatchBoundaryEqualsChangeSetBoundary() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=batch_8194-cf13-1f56" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "PUT Employees('2')/EmployeeName HTTP/1.1" + CRLF
-        + "Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Frederic Fall MODIFIED\"}" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--"
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_BLANK_LINE);
-  }
-
-  @Test
-  public void testNoContentType() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CONTENT_TYPE);
-  }
-
-  @Test
-  public void testMimeHeaderContentType() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: text/plain" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_CONTENT_TYPE);
-  }
-
-  @Test
-  public void testMimeHeaderEncoding() throws Exception {
-    String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: 8bit" + CRLF
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_CONTENT_TRANSFER_ENCODING);
-  }
-
-  @Test
-  public void testGetRequestMissingCRLF() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        // + CRLF // Belongs to the GET request
-        + CRLF // Belongs to the
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_BLANK_LINE);
-  }
-
-  @Test
-  public void testInvalidMethodForBatch() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "POST Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_QUERY_OPERATION_METHOD);
-  }
-
-  @Test
-  public void testNoBoundaryFound() throws Exception {
-    final String batch = "batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "POST Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF;
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CLOSE_DELIMITER);
-  }
-
-  @Test
-  public void testEmptyRequest() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56--";
-
-    final List<BatchRequestPart> parts = parse(batch);
-    assertEquals(0, parts.size());
-  }
-
-  @Test
-  public void testBadRequest() throws Exception {
-    final String batch = "This is a bad request. There is no syntax and also no semantic";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CLOSE_DELIMITER);
-  }
-
-  @Test
-  public void testNoMethod() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + /* GET */"Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_STATUS_LINE);
-  }
-
-  @Test
-  public void testInvalidMethodForChangeset() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "GET Employees('2')/EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--"
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_CHANGESET_METHOD);
-  }
-
-  @Test
-  public void testInvalidChangeSetBoundary() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94d"/* +"d" */+ CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "POST Employees('2') HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    final List<BatchRequestPart> parts = parse(batch);
-    assertEquals(1, parts.size());
-
-    final BatchRequestPart part = parts.get(0);
-    assertTrue(part.isChangeSet());
-    assertEquals(0, part.getRequests().size());
-  }
-
-  @Test
-  public void testNestedChangeset() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_f980-1cb6-94dd2" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd2" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "POST Employees('2') HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF        + "MaxDataServiceVersion: 2.0" + CRLF
-        + "Content-Id: 2"
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_CONTENT_TYPE);
-  }
-
-  @Test
-  public void testMissingContentTransferEncoding() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + "Content-Id: 1" + CRLF
-        + "Content-Type: application/http" + CRLF
-        // + "Content-Transfer-Encoding: binary" + CRLF
-        + CRLF
-        + "POST Employees('2') HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CONTENT_TRANSFER_ENCODING);
-  }
-
-  @Test
-  public void testMissingContentType() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + "Content-Id: 1"
-        // + "Content-Type: application/http" + CRLF
-        + "Content-Transfer-Encoding: binary" + CRLF
-        + CRLF
-        + "POST Employees('2') HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CONTENT_TYPE);
-  }
-
-  @Test
-  public void testNoCloseDelimiter() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + GET_REQUEST;
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CLOSE_DELIMITER);
-  }
-
-  @Test
-  public void testNoCloseDelimiter2() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF;
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CLOSE_DELIMITER);
-  }
-
-  @Test
-  public void testUriWithAbsolutePath() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET /odata/Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Host: http://localhost" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_URI);
-  }
-
-  @Test
-  public void testUriWithAbsolutePathMissingHostHeader() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET /odata/Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.INVALID_URI);
-  }
-
-  @Test
-  public void testUriWithAbsolutePathOtherHost() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET /odata/Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Host: http://localhost2" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.INVALID_URI);
-  }
-
-  @Test
-  public void testUriWithAbsolutePathWrongPath() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET /myservice/Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Host: http://localhost" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.INVALID_URI);
-  }
-
-  @Test
-  public void testNoCloseDelimiter3() throws Exception {
-    final String batch = "--batch_8194-cf13-1f56" + CRLF + GET_REQUEST + "--batch_8194-cf13-1f56-"/* no hyphen */;
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.MISSING_CLOSE_DELIMITER);
-  }
-
-  @Test
-  public void testNegativeContentLengthChangeSet() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + "Content-Length: -2" + CRLF
-        + CRLF
-        + "PUT EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parse(batch);
-  }
-
-  @Test
-  public void testNegativeContentLengthRequest() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "PUT EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "Content-Id: 1" + CRLF
-        + "Content-Length: 2" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parse(batch);
-  }
-
-  @Test
-  public void testContentLengthGreatherThanBodyLength() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "PUT Employee/Name HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "Content-Length: 100000" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-
-    assertNotNull(batchRequestParts);
-
-    for (BatchRequestPart multipart : batchRequestParts) {
-      if (multipart.isChangeSet()) {
-        assertEquals(1, multipart.getRequests().size());
-
-        final ODataRequest request = multipart.getRequests().get(0);
-        assertEquals("{\"EmployeeName\":\"Peter Fall\"}", IOUtils.toString(request.getBody()));
-      }
-    }
-  }
-
-  @Test
-  public void testContentLengthSmallerThanBodyLength() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "PUT EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "Content-Length: 10" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-
-    assertNotNull(batchRequestParts);
-
-    for (BatchRequestPart multipart : batchRequestParts) {
-      if (multipart.isChangeSet()) {
-        assertEquals(1, multipart.getRequests().size());
-
-        final ODataRequest request = multipart.getRequests().get(0);
-        assertEquals("{\"Employee", IOUtils.toString(request.getBody()));
-      }
-    }
-  }
-
-  @Test
-  public void testNonNumericContentLength() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "PUT EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "Content-Length: 10abc" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_HEADER);
-  }
-
-  @Test
-  public void testNonStrictParser() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_8194-cf13-1f56" + CRLF
-        + "--changeset_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: myRequest" + CRLF
-        + "PUT Employees('2')/EmployeeName HTTP/1.1" + CRLF
-        + "Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + "{\"EmployeeName\":\"Frederic Fall MODIFIED\"}" + CRLF
-        + "--changeset_8194-cf13-1f56--" + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    final List<BatchRequestPart> requests = parse(batch, false);
-
-    assertNotNull(requests);
-    assertEquals(1, requests.size());
-
-    final BatchRequestPart part = requests.get(0);
-    assertTrue(part.isChangeSet());
-    assertNotNull(part.getRequests());
-    assertEquals(1, part.getRequests().size());
-
-    final ODataRequest changeRequest = part.getRequests().get(0);
-    assertEquals("{\"EmployeeName\":\"Frederic Fall MODIFIED\"}",
-        IOUtils.toString(changeRequest.getBody()));
-    assertEquals("application/json;odata=verbose", changeRequest.getHeader(HttpHeader.CONTENT_TYPE));
-    assertEquals(HttpMethod.PUT, changeRequest.getMethod());
-  }
-
-  @Test
-  public void testNonStrictParserMoreCRLF() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed;boundary=changeset_8194-cf13-1f56" + CRLF
-        + "--changeset_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + CRLF // Only one CRLF allowed
-        + "PUT Employees('2')/EmployeeName HTTP/1.1" + CRLF
-        + "Accept: application/atomsvc+xml;q=0.8, application/json;odata=verbose;q=0.5, */*;q=0.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "MaxDataServiceVersion: 2.0" + CRLF
-        + "{\"EmployeeName\":\"Frederic Fall MODIFIED\"}" + CRLF
-        + "--changeset_8194-cf13-1f56--" + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, BatchDeserializerException.MessageKeys.INVALID_STATUS_LINE, false);
-  }
-
-  @Test
-  public void testContentId() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees HTTP/1.1" + CRLF
-        + "accept: */*,application/atom+xml,application/atomsvc+xml,application/xml" + CRLF
-        + "Content-Id: BBB" + CRLF
-        + CRLF + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "POST Employees HTTP/1.1" + CRLF
-        + "Content-type: application/octet-stream" + CRLF
-        + CRLF
-        + "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAA" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "PUT $1/EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + "Content-Id: 2" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-    assertNotNull(batchRequestParts);
-
-    for (BatchRequestPart multipart : batchRequestParts) {
-      if (!multipart.isChangeSet()) {
-        assertEquals(1, multipart.getRequests().size());
-        final ODataRequest retrieveRequest = multipart.getRequests().get(0);
-
-        assertEquals("BBB", retrieveRequest.getHeader(BatchParserCommon.HTTP_CONTENT_ID));
-      } else {
-        for (ODataRequest request : multipart.getRequests()) {
-          if (HttpMethod.POST.equals(request.getMethod())) {
-            assertEquals("1", request.getHeader(BatchParserCommon.HTTP_CONTENT_ID));
-          } else if (HttpMethod.PUT.equals(request.getMethod())) {
-            assertEquals("2", request.getHeader(BatchParserCommon.HTTP_CONTENT_ID));
-            assertEquals("/$1/EmployeeName", request.getRawODataPath());
-            assertEquals("http://localhost/odata/$1/EmployeeName", request.getRawRequestUri());
-          }
-        }
-      }
-    }
-  }
-
-  @Test
-  public void testNoContentId() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees HTTP/1.1" + CRLF
-        + "accept: */*,application/atom+xml,application/atomsvc+xml,application/xml" + CRLF
-        + CRLF + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "POST Employees HTTP/1.1" + CRLF
-        + "Content-type: application/octet-stream" + CRLF
-        + CRLF
-        + "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAA" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "PUT $1/EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parse(batch);
-  }
-
-  @Test
-  public void testPreamble() throws Exception {
-    final String batch = ""
-        + "This is a preamble and must be ignored" + CRLF
-        + CRLF
-        + CRLF
-        + "----1242" + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees HTTP/1.1" + CRLF
-        + "accept: */*,application/atom+xml,application/atomsvc+xml,application/xml" + CRLF
-        + "Content-Id: BBB" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "This is a preamble and must be ignored" + CRLF
-        + CRLF
-        + CRLF
-        + "----1242" + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "POST Employees HTTP/1.1" + CRLF
-        + "Content-type: application/octet-stream" + CRLF
-        + CRLF
-        + "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAA" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 2" + CRLF
-        + CRLF
-        + "PUT $1/EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-
-    assertNotNull(batchRequestParts);
-    assertEquals(2, batchRequestParts.size());
-
-    final BatchRequestPart getRequestPart = batchRequestParts.get(0);
-    assertEquals(1, getRequestPart.getRequests().size());
-
-    final ODataRequest getRequest = getRequestPart.getRequests().get(0);
-    assertEquals(HttpMethod.GET, getRequest.getMethod());
-
-    final BatchRequestPart changeSetPart = batchRequestParts.get(1);
-    assertEquals(2, changeSetPart.getRequests().size());
-    assertEquals("/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAA"
-        + CRLF,
-        IOUtils.toString(changeSetPart.getRequests().get(0).getBody()));
-    assertEquals("{\"EmployeeName\":\"Peter Fall\"}",
-        IOUtils.toString(changeSetPart.getRequests().get(1).getBody()));
-  }
-
-  @Test
-  public void testContentTypeCaseInsensitive() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: muLTiParT/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + "Content-Length: 200" + CRLF
-        + CRLF
-        + "PUT EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parse(batch);
-  }
-
-  @Test
-  public void testContentTypeBoundaryCaseInsensitive() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; bOunDaRy=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 1" + CRLF
-        + CRLF
-        + "PUT EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-
-    assertNotNull(batchRequestParts);
-    assertEquals(1, batchRequestParts.size());
-    assertTrue(batchRequestParts.get(0).isChangeSet());
-    assertEquals(1, batchRequestParts.get(0).getRequests().size());
-  }
-
-  @Test
-  public void testEpilog() throws Exception {
-    String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees HTTP/1.1" + CRLF
-        + "accept: */*,application/atom+xml,application/atomsvc+xml,application/xml" + CRLF
-        + "Content-Id: BBB" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56" + CRLF
-        + "Content-Type: multipart/mixed; boundary=changeset_f980-1cb6-94dd" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-Id: 1" + CRLF
-        + CRLF
-        + "POST Employees HTTP/1.1" + CRLF
-        + "Content-type: application/octet-stream" + CRLF
-        + CRLF
-        + "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAA" + CRLF
-        + CRLF
-        + "--changeset_f980-1cb6-94dd" + CRLF
-        + MIME_HEADERS
-        + "Content-ID: 2" + CRLF
-        + CRLF
-        + "PUT $1/EmployeeName HTTP/1.1" + CRLF
-        + "Content-Type: application/json;odata=verbose" + CRLF
-        + CRLF
-        + "{\"EmployeeName\":\"Peter Fall\"}" + CRLF
-        + "--changeset_f980-1cb6-94dd--" + CRLF
-        + CRLF
-        + "This is an epilog and must be ignored" + CRLF
-        + CRLF
-        + CRLF
-        + "----1242"
-        + CRLF
-        + "--batch_8194-cf13-1f56--"
-        + CRLF
-        + "This is an epilog and must be ignored" + CRLF
-        + CRLF
-        + CRLF
-        + "----1242";
-    final List<BatchRequestPart> batchRequestParts = parse(batch);
-
-    assertNotNull(batchRequestParts);
-    assertEquals(2, batchRequestParts.size());
-
-    BatchRequestPart getRequestPart = batchRequestParts.get(0);
-    assertEquals(1, getRequestPart.getRequests().size());
-    ODataRequest getRequest = getRequestPart.getRequests().get(0);
-    assertEquals(HttpMethod.GET, getRequest.getMethod());
-
-    BatchRequestPart changeSetPart = batchRequestParts.get(1);
-    assertEquals(2, changeSetPart.getRequests().size());
-    assertEquals("/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAA"
-        + CRLF,
-        IOUtils.toString(changeSetPart.getRequests().get(0).getBody()));
-    assertEquals("{\"EmployeeName\":\"Peter Fall\"}",
-        IOUtils.toString(changeSetPart.getRequests().get(1).getBody()));
-  }
-
-  @Test
-  public void testLargeBatch() throws Exception {
-    final InputStream in = readFile("/batchLarge.batch");
-    parse(in);
-  }
-
-  @Test
-  public void testForddenHeaderAuthorisation() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Authorization: Basic QWxhZdsdsddsduIHNlc2FtZQ==" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.FORBIDDEN_HEADER);
-  }
-
-  @Test
-  public void testForddenHeaderExpect() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Expect: 100-continue" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.FORBIDDEN_HEADER);
-  }
-
-  @Test
-  public void testForddenHeaderFrom() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "From: test@test.com" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.FORBIDDEN_HEADER);
-  }
-
-  @Test
-  public void testForddenHeaderRange() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Range: 200-256" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.FORBIDDEN_HEADER);
-  }
-
-  @Test
-  public void testForddenHeaderMaxForwards() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "Max-Forwards: 3" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.FORBIDDEN_HEADER);
-  }
-
-  @Test
-  public void testForddenHeaderTE() throws Exception {
-    final String batch = ""
-        + "--batch_8194-cf13-1f56" + CRLF
-        + MIME_HEADERS
-        + CRLF
-        + "GET Employees('1')/EmployeeName HTTP/1.1" + CRLF
-        + "TE: deflate" + CRLF
-        + CRLF
-        + CRLF
-        + "--batch_8194-cf13-1f56--";
-
-    parseInvalidBatchBody(batch, MessageKeys.FORBIDDEN_HEADER);
-  }
-
-  private List<BatchRequestPart> parse(final InputStream in, final boolean isStrict) throws Exception {
-    final BatchParser parser = new BatchParser();
-    final BatchOptions options = BatchOptions.with().isStrict(isStrict).rawBaseUri(SERVICE_ROOT).build();
-    final List<BatchRequestPart> batchRequestParts =
-        parser.parseBatchRequest(in, BOUNDARY, options);
-
-    assertNotNull(batchRequestParts);
-
-    return batchRequestParts;
-  }
-
-  private List<BatchRequestPart> parse(final InputStream in) throws Exception {
-    return parse(in, true);
-  }
-
-  private List<BatchRequestPart> parse(final String batch) throws Exception {
-    return parse(batch, true);
-  }
-
-  private List<BatchRequestPart> parse(final String batch, final boolean isStrict) throws Exception {
-    return parse(IOUtils.toInputStream(batch), isStrict);
-  }
-
-  private void parseInvalidBatchBody(final String batch, final MessageKeys key, final boolean isStrict)
-      throws Exception {
-    final BatchParser parser = new BatchParser();
-    final BatchOptions options = BatchOptions.with().isStrict(isStrict).rawBaseUri(SERVICE_ROOT).build();
-    try {
-      parser.parseBatchRequest(IOUtils.toInputStream(batch), BOUNDARY, options);
-      fail("No exception thrown. Expect: " + key.toString());
-    } catch (BatchDeserializerException e) {
-      assertMessageKey(e, key);
-    }
-  }
-
-  private void parseInvalidBatchBody(final String batch, final MessageKeys key) throws Exception {
-    parseInvalidBatchBody(batch, key, true);
-  }
-
-  private void assertMessageKey(final BatchDeserializerException e, final MessageKeys key) {
-    assertEquals(key, e.getMessageKey());
-  }
-
-  private InputStream readFile(final String fileName) throws Exception {
-    final InputStream in = ClassLoader.class.getResourceAsStream(fileName);
-    if (in == null) {
-      throw new IOException("Requested file '" + fileName + "' was not found.");
-    }
-    return in;
-  }
-}