/**
* Copyright (C) 2013 Red Hat, Inc. (jdcasey@commonjava.org)
*
* Licensed 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.commonjava.maven.cartographer.ftest;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.Model;
import org.commonjava.maven.atlas.ident.ref.ArtifactRef;
import org.commonjava.maven.atlas.ident.ref.SimpleArtifactRef;
import org.commonjava.cartographer.Cartographer;
import org.commonjava.maven.galley.util.PathUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
public abstract class AbstractCartographerTCK
{
protected static final String GRAPHS = "graphs";
protected static final String DTOS = "dto";
protected static final String OUTPUT = "output";
protected abstract String getTestDir();
@Rule
public TemporaryFolder temp = new TemporaryFolder();
private CartoTCKDriver driver;
protected Cartographer carto;
@Before
public void before()
throws Exception
{
final ServiceLoader<CartoTCKDriver> driverLoader = ServiceLoader.load( CartoTCKDriver.class );
final Iterator<CartoTCKDriver> driverIter = driverLoader.iterator();
if ( !driverIter.hasNext() )
{
throw new IllegalStateException( "No TCK driver found!" );
}
driver = driverIter.next();
carto = driver.start( temp );
}
@After
public void after()
throws Exception
{
if ( driver != null )
{
driver.stop();
}
}
protected void aliasRepo( final String alias, final String repoResource, final int repoResourceTrim )
throws Exception
{
String path = resourcePath( GRAPHS, getTestDir(), repoResource );
final URL pomUrl = Thread.currentThread()
.getContextClassLoader()
.getResource( path );
assertThat( repoResource + " is not on the classpath!", pomUrl, notNullValue() );
File f = new File( pomUrl.getPath() );
for ( int i = 0; i < repoResourceTrim; i++ )
{
f = f.getParentFile();
}
System.out.println( "Got file: " + f );
path = f.getPath();
if ( path.contains( ".jar!" ) )
{
path = "jar:" + path;
}
else
{
path = "file:" + path;
}
System.out.println( "Got repo path: " + path );
driver.createRepoAlias( alias, path );
}
protected <T> T readRecipe( final String dtoFile, final Class<T> type )
throws Exception
{
final String dto = resourcePath( GRAPHS, getTestDir(), DTOS, dtoFile );
final InputStream dtoStream = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream( dto );
assertThat( dto + " is not on the classpath!", dtoStream, notNullValue() );
try
{
return carto.getObjectMapper()
.readValue( dtoStream, type );
}
finally
{
IOUtils.closeQuietly( dtoStream );
}
}
protected String resourcePath( final String... parts )
{
return PathUtils.normalize( parts );
}
protected void assertPomDeps( final Model pom, final boolean managed, final String depsFile )
throws Exception
{
final String depListing = resourcePath( GRAPHS, getTestDir(), OUTPUT, depsFile );
final InputStream depsStream = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream( depListing );
final List<String> specs = IOUtils.readLines( depsStream );
System.out.println( "Asserting presence of artifacts:\n " + StringUtils.join( specs, "\n " ) );
IOUtils.closeQuietly( depsStream );
final List<Dependency> deps;
if ( managed )
{
final DependencyManagement dm = pom.getDependencyManagement();
assertThat( dm, notNullValue() );
deps = dm.getDependencies();
}
else
{
deps = pom.getDependencies();
}
final List<ArtifactRef> depArtifacts = new ArrayList<ArtifactRef>();
for ( final Dependency dep : deps )
{
final String depSpec =
String.format( "%s:%s:%s:%s%s", dep.getGroupId(), dep.getArtifactId(), dep.getVersion(),
( dep.getType() == null ? "jar" : dep.getType() ), ( dep.getClassifier() == null ? ""
: ":" + dep.getClassifier() ) );
depArtifacts.add( SimpleArtifactRef.parse( depSpec ) );
}
System.out.println( "POM dependencies:\n " + StringUtils.join( depArtifacts, "\n " ) );
assertThat( depArtifacts.size(), equalTo( specs.size() ) );
for ( final String spec : specs )
{
final ArtifactRef ar = SimpleArtifactRef.parse( spec );
assertThat( spec + " was missing from dependencies!", depArtifacts.contains( ar ), equalTo( true ) );
}
}
}