| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 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 static org.hamcrest.Matchers.containsString; |
| import static org.hamcrest.Matchers.is; |
| import static org.hamcrest.Matchers.notNullValue; |
| |
| import java.io.File; |
| import java.nio.file.Path; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.jetty.start.Props.Prop; |
| import org.eclipse.jetty.start.config.ConfigSource; |
| import org.eclipse.jetty.start.config.ConfigSources; |
| import org.eclipse.jetty.start.config.DirConfigSource; |
| import org.eclipse.jetty.toolchain.test.FS; |
| import org.eclipse.jetty.toolchain.test.TestingDir; |
| import org.junit.Assert; |
| import org.junit.Rule; |
| import org.junit.Test; |
| |
| public class IncludeJettyDirTest |
| { |
| private static class MainResult |
| { |
| private Main main; |
| private StartArgs args; |
| |
| public void assertSearchOrder(List<String> expectedSearchOrder) |
| { |
| ConfigSources sources = main.getBaseHome().getConfigSources(); |
| List<String> actualOrder = new ArrayList<>(); |
| for (ConfigSource source : sources) |
| { |
| if (source instanceof DirConfigSource) |
| { |
| actualOrder.add(source.getId()); |
| } |
| } |
| ConfigurationAssert.assertOrdered("Search Order",expectedSearchOrder,actualOrder); |
| } |
| |
| public void assertProperty(String key, String expectedValue) |
| { |
| Prop prop = args.getProperties().getProp(key); |
| String prefix = "Prop[" + key + "]"; |
| Assert.assertThat(prefix + " should have a value",prop,notNullValue()); |
| Assert.assertThat(prefix + " value",prop.value,is(expectedValue)); |
| } |
| } |
| |
| @Rule |
| public TestingDir testdir = new TestingDir(); |
| |
| private MainResult runMain(Path baseDir, Path homeDir, String... cmdLineArgs) throws Exception |
| { |
| MainResult ret = new MainResult(); |
| ret.main = new Main(); |
| List<String> cmdLine = new ArrayList<>(); |
| cmdLine.add("jetty.home=" + homeDir.toString()); |
| cmdLine.add("jetty.base=" + baseDir.toString()); |
| // cmdLine.add("--debug"); |
| for (String arg : cmdLineArgs) |
| { |
| cmdLine.add(arg); |
| } |
| ret.args = ret.main.processCommandLine(cmdLine); |
| return ret; |
| } |
| |
| @Test |
| public void testNoExtras() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1"); |
| |
| // Simple command line - no reference to include-jetty-dirs |
| MainResult result = runMain(base,home); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| } |
| |
| @Test |
| public void testCommandLine_1Extra() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini","jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1"); |
| |
| // Simple command line reference to include-jetty-dir |
| MainResult result = runMain(base,home, |
| // direct reference via path |
| "--include-jetty-dir=" + common.toString()); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(common.toString()); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testCommandLine_1Extra_FromSimpleProp() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini","jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1"); |
| |
| // Simple command line reference to include-jetty-dir via property (also on command line) |
| MainResult result = runMain(base,home, |
| // property |
| "my.common=" + common.toString(), |
| // reference via property |
| "--include-jetty-dir=${my.common}"); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add("${my.common}"); // should see property use |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testCommandLine_1Extra_FromPropPrefix() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create opt |
| Path opt = testdir.getPathFile("opt"); |
| FS.ensureEmpty(opt); |
| |
| // Create common |
| Path common = opt.resolve("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini","jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1"); |
| |
| String dirRef = "${my.opt}" + File.separator + "common"; |
| |
| // Simple command line reference to include-jetty-dir via property (also on command line) |
| MainResult result = runMain(base,home, |
| // property to 'opt' dir |
| "my.opt=" + opt.toString(), |
| // reference via property prefix |
| "--include-jetty-dir=" + dirRef); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(dirRef); // should use property |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testCommandLine_1Extra_FromCompoundProp() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create opt |
| Path opt = testdir.getPathFile("opt"); |
| FS.ensureEmpty(opt); |
| |
| // Create common |
| Path common = opt.resolve("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini","jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1"); |
| |
| String dirRef = "${my.opt}" + File.separator + "${my.dir}"; |
| |
| // Simple command line reference to include-jetty-dir via property (also on command line) |
| MainResult result = runMain(base,home, |
| // property to 'opt' dir |
| "my.opt=" + opt.toString(), |
| // property to commmon dir name |
| "my.dir=common", |
| // reference via property prefix |
| "--include-jetty-dir=" + dirRef); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(dirRef); // should use property |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testRefCommon() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini","jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "--include-jetty-dir=" + common.toString()); |
| |
| MainResult result = runMain(base,home); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(common.toString()); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testRefCommonAndCorp() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini","jetty.http.port=8080"); |
| |
| // Create corp |
| Path corp = testdir.getPathFile("corp"); |
| FS.ensureEmpty(corp); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "--include-jetty-dir=" + common.toString(), // |
| "--include-jetty-dir=" + corp.toString()); |
| |
| MainResult result = runMain(base,home); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(common.toString()); |
| expectedSearchOrder.add(corp.toString()); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testRefCommonRefCorp() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create corp |
| Path corp = testdir.getPathFile("corp"); |
| FS.ensureEmpty(corp); |
| TestEnv.makeFile(corp,"start.ini","jetty.http.port=9090"); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini", // |
| "--include-jetty-dir=" + corp.toString(), // |
| "jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "--include-jetty-dir=" + common.toString()); |
| |
| MainResult result = runMain(base,home); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(common.toString()); |
| expectedSearchOrder.add(corp.toString()); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testRefCommonRefCorp_FromSimpleProps() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create corp |
| Path corp = testdir.getPathFile("corp"); |
| FS.ensureEmpty(corp); |
| TestEnv.makeFile(corp,"start.ini", // |
| "jetty.http.port=9090"); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini", // |
| "my.corp=" + corp.toString(), // |
| "--include-jetty-dir=${my.corp}", // |
| "jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "my.common=" + common.toString(), // |
| "--include-jetty-dir=${my.common}"); |
| |
| MainResult result = runMain(base,home); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add("${my.common}"); |
| expectedSearchOrder.add("${my.corp}"); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","8080"); // from 'common' |
| } |
| |
| @Test |
| public void testRefCommonRefCorp_CmdLineRef() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create devops |
| Path devops = testdir.getPathFile("devops"); |
| FS.ensureEmpty(devops); |
| TestEnv.makeFile(devops,"start.ini", // |
| "--module=logging", // |
| "jetty.http.port=2222"); |
| |
| // Create corp |
| Path corp = testdir.getPathFile("corp"); |
| FS.ensureEmpty(corp); |
| TestEnv.makeFile(corp,"start.ini", // |
| "jetty.http.port=9090"); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini", // |
| "--include-jetty-dir=" + corp.toString(), // |
| "jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "--include-jetty-dir=" + common.toString()); |
| |
| MainResult result = runMain(base,home, |
| // command line provided include-jetty-dir ref |
| "--include-jetty-dir=" + devops.toString()); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(devops.toString()); |
| expectedSearchOrder.add(common.toString()); |
| expectedSearchOrder.add(corp.toString()); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","2222"); // from 'devops' |
| } |
| |
| @Test |
| public void testRefCommonRefCorp_CmdLineProp() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create corp |
| Path corp = testdir.getPathFile("corp"); |
| FS.ensureEmpty(corp); |
| TestEnv.makeFile(corp,"start.ini", // |
| "jetty.http.port=9090"); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| TestEnv.makeFile(common,"start.ini", // |
| "--include-jetty-dir=" + corp.toString(), // |
| "jetty.http.port=8080"); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "--include-jetty-dir=" + common.toString()); |
| |
| MainResult result = runMain(base,home, |
| // command line property should override all others |
| "jetty.http.port=7070"); |
| |
| List<String> expectedSearchOrder = new ArrayList<>(); |
| expectedSearchOrder.add("${jetty.base}"); |
| expectedSearchOrder.add(common.toString()); |
| expectedSearchOrder.add(corp.toString()); |
| expectedSearchOrder.add("${jetty.home}"); |
| result.assertSearchOrder(expectedSearchOrder); |
| |
| result.assertProperty("jetty.http.host","127.0.0.1"); |
| result.assertProperty("jetty.http.port","7070"); // from command line |
| } |
| |
| @Test |
| public void testBadDoubleRef() throws Exception |
| { |
| // Create home |
| Path home = testdir.getPathFile("home"); |
| FS.ensureEmpty(home); |
| TestEnv.copyTestDir("dist-home",home); |
| |
| // Create common |
| Path common = testdir.getPathFile("common"); |
| FS.ensureEmpty(common); |
| |
| // Create corp |
| Path corp = testdir.getPathFile("corp"); |
| FS.ensureEmpty(corp); |
| TestEnv.makeFile(corp,"start.ini", |
| // standard property |
| "jetty.http.port=9090", |
| // INTENTIONAL BAD Reference (duplicate) |
| "--include-jetty-dir=" + common.toString()); |
| |
| // Populate common |
| TestEnv.makeFile(common,"start.ini", |
| // standard property |
| "jetty.http.port=8080", |
| // reference to corp |
| "--include-jetty-dir=" + corp.toString()); |
| |
| // Create base |
| Path base = testdir.getPathFile("base"); |
| FS.ensureEmpty(base); |
| TestEnv.makeFile(base,"start.ini", // |
| "jetty.http.host=127.0.0.1",// |
| "--include-jetty-dir=" + common.toString()); |
| |
| try |
| { |
| runMain(base,home); |
| Assert.fail("Should have thrown a UsageException"); |
| } |
| catch (UsageException e) |
| { |
| Assert.assertThat("UsageException",e.getMessage(),containsString("Duplicate")); |
| } |
| } |
| } |