package org.jboss.resteasy.test.request; import org.jboss.resteasy.core.request.ServerDrivenNegotiation; import org.junit.Test; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Variant; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; /** * @tpSubChapter Requests * @tpChapter Unit tests * @tpTestCaseDetails Test for ServerDrivenNegotiation class. * @tpSince RESTEasy 3.0.16 */ public class VariantSelectionTest { final String ERROR_MSG = "Wrong media type"; @Test public void mostSpecific() { ServerDrivenNegotiation negotiation = new ServerDrivenNegotiation(); negotiation.setAcceptHeaders(Arrays.asList("text/plain")); negotiation.setAcceptCharsetHeaders(Arrays.asList(StandardCharsets.UTF_8.name())); negotiation.setAcceptEncodingHeaders(Arrays.asList("gzip")); negotiation.setAcceptLanguageHeaders(Arrays.asList("en-gb")); MediaType mediaTypeWithCharset = MediaType.valueOf("text/plain; charset=UTF-8"); MediaType mediaType = MediaType.valueOf("text/plain"); String encoding = "gzip"; Locale locale = Locale.UK; List<Variant> available = new ArrayList<Variant>(); available.add(new Variant(mediaTypeWithCharset, (String) null, (String) null)); available.add(new Variant(mediaTypeWithCharset, locale, null)); available.add(new Variant(mediaTypeWithCharset, (String) null, encoding)); available.add(new Variant(mediaTypeWithCharset, locale, encoding)); available.add(new Variant(mediaType, (String) null, (String) null)); available.add(new Variant(mediaType, locale, null)); available.add(new Variant(mediaType, (String) null, encoding)); available.add(new Variant(mediaType, locale, encoding)); available.add(new Variant(null, locale, null)); available.add(new Variant(null, locale, encoding)); available.add(new Variant((MediaType) null, (String) null, encoding)); // Assert all acceptable: for (Variant variant : available) { assertEquals(variant, negotiation.getBestMatch(Arrays.asList(variant))); } Variant best = negotiation.getBestMatch(available); assertNotNull("Variant should not be null", best); assertEquals("Wrong media type", mediaTypeWithCharset, best.getMediaType()); assertEquals("Wrong encoding", encoding, best.getEncoding()); assertEquals("Wrong locale", locale, best.getLanguage()); } @Test public void mostSpecificMediaType() { String header = "text/*, text/html, text/html;level=1, */*"; ServerDrivenNegotiation negotiation = new ServerDrivenNegotiation(); negotiation.setAcceptHeaders(Arrays.asList(header)); Variant o1 = new Variant(MediaType.valueOf("text/html;level=1"), (String) null, null); Variant o2 = new Variant(MediaType.valueOf("text/html"), (String) null, null); Variant o3 = new Variant(MediaType.valueOf("text/*"), (String) null, null); Variant o4 = new Variant(MediaType.valueOf("*/*"), (String) null, null); List<Variant> available = new ArrayList<>(); available.add(o4); assertEquals(ERROR_MSG, o4, negotiation.getBestMatch(available)); available.add(o3); assertEquals(ERROR_MSG, o3, negotiation.getBestMatch(available)); available.add(o2); assertEquals(ERROR_MSG, o2, negotiation.getBestMatch(available)); available.add(o1); assertEquals(ERROR_MSG, o1, negotiation.getBestMatch(available)); } @Test public void mediaTypeQualityFactor() { String header1 = "text/*;q=0.3, text/html;q=0.7, text/html;level=1"; String header2 = "text/html;level=2;q=0.4, */*;q=0.5"; ServerDrivenNegotiation negotiation = new ServerDrivenNegotiation(); negotiation.setAcceptHeaders(Arrays.asList(header1, header2)); negotiation.setAcceptLanguageHeaders(Arrays.asList("en")); Variant q03 = new Variant(MediaType.valueOf("text/plain"), (String) null, null); Variant q04 = new Variant(MediaType.valueOf("text/html;level=2"), (String) null, null); Variant q05 = new Variant(MediaType.valueOf("image/jpeg"), (String) null, null); Variant q07 = new Variant(MediaType.valueOf("text/html"), (String) null, null); Variant q07plus = new Variant(MediaType.valueOf("text/html;level=3"), (String) null, null); Variant q10 = new Variant(MediaType.valueOf("text/html;level=1"), (String) null, null); List<Variant> available = new ArrayList<Variant>(); available.add(q03); assertEquals(ERROR_MSG, q03, negotiation.getBestMatch(available)); available.add(q04); assertEquals(ERROR_MSG, q04, negotiation.getBestMatch(available)); available.add(q05); assertEquals(ERROR_MSG, q05, negotiation.getBestMatch(available)); available.add(q07); assertEquals(ERROR_MSG, q07, negotiation.getBestMatch(available)); available.add(q07plus); assertEquals(ERROR_MSG, q07plus, negotiation.getBestMatch(available)); available.add(q10); assertEquals(ERROR_MSG, q10, negotiation.getBestMatch(available)); } }