/**
* Copyright (C) 2012 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.cartographer.graph.spi.neo4j.model;
import org.commonjava.maven.atlas.graph.rel.BomRelationship;
import org.commonjava.maven.atlas.graph.rel.DependencyRelationship;
import org.commonjava.maven.atlas.graph.rel.ExtensionRelationship;
import org.commonjava.maven.atlas.graph.rel.ParentRelationship;
import org.commonjava.maven.atlas.graph.rel.PluginDependencyRelationship;
import org.commonjava.maven.atlas.graph.rel.PluginRelationship;
import org.commonjava.maven.atlas.graph.rel.ProjectRelationship;
import org.commonjava.maven.atlas.graph.rel.SimpleBomRelationship;
import org.commonjava.maven.atlas.graph.rel.SimpleDependencyRelationship;
import org.commonjava.maven.atlas.graph.rel.SimpleExtensionRelationship;
import org.commonjava.maven.atlas.graph.rel.SimpleParentRelationship;
import org.commonjava.maven.atlas.graph.rel.SimplePluginDependencyRelationship;
import org.commonjava.maven.atlas.graph.rel.SimplePluginRelationship;
import org.commonjava.cartographer.graph.spi.neo4j.GraphRelType;
import org.commonjava.cartographer.graph.spi.neo4j.io.Conversions;
import org.commonjava.cartographer.graph.util.RelationshipUtils;
import org.commonjava.maven.atlas.ident.DependencyScope;
import org.commonjava.maven.atlas.ident.ref.ProjectRef;
import org.commonjava.maven.atlas.ident.ref.ProjectVersionRef;
import org.commonjava.maven.atlas.ident.ref.SimpleProjectRef;
import org.commonjava.maven.atlas.ident.ref.SimpleProjectVersionRef;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.commonjava.maven.atlas.graph.rel.RelationshipConstants.POM_ROOT_URI;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Created by jdcasey on 8/26/15.
*/
public class NeoProjectRelationshipEqualitiesTest
{
private static final URI TEST_URI;
static
{
URI u;
try
{
u = new URI( "test:location" );
}
catch ( URISyntaxException e )
{
Logger logger = LoggerFactory.getLogger( NeoProjectRelationshipEqualitiesTest.class );
logger.error( "Failed to construct test URI", e );
u = null;
}
TEST_URI = u;
}
@Rule
public TemporaryFolder temp = new TemporaryFolder();
private GraphDatabaseService graph;
@Before
public void before()
throws Exception
{
graph = new GraphDatabaseFactory().newEmbeddedDatabase( temp.newFolder( "db" ).getAbsolutePath() );
}
@After
public void after()
{
if ( graph != null )
{
graph.shutdown();
}
}
@Test
public void parentRelationshipEq()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ParentRelationship rel =
new SimpleParentRelationship( pvr );
Relationship r = store( rel );
NeoParentRelationship result = new NeoParentRelationship( r );
assertThat( result, equalTo( rel ) );
}
@Test
public void dependencyRelationshipEq()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ProjectVersionRef pvr2 = new SimpleProjectVersionRef( "org.foo", "dep", "1.0" );
DependencyRelationship rel = new SimpleDependencyRelationship(TEST_URI, POM_ROOT_URI, pvr, pvr2.asJarArtifact(),
DependencyScope.compile, 0, false, false, false );
Relationship r = store( rel );
NeoDependencyRelationship result = new NeoDependencyRelationship( r );
assertThat( result, equalTo( rel ) );
}
private Relationship store( final ProjectRelationship<?, ?> rel )
{
Relationship r;
Transaction tx = graph.beginTx();
try
{
Node start = graph.createNode();
Conversions.toNodeProperties( rel.getDeclaring(), start, true );
Node end = graph.createNode();
Conversions.toNodeProperties( rel.getTarget(), end, false );
r = start.createRelationshipTo( end, GraphRelType.map( rel.getType(), rel.isManaged() ) );
Conversions.toRelationshipProperties( rel, r );
tx.success();
}
finally
{
tx.finish();
}
return r;
}
@Test
public void extensionRelationshipEq()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ProjectVersionRef pvr2 = new SimpleProjectVersionRef( "org.foo", "dep", "1.0" );
ExtensionRelationship rel = new SimpleExtensionRelationship(TEST_URI, POM_ROOT_URI, pvr, pvr2, 0, false );
Relationship r = store( rel );
NeoExtensionRelationship result = new NeoExtensionRelationship( r );
assertThat( result, equalTo( rel ) );
}
@Test
public void bomRelationshipEq()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ProjectVersionRef pvr2 = new SimpleProjectVersionRef( "org.foo", "dep", "1.0" );
BomRelationship rel = new SimpleBomRelationship(TEST_URI, POM_ROOT_URI, pvr, pvr2, 0, false, false );
Relationship r = store( rel );
NeoBomRelationship result = new NeoBomRelationship( r );
assertThat( result, equalTo( rel ) );
}
@Test
public void pluginRelationshipEq()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ProjectVersionRef pvr2 = new SimpleProjectVersionRef( "org.foo", "dep", "1.0" );
PluginRelationship rel = new SimplePluginRelationship(TEST_URI, POM_ROOT_URI, pvr, pvr2, 0, false, false );
Relationship r = store( rel );
NeoPluginRelationship result = new NeoPluginRelationship( r );
assertThat( result, equalTo( rel ) );
}
@Test
public void pluginDependencyRelationshipEq()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ProjectVersionRef pvr2 = new SimpleProjectVersionRef( "org.foo", "dep", "1.0" );
ProjectRef pr = new SimpleProjectRef( "org.foo", "plugin" );
PluginDependencyRelationship rel = new SimplePluginDependencyRelationship(TEST_URI, POM_ROOT_URI, pvr, pr, pvr2.asJarArtifact(), 0, false, false );
Relationship r = store( rel );
NeoPluginDependencyRelationship result = new NeoPluginDependencyRelationship( r );
assertThat( result, equalTo( rel ) );
}
@Test
public void mixedSetContains()
throws Exception
{
ProjectVersionRef pvr = new SimpleProjectVersionRef( "org.foo", "bar", "1" );
ProjectVersionRef dep = new SimpleProjectVersionRef( "org.foo", "dep", "1.0" );
ProjectVersionRef bom = new SimpleProjectVersionRef( "org.foo", "bom", "1.0" );
ProjectVersionRef ext = new SimpleProjectVersionRef( "org.foo", "ext", "1.0" );
ProjectVersionRef plug = new SimpleProjectVersionRef( "org.foo", "plug", "1.0" );
ProjectVersionRef pdep = new SimpleProjectVersionRef( "org.foo", "pdep", "1.0" );
ProjectVersionRef parent = new SimpleProjectVersionRef( "org.foo", "parent", "1.0" );
ProjectRef pr = new SimpleProjectRef( "org.foo", "plugin" );
List<ProjectRelationship<?, ?>> rels = Arrays.<ProjectRelationship<?, ?>> asList(
new SimpleParentRelationship( TEST_URI, pvr, parent ),
new SimpleDependencyRelationship( TEST_URI, POM_ROOT_URI, pvr, dep.asJarArtifact(),
DependencyScope.compile, 0, false, false, false ),
new SimpleBomRelationship( TEST_URI, POM_ROOT_URI, pvr, bom, 0, false, false ),
new SimpleExtensionRelationship( TEST_URI, POM_ROOT_URI, pvr, ext, 0, false ),
new SimplePluginRelationship( TEST_URI, POM_ROOT_URI, pvr, plug, 0, false, false ),
new SimplePluginDependencyRelationship( TEST_URI, POM_ROOT_URI, pvr, pr,
pdep.asJarArtifact(), 0, false, false ) );
List<Relationship> rs = new ArrayList<Relationship>();
for ( ProjectRelationship<?, ?> rel : rels )
{
rs.add( store( rel ) );
}
int i=0;
List<ProjectRelationship<?, ?>> nrels = new ArrayList<ProjectRelationship<?, ?>>();
Logger logger = LoggerFactory.getLogger( getClass() );
logger.info("Adding parent, i={}", i);
nrels.add( new NeoParentRelationship( rs.get( i++ ) ) );
logger.info( "Adding dep, i={}", i );
nrels.add( new NeoDependencyRelationship( rs.get( i++ ) ) );
logger.info( "Adding bom, i={}", i );
nrels.add( new NeoBomRelationship( rs.get( i++ ) ) );
logger.info( "Adding ext, i={}", i );
nrels.add( new NeoExtensionRelationship( rs.get( i++ ) ) );
logger.info( "Adding plugin, i={}", i );
nrels.add( new NeoPluginRelationship( rs.get( i++ ) ) );
logger.info( "Adding plugin-dep, i={}", i );
nrels.add( new NeoPluginDependencyRelationship( rs.get( i++ ) ) );
logger.info( "Added all, i={}", i );
List<ProjectRelationship<?, ?>> missing = new ArrayList<ProjectRelationship<?, ?>>();
for ( ProjectRelationship<?, ?> rel: nrels )
{
if ( !rels.contains( rel ) )
{
missing.add( rel );
}
}
assertThat( "Neo-specific relationships not found in original set: " + missing, missing.isEmpty(),
equalTo( true ) );
}
}