package org.jboss.resteasy.test.providers.iioimage;
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.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.test.providers.iioimage.resource.ImageResource;
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.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
* @tpSubChapter IIOImage provider
* @tpChapter Integration tests
* @tpTestCaseDetails Basic test for IIOImage provider. Old issue: https://issues.jboss.org/browse/RESTEASY-862
* @tpSince RESTEasy 3.0.16
*/
@RunWith(Arquillian.class)
@RunAsClient
public class IIOImageProviderTest {
static ResteasyClient client;
static final String testPngResource = "test.png";
static final String testWdpResource = "test.wdp";
@Before
public void init() {
client = new ResteasyClientBuilder().build();
}
@After
public void after() throws Exception {
client.close();
}
private static final String TEST_URI = generateURL("/image");
@Deployment
public static Archive<?> deploy() {
WebArchive war = TestUtil.prepareArchive(IIOImageProviderTest.class.getSimpleName());
return TestUtil.finishContainerPrepare(war, null, ImageResource.class);
}
private static String generateURL(String path) {
return PortProviderUtil.generateURL(path, IIOImageProviderTest.class.getSimpleName());
}
/**
* @tpTestDetails Test a post of a PNG image whose response should be a PNG version of the
* same photo.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testPostJPEGIMage() throws Exception {
File file = new File(TestUtil.getResourcePath(IIOImageProviderTest.class, testPngResource));
Assert.assertTrue(file.exists());
Response response = client.target(TEST_URI).request().post(Entity.entity(file, "image/png"));
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus());
String contentType = response.getHeaderString("content-type");
Assert.assertEquals("Wrong content type of response", "image/png", contentType);
BufferedInputStream in = new BufferedInputStream(response.readEntity(InputStream.class));
ByteArrayOutputStream fromServer = new ByteArrayOutputStream();
writeTo(in, fromServer);
response.close();
File savedPng = new File(TestUtil.getResourcePath(IIOImageProviderTest.class, testPngResource));
FileInputStream fis = new FileInputStream(savedPng);
ByteArrayOutputStream fromTestData = new ByteArrayOutputStream();
writeTo(fis, fromTestData);
// ImageResource could change image slightly, so next assert could fail, because same picture could have been saved different
Assert.assertTrue("ImageResource could change image slightly or ImageResource is wrong", Arrays.equals(fromServer.toByteArray(), fromTestData.toByteArray()));
}
/**
* @tpTestDetails Tests a image format that is not directly supported by Image IO. In this
* case, an HD Photo image is posted to the Resource which should return a
* 406 - Not Acceptable response. The response body should include a list of
* variants that are supported by the application.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testPostUnsupportedImage() throws Exception {
File file = new File(TestUtil.getResourcePath(IIOImageProviderTest.class, testWdpResource));
Assert.assertTrue(file.exists());
Response response = client.target(TEST_URI).request().post(Entity.entity(file, "image/vnd.ms-photo"));
Assert.assertEquals("Unsupported image is accepted by server", HttpServletResponse.SC_NOT_ACCEPTABLE, response.getStatus());
response.close();
}
public void writeTo(final InputStream in, final OutputStream out) throws IOException {
int read;
final byte[] buf = new byte[2048];
while ((read = in.read(buf)) != -1) {
out.write(buf, 0, read);
}
}
}