package org.webpieces.router.api.simplesvr; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.webpieces.util.logging.Logger; import org.webpieces.util.logging.LoggerFactory; import org.webpieces.ctx.api.HttpMethod; import org.webpieces.ctx.api.RouterRequest; import org.webpieces.router.api.RouterConfig; import org.webpieces.router.api.RouterSvcFactory; import org.webpieces.router.api.RouterService; import org.webpieces.router.api.dto.RedirectResponse; import org.webpieces.router.api.mocks.MockResponseStream; import org.webpieces.router.api.mocks.VirtualFileInputStream; import org.webpieces.util.file.VirtualFile; import org.webpieces.util.security.SecretKeyInfo; import com.google.inject.Binder; import com.google.inject.Module; @RunWith(Parameterized.class) public class TestProdRouter { private static final Logger log = LoggerFactory.getLogger(TestProdRouter.class); private RouterService server; private TestModule overrides; @SuppressWarnings("rawtypes") @Parameterized.Parameters public static Collection bothServers() { String moduleFileContents = AppModules.class.getName(); VirtualFile f = new VirtualFileInputStream(moduleFileContents.getBytes(), "testAppModules"); TestModule module = new TestModule(); RouterConfig config = new RouterConfig() .setMetaFile(f) .setWebappOverrides(module) .setSecretKey(SecretKeyInfo.generateForTest()); RouterService prodSvc = RouterSvcFactory.create(config); return Arrays.asList(new Object[][] { { prodSvc, module } }); } private static class TestModule implements Module { public MockSomeService mockService = new MockSomeService(); @Override public void configure(Binder binder) { binder.bind(SomeService.class).toInstance(mockService); } } public TestProdRouter(RouterService svc, TestModule module) { this.server = svc; this.overrides = module; log.info("constructing test class for server="+svc.getClass().getSimpleName()); } @Before public void setUp() { server.start(); } /** * This test won't work in DevRoute right now as we need to do the following * 1. create CompileOnDemand very early on * 2. do a Thread.current().setContextClassLoader(compileOnDemand.getLatestClassloader()) * * and this all needs to be done BEFORE TestModule is created and more importantly before * the bind(SomeService.class) as SomeService will be loaded from one classloader and then * when DEVrouter creates the controller, the compileOnDemand classloader is used resulting * in a mismatch. */ @Test public void testAsyncRouteAndMocking() { RouterRequest req = createHttpRequest(HttpMethod.GET, "/async"); //setup returning a response CompletableFuture<Integer> future = new CompletableFuture<Integer>(); overrides.mockService.addToReturn(future); MockResponseStream mockResponseStream = new MockResponseStream(); server.incomingCompleteRequest(req, mockResponseStream); //no response yet... List<RedirectResponse> responses = mockResponseStream.getSendRedirectCalledList(); Assert.assertEquals(0, responses.size()); int id = 78888; future.complete(id); responses = mockResponseStream.getSendRedirectCalledList(); Assert.assertEquals(1, responses.size()); RedirectResponse response = responses.get(0); Assert.assertEquals(req.domain, response.domain); Assert.assertFalse(response.isHttps); Assert.assertEquals("/meeting/"+id, response.redirectToPath); } private RouterRequest createHttpRequest(HttpMethod method, String path) { RouterRequest r = new RouterRequest(); r.method = method; r.relativePath = path; return r; } }