diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-04-22 17:03:23 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-04-22 18:19:53 +0200 |
commit | fa2bd6900dbec8c22e50dd468c625c3dc45b0fa5 (patch) | |
tree | 6478f07e4d1389a07af1e8d21336eafee0e76a90 /container-core/src/main/java/com | |
parent | d632e9ae9f44d673fc210602647546b39f837025 (diff) |
Add request handler test driver for minimal jdisc with Jetty http server
Diffstat (limited to 'container-core/src/main/java/com')
3 files changed, 197 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ConnectorFactoryRegistryModule.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ConnectorFactoryRegistryModule.java new file mode 100644 index 00000000000..9d475309955 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ConnectorFactoryRegistryModule.java @@ -0,0 +1,52 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.jdisc.http.server.jetty.testutils; + +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.Provides; +import com.yahoo.component.ComponentId; +import com.yahoo.component.provider.ComponentRegistry; +import com.yahoo.jdisc.http.ConnectorConfig; + +import com.yahoo.jdisc.http.server.jetty.ConnectorFactory; +import com.yahoo.jdisc.http.ssl.impl.ConfiguredSslContextFactoryProvider; + +/** + * Guice module for test ConnectorFactories + * + * @author Tony Vaagenes + */ +public class ConnectorFactoryRegistryModule implements Module { + + private final ConnectorConfig config; + + public ConnectorFactoryRegistryModule(ConnectorConfig config) { + this.config = config; + } + + public ConnectorFactoryRegistryModule() { + this(new ConnectorConfig(new ConnectorConfig.Builder())); + } + + @SuppressWarnings("unused") + @Provides + public ComponentRegistry<ConnectorFactory> connectorFactoryComponentRegistry() { + ComponentRegistry<ConnectorFactory> registry = new ComponentRegistry<>(); + registry.register(ComponentId.createAnonymousComponentId("connector-factory"), + new StaticKeyDbConnectorFactory(config)); + + registry.freeze(); + return registry; + } + + @Override public void configure(Binder binder) {} + + private static class StaticKeyDbConnectorFactory extends ConnectorFactory { + + public StaticKeyDbConnectorFactory(ConnectorConfig connectorConfig) { + super(connectorConfig, new ConfiguredSslContextFactoryProvider(connectorConfig)); + } + + } + +} diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ServletModule.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ServletModule.java new file mode 100644 index 00000000000..a507255c9b7 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ServletModule.java @@ -0,0 +1,23 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.jdisc.http.server.jetty.testutils; + +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.Provides; +import com.yahoo.component.provider.ComponentRegistry; + +import org.eclipse.jetty.servlet.ServletHolder; + +/** + * @author Tony Vaagenes + */ +public class ServletModule implements Module { + + @SuppressWarnings("unused") + @Provides + public ComponentRegistry<ServletHolder> servletHolderComponentRegistry() { + return new ComponentRegistry<>(); + } + + @Override public void configure(Binder binder) { } +} diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/TestDriver.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/TestDriver.java new file mode 100644 index 00000000000..7f3d54f1d34 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/TestDriver.java @@ -0,0 +1,122 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.jdisc.http.server.jetty.testutils; + +import com.google.inject.AbstractModule; +import com.google.inject.Module; +import com.google.inject.util.Modules; +import com.yahoo.container.logging.ConnectionLog; +import com.yahoo.container.logging.RequestLog; +import com.yahoo.jdisc.application.ContainerBuilder; +import com.yahoo.jdisc.handler.RequestHandler; +import com.yahoo.jdisc.http.ConnectorConfig; +import com.yahoo.jdisc.http.ServerConfig; +import com.yahoo.jdisc.http.ServletPathsConfig; +import com.yahoo.jdisc.http.server.jetty.FilterBindings; +import com.yahoo.jdisc.http.server.jetty.JettyHttpServer; +import com.yahoo.jdisc.http.server.jetty.VoidConnectionLog; +import com.yahoo.jdisc.http.server.jetty.VoidRequestLog; +import com.yahoo.security.SslContextBuilder; + +import javax.net.ssl.SSLContext; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * A {@link com.yahoo.jdisc.test.TestDriver} that is configured with {@link JettyHttpServer}. + * + * @author bjorncs + */ +public class TestDriver implements AutoCloseable { + + private final com.yahoo.jdisc.test.TestDriver jdiscCoreTestDriver; + private final JettyHttpServer server; + private final SSLContext sslContext; + + private TestDriver(Builder builder) { + ServerConfig serverConfig = + builder.serverConfig != null ? builder.serverConfig : new ServerConfig(new ServerConfig.Builder()); + ConnectorConfig connectorConfig = + builder.connectorConfig != null ? builder.connectorConfig : new ConnectorConfig(new ConnectorConfig.Builder()); + Module baseModule = createBaseModule(serverConfig, connectorConfig); + Module combinedModule = + builder.extraGuiceModules.isEmpty() ? baseModule : Modules.override(baseModule).with(builder.extraGuiceModules); + com.yahoo.jdisc.test.TestDriver jdiscCoreTestDriver = + com.yahoo.jdisc.test.TestDriver.newSimpleApplicationInstance(combinedModule); + ContainerBuilder containerBuilder = jdiscCoreTestDriver.newContainerBuilder(); + JettyHttpServer server = containerBuilder.getInstance(JettyHttpServer.class); + containerBuilder.serverProviders().install(server); + builder.handlers.forEach((binding, handler) -> containerBuilder.serverBindings().bind(binding, handler)); + jdiscCoreTestDriver.activateContainer(containerBuilder); + server.start(); + this.jdiscCoreTestDriver = jdiscCoreTestDriver; + this.server = server; + this.sslContext = newSslContext(containerBuilder); + } + + public static Builder newBuilder() { return new Builder(); } + + public SSLContext sslContext() { return sslContext; } + public JettyHttpServer server() { return server; } + + @Override public void close() { shutdown(); } + + public boolean shutdown() { + server.close(); + server.release(); + return jdiscCoreTestDriver.close(); + } + + private static SSLContext newSslContext(ContainerBuilder builder) { + ConnectorConfig.Ssl sslConfig = builder.getInstance(ConnectorConfig.class).ssl(); + if (!sslConfig.enabled()) return null; + + return new SslContextBuilder() + .withKeyStore(Paths.get(sslConfig.privateKeyFile()), Paths.get(sslConfig.certificateFile())) + .withTrustStore(Paths.get(sslConfig.caCertificateFile())) + .build(); + } + + private static Module createBaseModule(ServerConfig serverConfig, ConnectorConfig connectorConfig) { + return Modules.combine( + new AbstractModule() { + @Override + protected void configure() { + bind(ServletPathsConfig.class).toInstance(new ServletPathsConfig(new ServletPathsConfig.Builder())); + bind(ServerConfig.class).toInstance(serverConfig); + bind(ConnectorConfig.class).toInstance(connectorConfig); + bind(FilterBindings.class).toInstance(new FilterBindings.Builder().build()); + bind(ConnectionLog.class).toInstance(new VoidConnectionLog()); + bind(RequestLog.class).toInstance(new VoidRequestLog()); + } + }, + new ConnectorFactoryRegistryModule(connectorConfig), + new ServletModule()); + } + + public static class Builder { + private final SortedMap<String, RequestHandler> handlers = new TreeMap<>(); + private final List<Module> extraGuiceModules = new ArrayList<>(); + private ServerConfig serverConfig; + private ConnectorConfig connectorConfig; + + private Builder() {} + + public Builder withRequestHandler(String binding, RequestHandler handler) { + this.handlers.put(binding, handler); return this; + } + + public Builder withRequestHandler(RequestHandler handler) { return withRequestHandler("http://*/*", handler); } + + public Builder withServerConfig(ServerConfig config) { this.serverConfig = config; return this; } + + public Builder withConnectorConfig(ConnectorConfig config) { this.connectorConfig = config; return this; } + + public Builder withGuiceModule(Module module) { this.extraGuiceModules.add(module); return this; } + + public TestDriver build() { return new TestDriver(this); } + + } +} |