blob: 9d39123d7a2aef6a853e914ab4c46f210c6a7099 [file] [log] [blame]
package org.apache.maven.scm.provider.svn;
/*
* 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 org.apache.maven.scm.ScmBranch;
import org.apache.maven.scm.ScmRevision;
import org.apache.maven.scm.ScmTag;
import org.apache.maven.scm.ScmTestCase;
import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
import org.apache.maven.scm.repository.ScmRepository;
/**
* @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
* @version $Id$
*/
public class SvnTagBranchUtilsTest
extends ScmTestCase
{
// ----------------------------------------------------------------------
// appendPath
// ----------------------------------------------------------------------
public void testAppendPath()
throws Exception
{
assertEquals( "http://foo.com/svn/myproject/tags/foo",
SvnTagBranchUtils.appendPath( "http://foo.com/svn", "myproject/tags/foo" ) );
}
public void testAppendPathNullAddlPath()
throws Exception
{
assertEquals( "http://foo.com/svn", SvnTagBranchUtils.appendPath( "http://foo.com/svn", null ) );
}
public void testAppendPathNullAddlTrailingSlash()
throws Exception
{
assertEquals( "http://foo.com/svn", SvnTagBranchUtils.appendPath( "http://foo.com/svn/", null ) );
}
public void testAppendPathTrailingSlash()
throws Exception
{
assertEquals( "http://foo.com/svn/myproject/tags/foo",
SvnTagBranchUtils.appendPath( "http://foo.com/svn/", "myproject/tags/foo" ) );
}
public void testAppendPathLeadingAndTrailingSlash()
throws Exception
{
assertEquals( "http://foo.com/svn/myproject/tags/foo",
SvnTagBranchUtils.appendPath( "http://foo.com/svn/", "/myproject/tags/foo" ) );
}
// ----------------------------------------------------------------------
// resolveTagBase
// ----------------------------------------------------------------------
public void testResolveTagBase()
{
assertEquals( "http://foo.com/svn/myproject/tags",
SvnTagBranchUtils.resolveTagBase( "http://foo.com/svn/myproject/trunk" ) );
assertEquals( "http://foo.com/svn/myproject/tags",
SvnTagBranchUtils.resolveTagBase( "http://foo.com/svn/myproject/trunk/" ) );
}
// ----------------------------------------------------------------------
// getProjectRoot
// ----------------------------------------------------------------------
public void testGetProjectRootTagBranchTrunk()
throws Exception
{
// All of these should equate to the same project root
String[] paths = new String[]{"scm:svn:http://foo.com/svn/tags/my-tag", "scm:svn:http://foo.com/svn/tags",
"scm:svn:http://foo.com/svn/branches/my-branch", "scm:svn:http://foo.com/svn/branches",
"scm:svn:http://foo.com/svn/trunk", "scm:svn:http://foo.com/svn/trunk/some/path/to/some/file"};
for ( int i = 0; i < paths.length; i++ )
{
testGetProjectRoot( paths[i], "http://foo.com/svn" );
}
}
public void testGetProjectRootNoRootSpecifier()
throws Exception
{
testGetProjectRoot( "scm:svn:http://foo.com/svn/", "http://foo.com/svn" );
testGetProjectRoot( "scm:svn:http://foo.com/svn", "http://foo.com/svn" );
testGetProjectRoot( "scm:svn:http://foo.com/svn/ntags", "http://foo.com/svn/ntags" );
testGetProjectRoot( "scm:svn:http://foo.com/svn/nbranches", "http://foo.com/svn/nbranches" );
}
public void testGetProjectRootLooksLikeRootSpecifier()
throws Exception
{
testGetProjectRoot( "scm:svn:http://foo.com/svn/tagst", "http://foo.com/svn/tagst" );
testGetProjectRoot( "scm:svn:http://foo.com/svn/tagst/tags", "http://foo.com/svn/tagst" );
testGetProjectRoot( "scm:svn:http://foo.com/svn/branchess", "http://foo.com/svn/branchess" );
}
public void testGetProjectRootDoubleProjectRoots()
throws Exception
{
testGetProjectRoot( "scm:svn:http://foo.com/svn/tags/my-tag/tags/another-tag/",
"http://foo.com/svn/tags/my-tag" );
testGetProjectRoot( "scm:svn:http://foo.com/svn/trunk/a_directory/trunk/",
"http://foo.com/svn/trunk/a_directory" );
}
// ----------------------------------------------------------------------
// resolveTagUrl
// ----------------------------------------------------------------------
public void testResolveTagRelative()
throws Exception
{
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "my-tag", "http://foo.com/svn/tags/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/trunk", "my-tag", "http://foo.com/svn/tags/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/trunk/", "my-tag", "http://foo.com/svn/tags/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/branches", "my-tag", "http://foo.com/svn/tags/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/tags", "my-tag", "http://foo.com/svn/tags/my-tag" );
}
public void testResolveTagAbsolute()
throws Exception
{
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/branches/my-tag",
"http://foo.com/svn/branches/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "file://C://svn/some/crazy/path/my-tag",
"file://C://svn/some/crazy/path/my-tag" );
}
public void testResolveTagViewCVS()
throws Exception
{
assertEquals( "http://foo.com/cgi-bin/viewcvs.cgi/svn/tags/my-tag?root=test", SvnTagBranchUtils.resolveTagUrl(
"http://foo.com/cgi-bin/viewcvs.cgi/svn/trunk/?root=test", new ScmTag( "/my-tag/" ) ) );
}
public void testResolveTagWithSlashes()
throws Exception
{
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "/my-tag/", "http://foo.com/svn/tags/my-tag" );
testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "/my-branch/", "http://foo.com/svn/branches/my-branch" );
testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/myproject/branches/", "/my-branch/",
"http://foo.com/svn/myproject/branches/my-branch" );
}
public void testResolveTagWithTagOverwritingBase()
throws Exception
{
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "branches/my-tag", "http://foo.com/svn/branches/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "tags/my-tag", "http://foo.com/svn/tags/my-tag" );
// Not sure why you would ever specify a tag of /trunk/foo,
// but create the test case to assure consistent behavior in the future
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "trunk/my-tag", "http://foo.com/svn/trunk/my-tag" );
testResolveTagUrl( "scm:svn:svn+ssh://foo.com/svn/trunk/my_path/to/my_dir", "my-tag",
"svn+ssh://foo.com/svn/tags/my-tag" );
testResolveTagUrl( "scm:svn:svn+ssh://foo.com/svn/trunk/my_path/to/my_dir/trunk/mydir", "my-tag",
"svn+ssh://foo.com/svn/trunk/my_path/to/my_dir/tags/my-tag" );
testResolveTagUrl( "scm:svn:file://localhost/C:/mydir/myproject/trunk/my-module/target/scm-src/trunk", "my-tag",
"file://localhost/C:/mydir/myproject/trunk/my-module/target/scm-src/tags/my-tag" );
}
public void testResolveTagWithTagBaseSpecified()
throws Exception
{
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "../tags", "my-tag", "../tags/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/non-standard/tag/dir/", "my-tag",
"http://foo.com/svn/non-standard/tag/dir/my-tag" );
}
public void testResolveTagLooksLikeOverwriteTagBase()
throws Exception
{
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "tagst/my-tag", "http://foo.com/svn/tags/tagst/my-tag" );
testResolveTagUrl( "scm:svn:http://foo.com/svn/", "metatags/my-tag",
"http://foo.com/svn/tags/metatags/my-tag" );
}
public void testResolveBranchSimple()
throws Exception
{
testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "my-branch", "http://foo.com/svn/branches/my-branch" );
testResolveBranchUrl( "scm:svn:svn+ssh://foo.com/svn/trunk", "my-branch",
"svn+ssh://foo.com/svn/branches/my-branch" );
testResolveBranchUrl( "scm:svn:svn+ssh://foo.com/svn/trunk/my_path/to/my_dir", "my-branch",
"svn+ssh://foo.com/svn/branches/my-branch" );
testResolveBranchUrl( "scm:svn:http://foo.com/svn/trunk", "branches/my-branch",
"http://foo.com/svn/branches/my-branch" );
testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "subbranches/my-branch",
"http://foo.com/svn/branches/subbranches/my-branch" );
}
public void testResolveBranchTagBase()
throws Exception
{
testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "../branches", "my-branch", "../branches/my-branch" );
testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/non-standard/branch/dir", "my-branch",
"http://foo.com/svn/non-standard/branch/dir/my-branch" );
}
// ----------------------------------------------------------------------
// revisionArgument
// ----------------------------------------------------------------------
public void testIsRevisionArgumentSimple()
{
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "12345" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "hEaD" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "bAsE" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "cOmMiTtEd" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "pReV" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "{2005-1-1}" ) ) );
}
public void testIsRevisionArgumentRange()
{
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "12345:12345" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "1:2" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "hEaD:bAsE" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "BaSe:CoMmItTeD" ) ) );
assertTrue( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "{2004-1-1}:{2005-1-1}" ) ) );
assertFalse( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( "BASE:" ) ) );
assertFalse( SvnTagBranchUtils.isRevisionSpecifier( new ScmRevision( ":BASE" ) ) );
}
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
private SvnScmProviderRepository getSvnRepository( String scmUrl )
throws Exception
{
ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
return (SvnScmProviderRepository) repository.getProviderRepository();
}
private void testGetProjectRoot( String scmUrl, String expected )
throws Exception
{
assertEquals( expected, SvnTagBranchUtils.getProjectRoot( getSvnRepository( scmUrl ).getUrl() ) );
}
private void testResolveTagUrl( String scmUrl, String tag, String expected )
throws Exception
{
testResolveTagUrl( scmUrl, null, tag, expected );
}
private void testResolveTagUrl( String scmUrl, String tagBase, String tag, String expected )
throws Exception
{
SvnScmProviderRepository repository = getSvnRepository( scmUrl );
if ( tagBase != null )
{
repository.setTagBase( tagBase );
}
if ( tagBase != null )
{
assertEquals( repository.getTagBase(), tagBase );
}
else
{
assertEquals( repository.getTagBase(), SvnTagBranchUtils.resolveTagBase( repository.getUrl() ) );
}
assertEquals( expected, SvnTagBranchUtils.resolveTagUrl( repository, new ScmTag( tag ) ) );
}
private void testResolveBranchUrl( String scmUrl, String branch, String expected )
throws Exception
{
testResolveBranchUrl( scmUrl, null, branch, expected );
}
private void testResolveBranchUrl( String scmUrl, String branchBase, String branch, String expected )
throws Exception
{
SvnScmProviderRepository repository = getSvnRepository( scmUrl );
if ( branchBase != null )
{
repository.setBranchBase( branchBase );
}
if ( branchBase != null )
{
assertEquals( repository.getBranchBase(), branchBase );
}
else
{
assertEquals( repository.getBranchBase(), SvnTagBranchUtils.resolveBranchBase( repository.getUrl() ) );
}
assertEquals( expected, SvnTagBranchUtils.resolveBranchUrl( repository, new ScmBranch( branch ) ) );
}
}