package app.streaming.com.aol.micro.server;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.annotation.PostConstruct;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import cyclops.stream.ReactiveSeq;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.aol.micro.server.MicroserverApp;
import com.aol.micro.server.auto.discovery.RestResource;
import com.aol.micro.server.config.Microserver;
import com.aol.micro.server.reactive.EventQueueManager;
import com.aol.micro.server.reactive.rest.ReactiveRequest;
import com.aol.micro.server.reactive.rest.ReactiveResponse;
import com.aol.micro.server.testing.RestAgent;
@Microserver
@Path("/single")
public class SingleClassTest implements RestResource {
RestAgent rest = new RestAgent();
@Autowired
EventQueueManager<String> manager;
MicroserverApp server;
static String lastRecieved = null;
@Before
public void startServer() {
lastRecieved = null;
server = new MicroserverApp(
SingleClassTest.class, () -> "simple-app");
server.start();
}
@After
public void stopServer() {
server.stop();
}
@PostConstruct
public void busManager() {
manager.forEach("ping", in -> lastRecieved = in);
}
@Test
public void runAppAndBasicTest() throws InterruptedException, ExecutionException {
List<String> boos = new ReactiveRequest(
1000, 1000)
.getJsonStream("http://localhost:8080/simple-app/single/infinite-boo",
String.class)
.toList();
assertThat(boos.size(), is(5));
// System.out.println(rest.get("http://localhost:8080/simple-app/single/ping"));
// assertThat(rest.get("http://localhost:8080/simple-app/single/ping"),
// is("[1,2,3,4]"));
// assertThat(lastRecieved, equalTo("input"));
}
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/example")
public Response streamExample() {
StreamingOutput stream = new StreamingOutput() {
@Override
public void write(OutputStream os) throws IOException, WebApplicationException {
Writer writer = new BufferedWriter(
new OutputStreamWriter(
os));
for (int i = 0; i < 100_000_000; i++) {
writer.write("test");
writer.flush();
/** try {
Thread.sleep(100l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}**/
}
}
};
return Response.ok(stream)
.build();
}
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/out")
public Response output() {
StringBuilder b = new StringBuilder();
for (int i = 0; i < 100_000; i++) {
b.append("test");
}
return Response.ok(b.toString())
.build();
}
@GET
@Produces("application/json")
@Path("/infinite-boo")
public Response boo() {
manager.push("ping", "input");
Response response = ReactiveResponse.publishAsJson(ReactiveSeq.generate(() -> "boo!")
.limit(5));
System.out.println("created response");
return response;
}
@GET
@Produces("application/json")
@Path("/ping")
public Response ping() {
manager.push("ping", "input");
Response response = ReactiveResponse.publishAsJson(ReactiveSeq.of(1, 2, 3, 4)
.limit(5));
System.out.println("created response");
return response;
}
}