summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2021-04-22 17:03:23 +0200
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2021-04-22 18:19:53 +0200
commitfa2bd6900dbec8c22e50dd468c625c3dc45b0fa5 (patch)
tree6478f07e4d1389a07af1e8d21336eafee0e76a90 /container-core/src/main/java/com
parentd632e9ae9f44d673fc210602647546b39f837025 (diff)
Add request handler test driver for minimal jdisc with Jetty http server
Diffstat (limited to 'container-core/src/main/java/com')
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ConnectorFactoryRegistryModule.java52
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/ServletModule.java23
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/testutils/TestDriver.java122
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); }
+
+ }
+}