package org.jboss.resteasy.test.validation; import javax.ws.rs.client.Entity; import javax.ws.rs.core.Response; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.OperateOnDeployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.resteasy.api.validation.ResteasyViolationException; import org.jboss.resteasy.api.validation.Validation; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.test.validation.resource.ValidationExceptionClassValidator; import org.jboss.resteasy.test.validation.resource.ValidationExceptionCrazyConstraint; import org.jboss.resteasy.test.validation.resource.ValidationExceptionCrazyValidator; import org.jboss.resteasy.test.validation.resource.ValidationExceptionIncorrectConstraint; import org.jboss.resteasy.test.validation.resource.ValidationExceptionOtherConstraint; import org.jboss.resteasy.test.validation.resource.ValidationExceptionOtherValidationException; import org.jboss.resteasy.test.validation.resource.ValidationExceptionOtherValidationException2; import org.jboss.resteasy.test.validation.resource.ValidationExceptionOtherValidationException3; import org.jboss.resteasy.test.validation.resource.ValidationExceptionOtherValidator; import org.jboss.resteasy.test.validation.resource.ValidationExceptionResourceCrazy; import org.jboss.resteasy.test.validation.resource.ValidationExceptionResourceWithIncorrectConstraint; import org.jboss.resteasy.test.validation.resource.ValidationExceptionResourceWithInvalidConstraintGroup; import org.jboss.resteasy.test.validation.resource.ValidationExceptionResourceWithOther; import org.jboss.resteasy.test.validation.resource.ValidationExceptionSubResourceWithInvalidOverride; import org.jboss.resteasy.test.validation.resource.ValidationExceptionSuperResource; import org.jboss.resteasy.test.validation.resource.ValidationExceptionTestGroup1; import org.jboss.resteasy.test.validation.resource.ValidationExceptionTestGroup2; import org.jboss.resteasy.util.HttpResponseCodes; import org.jboss.resteasy.utils.TestUtil; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.jboss.resteasy.utils.PortProviderUtil.generateURL; /** * @tpSubChapter Validator provider * @tpChapter Integration tests * @tpSince RESTEasy 3.0.16 */ @RunWith(Arquillian.class) @RunAsClient public class ValidationExceptionsTest { protected static final Logger logger = LogManager.getLogger(ValidationExceptionsTest.class.getName()); static ResteasyClient client; private static final String DEF_EXCEPTION = "constraintDefinitionException"; private static final String DECL_EXCEPTION = "constraintDeclarationException"; private static final String GROUP_DEF_EXCEPTION = "groupDefinitionException"; private static final String OTHER_EXCEPTION = "otherException"; private static final String CRAZY_EXCEPTION = "crazyException"; private static final String ERROR_MESSAGE = "Expected other response"; private static final String ERROR_HEADER_MESSAGE = "Header was null"; private static final String ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE = "validation-expcetion header was expected to be true"; public static Archive<?> deploy(String name, Class<?>... resourceClasses) throws Exception { WebArchive war = TestUtil.prepareArchive(name); war.addClass(ValidationExceptionClassValidator.class); war.addClass(ValidationExceptionCrazyConstraint.class); war.addClass(ValidationExceptionCrazyValidator.class); war.addClass(ValidationExceptionIncorrectConstraint.class); war.addClass(ValidationExceptionOtherConstraint.class); war.addClass(ValidationExceptionOtherValidationException.class); war.addClass(ValidationExceptionOtherValidationException2.class); war.addClass(ValidationExceptionOtherValidationException3.class); war.addClass(ValidationExceptionOtherValidator.class); war.addClass(ValidationExceptionTestGroup1.class); war.addClass(ValidationExceptionTestGroup2.class); return TestUtil.finishContainerPrepare(war, null, resourceClasses); } @Before public void init() { client = new ResteasyClientBuilder().build(); } @After public void after() throws Exception { client.close(); } @Deployment(name = DEF_EXCEPTION) public static Archive<?> constraintDefinitionExceptionDeploy() throws Exception { return deploy(DEF_EXCEPTION, ValidationExceptionResourceWithIncorrectConstraint.class); } @Deployment(name = DECL_EXCEPTION) public static Archive<?> constraintDeclarationExceptionDeploy() throws Exception { return deploy(DECL_EXCEPTION, ValidationExceptionSubResourceWithInvalidOverride.class, ValidationExceptionSuperResource.class); } @Deployment(name = GROUP_DEF_EXCEPTION) public static Archive<?> groupDefinitionExceptionDeploy() throws Exception { return deploy(GROUP_DEF_EXCEPTION, ValidationExceptionResourceWithInvalidConstraintGroup.class); } @Deployment(name = OTHER_EXCEPTION) public static Archive<?> otherExceptionDeploy() throws Exception { return deploy(OTHER_EXCEPTION, ValidationExceptionResourceWithOther.class); } @Deployment(name = CRAZY_EXCEPTION) public static Archive<?> crazyExceptionDeploy() throws Exception { return deploy(CRAZY_EXCEPTION, ValidationExceptionResourceCrazy.class); } /** * @tpTestDetails Resource with incorrect constraint, constrain definitiont exception is expected * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment(DEF_EXCEPTION) public void testConstraintDefinitionException() throws Exception { Response response = client.target(generateURL("/", DEF_EXCEPTION)).request().post(null); Assert.assertEquals(HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("ConstraintDefinitionException")); } /** * @tpTestDetails Resource with incorrect constraint declaration, constraint definition exception is expected * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment(DECL_EXCEPTION) public void testConstraintDeclarationException() throws Exception { Response response = client.target(generateURL("/", DECL_EXCEPTION)).request().post(null); Assert.assertEquals(TestUtil.getErrorMessageForKnownIssue("JBEAP-3459"), HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("ConstraintDeclarationException")); } /** * @tpTestDetails Resource with incorrect group definition, group definition exception is expected * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment(GROUP_DEF_EXCEPTION) public void testGroupDefinitionException() throws Exception { Response response = client.target(generateURL("/", GROUP_DEF_EXCEPTION)).request().get(); Assert.assertEquals(HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("GroupDefinitionException")); } /** * @tpTestDetails Tests for: Exception thrown during validation of field, Exception thrown during validation of parameter, * Exception thrown during validation of return value, Exception thrown by resource method * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment(OTHER_EXCEPTION) public void testOtherValidationException() throws Exception { { Response response = client.target(generateURL("/parameter/fail", OTHER_EXCEPTION)).request().post(Entity.text("abc")); Assert.assertEquals(HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("ValidationException")); Assert.assertTrue(ERROR_MESSAGE, entity.contains("OtherValidationException")); } { Response response = client.target(generateURL("/parameter/ok", OTHER_EXCEPTION)).request().post(Entity.text("abc")); Assert.assertEquals(HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("ValidationException")); Assert.assertTrue(ERROR_MESSAGE, entity.contains("OtherValidationException")); } { Response response = client.target(generateURL("/return/ok", OTHER_EXCEPTION)).request().post(Entity.text("abc")); Assert.assertEquals(HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("ValidationException")); Assert.assertTrue(ERROR_MESSAGE, entity.contains("OtherValidationException")); } { Response response = client.target(generateURL("/execution/ok", OTHER_EXCEPTION)).request().get(); Assert.assertEquals(HttpResponseCodes.SC_INTERNAL_SERVER_ERROR, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("last entity: " + entity); Assert.assertTrue(ERROR_MESSAGE, entity.contains("OtherValidationException")); Assert.assertTrue(ERROR_MESSAGE, entity.contains("OtherValidationException2")); Assert.assertTrue(ERROR_MESSAGE, entity.contains("OtherValidationException3")); } } /** * @tpTestDetails Resource with crazy message in constraint * @tpSince RESTEasy 3.0.16 */ @Test @OperateOnDeployment(CRAZY_EXCEPTION) public void testCrazyMessage() throws Exception { Response response = client.target(generateURL("/", CRAZY_EXCEPTION)).request().get(); Assert.assertEquals(HttpResponseCodes.SC_BAD_REQUEST, response.getStatus()); String header = response.getStringHeaders().getFirst(Validation.VALIDATION_HEADER); Assert.assertNotNull(ERROR_HEADER_MESSAGE, header); Assert.assertTrue(ERROR_HEADER_VALIDATION_EXCEPTION_MESSAGE, Boolean.valueOf(header)); String entity = response.readEntity(String.class); logger.info("entity: " + entity); ResteasyViolationException e = new ResteasyViolationException(entity); } }