//
//  ========================================================================
//  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 java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.junit.Test;

/**
 * Various Home + Base use cases
 */
public class TestUseCases
{
    private void assertUseCase(String homeName, String baseName, String assertName, String... cmdLineArgs) throws Exception
    {
        File homeDir = MavenTestingUtils.getTestResourceDir("usecases/" + homeName);
        File baseDir = MavenTestingUtils.getTestResourceDir("usecases/" + baseName);

        Main main = new Main();
        List<String> cmdLine = new ArrayList<>();
        cmdLine.add("jetty.home=" + homeDir.getAbsolutePath());
        cmdLine.add("jetty.base=" + baseDir.getAbsolutePath());
        // cmdLine.add("--debug");
        for (String arg : cmdLineArgs)
        {
            cmdLine.add(arg);
        }
        StartArgs args = main.processCommandLine(cmdLine);
        BaseHome baseHome = main.getBaseHome();
        ConfigurationAssert.assertConfiguration(baseHome,args,"usecases/" + assertName);
    }

    @Test
    public void testBarebones() throws Exception
    {
        assertUseCase("home","base.barebones","assert-barebones.txt");
    }

    @Test
    public void testJMX() throws Exception
    {
        assertUseCase("home","base.jmx","assert-jmx.txt");
    }
    
    @Test
    public void testWithLogging() throws Exception
    {
        assertUseCase("home","base.logging","assert-logging.txt");
    }

    @Test
    public void testWithIncludeJettyDir_Logging() throws Exception
    {
        assertUseCase("home","base.with.include.jetty.dirs","assert-include-jetty-dir-logging.txt");
    }

    @Test
    public void testWithJspDefault() throws Exception
    {
        assertUseCase("home","base.with.jsp.default","assert-jsp-apache.txt");
    }

    @Test
    public void testWithJspApache() throws Exception
    {
        assertUseCase("home","base.with.jsp.apache","assert-jsp-apache.txt");
    }
    
    @Test
    public void testWithJspGlassfish() throws Exception
    {
        assertUseCase("home","base.with.jsp.glassfish","assert-jsp-glassfish.txt");
    }

    @Test
    public void testWithJspGlassfishCmdLine() throws Exception
    {
        assertUseCase("home","base.with.jsp.default","assert-jsp-glassfish.txt","jsp-impl=glassfish");
    }

    @Test
    public void testWithMissingNpnVersion() throws Exception
    {
        assertUseCase("home","base.missing.npn.version","assert-missing-npn-version.txt","java.version=1.7.0_01");
    }
    
    @Test
    public void testWithSpdy() throws Exception
    {
        assertUseCase("home","base.enable.spdy","assert-enable-spdy.txt","java.version=1.7.0_60");
    }
    
    @Test
    public void testWithDatabase() throws Exception
    {
        assertUseCase("home","base.with.db","assert-with-db.txt");
    }

    @Test
    public void testWithDeepExt() throws Exception
    {
        assertUseCase("home","base.with.ext","assert-with.ext.txt");
    }
    
    @Test
    public void testWithPropsBasic() throws Exception
    {
        assertUseCase("home","base.props.basic","assert-props.basic.txt","port=9090");
    }
    
    @Test
    public void testWithPropsAgent() throws Exception
    {
        assertUseCase("home","base.props.agent","assert-props.agent.txt","java.vm.specification.version=1.6");
    }
}
