blob: 23ab4ea1f8621540a12ddd407c5959292a46218d [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata2.core.batch;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata2.api.batch.BatchResponsePart;
import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse;
import org.apache.olingo.odata2.api.commons.HttpHeaders;
import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
import org.apache.olingo.odata2.api.processor.ODataResponse;
import org.apache.olingo.odata2.core.batch.v2.BatchParser;
import org.apache.olingo.odata2.core.commons.ContentType;
import org.apache.olingo.odata2.testutil.helper.StringHelper;
import org.junit.Test;
public class BatchResponseWriterITTest {
@Test
public void testSimpleRequest() throws Exception {
// Create batch response
List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
ODataResponse response =
ODataResponse.entity("Walter Winter").status(HttpStatusCodes.OK).contentHeader("application/json").build();
List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
responses.add(response);
parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
BatchResponseWriter writer = new BatchResponseWriter();
ODataResponse batchResponse = writer.writeResponse(parts);
assertEquals(202, batchResponse.getStatus().getStatusCode());
assertNotNull(batchResponse.getEntity());
String body = (String) batchResponse.getEntity();
// Get boundary
int lineEndingIndex = body.indexOf("\r\n");
String boundary = body.substring(2, lineEndingIndex);
// Parse response and test outputs
final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
for (BatchSingleResponse parserResponse : parserResponses) {
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("13", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Walter Winter", parserResponse.getBody());
}
}
@Test
public void testNoContent() throws Exception {
// Create batch response
List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
ODataResponse response =
ODataResponse.status(HttpStatusCodes.NO_CONTENT).build();
List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
responses.add(response);
parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
BatchResponseWriter writer = new BatchResponseWriter();
ODataResponse batchResponse = writer.writeResponse(parts);
assertEquals(202, batchResponse.getStatus().getStatusCode());
assertNotNull(batchResponse.getEntity());
String body = (String) batchResponse.getEntity();
// Get boundary
int lineEndingIndex = body.indexOf("\r\n");
String boundary = body.substring(2, lineEndingIndex);
// Parse response and test outputs
final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
for (BatchSingleResponse parserResponse : parserResponses) {
assertEquals("204", parserResponse.getStatusCode());
assertEquals("No Content", parserResponse.getStatusInfo());
}
}
@Test
public void testChangeSet() throws Exception {
List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
ODataResponse response = ODataResponse.entity("Walter Winter")
.status(HttpStatusCodes.OK)
.contentHeader("application/json")
.build();
List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
responses.add(response);
parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
ODataResponse changeSetResponse =
ODataResponse.status(HttpStatusCodes.NO_CONTENT).header(BatchHelper.MIME_HEADER_CONTENT_ID, "1").build();
responses = new ArrayList<ODataResponse>(2);
ODataResponse changeSetResponseEntity =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test\r\n").build();
ODataResponse changeSetResponseEntity2 =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test\n").build();
ODataResponse changeSetResponseEntity3 =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test").build();
responses.add(changeSetResponse);
responses.add(changeSetResponseEntity);
responses.add(changeSetResponseEntity2);
responses.add(changeSetResponseEntity3);
parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
BatchResponseWriter writer = new BatchResponseWriter();
ODataResponse batchResponse = writer.writeResponse(parts);
assertEquals(202, batchResponse.getStatus().getStatusCode());
assertNotNull(batchResponse.getEntity());
String body = (String) batchResponse.getEntity();
// Get boundary
int lineEndingIndex = body.indexOf("\r\n");
String boundary = body.substring(2, lineEndingIndex);
// Parse response and test outputs
final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(new ByteArrayInputStream(body.getBytes()));
assertEquals(5, parserResponses.size());
BatchSingleResponse parserResponse = parserResponses.get(0);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("13", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Walter Winter", parserResponse.getBody());
parserResponse = parserResponses.get(1);
assertEquals("204", parserResponse.getStatusCode());
assertEquals("1", parserResponse.getContentId());
assertEquals("No Content", parserResponse.getStatusInfo());
parserResponse = parserResponses.get(2);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("6", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test\r\n", parserResponse.getBody());
parserResponse = parserResponses.get(3);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("5", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test\n", parserResponse.getBody());
parserResponse = parserResponses.get(4);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test", parserResponse.getBody());
}
@Test
public void testChangeSetUtf() throws Exception {
List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
String charset= "utf-8";
StringHelper.Stream stream = StringHelper.toStream("Wälter Wünter", charset);
ODataResponse response = ODataResponse.entity(stream.asStream())
.status(HttpStatusCodes.OK)
.contentHeader("application/json; charset=" + charset)
.build();
List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
responses.add(response);
parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
ODataResponse changeSetResponse =
ODataResponse.status(HttpStatusCodes.NO_CONTENT).header(BatchHelper.MIME_HEADER_CONTENT_ID, "1").build();
responses = new ArrayList<ODataResponse>(2);
ODataResponse changeSetResponseEntity =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test\r\n").build();
ODataResponse changeSetResponseEntity2 =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test\n").build();
ODataResponse changeSetResponseEntity3 =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test").build();
responses.add(changeSetResponse);
responses.add(changeSetResponseEntity);
responses.add(changeSetResponseEntity2);
responses.add(changeSetResponseEntity3);
parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
BatchResponseWriter writer = new BatchResponseWriter(true);
ODataResponse batchResponse = writer.writeResponse(parts);
assertEquals(202, batchResponse.getStatus().getStatusCode());
StringHelper.Stream responseStream = StringHelper.toStream(batchResponse.getEntityAsStream());
String body = responseStream.asString(charset);
// Get boundary
int lineEndingIndex = body.indexOf("\r\n");
String boundary = body.substring(2, lineEndingIndex);
// Parse response and test outputs
final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(responseStream.asStream());
assertEquals(5, parserResponses.size());
BatchSingleResponse parserResponse = parserResponses.get(0);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json; charset=" + charset, parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("15", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Wälter Wünter", parserResponse.getBody());
parserResponse = parserResponses.get(1);
assertEquals("204", parserResponse.getStatusCode());
assertEquals("1", parserResponse.getContentId());
assertEquals("No Content", parserResponse.getStatusInfo());
parserResponse = parserResponses.get(2);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("6", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test\r\n", parserResponse.getBody());
parserResponse = parserResponses.get(3);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("5", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test\n", parserResponse.getBody());
parserResponse = parserResponses.get(4);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test", parserResponse.getBody());
}
@Test
public void testChangeSetIso() throws Exception {
List<BatchResponsePart> parts = new ArrayList<BatchResponsePart>();
String charset= "iso-8859-1";
StringHelper.Stream stream = StringHelper.toStream("Wälter Wünter", charset);
ODataResponse response = ODataResponse.entity(stream.asStream())
.status(HttpStatusCodes.OK)
.contentHeader("application/json; charset=" + charset)
.build();
List<ODataResponse> responses = new ArrayList<ODataResponse>(1);
responses.add(response);
parts.add(BatchResponsePart.responses(responses).changeSet(false).build());
ODataResponse changeSetResponse =
ODataResponse.status(HttpStatusCodes.NO_CONTENT).header(BatchHelper.MIME_HEADER_CONTENT_ID, "1").build();
responses = new ArrayList<ODataResponse>(2);
ODataResponse changeSetResponseEntity =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test\r\n").build();
ODataResponse changeSetResponseEntity2 =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test\n").build();
ODataResponse changeSetResponseEntity3 =
ODataResponse.status(HttpStatusCodes.OK).contentHeader(ContentType.APPLICATION_JSON.toContentTypeString())
.header(BatchHelper.MIME_HEADER_CONTENT_ID, "2")
.entity("Test").build();
responses.add(changeSetResponse);
responses.add(changeSetResponseEntity);
responses.add(changeSetResponseEntity2);
responses.add(changeSetResponseEntity3);
parts.add(BatchResponsePart.responses(responses).changeSet(true).build());
BatchResponseWriter writer = new BatchResponseWriter(true);
ODataResponse batchResponse = writer.writeResponse(parts);
assertEquals(202, batchResponse.getStatus().getStatusCode());
StringHelper.Stream responseStream = StringHelper.toStream(batchResponse.getEntityAsStream());
String body = responseStream.asString(charset);
// Get boundary
int lineEndingIndex = body.indexOf("\r\n");
String boundary = body.substring(2, lineEndingIndex);
// Parse response and test outputs
final BatchParser parser = new BatchParser("multipart/mixed;boundary=" + boundary, true);
List<BatchSingleResponse> parserResponses = parser.parseBatchResponse(responseStream.asStream());
assertEquals(5, parserResponses.size());
BatchSingleResponse parserResponse = parserResponses.get(0);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json; charset=" + charset, parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("13", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Wälter Wünter", parserResponse.getBody());
parserResponse = parserResponses.get(1);
assertEquals("204", parserResponse.getStatusCode());
assertEquals("1", parserResponse.getContentId());
assertEquals("No Content", parserResponse.getStatusInfo());
parserResponse = parserResponses.get(2);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("6", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test\r\n", parserResponse.getBody());
parserResponse = parserResponses.get(3);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("5", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test\n", parserResponse.getBody());
parserResponse = parserResponses.get(4);
assertEquals("200", parserResponse.getStatusCode());
assertEquals("OK", parserResponse.getStatusInfo());
assertEquals("application/json", parserResponse.getHeaders().get(HttpHeaders.CONTENT_TYPE));
assertEquals("4", parserResponse.getHeaders().get(HttpHeaders.CONTENT_LENGTH));
assertEquals("Test", parserResponse.getBody());
}
}