/* * Copyright 2012-2017 the original author or authors. * * Licensed 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.springframework.boot.autoconfigure.http; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.ResourceHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.smile.MappingJackson2SmileHttpMessageConverter; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; /** * Tests for {@link HttpMessageConverters}. * * @author Dave Syer * @author Phillip Webb */ public class HttpMessageConvertersTests { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void containsDefaults() throws Exception { HttpMessageConverters converters = new HttpMessageConverters(); List<Class<?>> converterClasses = new ArrayList<>(); for (HttpMessageConverter<?> converter : converters) { converterClasses.add(converter.getClass()); } assertThat(converterClasses).containsExactly(ByteArrayHttpMessageConverter.class, StringHttpMessageConverter.class, ResourceHttpMessageConverter.class, SourceHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class, MappingJackson2SmileHttpMessageConverter.class, MappingJackson2CborHttpMessageConverter.class, MappingJackson2XmlHttpMessageConverter.class); } @Test public void addBeforeExistingConverter() { MappingJackson2HttpMessageConverter converter1 = new MappingJackson2HttpMessageConverter(); MappingJackson2HttpMessageConverter converter2 = new MappingJackson2HttpMessageConverter(); HttpMessageConverters converters = new HttpMessageConverters(converter1, converter2); assertThat(converters.getConverters().contains(converter1)).isTrue(); assertThat(converters.getConverters().contains(converter2)).isTrue(); List<MappingJackson2HttpMessageConverter> httpConverters = new ArrayList<>(); for (HttpMessageConverter<?> candidate : converters) { if (candidate instanceof MappingJackson2HttpMessageConverter) { httpConverters.add((MappingJackson2HttpMessageConverter) candidate); } } // The existing converter is still there, but with a lower priority assertThat(httpConverters).hasSize(3); assertThat(httpConverters.indexOf(converter1)).isEqualTo(0); assertThat(httpConverters.indexOf(converter2)).isEqualTo(1); assertThat(converters.getConverters().indexOf(converter1)).isNotEqualTo(0); } @Test public void addNewConverters() { HttpMessageConverter<?> converter1 = mock(HttpMessageConverter.class); HttpMessageConverter<?> converter2 = mock(HttpMessageConverter.class); HttpMessageConverters converters = new HttpMessageConverters(converter1, converter2); assertThat(converters.getConverters().get(0)).isEqualTo(converter1); assertThat(converters.getConverters().get(1)).isEqualTo(converter2); } @Test public void convertersAreAddedToFormPartConverter() { HttpMessageConverter<?> converter1 = mock(HttpMessageConverter.class); HttpMessageConverter<?> converter2 = mock(HttpMessageConverter.class); List<HttpMessageConverter<?>> converters = new HttpMessageConverters(converter1, converter2).getConverters(); List<HttpMessageConverter<?>> partConverters = extractFormPartConverters( converters); assertThat(partConverters.get(0)).isEqualTo(converter1); assertThat(partConverters.get(1)).isEqualTo(converter2); } @Test public void postProcessConverters() throws Exception { HttpMessageConverters converters = new HttpMessageConverters() { @Override protected List<HttpMessageConverter<?>> postProcessConverters( List<HttpMessageConverter<?>> converters) { for (Iterator<HttpMessageConverter<?>> iterator = converters .iterator(); iterator.hasNext();) { if (iterator .next() instanceof MappingJackson2XmlHttpMessageConverter) { iterator.remove(); } } return converters; }; }; List<Class<?>> converterClasses = new ArrayList<>(); for (HttpMessageConverter<?> converter : converters) { converterClasses.add(converter.getClass()); } assertThat(converterClasses).containsExactly(ByteArrayHttpMessageConverter.class, StringHttpMessageConverter.class, ResourceHttpMessageConverter.class, SourceHttpMessageConverter.class, AllEncompassingFormHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class, MappingJackson2SmileHttpMessageConverter.class, MappingJackson2CborHttpMessageConverter.class); } @Test public void postProcessPartConverters() throws Exception { HttpMessageConverters converters = new HttpMessageConverters() { @Override protected List<HttpMessageConverter<?>> postProcessPartConverters( List<HttpMessageConverter<?>> converters) { for (Iterator<HttpMessageConverter<?>> iterator = converters .iterator(); iterator.hasNext();) { if (iterator .next() instanceof MappingJackson2XmlHttpMessageConverter) { iterator.remove(); } } return converters; }; }; List<Class<?>> converterClasses = new ArrayList<>(); for (HttpMessageConverter<?> converter : extractFormPartConverters( converters.getConverters())) { converterClasses.add(converter.getClass()); } assertThat(converterClasses).containsExactly(ByteArrayHttpMessageConverter.class, StringHttpMessageConverter.class, ResourceHttpMessageConverter.class, SourceHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class, MappingJackson2SmileHttpMessageConverter.class); } @SuppressWarnings("unchecked") private List<HttpMessageConverter<?>> extractFormPartConverters( List<HttpMessageConverter<?>> converters) { AllEncompassingFormHttpMessageConverter formConverter = findFormConverter( converters); return (List<HttpMessageConverter<?>>) ReflectionTestUtils.getField(formConverter, "partConverters"); } private AllEncompassingFormHttpMessageConverter findFormConverter( Collection<HttpMessageConverter<?>> converters) { for (HttpMessageConverter<?> converter : converters) { if (converter instanceof AllEncompassingFormHttpMessageConverter) { return (AllEncompassingFormHttpMessageConverter) converter; } } return null; } }