blob: 67ac03e0095b9a380fdab146aa2606fed2b52990 [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.test.support;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.xml.XmlConfiguration;
import org.junit.Assert;
import org.junit.Ignore;
/**
* Allows for setting up a Jetty server for testing based on XML configuration files.
*/
@Ignore
public class TestableJettyServer
{
private List<URL> _xmlConfigurations;
private final Map<String,String> _properties = new HashMap<String, String>();
private Server _server;
private int _serverPort;
private String _scheme = HttpScheme.HTTP.asString();
/* Popular Directories */
private File baseDir;
private File testResourcesDir;
public TestableJettyServer() throws IOException
{
_xmlConfigurations = new ArrayList<URL>();
Properties properties = new Properties();
/* Establish Popular Directories */
String baseDirPath = System.getProperty("basedir");
if (baseDirPath == null)
{
baseDirPath = System.getProperty("user.dir",".");
}
baseDir = new File(baseDirPath);
properties.setProperty("test.basedir",baseDir.getAbsolutePath());
testResourcesDir = new File(baseDirPath,"src/test/resources".replace('/',File.separatorChar));
properties.setProperty("test.resourcesdir",testResourcesDir.getAbsolutePath());
File testDocRoot = new File(testResourcesDir,"docroots");
properties.setProperty("test.docroot.base",testDocRoot.getAbsolutePath());
File targetDir = new File(baseDir,"target");
properties.setProperty("test.targetdir",targetDir.getAbsolutePath());
File webappsDir = new File(targetDir,"webapps");
properties.setProperty("test.webapps",webappsDir.getAbsolutePath());
// Write out configuration for use by ConfigurationManager.
File testConfig = new File(targetDir,"testable-jetty-server-config.properties");
FileOutputStream out = new FileOutputStream(testConfig);
properties.store(out,"Generated by " + TestableJettyServer.class.getName());
for (Object key:properties.keySet())
_properties.put(String.valueOf(key),String.valueOf(properties.get(key)));
}
public void addConfiguration(URL xmlConfig)
{
_xmlConfigurations.add(xmlConfig);
}
public void addConfiguration(File xmlConfigFile) throws MalformedURLException
{
_xmlConfigurations.add(xmlConfigFile.toURI().toURL());
}
public void addConfiguration(String testConfigName) throws MalformedURLException
{
addConfiguration(new File(testResourcesDir,testConfigName));
}
public void setProperty(String key, String value)
{
_properties.put(key,value);
}
public void load() throws Exception
{
XmlConfiguration last = null;
Object[] obj = new Object[this._xmlConfigurations.size()];
// Configure everything
for (int i = 0; i < this._xmlConfigurations.size(); i++)
{
URL configURL = this._xmlConfigurations.get(i);
System.err.println("configuring: "+configURL);
XmlConfiguration configuration = new XmlConfiguration(configURL);
if (last != null)
{
configuration.getIdMap().putAll(last.getIdMap());
}
configuration.getProperties().putAll(_properties);
obj[i] = configuration.configure();
last = configuration;
}
// Test for Server Instance.
Server foundServer = null;
int serverCount = 0;
for (int i = 0; i < this._xmlConfigurations.size(); i++)
{
if (obj[i] instanceof Server)
{
if (obj[i].equals(foundServer))
{
// Identical server instance found
break;
}
foundServer = (Server)obj[i];
serverCount++;
}
}
if (serverCount <= 0)
{
throw new Exception("Load failed to configure a " + Server.class.getName());
}
Assert.assertEquals("Server load count",1,serverCount);
this._server = foundServer;
this._server.setStopTimeout(1000);
}
public String getScheme()
{
return _scheme;
}
public void setScheme(String scheme)
{
this._scheme = scheme;
}
public void start() throws Exception
{
Assert.assertNotNull("Server should not be null (failed load?)",_server);
_server.start();
// Find the active server port.
this._serverPort = ((NetworkConnector)_server.getConnectors()[0]).getLocalPort();
System.err.println("Server Port="+_serverPort);
Assert.assertTrue("Server Port is between 1 and 65535. Actually <" + _serverPort + ">",(1 <= this._serverPort) && (this._serverPort <= 65535));
}
public int getServerPort()
{
return _serverPort;
}
public void stop() throws Exception
{
_server.stop();
}
public URI getServerURI() throws UnknownHostException
{
StringBuffer uri = new StringBuffer();
uri.append(this._scheme).append("://");
uri.append(InetAddress.getLocalHost().getHostAddress());
uri.append(":").append(this._serverPort);
return URI.create(uri.toString());
}
public Server getServer()
{
return _server;
}
}