diff options
Diffstat (limited to 'jdisc_core/src/test/java/com/yahoo/jdisc/core/ContainerSnapshotTestCase.java')
-rw-r--r-- | jdisc_core/src/test/java/com/yahoo/jdisc/core/ContainerSnapshotTestCase.java | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/jdisc_core/src/test/java/com/yahoo/jdisc/core/ContainerSnapshotTestCase.java b/jdisc_core/src/test/java/com/yahoo/jdisc/core/ContainerSnapshotTestCase.java new file mode 100644 index 00000000000..15bd3b050d4 --- /dev/null +++ b/jdisc_core/src/test/java/com/yahoo/jdisc/core/ContainerSnapshotTestCase.java @@ -0,0 +1,211 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.jdisc.core; + +import com.google.inject.AbstractModule; +import com.google.inject.Key; +import com.google.inject.name.Names; +import com.yahoo.jdisc.AbstractResource; +import com.yahoo.jdisc.Request; +import com.yahoo.jdisc.application.BindingMatch; +import com.yahoo.jdisc.application.ContainerBuilder; +import com.yahoo.jdisc.handler.CompletionHandler; +import com.yahoo.jdisc.handler.ContentChannel; +import com.yahoo.jdisc.handler.RequestHandler; +import com.yahoo.jdisc.handler.ResponseHandler; +import com.yahoo.jdisc.test.TestDriver; +import org.junit.Test; + +import java.net.URI; +import java.nio.ByteBuffer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + + +/** + * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + */ +public class ContainerSnapshotTestCase { + + @Test + public void requireThatServerHandlerCanBeResolved() { + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); + ContainerBuilder builder = driver.newContainerBuilder(); + builder.serverBindings().bind("http://foo/*", MyRequestHandler.newInstance()); + driver.activateContainer(builder); + + Request request = new Request(driver, URI.create("http://foo/")); + assertNotNull(request.container().resolveHandler(request)); + assertNotNull(request.getBindingMatch()); + request.release(); + + request = new Request(driver, URI.create("http://foo/")); + request.setServerRequest(false); + assertNull(request.container().resolveHandler(request)); + assertNull(request.getBindingMatch()); + request.release(); + + request = new Request(driver, URI.create("http://bar/")); + assertNull(request.container().resolveHandler(request)); + assertNull(request.getBindingMatch()); + request.release(); + + request = new Request(driver, URI.create("http://bar/")); + request.setServerRequest(false); + assertNull(request.container().resolveHandler(request)); + assertNull(request.getBindingMatch()); + request.release(); + + assertTrue(driver.close()); + } + + @Test + public void requireThatClientHandlerCanBeResolved() { + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); + ContainerBuilder builder = driver.newContainerBuilder(); + builder.clientBindings().bind("http://foo/*", MyRequestHandler.newInstance()); + driver.activateContainer(builder); + + Request request = new Request(driver, URI.create("http://foo/")); + assertNull(request.container().resolveHandler(request)); + assertNull(request.getBindingMatch()); + request.release(); + + request = new Request(driver, URI.create("http://foo/")); + request.setServerRequest(false); + assertNotNull(request.container().resolveHandler(request)); + assertNotNull(request.getBindingMatch()); + request.release(); + + request = new Request(driver, URI.create("http://bar/")); + assertNull(request.container().resolveHandler(request)); + assertNull(request.getBindingMatch()); + request.release(); + + request = new Request(driver, URI.create("http://bar/")); + request.setServerRequest(false); + assertNull(request.container().resolveHandler(request)); + assertNull(request.getBindingMatch()); + request.release(); + + assertTrue(driver.close()); + } + + @Test + public void requireThatClientBindingsAreUsed() { + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); + ContainerBuilder builder = driver.newContainerBuilder(); + builder.clientBindings().bind("http://host/path", MyRequestHandler.newInstance()); + driver.activateContainer(builder); + Request request = new Request(driver, URI.create("http://host/path")); + assertNull(request.container().resolveHandler(request)); + request.setServerRequest(false); + assertNotNull(request.container().resolveHandler(request)); + request.release(); + assertTrue(driver.close()); + } + + @Test + public void requireThatBindingMatchIsSetByResolveHandler() { + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); + ContainerBuilder builder = driver.newContainerBuilder(); + builder.serverBindings().bind("http://*/*", MyRequestHandler.newInstance()); + driver.activateContainer(builder); + + Request request = new Request(driver, URI.create("http://localhost:69/status.html")); + assertNotNull(request.container().resolveHandler(request)); + BindingMatch<RequestHandler> match = request.getBindingMatch(); + assertNotNull(match); + assertEquals(3, match.groupCount()); + assertEquals("localhost", match.group(0)); + assertEquals("69", match.group(1)); + assertEquals("status.html", match.group(2)); + request.release(); + + assertTrue(driver.close()); + } + + @Test + public void requireThatNewRequestHasSameSnapshot() { + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(); + driver.activateContainer(driver.newContainerBuilder()); + Request foo = new Request(driver, URI.create("http://host/foo")); + Request bar = new Request(foo, URI.create("http://host/bar")); + assertSame(foo.container(), bar.container()); + foo.release(); + bar.release(); + assertTrue(driver.close()); + } + + @Test + public void requireThatActiveInjectorIsUsed() { + final Object obj = new Object(); + TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(new AbstractModule() { + + @Override + protected void configure() { + bind(Object.class).toInstance(obj); + bind(String.class).annotatedWith(Names.named("foo")).toInstance("foo"); + } + }); + ActiveContainer active = new ActiveContainer(driver.newContainerBuilder()); + ContainerSnapshot snapshot = new ContainerSnapshot(active, null, null); + assertSame(obj, snapshot.getInstance(Object.class)); + assertEquals("foo", snapshot.getInstance(Key.get(String.class, Names.named("foo")))); + snapshot.release(); + assertTrue(driver.close()); + } + + private static class MyContent implements ContentChannel { + + CompletionHandler writeCompletion = null; + CompletionHandler closeCompletion = null; + ByteBuffer writeBuf = null; + boolean closed = false; + + @Override + public void write(ByteBuffer buf, CompletionHandler handler) { + writeBuf = buf; + writeCompletion = handler; + } + + @Override + public void close(CompletionHandler handler) { + closed = true; + closeCompletion = handler; + } + } + + private static class MyRequestHandler extends AbstractResource implements RequestHandler { + + final MyContent content = new MyContent(); + Request request = null; + ResponseHandler handler = null; + boolean timeout = false; + boolean destroyed = false; + + @Override + public ContentChannel handleRequest(Request request, ResponseHandler handler) { + this.request = request; + this.handler = handler; + return content; + } + + @Override + public void handleTimeout(Request request, ResponseHandler handler) { + timeout = true; + } + + @Override + public void destroy() { + destroyed = true; + } + + static MyRequestHandler newInstance() { + return new MyRequestHandler(); + } + } +} |