blob: 03c71b92681badbf7681378bf0241c453043a44d [file] [log] [blame]
package org.apache.maven.report.projectinfo;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.model.DeploymentRepository;
import org.apache.maven.model.DistributionManagement;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
import org.apache.maven.project.MavenProject;
import org.apache.maven.report.projectinfo.stubs.SettingsStub;
import org.apache.maven.settings.Settings;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.DefaultHandler;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.security.Constraint;
import org.mortbay.jetty.security.ConstraintMapping;
import org.mortbay.jetty.security.HashUserRealm;
import org.mortbay.jetty.security.SecurityHandler;
import org.mortbay.jetty.security.SslSocketConnector;
import org.mortbay.jetty.webapp.WebAppContext;
/**
* @author <a href="mailto:vincent.siveton@crim.ca">Vincent Siveton</a>
* @version $Id$
*/
public class ProjectInfoReportUtilsTest
extends AbstractMojoTestCase
{
private static final int MAX_IDLE_TIME = 30000;
private int port = -1;
private Settings settingsStub;
private Server jettyServer;
protected void setUp()
throws Exception
{
super.setUp();
final List<org.apache.maven.settings.Server> servers = new ArrayList<org.apache.maven.settings.Server>();
org.apache.maven.settings.Server server = new org.apache.maven.settings.Server();
server.setId( "localhost" );
server.setUsername( "admin" );
server.setPassword( "admin" );
servers.add( server );
settingsStub = new SettingsStub()
{
private static final long serialVersionUID = 1L;
@Override
public org.apache.maven.settings.Server getServer( String serverId )
{
for ( org.apache.maven.settings.Server server : getServers() )
{
if ( server.getId().equals( serverId ) )
{
return server;
}
}
return null;
}
@Override
public List<org.apache.maven.settings.Server> getServers()
{
return servers;
}
};
}
private MavenProject getMavenProjectStub( boolean https )
{
final DistributionManagement distributionManagement = new DistributionManagement();
DeploymentRepository repository = new DeploymentRepository();
repository.setId( "localhost" );
repository.setUrl( ( https ? "https" : "http" ) + "://localhost:" + port );
distributionManagement.setRepository( repository );
distributionManagement.setSnapshotRepository( repository );
return new MavenProjectStub()
{
@Override
public DistributionManagement getDistributionManagement()
{
return distributionManagement;
}
};
}
protected void tearDown()
throws Exception
{
super.tearDown();
}
public void testGetInputStreamURL()
throws Exception
{
assertTrue( ProjectInfoReportUtils.isArtifactUrlValid( "http://my.intern.domain:8080/test" ) );
// file
URL url = new File( getBasedir(), "/target/classes/project-info-reports.properties" ).toURI().toURL();
String content = ProjectInfoReportUtils.getContent( url, getMavenProjectStub( false ), settingsStub,
"ISO-8859-1" );
assertNotNull( content );
assertTrue( content.contains( "Licensed to the Apache Software Foundation" ) );
// file
url = new File( getBasedir(), "/src/test/resources/iso-8859-5-encoded.txt" ).toURI().toURL();
content = ProjectInfoReportUtils.getContent( url, getMavenProjectStub( false ), settingsStub,
"ISO-8859-5" );
assertNotNull( content );
assertTrue( content.contains( "Свобода всем народам!" ) );
// http + no auth
startJetty( false, false );
url = new URL( "http://localhost:" + port + "/project-info-reports.properties" );
content = ProjectInfoReportUtils.getContent( url, getMavenProjectStub( false ), settingsStub,
"ISO-8859-1" );
assertNotNull( content );
assertTrue( content.contains( "Licensed to the Apache Software Foundation" ) );
stopJetty();
// http + auth
startJetty( false, true );
url = new URL( "http://localhost:" + port + "/project-info-reports.properties" );
content = ProjectInfoReportUtils.getContent( url, getMavenProjectStub( false ), settingsStub,
"ISO-8859-1" );
assertNotNull( content );
assertTrue( content.contains( "Licensed to the Apache Software Foundation" ) );
stopJetty();
// https + no auth
startJetty( true, false );
url = new URL( "https://localhost:" + port + "/project-info-reports.properties" );
content = ProjectInfoReportUtils.getContent( url, getMavenProjectStub( true ), settingsStub,
"ISO-8859-1" );
assertNotNull( content );
assertTrue( content.contains( "Licensed to the Apache Software Foundation" ) );
stopJetty();
// https + auth
startJetty( true, true );
url = new URL( "https://localhost:" + port + "/project-info-reports.properties" );
content = ProjectInfoReportUtils.getContent( url, getMavenProjectStub( true ), settingsStub,
"ISO-8859-1" );
assertNotNull( content );
assertTrue( content.contains( "Licensed to the Apache Software Foundation" ) );
stopJetty();
// TODO need to test with a proxy
}
private void startJetty( boolean isSSL, boolean withAuth )
throws Exception
{
jettyServer = new Server();
jettyServer.setStopAtShutdown( true );
Connector connector = ( isSSL ? getSSLConnector() : getDefaultConnector() );
jettyServer.setConnectors( new Connector[] { connector } );
WebAppContext webapp = new WebAppContext();
webapp.setContextPath( "/" );
webapp.setResourceBase( getBasedir() + "/target/classes/" );
webapp.setServer( jettyServer );
if ( withAuth )
{
Constraint constraint = new Constraint();
constraint.setName( Constraint.__BASIC_AUTH );
constraint.setRoles( new String[] { "user", "admin" } );
constraint.setAuthenticate( true );
ConstraintMapping cm = new ConstraintMapping();
cm.setConstraint( constraint );
cm.setPathSpec( "/*" );
SecurityHandler sh = new SecurityHandler();
sh.setUserRealm( new HashUserRealm( "MyRealm", getBasedir() + "/src/test/resources/realm.properties" ) );
sh.setConstraintMappings( new ConstraintMapping[] { cm } );
webapp.addHandler( sh );
}
DefaultHandler defaultHandler = new DefaultHandler();
defaultHandler.setServer( jettyServer );
Handler[] handlers = new Handler[2];
handlers[0] = webapp;
handlers[1] = defaultHandler;
jettyServer.setHandlers( handlers );
jettyServer.start();
port = connector.getLocalPort();
}
private void stopJetty()
throws Exception
{
if ( jettyServer != null )
{
jettyServer.stop();
jettyServer = null;
port = -1;
}
}
private Connector getDefaultConnector()
{
Connector connector = new SelectChannelConnector();
connector.setMaxIdleTime( MAX_IDLE_TIME );
return connector;
}
private Connector getSSLConnector()
{
SslSocketConnector connector = new SslSocketConnector();
connector.setKeystore( getBasedir() + "/target/jetty.jks" );
connector.setPassword( "apache" );
connector.setKeyPassword( "apache" );
connector.setTruststore( getBasedir() + "/target/jetty.jks" );
connector.setTrustPassword( "apache" );
return connector;
}
}