blob: 28772c83653a65040ae0cee06a37419c24904280 [file] [log] [blame]
//
// ========================================================================
// 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.config;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jetty.start.ConfigurationAssert;
import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.TestEnv;
import org.eclipse.jetty.start.UsageException;
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 ConfigSourcesTest
{
@Rule
public TestingDir testdir = new TestingDir();
private void assertIdOrder(ConfigSources sources, String... expectedOrder)
{
List<String> actualList = new ArrayList<>();
for (ConfigSource source : sources)
{
actualList.add(source.getId());
}
List<String> expectedList = Arrays.asList(expectedOrder);
ConfigurationAssert.assertOrdered("ConfigSources.id order",expectedList,actualList);
}
private void assertDirOrder(ConfigSources sources, Path... expectedDirOrder) throws IOException
{
List<String> actualList = new ArrayList<>();
for (ConfigSource source : sources)
{
if (source instanceof DirConfigSource)
{
actualList.add(((DirConfigSource)source).getDir().toString());
}
}
List<String> expectedList = new ArrayList<>();
for (Path path : expectedDirOrder)
{
expectedList.add(path.toRealPath().toString());
}
ConfigurationAssert.assertOrdered("ConfigSources.dir order",expectedList,actualList);
}
private void assertProperty(ConfigSources sources, String key, String expectedValue)
{
Prop prop = sources.getProp(key);
Assert.assertThat("getProp('" + key + "') should not be null",prop,notNullValue());
Assert.assertThat("getProp('" + key + "')",prop.value,is(expectedValue));
}
@Test
public void testOrder_BasicConfig() throws IOException
{
// 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");
ConfigSources sources = new ConfigSources();
String[] cmdLine = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyBaseConfigSource(base));
sources.add(new JettyHomeConfigSource(home));
assertIdOrder(sources,"<command-line>","${jetty.base}","${jetty.home}");
}
@Test
public void testOrder_With1ExtraConfig() throws IOException
{
// 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.toFile());
common = common.toRealPath();
// 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());
ConfigSources sources = new ConfigSources();
String[] cmdLine = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home.toRealPath()));
sources.add(new JettyBaseConfigSource(base.toRealPath()));
assertIdOrder(sources,"<command-line>","${jetty.base}",common.toString(),"${jetty.home}");
}
@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");
ConfigSources sources = new ConfigSources();
// Simple command line reference to include-jetty-dir via property (also on command line)
String[] cmdLine = new String[] {
// property
"my.common=" + common.toString(),
// reference via property
"--include-jetty-dir=${my.common}" };
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}","${my.common}","${jetty.home}");
assertDirOrder(sources,base,common,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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";
ConfigSources sources = new ConfigSources();
// Simple command line reference to include-jetty-dir via property (also on command line)
String[] cmdLine = new String[] {
// property to 'opt' dir
"my.opt=" + opt.toString(),
// reference via property prefix
"--include-jetty-dir=" + dirRef };
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}",dirRef,"${jetty.home}");
assertDirOrder(sources,base,common,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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}";
ConfigSources sources = new ConfigSources();
// Simple command line reference to include-jetty-dir via property (also on command line)
String[] cmdLine = new String[] {
// property to 'opt' dir
"my.opt=" + opt.toString(),
// property to commmon dir name
"my.dir=common",
// reference via property prefix
"--include-jetty-dir=" + dirRef };
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}",dirRef,"${jetty.home}");
assertDirOrder(sources,base,common,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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());
ConfigSources sources = new ConfigSources();
String cmdLine[] = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}",common.toString(),"${jetty.home}");
assertDirOrder(sources,base,common,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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());
ConfigSources sources = new ConfigSources();
String cmdLine[] = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}",
common.toString(),
corp.toString(),
"${jetty.home}");
assertDirOrder(sources,base,common,corp,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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());
ConfigSources sources = new ConfigSources();
String cmdLine[] = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}",
common.toString(),
corp.toString(),
"${jetty.home}");
assertDirOrder(sources,base,common,corp,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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}");
ConfigSources sources = new ConfigSources();
String cmdLine[] = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>",
"${jetty.base}",
"${my.common}",
"${my.corp}",
"${jetty.home}");
assertDirOrder(sources,base,common,corp,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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());
ConfigSources sources = new ConfigSources();
String cmdLine[] = new String[]{
// command line provided include-jetty-dir ref
"--include-jetty-dir=" + devops.toString()};
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>",
"${jetty.base}",
devops.toString(),
common.toString(),
corp.toString(),
"${jetty.home}");
assertDirOrder(sources,base,devops,common,corp,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"jetty.http.port","2222"); // from 'common'
}
@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());
ConfigSources sources = new ConfigSources();
String cmdLine[] = new String[]{
// command line property should override all others
"jetty.http.port=7070"
};
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
assertIdOrder(sources,"<command-line>","${jetty.base}",
common.toString(),
corp.toString(),
"${jetty.home}");
assertDirOrder(sources,base,common,corp,home);
assertProperty(sources,"jetty.http.host","127.0.0.1");
assertProperty(sources,"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());
ConfigSources sources = new ConfigSources();
try
{
String cmdLine[] = new String[0];
sources.add(new CommandLineConfigSource(cmdLine));
sources.add(new JettyHomeConfigSource(home));
sources.add(new JettyBaseConfigSource(base));
Assert.fail("Should have thrown a UsageException");
}
catch (UsageException e)
{
Assert.assertThat("UsageException",e.getMessage(),containsString("Duplicate"));
}
}
}