blob: 66216ea887d3952d6062fc037461a33174d647e7 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.start;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.eclipse.jetty.start.config.CommandLineConfigSource;
import org.eclipse.jetty.start.config.ConfigSources;
import org.eclipse.jetty.start.config.JettyBaseConfigSource;
import org.eclipse.jetty.start.config.JettyHomeConfigSource;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.TestingDir;
import org.hamcrest.Matchers;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class ModulesTest
{
private final static String TEST_SOURCE = "<test>";
@Rule
public TestingDir testdir = new TestingDir();
@Test
public void testLoadAllModules() throws IOException
{
// Test Env
File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
File baseDir = testdir.getEmptyPathDir().toFile();
String cmdLine[] = new String[] { "jetty.version=TEST" };
// Configuration
CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
ConfigSources config = new ConfigSources();
config.add(cmdLineSource);
config.add(new JettyHomeConfigSource(homeDir.toPath()));
config.add(new JettyBaseConfigSource(baseDir.toPath()));
// Initialize
BaseHome basehome = new BaseHome(config);
StartArgs args = new StartArgs();
args.parse(config);
// Test Modules
Modules modules = new Modules(basehome,args);
modules.registerAll();
// Check versions
assertThat("java.version.major", args.getProperties().getString("java.version.major"),equalTo("1"));
assertThat("java.version.minor", args.getProperties().getString("java.version.minor"),anyOf(equalTo("7"),Matchers.equalTo("8"),Matchers.equalTo("9")));
List<String> moduleNames = new ArrayList<>();
for (Module mod : modules)
{
// skip alpn-boot in this test (as its behavior is jdk specific)
if (mod.getName().equals("alpn-boot"))
{
continue;
}
moduleNames.add(mod.getName());
}
List<String> expected = new ArrayList<>();
expected.add("alpn");
expected.add("annotations");
expected.add("apache-jsp");
expected.add("apache-jstl");
expected.add("cdi");
expected.add("client");
expected.add("continuation");
expected.add("debuglog");
expected.add("deploy");
expected.add("ext");
expected.add("fcgi");
expected.add("gzip");
expected.add("hawtio");
expected.add("home-base-warning");
expected.add("http");
expected.add("http2");
expected.add("http2c");
expected.add("https");
expected.add("ipaccess");
expected.add("jaas");
expected.add("jamon");
expected.add("jaspi");
expected.add("jminix");
expected.add("jmx");
expected.add("jmx-remote");
expected.add("jndi");
expected.add("jolokia");
expected.add("jsp");
expected.add("jstl");
expected.add("jvm");
expected.add("logging");
expected.add("lowresources");
expected.add("monitor");
expected.add("plus");
expected.add("proxy");
expected.add("quickstart");
expected.add("requestlog");
expected.add("resources");
expected.add("rewrite");
expected.add("security");
expected.add("server");
expected.add("servlet");
expected.add("servlets");
expected.add("setuid");
expected.add("spring");
expected.add("ssl");
expected.add("stats");
expected.add("webapp");
expected.add("websocket");
expected.add("infinispan");
expected.add("jdbc-sessions");
expected.add("nosql");
ConfigurationAssert.assertContainsUnordered("All Modules",expected,moduleNames);
}
/**
* Test loading of only shallow modules, not deep references.
* In other words. ${search-dir}/modules/*.mod should be the only
* valid references, but ${search-dir}/alt/foo/modules/*.mod should
* not be considered valid.
* @throws IOException on test failures
*/
@Test
public void testLoadShallowModulesOnly() throws IOException
{
// Test Env
File homeDir = MavenTestingUtils.getTestResourceDir("jetty home with spaces");
// intentionally setup top level resources dir (as this would have many
// deep references)
File baseDir = MavenTestingUtils.getTestResourcesDir();
String cmdLine[] = new String[] { "jetty.version=TEST" };
// Configuration
CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
ConfigSources config = new ConfigSources();
config.add(cmdLineSource);
config.add(new JettyHomeConfigSource(homeDir.toPath()));
config.add(new JettyBaseConfigSource(baseDir.toPath()));
// Initialize
BaseHome basehome = new BaseHome(config);
StartArgs args = new StartArgs();
args.parse(config);
// Test Modules
Modules modules = new Modules(basehome,args);
modules.registerAll();
List<String> moduleNames = new ArrayList<>();
for (Module mod : modules)
{
moduleNames.add(mod.getName());
}
List<String> expected = new ArrayList<>();
expected.add("base");
ConfigurationAssert.assertContainsUnordered("All Modules",expected,moduleNames);
}
@Test
public void testEnableRegexSimple() throws IOException
{
// Test Env
File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
File baseDir = testdir.getEmptyPathDir().toFile();
String cmdLine[] = new String[] { "jetty.version=TEST", "java.version=1.8.0_31" };
// Configuration
CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
ConfigSources config = new ConfigSources();
config.add(cmdLineSource);
config.add(new JettyHomeConfigSource(homeDir.toPath()));
config.add(new JettyBaseConfigSource(baseDir.toPath()));
// Initialize
BaseHome basehome = new BaseHome(config);
StartArgs args = new StartArgs();
args.parse(config);
// Test Modules
Modules modules = new Modules(basehome,args);
modules.registerAll();
Pattern predicate = Pattern.compile("[sj]{1}.*");
modules.stream().filter(m->{return predicate.matcher(m.getName()).matches();}).forEach(m->{modules.select(m.getName(),TEST_SOURCE);});
modules.sort();
List<String> expected = new ArrayList<>();
expected.add("jmx");
expected.add("stats");
expected.add("security");
expected.add("jndi");
expected.add("jsp");
expected.add("servlet");
expected.add("servlets");
expected.add("jaas");
expected.add("server");
expected.add("setuid");
expected.add("spring");
expected.add("jaspi");
expected.add("jminix");
expected.add("jolokia");
expected.add("jamon");
expected.add("jstl");
expected.add("jmx-remote");
expected.add("jvm");
// transitive
expected.add("ssl");
expected.add("apache-jsp");
expected.add("apache-jstl");
expected.add("webapp");
expected.add("deploy");
expected.add("plus");
expected.add("annotations");
expected.add("jdbc-sessions");
List<String> resolved = new ArrayList<>();
for (Module module : modules.getSelected())
{
resolved.add(module.getName());
}
ConfigurationAssert.assertContainsUnordered("Enabled Modules",expected,resolved);
}
@Test
public void testResolve_ServerHttp() throws IOException
{
// Test Env
File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
File baseDir = testdir.getEmptyPathDir().toFile();
String cmdLine[] = new String[] { "jetty.version=TEST" };
// Configuration
CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
ConfigSources config = new ConfigSources();
config.add(cmdLineSource);
config.add(new JettyHomeConfigSource(homeDir.toPath()));
config.add(new JettyBaseConfigSource(baseDir.toPath()));
// Initialize
BaseHome basehome = new BaseHome(config);
StartArgs args = new StartArgs();
args.parse(config);
// Test Modules
Modules modules = new Modules(basehome,args);
modules.registerAll();
// Enable 2 modules
modules.select("server",TEST_SOURCE);
modules.select("http",TEST_SOURCE);
modules.sort();
// Collect active module list
List<Module> active = modules.getSelected();
// Assert names are correct, and in the right order
List<String> expectedNames = new ArrayList<>();
expectedNames.add("server");
expectedNames.add("http");
List<String> actualNames = new ArrayList<>();
for (Module actual : active)
{
actualNames.add(actual.getName());
}
assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
// Assert Library List
List<String> expectedLibs = new ArrayList<>();
expectedLibs.add("lib/servlet-api-3.1.jar");
expectedLibs.add("lib/jetty-schemas-3.1.jar");
expectedLibs.add("lib/jetty-http-${jetty.version}.jar");
expectedLibs.add("lib/jetty-server-${jetty.version}.jar");
expectedLibs.add("lib/jetty-xml-${jetty.version}.jar");
expectedLibs.add("lib/jetty-util-${jetty.version}.jar");
expectedLibs.add("lib/jetty-io-${jetty.version}.jar");
List<String> actualLibs = normalizeLibs(active);
assertThat("Resolved Libs: " + actualLibs,actualLibs,contains(expectedLibs.toArray()));
// Assert XML List
List<String> expectedXmls = new ArrayList<>();
expectedXmls.add("etc/jetty.xml");
expectedXmls.add("etc/jetty-http.xml");
List<String> actualXmls = normalizeXmls(active);
assertThat("Resolved XMLs: " + actualXmls,actualXmls,contains(expectedXmls.toArray()));
}
// TODO fix the order checking to allow alternate orders that comply with graph
@Test
@Ignore
public void testResolve_WebSocket() throws IOException
{
// Test Env
File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
File baseDir = testdir.getEmptyPathDir().toFile();
String cmdLine[] = new String[] { "jetty.version=TEST" };
// Configuration
CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
ConfigSources config = new ConfigSources();
config.add(cmdLineSource);
config.add(new JettyHomeConfigSource(homeDir.toPath()));
config.add(new JettyBaseConfigSource(baseDir.toPath()));
// Initialize
BaseHome basehome = new BaseHome(config);
StartArgs args = new StartArgs();
args.parse(config);
// Test Modules
Modules modules = new Modules(basehome,args);
modules.registerAll();
// Enable 2 modules
modules.select("websocket",TEST_SOURCE);
modules.select("http",TEST_SOURCE);
modules.sort();
// Collect active module list
List<Module> active = modules.getSelected();
// Assert names are correct, and in the right order
List<String> expectedNames = new ArrayList<>();
expectedNames.add("server");
expectedNames.add("http");
expectedNames.add("jndi");
expectedNames.add("security");
expectedNames.add("servlet");
expectedNames.add("webapp");
expectedNames.add("plus");
expectedNames.add("annotations");
expectedNames.add("websocket");
List<String> actualNames = new ArrayList<>();
for (Module actual : active)
{
actualNames.add(actual.getName());
}
assertThat("Resolved Names: " + actualNames,actualNames,contains(expectedNames.toArray()));
// Assert Library List
List<String> expectedLibs = new ArrayList<>();
expectedLibs.add("lib/servlet-api-3.1.jar");
expectedLibs.add("lib/jetty-schemas-3.1.jar");
expectedLibs.add("lib/jetty-http-${jetty.version}.jar");
expectedLibs.add("lib/jetty-server-${jetty.version}.jar");
expectedLibs.add("lib/jetty-xml-${jetty.version}.jar");
expectedLibs.add("lib/jetty-util-${jetty.version}.jar");
expectedLibs.add("lib/jetty-io-${jetty.version}.jar");
expectedLibs.add("lib/jetty-jndi-${jetty.version}.jar");
expectedLibs.add("lib/jndi/*.jar");
expectedLibs.add("lib/jetty-security-${jetty.version}.jar");
expectedLibs.add("lib/jetty-servlet-${jetty.version}.jar");
expectedLibs.add("lib/jetty-webapp-${jetty.version}.jar");
expectedLibs.add("lib/jetty-plus-${jetty.version}.jar");
expectedLibs.add("lib/jetty-annotations-${jetty.version}.jar");
expectedLibs.add("lib/annotations/*.jar");
expectedLibs.add("lib/websocket/*.jar");
List<String> actualLibs = normalizeLibs(active);
assertThat("Resolved Libs: " + actualLibs,actualLibs,contains(expectedLibs.toArray()));
// Assert XML List
List<String> expectedXmls = new ArrayList<>();
expectedXmls.add("etc/jetty.xml");
expectedXmls.add("etc/jetty-http.xml");
expectedXmls.add("etc/jetty-plus.xml");
expectedXmls.add("etc/jetty-annotations.xml");
List<String> actualXmls = normalizeXmls(active);
assertThat("Resolved XMLs: " + actualXmls,actualXmls,contains(expectedXmls.toArray()));
}
// TODO fix the order checking to allow alternate orders that comply with graph
@Test
@Ignore
public void testResolve_Alt() throws IOException
{
// Test Env
File homeDir = MavenTestingUtils.getTestResourceDir("dist-home");
File baseDir = testdir.getEmptyPathDir().toFile();
String cmdLine[] = new String[] { "jetty.version=TEST" };
// Configuration
CommandLineConfigSource cmdLineSource = new CommandLineConfigSource(cmdLine);
ConfigSources config = new ConfigSources();
config.add(cmdLineSource);
config.add(new JettyHomeConfigSource(homeDir.toPath()));
config.add(new JettyBaseConfigSource(baseDir.toPath()));
// Initialize
BaseHome basehome = new BaseHome(config);
StartArgs args = new StartArgs();
args.parse(config);
// Test Modules
Modules modules = new Modules(basehome,args);
modules.registerAll();
// Enable test modules
modules.select("http",TEST_SOURCE);
modules.select("annotations",TEST_SOURCE);
modules.select("deploy",TEST_SOURCE);
// Enable alternate modules
String alt = "<alt>";
modules.select("websocket",alt);
modules.select("jsp",alt);
modules.sort();
// Collect active module list
List<String> active = modules.getSelected().stream().map(m->{return m.getName();}).collect(Collectors.toList());
// Assert names are correct, and in the right order
List<String> expectedNames = new ArrayList<>();
expectedNames.add("apache-jsp");
expectedNames.add("server");
expectedNames.add("http");
expectedNames.add("jndi");
expectedNames.add("security");
expectedNames.add("servlet");
expectedNames.add("webapp");
expectedNames.add("deploy");
expectedNames.add("plus");
expectedNames.add("annotations");
expectedNames.add("jsp");
expectedNames.add("websocket");
assertThat("Resolved Names: " + active,active,contains(expectedNames.toArray()));
// Now work with the 'alt' selected
List<String> expectedAlts = new ArrayList<>();
expectedAlts.add("apache-jsp");
expectedAlts.add("jsp");
expectedAlts.add("websocket");
for (String expectedAlt : expectedAlts)
{
Module altMod = modules.get(expectedAlt);
assertThat("Alt.mod[" + expectedAlt + "].selected",altMod.isSelected(),is(true));
Set<String> sources = altMod.getSelections();
assertThat("Alt.mod[" + expectedAlt + "].sources: [" + Utils.join(sources,", ") + "]",sources,contains(alt));
}
// Now collect the unique source list
List<String> alts = modules.stream().filter(m->{return m.getSelections().contains(alt);}).map(m->{return m.getName();}).collect(Collectors.toList());
assertThat("Resolved Alt (Sources) Names: " + alts,alts,contains(expectedAlts.toArray()));
}
public List<String> normalizeLibs(List<Module> active)
{
List<String> libs = new ArrayList<>();
for (Module module : active)
{
for (String lib : module.getLibs())
{
if (!libs.contains(lib))
{
libs.add(lib);
}
}
}
return libs;
}
public List<String> normalizeXmls(List<Module> active)
{
List<String> xmls = new ArrayList<>();
for (Module module : active)
{
for (String xml : module.getXmls())
{
if (!xmls.contains(xml))
{
xmls.add(xml);
}
}
}
return xmls;
}
}