Fit Tests
Signed-off-by: Christian Amend <chrisam@apache.org>
This commit is contained in:
parent
5f18ea2e09
commit
aab7eaf6e3
|
@ -192,6 +192,65 @@ public class BatchClientITCase extends AbstractTestITCase {
|
|||
assertFalse(iter.hasNext());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidAbsoluteUri() throws URISyntaxException {
|
||||
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
|
||||
request.setAccept(ACCEPT);
|
||||
|
||||
final BatchManager payload = request.payloadManager();
|
||||
final URI uri = new URI(SERVICE_URI + "/../ESAllPrim(32767)");
|
||||
final ODataEntityRequest<ODataEntity> queryReq = client.getRetrieveRequestFactory().getEntityRequest(uri);
|
||||
queryReq.setFormat(ODataFormat.JSON);
|
||||
payload.addRequest(queryReq);
|
||||
|
||||
// Fetch result
|
||||
final ODataBatchResponse response = payload.getResponse();
|
||||
assertEquals(202, response.getStatusCode());
|
||||
|
||||
final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
|
||||
assertTrue(bodyIterator.hasNext());
|
||||
|
||||
ODataBatchResponseItem item = bodyIterator.next();
|
||||
assertFalse(item.isChangeset());
|
||||
|
||||
final ODataResponse oDataResponse = item.next();
|
||||
assertEquals(400, oDataResponse.getStatusCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void testInvalidHost() throws URISyntaxException {
|
||||
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
|
||||
request.setAccept(ACCEPT);
|
||||
|
||||
final BatchManager payload = request.payloadManager();
|
||||
final URI uri = new URI("http://otherhost/odata/ESAllPrim(32767)");
|
||||
final ODataEntityRequest<ODataEntity> queryReq = client.getRetrieveRequestFactory().getEntityRequest(uri);
|
||||
queryReq.setFormat(ODataFormat.JSON);
|
||||
payload.addRequest(queryReq);
|
||||
|
||||
// Fetch result
|
||||
final ODataBatchResponse response = payload.getResponse();
|
||||
assertEquals(400, response.getStatusCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void testInvalidAbsoluteRequest() throws URISyntaxException {
|
||||
final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI);
|
||||
request.setAccept(ACCEPT);
|
||||
|
||||
final BatchManager payload = request.payloadManager();
|
||||
final URI uri = new URI("/ESAllPrim(32767)");
|
||||
final ODataEntityRequest<ODataEntity> queryReq = client.getRetrieveRequestFactory().getEntityRequest(uri);
|
||||
queryReq.setFormat(ODataFormat.JSON);
|
||||
payload.addRequest(queryReq);
|
||||
|
||||
// Fetch result
|
||||
final ODataBatchResponse response = payload.getResponse();
|
||||
assertEquals(400, response.getStatusCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testErrorWithContinueOnErrorPreferHeader() throws URISyntaxException {
|
||||
client.getConfiguration().setContinueOnError(true);
|
||||
|
|
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
* 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.fit.tecsvc.http;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.ProtocolException;
|
||||
import java.net.URL;
|
||||
|
||||
import org.apache.olingo.client.api.CommonODataClient;
|
||||
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.fit.AbstractBaseTestITCase;
|
||||
import org.apache.olingo.fit.tecsvc.TecSvcConst;
|
||||
import org.junit.Test;
|
||||
|
||||
public class BasicBatchITCase extends AbstractBaseTestITCase {
|
||||
|
||||
private static final String HEADER_CONTENT_TRANSFER_ENCODING_BINARY = "Content-Transfer-Encoding: binary";
|
||||
private static final String HEADER_CONTENT_TYPE_HTTP = "Content-Type: application/http";
|
||||
private static final String SERVICE_URI = TecSvcConst.BASE_URI + "/";
|
||||
private static final String CONTENT_TYPE_HEADER_VALUE = " multipart/mixed;boundary=batch_123";
|
||||
private static final String CRLF = "\r\n";
|
||||
private static final String ACCEPT_HEADER_VALUE = "application/json";
|
||||
|
||||
@Test
|
||||
public void test() throws IOException {
|
||||
final String content = getRequest("ESAllPrim(32767)");
|
||||
final HttpURLConnection connection = batch(content);
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
|
||||
assertTrue(reader.readLine().contains("batch_"));
|
||||
checkMimeHeader(reader);
|
||||
blankLine(reader);
|
||||
|
||||
assertEquals("HTTP/1.1 200 OK", reader.readLine());
|
||||
assertEquals("OData-Version: 4.0", reader.readLine());
|
||||
assertEquals("Content-Type: application/json;odata.metadata=minimal", reader.readLine());
|
||||
assertEquals("Content-Length: 538", reader.readLine());
|
||||
blankLine(reader);
|
||||
|
||||
reader.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidRelativeURI() throws IOException {
|
||||
final String content = getRequest("/ESAllPrim(32767)");
|
||||
batchFail(content);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidAbsoluteURI() throws IOException {
|
||||
final String content = getRequest(SERVICE_URI + "../ESAllPrim(32767)");
|
||||
HttpURLConnection connection = batch(content);
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
|
||||
assertTrue(reader.readLine().contains("batch_"));
|
||||
checkMimeHeader(reader);
|
||||
blankLine(reader);
|
||||
|
||||
assertEquals("HTTP/1.1 400 Bad Request", reader.readLine());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testNestedAbsoluteRequest() throws IOException {
|
||||
final String content = getRequest(SERVICE_URI + SERVICE_URI + "../ESAllPrim(32767)");
|
||||
HttpURLConnection connection = batch(content);
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
|
||||
assertTrue(reader.readLine().contains("batch_"));
|
||||
checkMimeHeader(reader);
|
||||
blankLine(reader);
|
||||
|
||||
assertEquals("HTTP/1.1 400 Bad Request", reader.readLine());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidHost() throws IOException {
|
||||
final String content = getRequest("http://otherhost/odata/odata.svc/ESAllPrim(32767)");
|
||||
batchFail(content);
|
||||
}
|
||||
|
||||
private void checkMimeHeader(final BufferedReader reader) throws IOException {
|
||||
assertEquals(HEADER_CONTENT_TYPE_HTTP, reader.readLine());
|
||||
assertEquals(HEADER_CONTENT_TRANSFER_ENCODING_BINARY, reader.readLine());
|
||||
}
|
||||
|
||||
private void blankLine(BufferedReader reader) throws IOException {
|
||||
assertEquals("", reader.readLine()); // CRLF becomes to an empty string
|
||||
}
|
||||
|
||||
private String getRequest(String uri) {
|
||||
return "--batch_123" + CRLF
|
||||
+ HEADER_CONTENT_TRANSFER_ENCODING_BINARY + CRLF
|
||||
+ HEADER_CONTENT_TYPE_HTTP + CRLF
|
||||
+ CRLF
|
||||
+ "GET " + uri + " HTTP/1.1" + CRLF
|
||||
+ CRLF
|
||||
+ CRLF
|
||||
+ "--batch_123--";
|
||||
}
|
||||
|
||||
private HttpURLConnection batch(final String content) throws IOException {
|
||||
final HttpURLConnection connection = getConnection(content);
|
||||
|
||||
assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), connection.getResponseCode());
|
||||
|
||||
return connection;
|
||||
}
|
||||
|
||||
private HttpURLConnection batchFail(String content) throws IOException {
|
||||
final HttpURLConnection connection = getConnection(content);
|
||||
|
||||
assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(), connection.getResponseCode());
|
||||
|
||||
return connection; }
|
||||
|
||||
private HttpURLConnection getConnection(String content) throws MalformedURLException, IOException, ProtocolException {
|
||||
final URL url = new URL(SERVICE_URI + "$batch");
|
||||
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestMethod(HttpMethod.POST.toString());
|
||||
connection.setRequestProperty(HttpHeader.CONTENT_TYPE, CONTENT_TYPE_HEADER_VALUE);
|
||||
connection.setRequestProperty(HttpHeader.ACCEPT, ACCEPT_HEADER_VALUE);
|
||||
connection.setDoOutput(true);
|
||||
final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
|
||||
writer.append(content);
|
||||
writer.close();
|
||||
connection.connect();
|
||||
return connection;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CommonODataClient<?> getClient() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -18,7 +18,9 @@
|
|||
*/
|
||||
package org.apache.olingo.server.api.batch.exception;
|
||||
|
||||
public class BatchDeserializerException extends BatchException {
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException;
|
||||
|
||||
public class BatchDeserializerException extends DeserializerException {
|
||||
public static enum MessageKeys implements MessageKey {
|
||||
INVALID_BOUNDARY,
|
||||
INVALID_CHANGESET_METHOD,
|
||||
|
@ -60,8 +62,4 @@ public class BatchDeserializerException extends BatchException {
|
|||
super(developmentMessage, messageKey, parameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getBundleName() {
|
||||
return DEFAULT_SERVER_BUNDLE_NAME;
|
||||
}
|
||||
}
|
|
@ -1,47 +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.api.batch.exception;
|
||||
|
||||
import org.apache.olingo.server.api.ODataTranslatedException;
|
||||
|
||||
public class BatchException extends ODataTranslatedException {
|
||||
private static final long serialVersionUID = 8747815702545202733L;
|
||||
|
||||
public static enum MessageKeys implements MessageKey {
|
||||
;
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return name();
|
||||
}
|
||||
}
|
||||
|
||||
public BatchException(final String developmentMessage, final MessageKey messageKey, final int lineNumber) {
|
||||
this(developmentMessage, messageKey, "" + lineNumber);
|
||||
}
|
||||
|
||||
public BatchException(final String developmentMessage, final MessageKey messageKey, final String... parameters) {
|
||||
super(developmentMessage, messageKey, parameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getBundleName() {
|
||||
return DEFAULT_SERVER_BUNDLE_NAME;
|
||||
}
|
||||
}
|
|
@ -18,7 +18,9 @@
|
|||
*/
|
||||
package org.apache.olingo.server.api.batch.exception;
|
||||
|
||||
public class BatchSerializerExecption extends BatchException {
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
|
||||
public class BatchSerializerExecption extends SerializerException {
|
||||
|
||||
private static final long serialVersionUID = 2634433974342796905L;
|
||||
|
||||
|
|
|
@ -23,14 +23,14 @@ import java.util.List;
|
|||
import org.apache.olingo.server.api.ODataRequest;
|
||||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.batch.BatchFacade;
|
||||
import org.apache.olingo.server.api.batch.exception.BatchException;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException;
|
||||
import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
|
||||
|
||||
public interface BatchProcessor extends Processor {
|
||||
// TODO:Check exception signature
|
||||
void executeBatch(BatchFacade facade, ODataRequest request, ODataResponse response)
|
||||
throws SerializerException, BatchException;
|
||||
throws SerializerException, DeserializerException;
|
||||
|
||||
ODataResponsePart executeChangeSet(BatchFacade facade, List<ODataRequest> requests);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.olingo.server.api.ODataApplicationException;
|
|||
import org.apache.olingo.server.api.ODataServerError;
|
||||
import org.apache.olingo.server.api.ODataTranslatedException;
|
||||
import org.apache.olingo.server.api.ODataTranslatedException.ODataErrorMessage;
|
||||
import org.apache.olingo.server.api.batch.exception.BatchDeserializerException;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
import org.apache.olingo.server.core.uri.parser.UriParserException;
|
||||
import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
|
||||
|
@ -94,6 +95,12 @@ public class ODataExceptionHelper {
|
|||
return serverError;
|
||||
}
|
||||
|
||||
public static ODataServerError createServerErrorObject(BatchDeserializerException e, Locale requestedLocale) {
|
||||
ODataServerError serverError = basicTranslatedError(e, requestedLocale);
|
||||
serverError.setStatusCode(HttpStatusCode.BAD_REQUEST.getStatusCode());
|
||||
return serverError;
|
||||
}
|
||||
|
||||
public static ODataServerError createServerErrorObject(ODataTranslatedException e, Locale requestedLocale) {
|
||||
return basicTranslatedError(e, requestedLocale);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ import org.apache.olingo.server.api.ODataRequest;
|
|||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.ODataServerError;
|
||||
import org.apache.olingo.server.api.ServiceMetadata;
|
||||
import org.apache.olingo.server.api.batch.exception.BatchException;
|
||||
import org.apache.olingo.server.api.batch.exception.BatchDeserializerException;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException;
|
||||
import org.apache.olingo.server.api.processor.BatchProcessor;
|
||||
import org.apache.olingo.server.api.processor.ComplexCollectionProcessor;
|
||||
|
@ -110,6 +110,9 @@ public class ODataHandler {
|
|||
} catch (SerializerException e) {
|
||||
ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e, null);
|
||||
handleException(request, response, serverError);
|
||||
} catch (BatchDeserializerException e) {
|
||||
ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e, null);
|
||||
handleException(request, response, serverError);
|
||||
} catch (DeserializerException e) {
|
||||
ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e, null);
|
||||
handleException(request, response, serverError);
|
||||
|
@ -128,7 +131,7 @@ public class ODataHandler {
|
|||
|
||||
private void processInternal(final ODataRequest request, final ODataResponse response)
|
||||
throws ODataHandlerException, UriParserException, UriValidationException, ContentNegotiatorException,
|
||||
ODataApplicationException, SerializerException, DeserializerException, BatchException {
|
||||
ODataApplicationException, SerializerException, DeserializerException {
|
||||
validateODataVersion(request, response);
|
||||
|
||||
uriInfo = new Parser().parseUri(request.getRawODataPath(), request.getRawQueryPath(), null,
|
||||
|
|
|
@ -25,7 +25,7 @@ import org.apache.olingo.server.api.ODataResponse;
|
|||
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.BatchDeserializerException.MessageKeys;
|
||||
import org.apache.olingo.server.api.batch.exception.BatchException;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException;
|
||||
import org.apache.olingo.server.api.processor.BatchProcessor;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
import org.apache.olingo.server.core.ODataHandler;
|
||||
|
@ -42,7 +42,7 @@ public class BatchHandler {
|
|||
}
|
||||
|
||||
public void process(final ODataRequest request, final ODataResponse response, final boolean isStrict)
|
||||
throws SerializerException, BatchException {
|
||||
throws DeserializerException, SerializerException {
|
||||
validateRequest(request);
|
||||
|
||||
final BatchFacade operation = new BatchFascadeImpl(oDataHandler, request, batchProcessor, isStrict);
|
||||
|
|
|
@ -40,7 +40,6 @@ 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.BatchException;
|
||||
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;
|
||||
|
@ -596,7 +595,7 @@ public class MockedBatchHandlerTest {
|
|||
|
||||
@Override
|
||||
public void executeBatch(BatchFacade fascade, ODataRequest request, ODataResponse response)
|
||||
throws BatchException, SerializerException {
|
||||
throws SerializerException, BatchDeserializerException {
|
||||
final String boundary = getBoundary(request.getHeader(HttpHeader.CONTENT_TYPE));
|
||||
final BatchOptions options = BatchOptions.with().isStrict(true).rawBaseUri(BASE_URI).build();
|
||||
final List<BatchRequestPart> parts =
|
||||
|
|
|
@ -44,7 +44,7 @@ public class HttpRequestStatusLineTest {
|
|||
|
||||
@Test
|
||||
public void testAbsoluteWithRelativePath() throws BatchDeserializerException {
|
||||
final HttpRequestStatusLine line = parse("http://localhost/odata../../Employee?$top=2");
|
||||
final HttpRequestStatusLine line = parse("http://localhost/odata/../../Employee?$top=2");
|
||||
assertEquals("/../../Employee", line.getRawODataPath());
|
||||
assertEquals("$top=2", line.getRawQueryPath());
|
||||
assertEquals("http://localhost/odata/../../Employee?$top=2", line.getRawRequestUri());
|
||||
|
|
|
@ -32,7 +32,6 @@ import org.apache.olingo.server.api.ODataRequest;
|
|||
import org.apache.olingo.server.api.ODataResponse;
|
||||
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.BatchException;
|
||||
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;
|
||||
|
@ -50,7 +49,7 @@ public class TechnicalBatchProcessor extends TechnicalProcessor implements Batch
|
|||
|
||||
@Override
|
||||
public void executeBatch(BatchFacade fascade, ODataRequest request, ODataResponse response)
|
||||
throws SerializerException, BatchException {
|
||||
throws SerializerException, BatchDeserializerException {
|
||||
|
||||
// TODO refactor isContinueOnError
|
||||
boolean continueOnError = isContinueOnError(request);
|
||||
|
|
Loading…
Reference in New Issue