blob: 8efbf246a8a1b7f525d3c20f8dabe814de46c3f1 [file] [log] [blame]
/**
* 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.
*/
package org.apache.maven.mercury.repository.metadata;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.maven.mercury.util.FileUtil;
import org.apache.maven.mercury.util.TimeUtil;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* @author Oleg Gusakov
* @version $Id$
*/
public class MetadataBuilderTest
extends TestCase
{
MetadataBuilder mb;
File testBase = new File( "./target/test-classes/controlledRepoMd" );
// -------------------------------------------------------------------------
@Override
protected void setUp()
throws Exception
{
File temp = new File( testBase, "group-maven-metadata-write.xml" );
if ( temp.exists() )
temp.delete();
}
// -------------------------------------------------------------------------
protected void tearDown()
throws Exception
{
}
protected Metadata getMetadata( File file )
throws Exception
{
byte[] targetBytes = FileUtil.readRawData( file );
return MetadataBuilder.getMetadata( targetBytes );
}
protected Metadata applyOpsAndGetMetadata( Metadata metadata, List<MetadataOperation> ops, File file )
throws Exception
{
byte[] resBytes = MetadataBuilder.changeMetadata( metadata, ops );
FileUtil.writeRawData( file, resBytes );
return MetadataBuilder.read( new FileInputStream( file ) );
}
// -------------------------------------------------------------------------
public void testReadGroupMd()
throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
{
File groupMd = new File( testBase, "group-maven-metadata.xml" );
Metadata mmd = MetadataBuilder.read( new FileInputStream( groupMd ) );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 4, versions.size() );
}
// -------------------------------------------------------------------------
public void testWriteGroupMd()
throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
{
File groupMd = new File( testBase, "group-maven-metadata-write.xml" );
Metadata md = new Metadata();
md.setGroupId( "a" );
md.setArtifactId( "a" );
md.setVersion( "1.0.0" );
Versioning v = new Versioning();
v.addVersion( "1.0.0" );
v.addVersion( "2.0.0" );
md.setVersioning( v );
MetadataBuilder.write( md, new FileOutputStream( groupMd ) );
Metadata mmd = MetadataBuilder.read( new FileInputStream( groupMd ) );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "1.0.0", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 2, versions.size() );
}
// -------------------------------------------------------------------------
public void testAddPluginOperation()
throws Exception
{
File mdFileBefore = new File( testBase, "group-maven-metadata.xml" );
Metadata mdBefore = getMetadata( mdFileBefore );
Plugin pluginA = new Plugin();
pluginA.setArtifactId( "maven-testa-plugin" );
pluginA.setName( "Some Plugin A" );
pluginA.setPrefix( "testa" );
Plugin pluginB = new Plugin();
pluginB.setArtifactId( "maven-testb-plugin" );
pluginB.setName( "Some Plugin B" );
pluginB.setPrefix( "testb" );
Plugin pluginC = new Plugin();
pluginC.setArtifactId( "maven-testc-plugin" );
pluginC.setName( "Some Plugin C" );
pluginC.setPrefix( "testc" );
List<MetadataOperation> opsAdd = new ArrayList<MetadataOperation>();
opsAdd.add( new AddPluginOperation( new PluginOperand( pluginC ) ) );
opsAdd.add( new AddPluginOperation( new PluginOperand( pluginB ) ) );
opsAdd.add( new AddPluginOperation( new PluginOperand( pluginA ) ) );
File mdFileAfter = new File( testBase, "group-maven-metadata-write.xml" );
Metadata mdAfterAdd = applyOpsAndGetMetadata( mdBefore, opsAdd, mdFileAfter );
assertEquals( 3, mdAfterAdd.getPlugins().size() );
assertEquals( "maven-testa-plugin", ( (Plugin) mdAfterAdd.getPlugins().get( 0 ) ).getArtifactId() );
assertEquals( "testa", ( (Plugin) mdAfterAdd.getPlugins().get( 0 ) ).getPrefix() );
assertEquals( "Some Plugin A", ( (Plugin) mdAfterAdd.getPlugins().get( 0 ) ).getName() );
assertEquals( "maven-testb-plugin", ( (Plugin) mdAfterAdd.getPlugins().get( 1 ) ).getArtifactId() );
assertEquals( "maven-testc-plugin", ( (Plugin) mdAfterAdd.getPlugins().get( 2 ) ).getArtifactId() );
List<MetadataOperation> opsRemove = new ArrayList<MetadataOperation>();
opsRemove.add( new RemovePluginOperation( new PluginOperand( pluginA ) ) );
opsRemove.add( new RemovePluginOperation( new PluginOperand( pluginB ) ) );
opsRemove.add( new RemovePluginOperation( new PluginOperand( pluginC ) ) );
Metadata mdAfterRemove = applyOpsAndGetMetadata( mdAfterAdd, opsRemove, mdFileAfter );
assertEquals( 0, mdAfterRemove.getPlugins().size() );
}
// -------------------------------------------------------------------------
public void testMergeOperation()
throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
{
File groupMd = new File( testBase, "group-maven-metadata.xml" );
byte[] targetBytes = FileUtil.readRawData( groupMd );
Metadata source = new Metadata();
source.setGroupId( "a" );
source.setArtifactId( "a" );
source.setVersion( "1.0.0" );
Versioning v = new Versioning();
v.addVersion( "1.0.0" );
v.addVersion( "2.0.0" );
source.setVersioning( v );
byte[] resBytes =
MetadataBuilder.changeMetadata( targetBytes, new MergeOperation( new MetadataOperand( source ) ) );
File resFile = new File( testBase, "group-maven-metadata-write.xml" );
FileUtil.writeRawData( resFile, resBytes );
Metadata mmd = MetadataBuilder.read( new FileInputStream( resFile ) );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "4", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 6, versions.size() );
assertTrue( versions.contains( "1" ) );
assertTrue( versions.contains( "2" ) );
assertTrue( versions.contains( "3" ) );
assertTrue( versions.contains( "4" ) );
assertTrue( versions.contains( "1.0.0" ) );
assertTrue( versions.contains( "2.0.0" ) );
}
public void testAddVersionOperationOrdered()
throws Exception
{
File mdFileBefore = new File( testBase, "group-maven-metadata.xml" );
Metadata mdBefore = getMetadata( mdFileBefore );
List<MetadataOperation> ops = new ArrayList<MetadataOperation>();
ops.add( new AddVersionOperation( new StringOperand( "1.3.0-SNAPSHOT" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.2.0-SNAPSHOT" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.2.0.5-SNAPSHOT" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.0.1" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.0.3-SNAPSHOT" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.1-M1" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.0.0-alpha-5" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.2.0" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.2.0-beta-1" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.0.0.1" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.0.0-beta-3" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "4.1.0" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "1.0.0-beta-6-SNAPSHOT" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "5.0-SNAPSHOT" ) ) );
List<String> orderedVersions = new ArrayList<String>();
orderedVersions.add( "1.0.0-alpha-5" );
orderedVersions.add( "1.0.0-beta-3" );
orderedVersions.add( "1.0.0-beta-6-SNAPSHOT" );
orderedVersions.add( "1" );
orderedVersions.add( "1.0.0.1" );
orderedVersions.add( "1.0.1" );
orderedVersions.add( "1.0.3-SNAPSHOT" );
orderedVersions.add( "1.1-M1" );
orderedVersions.add( "1.2.0-beta-1" );
orderedVersions.add( "1.2.0-SNAPSHOT" );
orderedVersions.add( "1.2.0" );
orderedVersions.add( "1.2.0.5-SNAPSHOT" );
orderedVersions.add( "1.3.0-SNAPSHOT" );
orderedVersions.add( "2" );
orderedVersions.add( "3" );
orderedVersions.add( "4" );
orderedVersions.add( "4.1.0" );
orderedVersions.add( "5.0-SNAPSHOT" );
File mdFileAfter = new File( testBase, "group-maven-metadata-write.xml" );
Metadata mdAfter = applyOpsAndGetMetadata( mdBefore, ops, mdFileAfter );
Assert.assertEquals( orderedVersions, mdAfter.getVersioning().getVersions() );
Assert.assertEquals( "5.0-SNAPSHOT", mdAfter.getVersioning().getLatest() );
Assert.assertEquals( "4.1.0", mdAfter.getVersioning().getRelease() );
}
// -------------------------------------------------------------------------
public void testAddVersionOperation()
throws Exception
{
// prepare
File groupMd = new File( testBase, "group-maven-metadata.xml" );
Metadata md = getMetadata( groupMd );
List<MetadataOperation> ops = new ArrayList<MetadataOperation>();
ops.add( new AddVersionOperation( new StringOperand( "5" ) ) );
File resFile = new File( testBase, "group-maven-metadata-write.xml" );
// do
Metadata mmd = applyOpsAndGetMetadata( md, ops, resFile );
// assert
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "4", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 5, versions.size() );
assertTrue( versions.contains( "1" ) );
assertTrue( versions.contains( "2" ) );
assertTrue( versions.contains( "3" ) );
assertTrue( versions.contains( "4" ) );
assertTrue( versions.contains( "5" ) );
}
// -------------------------------------------------------------------------
public void testAddVersionTwiceOperation()
throws Exception
{
File groupMd = new File( testBase, "group-maven-metadata.xml" );
Metadata checkMd = getMetadata( groupMd );
assertNotNull( checkMd );
assertEquals( "a", checkMd.getGroupId() );
assertEquals( "a", checkMd.getArtifactId() );
assertEquals( "4", checkMd.getVersion() );
assertNotNull( checkMd.getVersioning() );
List<String> checkVersions = checkMd.getVersioning().getVersions();
assertNotNull( checkVersions );
assertEquals( 4, checkVersions.size() );
assertTrue( checkVersions.contains( "1" ) );
assertTrue( checkVersions.contains( "2" ) );
assertTrue( checkVersions.contains( "3" ) );
assertTrue( checkVersions.contains( "4" ) );
assertFalse( checkVersions.contains( "5" ) );
List<MetadataOperation> ops = new ArrayList<MetadataOperation>();
ops.add( new AddVersionOperation( new StringOperand( "5" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "5" ) ) );
File resFile = new File( testBase, "group-maven-metadata-write.xml" );
Metadata mmd = applyOpsAndGetMetadata( checkMd, ops, resFile );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "4", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 5, versions.size() );
assertTrue( versions.contains( "1" ) );
assertTrue( versions.contains( "2" ) );
assertTrue( versions.contains( "3" ) );
assertTrue( versions.contains( "4" ) );
assertTrue( versions.contains( "5" ) );
}
// -------------------------------------------------------------------------
public void testRemoveVersionOperation()
throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
{
File groupMd = new File( testBase, "group-maven-metadata.xml" );
byte[] targetBytes = FileUtil.readRawData( groupMd );
byte[] resBytes =
MetadataBuilder.changeMetadata( targetBytes, new RemoveVersionOperation( new StringOperand( "1" ) ) );
File resFile = new File( testBase, "group-maven-metadata-write.xml" );
FileUtil.writeRawData( resFile, resBytes );
Metadata mmd = MetadataBuilder.read( new FileInputStream( resFile ) );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "4", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 3, versions.size() );
assertTrue( !versions.contains( "1" ) );
assertTrue( versions.contains( "2" ) );
assertTrue( versions.contains( "3" ) );
assertTrue( versions.contains( "4" ) );
}
public void testSetSnapshotVersionOperation()
throws Exception
{
File mdFileBefore = new File( testBase, "group-maven-metadata.xml" );
Metadata mdBefore = getMetadata( mdFileBefore );
mdBefore.setVersion( "1.3.0-SNAPSHOT" );
List<MetadataOperation> ops = new ArrayList<MetadataOperation>();
ops.add( new SetSnapshotOperation( new StringOperand( "a-1.3.0-20090210.041603-374.pom" ) ) );
ops.add( new SetSnapshotOperation( new StringOperand( "a-1.3.0-20090210.030701-373.pom" ) ) );
ops.add( new SetSnapshotOperation( new StringOperand( "a-1.3.0-20090210.090218-375.pom" ) ) );
ops.add( new SetSnapshotOperation( new StringOperand( "a-1.3.0-20090210.095716-376.pom" ) ) );
File mdFileAfter = new File( testBase, "group-maven-metadata-write.xml" );
Metadata mdAfter = applyOpsAndGetMetadata( mdBefore, ops, mdFileAfter );
Assert.assertEquals( "20090210.095716", mdAfter.getVersioning().getSnapshot().getTimestamp() );
Assert.assertEquals( 376, mdAfter.getVersioning().getSnapshot().getBuildNumber() );
}
// -------------------------------------------------------------------------
public void testSetSnapshotOperation()
throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
{
File groupMd = new File( testBase, "group-maven-metadata.xml" );
byte[] targetBytes = FileUtil.readRawData( groupMd );
Snapshot sn = new Snapshot();
sn.setLocalCopy( false );
sn.setBuildNumber( 35 );
String ts = TimeUtil.getUTCTimestamp();
sn.setTimestamp( ts );
byte[] resBytes =
MetadataBuilder.changeMetadata( targetBytes, new SetSnapshotOperation( new SnapshotOperand( sn ) ) );
File resFile = new File( testBase, "group-maven-metadata-write.xml" );
FileUtil.writeRawData( resFile, resBytes );
Metadata mmd = MetadataBuilder.read( new FileInputStream( resFile ) );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "4", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
Snapshot snapshot = mmd.getVersioning().getSnapshot();
assertNotNull( snapshot );
assertEquals( ts, snapshot.getTimestamp() );
// now let's drop sn
targetBytes = FileUtil.readRawData( resFile );
resBytes =
MetadataBuilder.changeMetadata( targetBytes, new SetSnapshotOperation( new SnapshotOperand( null ) ) );
Metadata mmd2 = MetadataBuilder.read( new ByteArrayInputStream( resBytes ) );
assertNotNull( mmd2 );
assertEquals( "a", mmd2.getGroupId() );
assertEquals( "a", mmd2.getArtifactId() );
assertEquals( "4", mmd2.getVersion() );
assertNotNull( mmd2.getVersioning() );
snapshot = mmd2.getVersioning().getSnapshot();
assertNull( snapshot );
}
// -------------------------------------------------------------------------
public void testMultipleOperations()
throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
{
File groupMd = new File( testBase, "group-maven-metadata.xml" );
byte[] targetBytes = FileUtil.readRawData( groupMd );
ArrayList<MetadataOperation> ops = new ArrayList<MetadataOperation>( 2 );
ops.add( new RemoveVersionOperation( new StringOperand( "1" ) ) );
ops.add( new AddVersionOperation( new StringOperand( "8" ) ) );
byte[] resBytes = MetadataBuilder.changeMetadata( targetBytes, ops );
File resFile = new File( testBase, "group-maven-metadata-write.xml" );
FileUtil.writeRawData( resFile, resBytes );
Metadata mmd = MetadataBuilder.read( new FileInputStream( resFile ) );
assertNotNull( mmd );
assertEquals( "a", mmd.getGroupId() );
assertEquals( "a", mmd.getArtifactId() );
assertEquals( "4", mmd.getVersion() );
assertNotNull( mmd.getVersioning() );
List<String> versions = mmd.getVersioning().getVersions();
assertNotNull( versions );
assertEquals( 4, versions.size() );
assertTrue( !versions.contains( "1" ) );
assertTrue( versions.contains( "2" ) );
assertTrue( versions.contains( "3" ) );
assertTrue( versions.contains( "4" ) );
assertTrue( versions.contains( "8" ) );
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
}