package org.jboss.resteasy.test;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.plugins.server.netty.NettyContainer;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CountDownLatch;
import static org.jboss.resteasy.test.TestPortProvider.generateURL;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class StreamingOutputTest
{
static String BASE_URI = generateURL("");
static Client client;
static CountDownLatch latch;
@Path("/test")
public static class Resteasy1029Netty4StreamingOutput {
@GET
@Produces(MediaType.TEXT_PLAIN)
public StreamingOutput stream() {
return new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
for (int i = 0; i < 10; i++) {
output.write(("" + i + "\n\n").getBytes(StandardCharsets.ISO_8859_1));
output.flush();
}
output.close();
}
};
}
@GET
@Path("delay")
@Produces(MediaType.TEXT_PLAIN)
public StreamingOutput delay() {
return new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
for (int i = 0; i < 10; i++) {
output.write(("" + i + "\n\n").getBytes(StandardCharsets.ISO_8859_1));
try
{
latch.countDown();
Thread.sleep(100);
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
output.flush();
}
output.close();
}
};
}
}
@BeforeClass
public static void setup() throws Exception
{
NettyContainer.start().getRegistry().addPerRequestResource(Resteasy1029Netty4StreamingOutput.class);
client = new ResteasyClientBuilder().connectionPoolSize(10).build();
}
@AfterClass
public static void end() throws Exception
{
client.close();
NettyContainer.stop();
}
static boolean pass = false;
@Test
public void testConcurrent() throws Exception
{
pass = false;
latch = new CountDownLatch(1);
Runnable r = new Runnable()
{
@Override
public void run()
{
String str = client.target(BASE_URI).path("test/delay").request().get(String.class);
pass = true;
}
};
Thread t = new Thread(r);
t.start();
latch.await();
long start = System.currentTimeMillis();
testStreamingOutput();
long end = System.currentTimeMillis() - start;
System.out.println(end);
Assert.assertTrue(end < 1000);
t.join();
Assert.assertTrue(pass);
}
@Test
public void testStreamingOutput() throws Exception
{
Response response = client.target(BASE_URI).path("test").request().get();
Assert.assertTrue(response.readEntity(String.class).equals("0\n" +
"\n1\n" +
"\n2\n" +
"\n3\n" +
"\n4\n" +
"\n5\n" +
"\n6\n" +
"\n7\n" +
"\n8\n" +
"\n9\n" +
"\n"));
Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
}
}