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: [email protected]" + 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; - } -}
