blob: f19ab6146b717d2e4454b2807c0e5da935a42069 [file] [log] [blame]
package org.apache.maven.doxia.tools;
/*
* 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.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.decoration.LinkItem;
import org.apache.maven.doxia.site.decoration.Skin;
import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Writer;
import org.apache.maven.doxia.tools.stubs.SiteToolMavenProjectStub;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.WriterFactory;
/**
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
*/
public class SiteToolTest
extends PlexusTestCase
{
/**
* @return the repo.
*
* @throws Exception
*/
protected ArtifactRepository getLocalRepo()
throws Exception
{
String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS;
String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
ArtifactRepositoryPolicy snapshotsPolicy = new ArtifactRepositoryPolicy( true, updatePolicyFlag,
checksumPolicyFlag );
ArtifactRepositoryPolicy releasesPolicy = new ArtifactRepositoryPolicy( true, updatePolicyFlag,
checksumPolicyFlag );
ArtifactRepositoryFactory artifactRepositoryFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
ArtifactRepositoryLayout defaultArtifactRepositoryLayout = (ArtifactRepositoryLayout) lookup(
ArtifactRepositoryLayout.ROLE,
"default" );
return artifactRepositoryFactory.createArtifactRepository( "local", getTestFile( "target/local-repo" ).toURI().toURL()
.toString(), defaultArtifactRepositoryLayout, snapshotsPolicy, releasesPolicy );
}
/**
* @return the local repo directory.
*
* @throws Exception
*/
protected File getLocalRepoDir()
throws Exception
{
return new File( getLocalRepo().getBasedir() );
}
/**
* @throws Exception
*/
public void testGetDefaultSkinArtifact()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "site-tool-test" );
assertNotNull( tool.getDefaultSkinArtifact( getLocalRepo(), project.getRemoteArtifactRepositories() ) );
}
/**
* @throws Exception
*/
public void testGetSkinArtifactFromRepository()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "site-tool-test" );
DecorationModel decorationModel = new DecorationModel();
Skin skin = new Skin();
skin.setGroupId( "org.apache.maven.skins" );
skin.setArtifactId( "maven-stylus-skin" );
decorationModel.setSkin( skin );
assertNotNull( tool.getSkinArtifactFromRepository( getLocalRepo(), project.getRemoteArtifactRepositories(),
decorationModel ) );
}
private void checkGetRelativePathDirectory( SiteTool tool, String relative, String to, String from )
{
assertEquals( relative, tool.getRelativePath( to, from ) );
assertEquals( relative, tool.getRelativePath( to + '/', from ) );
assertEquals( relative, tool.getRelativePath( to, from + '/' ) );
assertEquals( relative, tool.getRelativePath( to + '/', from + '/' ) );
}
/**
* @throws Exception
*/
public void testGetRelativePath()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
checkGetRelativePathDirectory( tool, "", "http://maven.apache.org", "http://maven.apache.org" );
checkGetRelativePathDirectory( tool, ".." + File.separator + "..", "http://maven.apache.org",
"http://maven.apache.org/plugins/maven-site-plugin" );
checkGetRelativePathDirectory( tool, "plugins" + File.separator + "maven-site-plugin",
"http://maven.apache.org/plugins/maven-site-plugin", "http://maven.apache.org" );
checkGetRelativePathDirectory( tool, "", "dav:https://maven.apache.org", "dav:https://maven.apache.org" );
checkGetRelativePathDirectory( tool, "plugins" + File.separator + "maven-site-plugin",
"dav:http://maven.apache.org/plugins/maven-site-plugin",
"dav:http://maven.apache.org" );
checkGetRelativePathDirectory( tool, "", "scm:svn:https://maven.apache.org", "scm:svn:https://maven.apache.org" );
checkGetRelativePathDirectory( tool, "plugins" + File.separator + "maven-site-plugin",
"scm:svn:https://maven.apache.org/plugins/maven-site-plugin",
"scm:svn:https://maven.apache.org" );
String to = "http://maven.apache.org/downloads.html";
String from = "http://maven.apache.org/index.html";
// FIXME! assertEquals( "downloads.html", tool.getRelativePath( to, from ) );
// MSITE-600, MSHARED-203
to = "file:///tmp/bloop";
from = "scp://localhost:/tmp/blop";
// FIXME! assertEquals( tool.getRelativePath( to, from ), to );
// note: 'tmp' is the host here which is probably not the intention, but at least the result is correct
to = "file://tmp/bloop";
from = "scp://localhost:/tmp/blop";
assertEquals( to, tool.getRelativePath( to, from ) );
// Tests between files as described in MIDEA-102
to = "C:/dev/voca/gateway/parser/gateway-parser.iml";
from = "C:/dev/voca/gateway/";
assertEquals( "Child file using Windows drive letter",
"parser" + File.separator + "gateway-parser.iml", tool.getRelativePath( to, from ) );
to = "C:/foo/child";
from = "C:/foo/master";
assertEquals( "Sibling directory using Windows drive letter",
".." + File.separator + "child", tool.getRelativePath( to, from ) );
to = "/myproject/myproject-module1";
from = "/myproject/myproject";
assertEquals( "Sibling directory with similar name",
".." + File.separator + "myproject-module1", tool.getRelativePath( to, from ) );
// Normalized paths as described in MSITE-284
assertEquals( ".." + File.separator + "project-module-1" + File.separator + "src" + File.separator + "site",
tool.getRelativePath( "Z:\\dir\\project\\project-module-1\\src\\site",
"Z:\\dir\\project\\project-module-1\\..\\project-parent" ) );
assertEquals( ".." + File.separator + ".." + File.separator + ".." + File.separator + "project-parent",
tool.getRelativePath( "Z:\\dir\\project\\project-module-1\\..\\project-parent",
"Z:\\dir\\project\\project-module-1\\src\\site" ) );
assertEquals( ".." + File.separator + "foo", tool.getRelativePath( "../../foo/foo", "../../foo/bar" ) );
}
/**
* @throws Exception
*/
public void testGetSiteDescriptorFromBasedir()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "site-tool-test" );
assertEquals( tool.getSiteDescriptor( new File( project.getBasedir(), "src/site" ), null ).toString(),
project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml" );
assertEquals( tool.getSiteDescriptor( new File( project.getBasedir(), "src/site" ), Locale.ENGLISH ).toString(),
project.getBasedir() + File.separator + "src" + File.separator + "site" + File.separator + "site.xml" );
String siteDir = "src/blabla";
assertEquals( tool.getSiteDescriptor( new File( project.getBasedir(), siteDir ), null ).toString(),
project.getBasedir() + File.separator + "src" + File.separator + "blabla" + File.separator + "site.xml" );
}
/**
* @throws Exception
*/
public void testGetSiteDescriptorFromRepository()
throws Exception
{
DefaultSiteTool tool = (DefaultSiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "site-tool-test" );
project.setGroupId( "org.apache.maven" );
project.setArtifactId( "maven-site" );
project.setVersion( "1.0" );
String result = getLocalRepoDir() + File.separator + "org" + File.separator + "apache" + File.separator
+ "maven" + File.separator + "maven-site" + File.separator + "1.0" + File.separator
+ "maven-site-1.0-site.xml";
assertEquals( tool.getSiteDescriptorFromRepository( project, getLocalRepo(),
project.getRemoteArtifactRepositories(), Locale.ENGLISH )
.toString(), result );
}
/**
* @throws Exception
*/
public void testGetDecorationModel()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "site-tool-test" );
List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
// model from current local build
DecorationModel model =
tool.getDecorationModel( new File( project.getBasedir(), "src/site" ), Locale.getDefault(), project,
reactorProjects, getLocalRepo(), project.getRemoteArtifactRepositories() );
assertNotNull( model );
assertNotNull( model.getBannerLeft() );
assertEquals( "Maven Site", model.getBannerLeft().getName() );
assertEquals( "http://maven.apache.org/images/apache-maven-project.png", model.getBannerLeft().getSrc() );
assertEquals( "http://maven.apache.org/", model.getBannerLeft().getHref() );
assertNotNull( model.getBannerRight() );
assertNull( model.getBannerRight().getName() );
assertEquals( "http://maven.apache.org/images/maven-small.gif", model.getBannerRight().getSrc() );
assertNull( model.getBannerRight().getHref() );
// model from repo: https://repo1.maven.org/maven2/org/apache/maven/maven-site/1.0/maven-site-1.0-site.xml
// TODO Enable this test as soon as we haven a site.xml with head content as string
/*project.setBasedir( null );
project.setGroupId( "org.apache.maven" );
project.setArtifactId( "maven-site" );
project.setVersion( "1.0" );
DecorationModel modelFromRepo =
tool.getDecorationModel( null, Locale.getDefault(), project, reactorProjects, getLocalRepo(),
project.getRemoteArtifactRepositories() );
assertNotNull( modelFromRepo );
assertNotNull( modelFromRepo.getBannerLeft() );
assertEquals( "Maven", modelFromRepo.getBannerLeft().getName() );
assertEquals( "images/apache-maven-project-2.png", modelFromRepo.getBannerLeft().getSrc() );
assertEquals( "http://maven.apache.org/", modelFromRepo.getBannerLeft().getHref() );
assertNotNull( modelFromRepo.getBannerRight() );
assertNull( modelFromRepo.getBannerRight().getName() );
assertEquals( "images/maven-logo-2.gif", modelFromRepo.getBannerRight().getSrc() );
assertNull( modelFromRepo.getBannerRight().getHref() );*/
}
/**
* @throws Exception
*/
public void testGetDefaultDecorationModel()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "no-site-test" );
String siteDirectory = "src/site";
List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
DecorationModel model =
tool.getDecorationModel( new File( project.getBasedir(), siteDirectory ), Locale.getDefault(), project,
reactorProjects, getLocalRepo(), project.getRemoteArtifactRepositories() );
assertNotNull( model );
}
public void testGetAvailableLocales()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertEquals( Arrays.asList( new Locale[] { SiteTool.DEFAULT_LOCALE } ), tool.getSiteLocales( "en" ) );
assertEquals( Arrays.asList( new Locale[] { SiteTool.DEFAULT_LOCALE, Locale.FRENCH, Locale.ITALIAN } ),
tool.getSiteLocales( "en,fr,it" ) );
// by default, only DEFAULT_LOCALE
assertEquals( Arrays.asList( new Locale[] { SiteTool.DEFAULT_LOCALE } ), tool.getSiteLocales( "" ) );
}
public void testGetInterpolatedSiteDescriptorContent()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
File pomXmlFile = getTestFile( "src/test/resources/unit/interpolated-site/pom.xml" );
assertNotNull( pomXmlFile );
assertTrue( pomXmlFile.exists() );
File descriptorFile = getTestFile( "src/test/resources/unit/interpolated-site/src/site/site.xml" );
assertNotNull( descriptorFile );
assertTrue( descriptorFile.exists() );
String siteDescriptorContent = FileUtils.fileRead( descriptorFile );
assertNotNull( siteDescriptorContent );
assertTrue( siteDescriptorContent.contains( "${project.name}" ) );
assertFalse( siteDescriptorContent.contains( "Interpolatesite" ) );
SiteToolMavenProjectStub project = new SiteToolMavenProjectStub( "interpolated-site" );
SiteTool siteTool = (SiteTool) lookup( SiteTool.ROLE );
siteDescriptorContent =
siteTool.getInterpolatedSiteDescriptorContent( new HashMap<String, String>(), project,
siteDescriptorContent );
assertNotNull( siteDescriptorContent );
assertFalse( siteDescriptorContent.contains( "${project.name}" ) );
assertTrue( siteDescriptorContent.contains( "Interpolatesite" ) );
}
// MSHARED-217 -> DOXIATOOLS-34 -> DOXIASITETOOLS-118
public void testDecorationModelInheritanceAndInterpolation()
throws Exception
{
SiteTool tool = (SiteTool) lookup( SiteTool.ROLE );
assertNotNull( tool );
SiteToolMavenProjectStub parentProject = new SiteToolMavenProjectStub( "interpolation-parent-test" );
parentProject.setDistgributionManagementSiteUrl( "dav:https://davs.codehaus.org/site" );
SiteToolMavenProjectStub childProject = new SiteToolMavenProjectStub( "interpolation-child-test" );
childProject.setParent( parentProject );
childProject.setDistgributionManagementSiteUrl( "dav:https://davs.codehaus.org/site/child" );
List<MavenProject> reactorProjects = Collections.<MavenProject>singletonList( parentProject );
DecorationModel model = tool.getDecorationModel( new File( childProject.getBasedir(), "src/site" ),
Locale.getDefault(), childProject, reactorProjects,
getLocalRepo(), childProject.getRemoteArtifactRepositories() );
assertNotNull( model );
writeModel( model, "unit/interpolation-child-test/effective-site.xml" );
assertEquals( "MSHARED-217 Child", model.getName() );
// late (classical) interpolation
assertEquals( "project.artifactId = mshared-217-child", model.getBannerLeft().getName() );
// early interpolation: DOXIASITETOOLS-158
assertEquals( "this.artifactId = mshared-217-parent", model.getBannerRight().getName() );
// href rebase
assertEquals( "../../index.html", model.getBody().getBreadcrumbs().iterator().next().getHref() );
Iterator<LinkItem> links = model.getBody().getLinks().iterator();
// late interpolation of pom content (which happens first: properties can't override)
assertEquals( "project.name = MSHARED-217 Child", links.next().getName() );
assertEquals( "name = MSHARED-217 Child", links.next().getName() );
// early interpolation: DOXIASITETOOLS-158
assertEquals( "this.name = MSHARED-217 Parent", links.next().getName() );
// late interpolation of project properties
assertEquals( "my_property = from child pom.xml", links.next().getName() );
// early interpolation of project properties: DOXIASITETOOLS-158
assertEquals( "this.my_property = from parent pom.xml", links.next().getName() );
// Env Var interpolation
String envPath = links.next().getName();
assertTrue( envPath.startsWith( "env.PATH = " ) );
assertFalse( envPath.contains( "${" ) );
assertNotSame( "env.PATH = PATH property from pom", envPath );
// property overrides env
assertEquals( "PATH = PATH property from pom", links.next().getName() );
}
private void writeModel( DecorationModel model, String to )
throws Exception
{
Writer writer = WriterFactory.newXmlWriter( getTestFile( "target/test-classes/" + to ) );
try
{
new DecorationXpp3Writer().write( writer, model );
}
finally
{
IOUtil.close( writer );
}
}
}