package org.jboss.resteasy.test.providers.multipart; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataOutput; import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; import org.jboss.resteasy.test.providers.multipart.resource.HeaderFlushedOutputStreamBean; import org.jboss.resteasy.test.providers.multipart.resource.HeaderFlushedOutputStreamService; import org.jboss.resteasy.utils.PortProviderUtil; import org.jboss.resteasy.utils.TestUtil; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import javax.mail.BodyPart; import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.BufferedInputStream; import java.io.File; import java.io.InputStream; /** * @tpSubChapter Multipart provider * @tpChapter Integration tests * @tpTestCaseDetails Regression test for RESTEASY-190 * @tpSince RESTEasy 3.0.16 */ @RunWith(Arquillian.class) @RunAsClient public class HeaderFlushedOutputStreamTest { static Client client; @BeforeClass public static void before() throws Exception { client = ClientBuilder.newClient(); } @AfterClass public static void after() throws Exception { client.close(); } static final String testFilePath; static { testFilePath = TestUtil.getResourcePath(HeaderFlushedOutputStreamTest.class, "HeaderFlushedOutputStreamTestData.txt"); } @Deployment public static Archive<?> deploy() { WebArchive war = TestUtil.prepareArchive(HeaderFlushedOutputStreamTest.class.getSimpleName()); war.addClass(HeaderFlushedOutputStreamBean.class); return TestUtil.finishContainerPrepare(war, null, HeaderFlushedOutputStreamService.class); } private static String generateURL(String path) { return PortProviderUtil.generateURL(path, HeaderFlushedOutputStreamTest.class.getSimpleName()); } private static final String TEST_URI = generateURL("/mime"); /** * @tpTestDetails Loopback to examine form-data * @tpSince RESTEasy 3.0.16 */ @Test public void testPost() throws Exception { // prepare file File file = new File(testFilePath); Assert.assertTrue("File " + testFilePath + " doesn't exists", file.exists()); // test logic MultipartOutput mpo = new MultipartOutput(); mpo.addPart("This is Value 1", MediaType.TEXT_PLAIN_TYPE); mpo.addPart("This is Value 2", MediaType.TEXT_PLAIN_TYPE); mpo.addPart(file, MediaType.TEXT_PLAIN_TYPE); Response response = client.target(TEST_URI).request().post(Entity.entity(mpo, MediaType.MULTIPART_FORM_DATA_TYPE)); BufferedInputStream in = new BufferedInputStream(response.readEntity(InputStream.class)); String contentType = response.getHeaderString("content-type"); ByteArrayDataSource ds = new ByteArrayDataSource(in, contentType); MimeMultipart mimeMultipart = new MimeMultipart(ds); Assert.assertEquals("Wrong count of parts of response", mimeMultipart.getCount(), 3); response.close(); } /** * @tpTestDetails Test post method * @tpSince RESTEasy 3.0.16 */ @Test public void testPostForm() throws Exception { // prepare file File file = new File(testFilePath); Assert.assertTrue("File " + testFilePath + " doesn't exists", file.exists()); // test logic MultipartFormDataOutput mpfdo = new MultipartFormDataOutput(); mpfdo.addFormData("part1", "This is Value 1", MediaType.TEXT_PLAIN_TYPE); mpfdo.addFormData("part2", "This is Value 2", MediaType.TEXT_PLAIN_TYPE); mpfdo.addFormData("data.txt", file, MediaType.TEXT_PLAIN_TYPE); Response response = client.target(TEST_URI).request().post(Entity.entity(mpfdo, MediaType.MULTIPART_FORM_DATA_TYPE)); BufferedInputStream in = new BufferedInputStream(response.readEntity(InputStream.class)); String contentType = response.getHeaderString("content-type"); ByteArrayDataSource ds = new ByteArrayDataSource(in, contentType); MimeMultipart mimeMultipart = new MimeMultipart(ds); Assert.assertEquals("Wrong count of parts of response", mimeMultipart.getCount(), 3); response.close(); } /** * @tpTestDetails Test get method * @tpSince RESTEasy 3.0.16 */ @Test public void testGet() throws Exception { Response response = client.target(TEST_URI).request().get(); Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus()); BufferedInputStream in = new BufferedInputStream(response.readEntity(InputStream.class)); String contentType = response.getHeaderString("content-type"); ByteArrayDataSource ds = new ByteArrayDataSource(in, contentType); MimeMultipart mimeMultipart = new MimeMultipart(ds); Assert.assertEquals("Wrong count of parts of response", mimeMultipart.getCount(), 1); BodyPart part = mimeMultipart.getBodyPart(0); InputStream is = part.getInputStream(); Assert.assertEquals("Wrong count of parts of response", 3, part.getSize()); char[] output = new char[3]; output[0] = (char) is.read(); output[1] = (char) is.read(); output[2] = (char) is.read(); String str = new String(output); Assert.assertEquals("Wrong content of first part of response", "bla", str); } }