001package org.eclipse.aether.util.graph.transformer;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.eclipse.aether.RepositoryException;
023import org.eclipse.aether.artifact.DefaultArtifact;
024import org.eclipse.aether.graph.DefaultDependencyNode;
025import org.eclipse.aether.graph.Dependency;
026import org.eclipse.aether.graph.DependencyNode;
027import org.eclipse.aether.internal.test.util.TestUtils;
028import org.eclipse.aether.internal.test.util.TestVersion;
029import org.eclipse.aether.internal.test.util.TestVersionConstraint;
030import org.junit.Test;
031
032import java.util.ArrayList;
033import java.util.Arrays;
034import java.util.List;
035
036import static org.junit.Assert.assertEquals;
037import static org.junit.Assert.assertSame;
038import static org.junit.Assert.assertTrue;
039
040public class ConflictResolverTest
041{
042    @Test
043    public void noTransformationRequired() throws RepositoryException
044    {
045        ConflictResolver resolver = makeDefaultResolver();
046
047        // Foo -> Bar
048        DependencyNode fooNode = makeDependencyNode( "group-id", "foo", "1.0" );
049        DependencyNode barNode = makeDependencyNode( "group-id", "bar", "1.0" );
050        fooNode.setChildren( mutableList( barNode ) );
051
052        DependencyNode transformedNode = resolver.transformGraph(
053            fooNode, TestUtils.newTransformationContext( TestUtils.newSession() )
054        );
055
056        assertSame( fooNode, transformedNode );
057        assertEquals( 1, transformedNode.getChildren().size() );
058        assertSame( barNode, transformedNode.getChildren().get( 0 ) );
059    }
060
061    @Test
062    public void versionClash() throws RepositoryException
063    {
064        ConflictResolver resolver = makeDefaultResolver();
065
066        // Foo -> Bar -> Baz 2.0
067        //  |---> Baz 1.0
068        DependencyNode fooNode = makeDependencyNode( "some-group", "foo", "1.0" );
069        DependencyNode barNode = makeDependencyNode( "some-group", "bar", "1.0" );
070        DependencyNode baz1Node = makeDependencyNode( "some-group", "baz", "1.0" );
071        DependencyNode baz2Node = makeDependencyNode( "some-group", "baz", "2.0" );
072        fooNode.setChildren( mutableList( barNode, baz1Node ) );
073        barNode.setChildren( mutableList( baz2Node ) );
074
075        DependencyNode transformedNode = resolver.transformGraph(
076            fooNode, TestUtils.newTransformationContext( TestUtils.newSession() )
077        );
078
079        assertSame( fooNode, transformedNode );
080        assertEquals( 2, fooNode.getChildren().size() );
081        assertSame( barNode, fooNode.getChildren().get( 0 ) );
082        assertTrue( barNode.getChildren().isEmpty() );
083        assertSame( baz1Node, fooNode.getChildren().get( 1 ) );
084    }
085
086    @Test
087    public void derivedScopeChange() throws RepositoryException
088    {
089        ConflictResolver resolver = makeDefaultResolver();
090
091        // Foo -> Bar (test) -> Jaz
092        //  |---> Baz -> Jaz
093        DependencyNode fooNode = makeDependencyNode( "some-group", "foo", "1.0" );
094        DependencyNode barNode = makeDependencyNode( "some-group", "bar", "1.0", "test" );
095        DependencyNode bazNode = makeDependencyNode( "some-group", "baz", "1.0" );
096        DependencyNode jazNode = makeDependencyNode( "some-group", "jaz", "1.0" );
097        fooNode.setChildren( mutableList( barNode, bazNode ) );
098
099        List<DependencyNode> jazList = mutableList( jazNode );
100        barNode.setChildren( jazList );
101        bazNode.setChildren( jazList );
102
103        DependencyNode transformedNode = resolver.transformGraph(
104            fooNode, TestUtils.newTransformationContext( TestUtils.newSession() )
105        );
106
107        assertSame( fooNode, transformedNode );
108        assertEquals( 2, fooNode.getChildren().size() );
109        assertSame( barNode, fooNode.getChildren().get( 0 ) );
110        assertEquals( 1, barNode.getChildren().size() );
111        assertSame( jazNode, barNode.getChildren().get( 0 ) );
112        assertSame( bazNode, fooNode.getChildren().get( 1 ) );
113        assertEquals( 1, barNode.getChildren().size() );
114        assertSame( jazNode, barNode.getChildren().get( 0 ) );
115    }
116
117    @Test
118    public void derivedOptionalStatusChange() throws RepositoryException
119    {
120        ConflictResolver resolver = makeDefaultResolver();
121
122        // Foo -> Bar (optional) -> Jaz
123        //  |---> Baz -> Jaz
124        DependencyNode fooNode = makeDependencyNode( "some-group", "foo", "1.0" );
125        DependencyNode barNode = makeDependencyNode( "some-group", "bar", "1.0" );
126        barNode.setOptional(true);
127        DependencyNode bazNode = makeDependencyNode( "some-group", "baz", "1.0" );
128        DependencyNode jazNode = makeDependencyNode( "some-group", "jaz", "1.0" );
129        fooNode.setChildren( mutableList( barNode, bazNode ) );
130
131        List<DependencyNode> jazList = mutableList( jazNode );
132        barNode.setChildren( jazList );
133        bazNode.setChildren( jazList );
134
135        DependencyNode transformedNode = resolver.transformGraph(
136            fooNode, TestUtils.newTransformationContext( TestUtils.newSession() )
137        );
138
139        assertSame( fooNode, transformedNode );
140        assertEquals( 2, fooNode.getChildren().size() );
141        assertSame( barNode, fooNode.getChildren().get( 0 ) );
142        assertEquals( 1, barNode.getChildren().size() );
143        assertSame( jazNode, barNode.getChildren().get( 0 ) );
144        assertSame( bazNode, fooNode.getChildren().get( 1 ) );
145        assertEquals( 1, barNode.getChildren().size() );
146        assertSame( jazNode, barNode.getChildren().get( 0 ) );
147    }
148
149    private static ConflictResolver makeDefaultResolver()
150    {
151        return new ConflictResolver(
152            new NearestVersionSelector(), new JavaScopeSelector(), new SimpleOptionalitySelector(), new JavaScopeDeriver()
153        );
154    }
155
156    private static DependencyNode makeDependencyNode( String groupId, String artifactId, String version )
157    {
158        return makeDependencyNode( groupId, artifactId, version, "compile" );
159    }
160
161    private static DependencyNode makeDependencyNode( String groupId, String artifactId, String version, String scope )
162    {
163        DefaultDependencyNode node = new DefaultDependencyNode(
164            new Dependency( new DefaultArtifact( groupId + ':' + artifactId + ':' + version ), scope )
165        );
166        node.setVersion( new TestVersion( version ) );
167        node.setVersionConstraint( new TestVersionConstraint( node.getVersion() ) );
168        return node;
169    }
170
171    private static List<DependencyNode> mutableList(DependencyNode... nodes)
172    {
173        return new ArrayList<>( Arrays.asList( nodes ) );
174    }
175}