View Javadoc
1   package org.eclipse.aether.util.graph.transformer;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.eclipse.aether.RepositoryException;
23  import org.eclipse.aether.artifact.DefaultArtifact;
24  import org.eclipse.aether.graph.DefaultDependencyNode;
25  import org.eclipse.aether.graph.Dependency;
26  import org.eclipse.aether.graph.DependencyNode;
27  import org.eclipse.aether.internal.test.util.TestUtils;
28  import org.eclipse.aether.internal.test.util.TestVersion;
29  import org.eclipse.aether.internal.test.util.TestVersionConstraint;
30  import org.junit.Test;
31  
32  import java.util.ArrayList;
33  import java.util.Arrays;
34  import java.util.List;
35  
36  import static org.junit.Assert.assertEquals;
37  import static org.junit.Assert.assertSame;
38  import static org.junit.Assert.assertTrue;
39  
40  public class ConflictResolverTest
41  {
42      @Test
43      public void noTransformationRequired() throws RepositoryException
44      {
45          ConflictResolver resolver = makeDefaultResolver();
46  
47          // Foo -> Bar
48          DependencyNode fooNode = makeDependencyNode( "group-id", "foo", "1.0" );
49          DependencyNode barNode = makeDependencyNode( "group-id", "bar", "1.0" );
50          fooNode.setChildren( mutableList( barNode ) );
51  
52          DependencyNode transformedNode = resolver.transformGraph(
53              fooNode, TestUtils.newTransformationContext( TestUtils.newSession() )
54          );
55  
56          assertSame( fooNode, transformedNode );
57          assertEquals( 1, transformedNode.getChildren().size() );
58          assertSame( barNode, transformedNode.getChildren().get( 0 ) );
59      }
60  
61      @Test
62      public void versionClash() throws RepositoryException
63      {
64          ConflictResolver resolver = makeDefaultResolver();
65  
66          // Foo -> Bar -> Baz 2.0
67          //  |---> Baz 1.0
68          DependencyNode fooNode = makeDependencyNode( "some-group", "foo", "1.0" );
69          DependencyNode barNode = makeDependencyNode( "some-group", "bar", "1.0" );
70          DependencyNode baz1Node = makeDependencyNode( "some-group", "baz", "1.0" );
71          DependencyNode baz2Node = makeDependencyNode( "some-group", "baz", "2.0" );
72          fooNode.setChildren( mutableList( barNode, baz1Node ) );
73          barNode.setChildren( mutableList( baz2Node ) );
74  
75          DependencyNode transformedNode = resolver.transformGraph(
76              fooNode, TestUtils.newTransformationContext( TestUtils.newSession() )
77          );
78  
79          assertSame( fooNode, transformedNode );
80          assertEquals( 2, fooNode.getChildren().size() );
81          assertSame( barNode, fooNode.getChildren().get( 0 ) );
82          assertTrue( barNode.getChildren().isEmpty() );
83          assertSame( baz1Node, fooNode.getChildren().get( 1 ) );
84      }
85  
86      @Test
87      public void derivedScopeChange() throws RepositoryException
88      {
89          ConflictResolver resolver = makeDefaultResolver();
90  
91          // Foo -> Bar (test) -> Jaz
92          //  |---> Baz -> Jaz
93          DependencyNode fooNode = makeDependencyNode( "some-group", "foo", "1.0" );
94          DependencyNode barNode = makeDependencyNode( "some-group", "bar", "1.0", "test" );
95          DependencyNode bazNode = makeDependencyNode( "some-group", "baz", "1.0" );
96          DependencyNode jazNode = makeDependencyNode( "some-group", "jaz", "1.0" );
97          fooNode.setChildren( mutableList( barNode, bazNode ) );
98  
99          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 }