/*
* Copyright (c) 2007, Ounce Labs, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY OUNCE LABS, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL OUNCE LABS, INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.codehaus.mojo.ounce;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.codehaus.mojo.ounce.TestUtils.ApplicationMojoMock;
import org.codehaus.mojo.ounce.TestUtils.MockProject;
import org.codehaus.mojo.ounce.TestUtils.OunceCoreMock;
import org.codehaus.mojo.ounce.core.OunceCoreApplication;
import org.codehaus.mojo.ounce.core.OunceCoreException;
import org.codehaus.mojo.ounce.core.OunceProjectBean;
import org.codehaus.mojo.ounce.utils.ExternalApplication;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
/**
* @author <a href="mailto:brianf@apache.org">Brian Fox</a>
*/
public class TestApplicationMojo
extends TestCase
{
public void testApplicationRelative()
throws ComponentLookupException, MojoExecutionException, MojoFailureException
{
ApplicationMojoMock mojo = new ApplicationMojoMock();
mojo.setSkipPoms( false );
mojo.setName( "MyName" );
mojo.setProjectRoot( new File( "/etc/bin/myname" ).getAbsolutePath() );
List projects = getProjects();
// first one in the list is always the current
// project.
mojo.setProject( (MavenProject) projects.get( 0 ) );
mojo.setProjects( projects );
mojo.execute();
OunceCoreMock core = (OunceCoreMock) mojo.getCore();
OunceCoreApplication app = core.getApp();
assertEquals( "MyName", app.getName() );
assertEquals( ".", app.getApplicationRoot() );
List ounceProjects = app.getProjects();
assertEquals( 2, ounceProjects.size() );
OunceProjectBean prj = (OunceProjectBean) ounceProjects.get( 0 );
assertEquals( "MyName", prj.getName() );
assertEquals( ".", prj.getPath() );
prj = (OunceProjectBean) ounceProjects.get( 1 );
assertEquals( "foo", prj.getName() );
assertEquals( "foo", prj.getPath() );
}
public void testApplicationSkipCurrent()
throws ComponentLookupException, MojoExecutionException, MojoFailureException
{
ApplicationMojoMock mojo = new ApplicationMojoMock();
mojo.setSkipPoms( true );
mojo.setName( "MyName" );
mojo.setProjectRoot( new File( "/etc/bin/myname" ).getAbsolutePath() );
List projects = getProjects();
// first one in the list is always the current
// project.
mojo.setProject( (MavenProject) projects.get( 0 ) );
mojo.setProjects( projects );
mojo.execute();
OunceCoreMock core = (OunceCoreMock) mojo.getCore();
OunceCoreApplication app = core.getApp();
assertEquals( "MyName", app.getName() );
assertEquals( ".", app.getApplicationRoot() );
List ounceProjects = app.getProjects();
assertEquals( 1, ounceProjects.size() );
OunceProjectBean prj = (OunceProjectBean) ounceProjects.get( 0 );
assertEquals( "foo", prj.getName() );
assertEquals( "foo", prj.getPath() );
}
public void testApplicationExcludes()
throws MojoExecutionException, MojoFailureException, ComponentLookupException
{
ApplicationMojoMock mojo = new ApplicationMojoMock();
mojo.setSkipPoms( false );
mojo.setName( "MyName" );
mojo.setProjectRoot( getCanonicalName( "/etc/bin/myname" ) );
List projects = getProjects();
// first one in the list is always the current
// project.
mojo.setProject( (MavenProject) projects.get( 0 ) );
mojo.setProjects( projects );
String[] excludes = { "**/foo" };
mojo.setExcludes( excludes );
mojo.execute();
OunceCoreMock core = (OunceCoreMock) mojo.getCore();
OunceCoreApplication app = core.getApp();
assertEquals( "MyName", app.getName() );
assertEquals( ".", app.getApplicationRoot() );
List ounceProjects = app.getProjects();
assertEquals( 1, ounceProjects.size() );
assertContains( ounceProjects, ".", mojo.getProjectRoot(), "MyName" );
}
public void testApplicationIncludes()
throws MojoExecutionException, MojoFailureException, ComponentLookupException
{
ApplicationMojoMock mojo = new ApplicationMojoMock();
mojo.setSkipPoms( true );
mojo.setName( "MyName" );
mojo.setProjectRoot( getCanonicalName( "/etc/bin/myname" ) );
List projects = getProjects();
// first one in the list is always the current
// project.
mojo.setProject( (MavenProject) projects.get( 0 ) );
mojo.setProjects( projects );
String[] includes = { "**/foo" };
mojo.setIncludes( includes );
mojo.execute();
OunceCoreMock core = (OunceCoreMock) mojo.getCore();
OunceCoreApplication app = core.getApp();
assertEquals( "MyName", app.getName() );
assertEquals( ".", app.getApplicationRoot() );
List ounceProjects = app.getProjects();
assertEquals( 1, ounceProjects.size() );
assertContains( ounceProjects, "foo", mojo.getProjectRoot(), "foo" );
}
public void testApplicationExcludePath()
throws MojoExecutionException, MojoFailureException, ComponentLookupException
{
ApplicationMojoMock mojo = new ApplicationMojoMock();
mojo.setSkipPoms( false );
mojo.setName( "MyName" );
mojo.setProjectRoot( getCanonicalName( "/etc/bin/myname" ) );
List projects = getProjects();
MockProject project = new MockProject();
project.setBaseDir( new File( "/etc/src/myname/foo" ) );
project.setArtifactId( "foo2" );
projects.add( project );
// first one in the list is always the current
// project.
mojo.setProject( (MavenProject) projects.get( 0 ) );
mojo.setProjects( projects );
String[] excludes = { "**/src/" };
mojo.setExcludes( excludes );
mojo.execute();
OunceCoreMock core = (OunceCoreMock) mojo.getCore();
OunceCoreApplication app = core.getApp();
assertEquals( "MyName", app.getName() );
assertEquals( ".", app.getApplicationRoot() );
List ounceProjects = app.getProjects();
assertEquals( 2, ounceProjects.size() );
assertContains( ounceProjects, ".", mojo.getProjectRoot(), "MyName" );
assertContains( ounceProjects, "foo", mojo.getProjectRoot(), "foo" );
}
public void testExternals()
throws MojoExecutionException, MojoFailureException, ComponentLookupException
{
ApplicationMojoMock mojo = new ApplicationMojoMock();
mojo.setSkipPoms( true );
mojo.setName( "MyName" );
mojo.setProjectRoot( getCanonicalName( "/etc/bin/myname" ) );
List projects = getProjects();
MockProject project = new MockProject();
project.setBaseDir( new File( "/etc/bin/myname" ) );
project.setArtifactId( "foo2" );
project.setPackaging( "jar" );
projects.add( project );
// first one in the list is always the current
// project.
mojo.setProject( (MavenProject) projects.get( 0 ) );
mojo.setProjects( projects );
// exclude all the modules
String[] includes = { " " };
mojo.setIncludes( includes );
List externs = new ArrayList();
externs.add( "name,/mypath" );
externs.add( "name2,/mypath2" );
mojo.setExternalProjects( externs );
mojo.execute();
OunceCoreMock core = (OunceCoreMock) mojo.getCore();
OunceCoreApplication app = core.getApp();
assertEquals( "MyName", app.getName() );
assertEquals( ".", app.getApplicationRoot() );
List ounceProjects = app.getProjects();
assertEquals( 2, ounceProjects.size() );
assertContains( ounceProjects, "/mypath", mojo.getProjectRoot(), "name" );
assertContains( ounceProjects, "/mypath2", mojo.getProjectRoot(), "name2" );
}
public void testExternalApplications()
throws MojoExecutionException
{
ApplicationMojo mojo = new ApplicationMojo();
List apps = new ArrayList();
apps.add( "/mypath" );
apps.add( "/mypath2" );
apps.add( "/foo,**/foo|**/6" );
apps.add( "/foo2,**/*,**/foo" );
mojo.setExternalApplications( apps );
List result = mojo.getExternalApplications();
assertEquals( 4, result.size() );
ExternalApplication app = (ExternalApplication) result.get( 0 );
assertEquals( "/mypath", app.getPath() );
assertEquals( null, app.getIncludes() );
assertEquals( null, app.getExcludes() );
app = (ExternalApplication) result.get( 1 );
assertEquals( "/mypath2", app.getPath() );
assertEquals( null, app.getIncludes() );
assertEquals( null, app.getExcludes() );
app = (ExternalApplication) result.get( 2 );
assertEquals( "/foo", app.getPath() );
assertEquals( "**/foo|**/6", app.getIncludes() );
assertEquals( null, app.getExcludes() );
app = (ExternalApplication) result.get( 3 );
assertEquals( "/foo2", app.getPath() );
assertEquals( "**/*", app.getIncludes() );
assertEquals( "**/foo", app.getExcludes() );
apps = new ArrayList();
apps.add( "something,something,something,,something" );
mojo.setExternalApplications( apps );
try
{
mojo.getExternalApplications();
fail( "Expected an exception" );
}
catch ( MojoExecutionException e )
{
}
}
public void testIncludeExternalProjectsFromApplication()
throws MojoExecutionException, OunceCoreException, IOException
{
ApplicationMojo mojo = new ApplicationMojo();
OunceCoreMock core = new OunceCoreMock();
List externalApplications = new ArrayList();
externalApplications.add( "myExternalApp" );
mojo.setExternalApplications( externalApplications );
List projects = mojo.getIncludedExternalApplicationProjects( core );
assertEquals( 3, projects.size() );
assertContains( projects, "myExternalApp/e", "myExternalApp", "e" );
assertContains( projects, "myExternalApp/uis/f", "myExternalApp", "f" );
assertContains( projects, "myExternalApp/uis/g", "myExternalApp", "g" );
externalApplications.clear();
externalApplications.add( "myExternalApp,**/e" );
projects = mojo.getIncludedExternalApplicationProjects( core );
assertEquals( 1, projects.size() );
assertContains( projects, "myExternalApp/e", "myExternalApp", "e" );
externalApplications.clear();
externalApplications.add( "myExternalApp,**/uis/**" );
projects = mojo.getIncludedExternalApplicationProjects( core );
assertEquals( 2, projects.size() );
assertContains( projects, "myExternalApp/uis/f", "myExternalApp", "f" );
assertContains( projects, "myExternalApp/uis/g", "myExternalApp", "g" );
externalApplications.clear();
externalApplications.add( "myExternalApp,**/*,**/uis/*" );
projects = mojo.getIncludedExternalApplicationProjects( core );
assertEquals( 1, projects.size() );
assertContains( projects, "myExternalApp/e", "myExternalApp", "e" );
}
public void testPropertyReplacements()
throws MojoExecutionException, OunceCoreException, IOException
{
ApplicationMojo mojo = new ApplicationMojo();
OunceCoreMock core = new OunceCoreMock();
List externalApplications = new ArrayList();
externalApplications.add( "myExternalApp" );
Map properties = new HashMap();
// intentionally using backwards path to makesure it
// is handled correctly
properties.put( "pathToExtern", "myExternalApp\\e" );
properties.put( "pathToExtern2", "myExternalApp\\uis" );
mojo.setPathProperties( properties );
mojo.setExternalApplications( externalApplications );
List projects = mojo.getIncludedExternalApplicationProjects( core );
assertEquals( 3, projects.size() );
assertContains( projects, "%pathToExtern%", "myExternalApp", "e" );
assertContains( projects, "%pathToExtern2%/f", "myExternalApp", "f" );
assertContains( projects, "%pathToExtern2%/g", "myExternalApp", "g" );
}
public List getProjects()
{
List projects = new ArrayList();
MockProject project = new MockProject();
project.setBaseDir( new File( "/etc/bin/myname" ) );
project.setPackaging( "pom" );
project.setArtifactId( "MyName" );
projects.add( project );
project = new MockProject();
project.setBaseDir( new File( "/etc/bin/myname/foo" ) );
project.setArtifactId( "foo" );
project.setPackaging( "jar" );
projects.add( project );
return projects;
}
private String getCanonicalName( String pName )
{
return pName.replace( '/', File.separatorChar ).replace( '\\', File.separatorChar );
}
public void assertContains( List list, String path, String projectRoot, String name )
{
// this is done to handle weird ways that windows
// creates the paths.
// the IT tests ensure that the correct pathing is
// always done.
String absPath = new File( path ).getAbsolutePath();
String drive = absPath.substring( 0, 2 );
absPath = drive + path;
// System.out.println("Assert that "+list+ "contains
// "+ absPath+" or "+ path);
// try the absolute and the original.
OunceProjectBean one = new OunceProjectBean( absPath, name );
OunceProjectBean two = new OunceProjectBean( path, name );
OunceProjectBean three = new OunceProjectBean( getCanonicalName( path ), name );
assertTrue( list.contains( one ) || list.contains( two ) || list.contains( three ) );
}
}