package org.webpieces.webserver.async; import java.util.List; import java.util.concurrent.CompletableFuture; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.webpieces.httpcommon.Requests; import org.webpieces.httpcommon.api.RequestId; import org.webpieces.httpcommon.api.RequestListener; import org.webpieces.httpparser.api.dto.HttpRequest; import org.webpieces.httpparser.api.dto.KnownHttpMethod; import org.webpieces.httpparser.api.dto.KnownStatusCode; import org.webpieces.util.file.VirtualFileClasspath; import org.webpieces.webserver.ResponseExtract; import org.webpieces.webserver.WebserverForTest; import org.webpieces.webserver.basic.app.biz.SomeOtherLib; import org.webpieces.webserver.mock.MockSomeOtherLib; import org.webpieces.webserver.test.FullResponse; import org.webpieces.webserver.test.MockResponseSender; import org.webpieces.webserver.test.PlatformOverridesForTest; import com.google.inject.Binder; import com.google.inject.Module; public class TestAsyncWebServer { private MockResponseSender socket = new MockResponseSender(); private RequestListener server; private MockSomeOtherLib mockNotFoundLib = new MockSomeOtherLib(); @Before public void setUp() { VirtualFileClasspath metaFile = new VirtualFileClasspath("asyncMeta.txt", WebserverForTest.class.getClassLoader()); WebserverForTest webserver = new WebserverForTest(new PlatformOverridesForTest(), new AppOverridesModule(), false, metaFile); server = webserver.start(); } @Test public void testCompletePromiseOnRequestThread() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/myroute"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("This is the first raw html page"); } @Test public void testCompletePromiseOnAnotherThread() { CompletableFuture<Integer> future = new CompletableFuture<Integer>(); mockNotFoundLib.queueFuture(future ); HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/asyncSuccessRoute"); server.incomingRequest(req, new RequestId(0), true, socket); //no response yet... List<FullResponse> responses1 = socket.getResponses(); Assert.assertEquals(0, responses1.size()); //now have the server complete processing future.complete(5); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("Hi Dean Hiller, This is a page"); } @Test public void testRedirect() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER); Assert.assertEquals(0, response.getBody().getReadableSize()); } private class AppOverridesModule implements Module { @Override public void configure(Binder binder) { binder.bind(SomeOtherLib.class).toInstance(mockNotFoundLib); } } }