blob: 10be9158840817a1659b7391e2dd8ec8d2bc8087 [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.fit.ref;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
import org.apache.olingo.odata2.api.edm.EdmProperty;
import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
import org.apache.olingo.odata2.api.ep.EntityProvider;
import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties;
import org.apache.olingo.odata2.api.exception.ODataApplicationException;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.processor.ODataContext;
import org.apache.olingo.odata2.api.processor.ODataResponse;
import org.apache.olingo.odata2.api.processor.ODataSingleProcessor;
import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetEntityUriInfo;
import org.apache.olingo.odata2.api.uri.info.GetSimplePropertyUriInfo;
import org.apache.olingo.odata2.core.processor.ODataSingleProcessorService;
import org.apache.olingo.odata2.ref.edm.ScenarioEdmProvider;
import org.apache.olingo.odata2.testutil.server.ServletType;
import org.junit.Before;
import org.junit.Test;
/**
* Based on OLINGO-763 we changed the behaviour of serializer exceptions. Now they must result in 500 internal server
* errors if an application provides false data. This test is to ensure that the serializer throws the correct exception
* which then results in the correct status code.
*/
public class InvalidDataInScenarioTest extends AbstractRefTest {
public InvalidDataInScenarioTest(ServletType servletType) {
super(servletType);
}
@Override
protected ODataSingleProcessorService createService() {
ODataSingleProcessor processor = new LocalProcessor();
EdmProvider provider = new ScenarioEdmProvider();
return new ODataSingleProcessorService(provider, processor) {};
}
@Before
public void showStacktrace() {
disableLogging();
}
@Test
public void nullKeyInEntryData() throws Exception {
HttpResponse response = callUri("Employees('1')", HttpStatusCodes.INTERNAL_SERVER_ERROR);
System.out.println(getBody(response));
response = callUri("Employees('1')?$format=json", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("null value"));
}
@Test
public void violatedFacetsInEntry() throws Exception {
HttpResponse response = callUri("Employees('2')", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("metadata constraints"));
response = callUri("Employees('2')?$format=json", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("metadata constraints"));
}
@Test
public void nullKeyInFeedData() throws Exception {
HttpResponse response = callUri("Employees", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("null value"));
response = callUri("Employees?$format=json", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("null value"));
}
@Test
public void wrongPropertyValueIsNull() throws Exception {
HttpResponse response = callUri("Employees('1')/EmployeeId", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("null value"));
response = callUri("Employees('1')/EmployeeId?$format=json", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("null value"));
}
@Test
public void wrongPropertyValueWithFacets() throws Exception {
HttpResponse response = callUri("Employees('2')/TeamId", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("metadata constraints"));
response = callUri("Employees('2')/TeamId?$format=json", HttpStatusCodes.INTERNAL_SERVER_ERROR);
assertTrue(getBody(response).contains("metadata constraints"));
}
public class LocalProcessor extends ODataSingleProcessor {
@Override
public ODataResponse readEntity(GetEntityUriInfo uriInfo, String contentType) throws ODataException {
HashMap<String, Object> data = new HashMap<String, Object>();
if ("Employees".equals(uriInfo.getTargetEntitySet().getName())) {
if ("2".equals(uriInfo.getKeyPredicates().get(0).getLiteral())) {
data.put("EmployeeId", "1");
data.put("TeamId", "420");
}
ODataContext context = getContext();
EntityProviderWriteProperties writeProperties =
EntityProviderWriteProperties.serviceRoot(context.getPathInfo().getServiceRoot()).build();
return EntityProvider.writeEntry(contentType, uriInfo.getTargetEntitySet(), data, writeProperties);
} else {
throw new ODataApplicationException("Wrong testcall", Locale.getDefault(), HttpStatusCodes.NOT_IMPLEMENTED);
}
}
@Override
public ODataResponse readEntitySet(GetEntitySetUriInfo uriInfo, String contentType) throws ODataException {
if ("Employees".equals(uriInfo.getTargetEntitySet().getName())) {
ODataContext context = getContext();
EntityProviderWriteProperties writeProperties =
EntityProviderWriteProperties.serviceRoot(context.getPathInfo().getServiceRoot()).build();
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
data.add(new HashMap<String, Object>());
return EntityProvider.writeFeed(contentType, uriInfo.getTargetEntitySet(), data, writeProperties);
} else {
throw new ODataApplicationException("Wrong testcall", Locale.getDefault(), HttpStatusCodes.NOT_IMPLEMENTED);
}
}
@Override
public ODataResponse readEntitySimpleProperty(GetSimplePropertyUriInfo uriInfo, String contentType)
throws ODataException {
EdmProperty edmProperty = uriInfo.getPropertyPath().get(0);
Object value = null;
if ("EmployeeId".equals(edmProperty.getName())) {
// must be null for a specific test
value = null;
} else if ("TeamId".equals(edmProperty.getName())) {
value = new Integer(520);
}
return EntityProvider.writeProperty(contentType, edmProperty, value);
}
}
}