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}