package com.mastfrog.acteur; import com.google.common.net.MediaType; import com.google.inject.Inject; import com.mastfrog.acteur.PutTest.SM; import com.mastfrog.acteur.headers.Headers; import com.mastfrog.giulius.tests.TestWith; import com.mastfrog.acteur.util.CacheControlTypes; import com.mastfrog.acteur.headers.Method; import static com.mastfrog.acteur.headers.Method.GET; import static com.mastfrog.acteur.headers.Method.PUT; import com.mastfrog.acteur.preconditions.Methods; import com.mastfrog.acteur.server.ServerModule; import com.mastfrog.acteur.util.CacheControl; import com.mastfrog.giulius.tests.GuiceRunner; import com.mastfrog.netty.http.test.harness.TestHarness; import com.mastfrog.netty.http.test.harness.TestHarnessModule; import com.mastfrog.util.Types; import io.netty.buffer.ByteBuf; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import static io.netty.handler.codec.http.HttpResponseStatus.OK; import org.junit.Test; import org.junit.runner.RunWith; /** * * @author Tim Boudreau */ @TestWith({TestHarnessModule.class, SM.class}) // Use these Guice modules @RunWith(GuiceRunner.class) // Use the Guice-Tests JUnit runner public class PutTest { // Just subclasses ServerModule to provide the application class static class SM extends ServerModule<EchoServer> { SM() { super(EchoServer.class, 2, 2, 3); } } @Test(timeout = 5000L) public void testPuts(TestHarness harn) throws Throwable { harn.get("foo/bar/baz").go().assertStatus(OK).assertContent("Hello world"); harn.get("/").go().assertStatus(OK).assertContent("Hello world"); for (int i = 0; i < 20; i++) { harn.put("/").addHeader(Headers.stringHeader("X-Iteration"), "" + i) .setBody("Test " + i + " iter", MediaType.PLAIN_TEXT_UTF_8).go() .assertStatus(OK).assertContent("Test " + i + " iter"); } harn.get(veryLongUrl(3500)).go().assertStatus(OK); } private String veryLongUrl(int amt) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < amt; i++) { sb.append("/0123456789"); } return sb.toString(); } static class EchoServer extends Application { EchoServer() { add(EchoPage.class); } @Methods({PUT, GET}) private static final class EchoPage extends Page { @Inject EchoPage(ActeurFactory af) { getResponseHeaders().addCacheControl(CacheControlTypes.Public); add(EchoActeur.class); } } } static class EchoActeur extends Acteur { @Inject EchoActeur(HttpEvent evt) { add(Headers.CACHE_CONTROL, CacheControl.$(CacheControlTypes.Public)); if (evt.getMethod() == Method.GET) { setState(new RespondWith(HttpResponseStatus.OK, "Hello world")); } else { setState(new RespondWith(HttpResponseStatus.OK)); setResponseWriter(RWriter.class); } } } private static class RWriter extends ResponseWriter { @Override public ResponseWriter.Status write(Event<?> evt, Output out) throws Exception { FullHttpRequest req = evt.getRequest() instanceof FullHttpRequest ? (FullHttpRequest) evt.getRequest() : null; if (req != null) { ByteBuf buf = req.content(); out.write(buf); } else { throw new AssertionError("Not a FullHttpRequest: " + evt.getRequest() + " " + Types.list(evt.getRequest().getClass())); } return ResponseWriter.Status.DONE; } } }