package org.jboss.resteasy.test.providers;
import org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.test.providers.resource.ProviderFactoryStrParamUnmarshaller;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import java.lang.reflect.Field;
import java.sql.Date;
import java.util.List;
import static org.junit.Assert.assertNotNull;
/**
* @tpSubChapter Providers
* @tpChapter Unit tests
* @tpTestCaseDetails Regression test for RESTEASY-584
* @tpSince RESTEasy 3.0.16
*/
public class ProviderFactoryTest {
private ResteasyProviderFactory factory;
@Before
public void createBean() {
factory = new ResteasyProviderFactory();
}
/**
* @tpTestDetails Basic check for ResteasyProviderFactory class.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void shouldReturnStringParameterUnmarshallerAddedForType() {
factory.addStringParameterUnmarshaller(ProviderFactoryStrParamUnmarshaller.class);
assertNotNull("Null StringParameterUnmarshaller object", factory.createStringParameterUnmarshaller(Date.class));
}
/**
* @tpTestDetails Regression test for JBEAP-4706
* Test whether the priority is supplied to the container request filter registry.
* @tpSince RESTEasy 3.0.17
*/
@Test
public void testRegisterProviderInstancePriorityContainerRequestFilter() throws Exception {
ContainerRequestFilter requestFilter = new ContainerRequestFilter() {
public void filter(ContainerRequestContext requestContext) {
}
};
this.testRegisterProviderInstancePriority(requestFilter, factory.getContainerRequestFilterRegistry());
}
/**
* @tpTestDetails Regression test for JBEAP-4706
* Test whether the priority is supplied to the container response filter registry.
* @tpSince RESTEasy 3.0.17
*/
@Test
public void testRegisterProviderInstancePriorityContainerResponseFilter() throws Exception {
ContainerResponseFilter responseFilter = new ContainerResponseFilter() {
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
}
};
this.testRegisterProviderInstancePriority(responseFilter, factory.getContainerResponseFilterRegistry());
}
/**
* Generic helper method for RESTEASY-1311 cases, because the test logic is the same.
* Unfortunately, there seems to be no public accessors for the properties we need,
* so we have to resort to using reflection to check the right priority setting.
*/
private void testRegisterProviderInstancePriority(Object filter, Object registry) throws Exception {
int priorityOverride = Priorities.USER + 1;
factory.registerProviderInstance(filter, null, priorityOverride, false);
Field interceptorsField = registry.getClass().getSuperclass().getDeclaredField("interceptors");
interceptorsField.setAccessible(true);
@SuppressWarnings("unchecked")
List<JaxrsInterceptorRegistry.InterceptorFactory> interceptors = (List<JaxrsInterceptorRegistry.InterceptorFactory>) interceptorsField.get(registry);
Field orderField = interceptors.get(0).getClass().getSuperclass().getDeclaredField("order");
orderField.setAccessible(true);
int order = (Integer) orderField.get(interceptors.get(0));
Assert.assertEquals(priorityOverride, order);
}
}