// // ======================================================================== // 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.quickstart; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.io.File; import java.io.IOException; import java.net.URI; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.OS; import org.eclipse.jetty.util.resource.Resource; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class AttributeNormalizerTest { @Parameterized.Parameters(name = "[{index}] {0} - {1}") public static List<Object[]> data() { List<Object[]> data = new ArrayList<>(); String arch = String.format("%s/%s", System.getProperty("os.name"), System.getProperty("os.arch")); String title; Map<String, String> env; // ------ title = "Typical Setup"; env = new HashMap<>(); env.put("jetty.home", asTargetPath(title,"jetty-distro")); env.put("jetty.base", asTargetPath(title,"jetty-distro/demo.base")); env.put("WAR", asTargetPath(title,"jetty-distro/demo.base/webapps/FOO")); data.add(new Object[]{arch, title, env}); // ------ // This puts the jetty.home inside of the jetty.base title = "Overlap Setup"; env = new HashMap<>(); env.put("jetty.home", asTargetPath(title,"app/dist")); env.put("jetty.base", asTargetPath(title,"app")); env.put("WAR", asTargetPath(title,"app/webapps/FOO")); data.add(new Object[]{arch, title, env}); // ------ // This tests a path scenario often seen on various automatic deployments tooling // such as Kubernetes, CircleCI, TravisCI, and Jenkins. title = "Nasty Path Setup"; env = new HashMap<>(); env.put("jetty.home", asTargetPath(title,"app%2Fnasty/dist")); env.put("jetty.base", asTargetPath(title,"app%2Fnasty/base")); env.put("WAR", asTargetPath(title,"app%2Fnasty/base/webapps/FOO")); data.add(new Object[]{arch, title, env}); return data; } private static final String asTargetPath(String title, String subpath) { Path rootPath = MavenTestingUtils.getTargetTestingPath(title); FS.ensureDirExists(rootPath); Path path = rootPath.resolve(OS.separators(subpath)); FS.ensureDirExists(path); return path.toString(); } private Map<String, String> oldValues = new HashMap<>(); private final String jettyHome; private final String jettyBase; private final String war; private final String arch; private final String title; private final Map<String, String> env; private final AttributeNormalizer normalizer; public AttributeNormalizerTest(String arch, String title, Map<String, String> env) throws IOException { this.arch = arch; this.title = title; this.env = env; // Remember old values env.keySet().stream().forEach((key) -> { String old = System.getProperty(key); oldValues.put(key, old); }); // Grab specific values of interest in general jettyHome = env.get("jetty.home"); jettyBase = env.get("jetty.base"); war = env.get("WAR"); // Set environment (skipping null and WAR) env.entrySet().stream() .filter((e) -> e.getValue() != null && !e.getKey().equalsIgnoreCase("WAR")) .forEach((entry) -> System.setProperty(entry.getKey(), entry.getValue())); // Setup normalizer Resource webresource = Resource.newResource(war); this.normalizer = new AttributeNormalizer(webresource); } @After public void restoreEnv() { // Restore old values oldValues.entrySet().stream().forEach((entry) -> EnvUtils.restoreSystemProperty(entry.getKey(), entry.getValue()) ); } private void assertNormalize(Object o, String expected) { String result = normalizer.normalize(o); assertThat("normalize((" + o.getClass().getSimpleName() + ") " + o.toString() + ")", result, is(expected)); } private void assertExpandPath(String line, String expected) { String result = normalizer.expand(line); // Treat output as strings assertThat("expand('" + line + "')", result, is(expected)); } private void assertExpandURI(String line, URI expected) { String result = normalizer.expand(line); URI resultURI = URI.create(result); assertThat("expand('" + line + "')", resultURI.getScheme(), is(expected.getScheme())); assertThat("expand('" + line + "')", resultURI.getPath(), is(expected.getPath())); } @Test public void testNormalizeWarAsString() { // Normalize WAR as String path assertNormalize(war, war); // only URL, File, URI are supported } @Test public void testNormalizeJettyBaseAsFile() { // Normalize jetty.base as File path assertNormalize(new File(jettyBase), "${jetty.base}"); } @Test public void testNormalizeJettyHomeAsFile() { // Normalize jetty.home as File path assertNormalize(new File(jettyHome), "${jetty.home}"); } @Test public void testNormalizeJettyBaseAsURI() { // Normalize jetty.base as URI path assertNormalize(new File(jettyBase).toURI(), "${jetty.base.uri}"); } @Test public void testNormalizeJettyHomeAsURI() { // Normalize jetty.home as URI path assertNormalize(new File(jettyHome).toURI(), "${jetty.home.uri}"); } @Test public void testExpandJettyBase() { // Expand jetty.base assertExpandPath("${jetty.base}", jettyBase); } @Test public void testExpandJettyHome() { // Expand jetty.home assertExpandPath("${jetty.home}", jettyHome); } @Test public void testNormalizeWarAsURI() { // Normalize WAR as URI URI testWarURI = new File(war).toURI(); assertNormalize(testWarURI, "${WAR.uri}"); } @Test public void testNormalizeWarDeepAsFile() { // Normalize WAR deep path as File File testWarDeep = new File(new File(war), OS.separators("deep/ref")).getAbsoluteFile(); assertNormalize(testWarDeep, "${WAR.path}" + OS.separators("/deep/ref")); } @Test public void testNormalizeWarDeepAsString() { // Normalize WAR deep path as String File testWarDeep = new File(new File(war), OS.separators("deep/ref")).getAbsoluteFile(); assertNormalize(testWarDeep.toString(), testWarDeep.toString()); } @Test public void testNormalizeWarDeepAsURI() { // Normalize WAR deep path as URI File testWarDeep = new File(new File(war), OS.separators("deep/ref")).getAbsoluteFile(); assertNormalize(testWarDeep.toURI(), "${WAR.uri}/deep/ref"); } @Test public void testExpandWarDeep() { // Expand WAR deep path File testWarDeep = new File(new File(war), OS.separators("deep/ref")); URI uri = URI.create("jar:" + testWarDeep.toURI().toASCIIString() + "!/other/file"); assertExpandURI("jar:${WAR.uri}/deep/ref!/other/file", uri); } }