| /******************************************************************************* |
| * 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; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNull; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import org.apache.olingo.odata2.api.commons.HttpHeaders; |
| import org.apache.olingo.odata2.api.commons.ODataHttpMethod; |
| import org.apache.olingo.odata2.api.exception.ODataException; |
| import org.apache.olingo.odata2.api.exception.ODataNotAcceptableException; |
| import org.apache.olingo.odata2.api.processor.ODataRequest; |
| import org.apache.olingo.odata2.core.commons.ContentType; |
| import org.apache.olingo.odata2.core.uri.UriInfoImpl; |
| import org.apache.olingo.odata2.core.uri.UriType; |
| import org.junit.Test; |
| import org.mockito.Mockito; |
| |
| /** |
| * |
| */ |
| public class ContentNegotiatorTest { |
| |
| private void negotiateContentType(final List<ContentType> contentTypes, final List<ContentType> supportedTypes, |
| final String expected) throws ODataException { |
| final ContentType contentType = new ContentNegotiator().contentNegotiation(contentTypes, supportedTypes); |
| assertEquals(expected, contentType.toContentTypeString()); |
| } |
| |
| @Test |
| public void defaultContentTypeForEmptyList() throws ODataException { |
| List<ContentType> contentTypes = Arrays.asList(); |
| List<ContentType> supportedTypes = Arrays.asList(ContentType.APPLICATION_ATOM_XML, ContentType.APPLICATION_XML); |
| |
| negotiateContentType(contentTypes, supportedTypes, "application/atom+xml"); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void invalidContentNegotiatorCreation() throws ODataException { |
| final ContentType contentType = new ContentNegotiator().doContentNegotiation(null, null, null); |
| assertNull(contentType); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void invalidContentNegotiatorCreationNullRequest() throws ODataException { |
| UriInfoImpl uriInfo = Mockito.mock(UriInfoImpl.class); |
| final ContentType contentType = |
| new ContentNegotiator().doContentNegotiation(null, uriInfo, new ArrayList<String>()); |
| assertNull(contentType); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void invalidContentNegotiatorCreationNullUri() throws ODataException { |
| ODataRequest request = Mockito.mock(ODataRequest.class); |
| final ContentType contentType = |
| new ContentNegotiator().doContentNegotiation(request, null, new ArrayList<String>()); |
| assertNull(contentType); |
| } |
| |
| @Test(expected = IllegalArgumentException.class) |
| public void invalidContentNegotiatorCreationNullSupported() throws ODataException { |
| ODataRequest request = Mockito.mock(ODataRequest.class); |
| UriInfoImpl uriInfo = Mockito.mock(UriInfoImpl.class); |
| final ContentType contentType = new ContentNegotiator().doContentNegotiation(request, uriInfo, null); |
| assertNull(contentType); |
| } |
| |
| @Test |
| public void contentNegotiationEmptyRequest() throws Exception { |
| negotiateContentType( |
| contentTypes(), |
| contentTypes("sup/111", "sup/222"), |
| "sup/111"); |
| } |
| |
| @Test |
| public void contentNegotiationConcreteRequest() throws Exception { |
| negotiateContentType( |
| contentTypes("sup/222"), |
| contentTypes("sup/111", "sup/222"), |
| "sup/222"); |
| } |
| |
| @Test(expected = ODataNotAcceptableException.class) |
| public void contentNegotiationNotSupported() throws Exception { |
| negotiateContentType(contentTypes("image/gif"), contentTypes("sup/111", "sup/222"), null); |
| } |
| |
| @Test |
| public void contentNegotiationSupportedWildcard() throws Exception { |
| negotiateContentType( |
| contentTypes("image/gif"), |
| contentTypes("sup/111", "sup/222", "*/*"), |
| "image/gif"); |
| } |
| |
| @Test |
| public void contentNegotiationSupportedSubWildcard() throws Exception { |
| negotiateContentType( |
| contentTypes("image/gif"), |
| contentTypes("sup/111", "sup/222", "image/*"), |
| "image/gif"); |
| } |
| |
| @Test |
| public void contentNegotiationRequestWildcard() throws Exception { |
| negotiateContentType( |
| contentTypes("*/*"), |
| contentTypes("sup/111", "sup/222"), |
| "sup/111"); |
| } |
| |
| @Test |
| public void contentNegotiationRequestSubWildcard() throws Exception { |
| negotiateContentType( |
| contentTypes("sup/*", "*/*"), |
| contentTypes("bla/111", "sup/222"), |
| "sup/222"); |
| } |
| |
| @Test |
| public void contentNegotiationRequestSubtypeWildcard() throws Exception { |
| negotiateContentType( |
| contentTypes("sup2/*"), |
| contentTypes("sup1/111", "sup2/222", "sup2/333"), |
| "sup2/222"); |
| } |
| |
| @Test |
| public void contentNegotiationRequestResponseWildcard() throws Exception { |
| negotiateContentType(contentTypes("*/*"), contentTypes("*/*"), "*/*"); |
| } |
| |
| @Test |
| public void contentNegotiationManyRequests() throws Exception { |
| negotiateContentType( |
| contentTypes("bla/111", "bla/blub", "sub2/222"), |
| contentTypes("sub1/666", "sub2/222", "sub3/333"), |
| "sub2/222"); |
| } |
| |
| @Test(expected = ODataNotAcceptableException.class) |
| public void contentNegotiationCharsetNotSupported() throws Exception { |
| negotiateContentType( |
| contentTypes("text/plain;charset=iso-8859-1"), |
| contentTypes("sup/111", "sup/222"), |
| "sup/222"); |
| } |
| |
| @Test |
| public void contentNegotiationWithODataVerbose() throws Exception { |
| negotiateContentType( |
| contentTypes("text/plain;q=0.5", "application/json;odata=verbose;q=0.2", "*/*"), |
| contentTypes("application/json;charset=utf-8", "sup/222"), |
| "application/json;charset=utf-8"); |
| } |
| |
| @Test |
| public void contentNegotiationDefaultCharset() throws Exception { |
| negotiateContentTypeCharset("application/xml", "application/xml;charset=utf-8", false); |
| } |
| |
| @Test |
| public void contentNegotiationDefaultCharsetAsDollarFormat() throws Exception { |
| negotiateContentTypeCharset("application/xml", "application/xml;charset=utf-8", true); |
| } |
| |
| @Test |
| public void contentNegotiationSupportedCharset() throws Exception { |
| negotiateContentTypeCharset("application/xml; charset=utf-8", "application/xml;charset=utf-8", false); |
| } |
| |
| @Test |
| public void contentNegotiationSupportedCharsetAsDollarFormat() throws Exception { |
| negotiateContentTypeCharset("application/xml; charset=utf-8", "application/xml;charset=utf-8", true); |
| } |
| |
| private void |
| negotiateContentTypeCharset(final String requestType, final String supportedType, final boolean asFormat) |
| throws ODataException { |
| UriInfoImpl uriInfo = Mockito.mock(UriInfoImpl.class); |
| Mockito.when(uriInfo.getUriType()).thenReturn(UriType.URI1); |
| if (asFormat) { |
| Mockito.when(uriInfo.getFormat()).thenReturn(requestType); |
| } |
| |
| List<String> acceptedContentTypes = Arrays.asList(requestType); |
| List<String> supportedContentTypes = Arrays.asList(supportedType); |
| |
| ODataRequest request = Mockito.mock(ODataRequest.class); |
| Mockito.when(request.getMethod()).thenReturn(ODataHttpMethod.GET); |
| Mockito.when(request.getRequestHeaderValue(HttpHeaders.ACCEPT)).thenReturn(requestType); |
| Mockito.when(request.getAcceptHeaders()).thenReturn(acceptedContentTypes); |
| |
| // perform |
| ContentNegotiator negotiator = new ContentNegotiator(); |
| String negotiatedContentType = |
| negotiator.doContentNegotiation(request, uriInfo, supportedContentTypes).toContentTypeString(); |
| |
| // verify |
| assertEquals(supportedType, negotiatedContentType); |
| } |
| |
| private List<ContentType> contentTypes(final String... contentType) { |
| List<ContentType> ctList = new ArrayList<ContentType>(); |
| for (String ct : contentType) { |
| ctList.add(ContentType.create(ct)); |
| } |
| return ctList; |
| } |
| } |