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 static org.junit.Assert.*; 023 024import java.util.List; 025 026import org.eclipse.aether.collection.UnsolvableVersionConflictException; 027import org.eclipse.aether.graph.DependencyNode; 028import org.eclipse.aether.internal.test.util.DependencyGraphParser; 029import org.junit.Test; 030 031/** 032 */ 033public class NearestVersionSelectorTest 034 extends AbstractDependencyGraphTransformerTest 035{ 036 037 @Override 038 protected ConflictResolver newTransformer() 039 { 040 return new ConflictResolver( new NearestVersionSelector(), new JavaScopeSelector(), 041 new SimpleOptionalitySelector(), new JavaScopeDeriver() ); 042 } 043 044 @Override 045 protected DependencyGraphParser newParser() 046 { 047 return new DependencyGraphParser( "transformer/version-resolver/" ); 048 } 049 050 @Test 051 public void testSelectHighestVersionFromMultipleVersionsAtSameLevel() 052 throws Exception 053 { 054 DependencyNode root = parseResource( "sibling-versions.txt" ); 055 assertSame( root, transform( root ) ); 056 057 assertEquals( 1, root.getChildren().size() ); 058 assertEquals( "3", root.getChildren().get( 0 ).getArtifact().getVersion() ); 059 } 060 061 @Test 062 public void testSelectedVersionAtDeeperLevelThanOriginallySeen() 063 throws Exception 064 { 065 DependencyNode root = parseResource( "nearest-underneath-loser-a.txt" ); 066 067 assertSame( root, transform( root ) ); 068 069 List<DependencyNode> trail = find( root, "j" ); 070 assertEquals( 5, trail.size() ); 071 } 072 073 @Test 074 public void testNearestDirtyVersionUnderneathRemovedNode() 075 throws Exception 076 { 077 DependencyNode root = parseResource( "nearest-underneath-loser-b.txt" ); 078 079 assertSame( root, transform( root ) ); 080 081 List<DependencyNode> trail = find( root, "j" ); 082 assertEquals( 5, trail.size() ); 083 } 084 085 @Test 086 public void testViolationOfHardConstraintFallsBackToNearestSeenNotFirstSeen() 087 throws Exception 088 { 089 DependencyNode root = parseResource( "range-backtracking.txt" ); 090 091 assertSame( root, transform( root ) ); 092 093 List<DependencyNode> trail = find( root, "x" ); 094 assertEquals( 3, trail.size() ); 095 assertEquals( "2", trail.get( 0 ).getArtifact().getVersion() ); 096 } 097 098 @Test 099 public void testCyclicConflictIdGraph() 100 throws Exception 101 { 102 DependencyNode root = parseResource( "conflict-id-cycle.txt" ); 103 104 assertSame( root, transform( root ) ); 105 106 assertEquals( 2, root.getChildren().size() ); 107 assertEquals( "a", root.getChildren().get( 0 ).getArtifact().getArtifactId() ); 108 assertEquals( "b", root.getChildren().get( 1 ).getArtifact().getArtifactId() ); 109 assertTrue( root.getChildren().get( 0 ).getChildren().isEmpty() ); 110 assertTrue( root.getChildren().get( 1 ).getChildren().isEmpty() ); 111 } 112 113 @Test( expected = UnsolvableVersionConflictException.class ) 114 public void testUnsolvableRangeConflictBetweenHardConstraints() 115 throws Exception 116 { 117 DependencyNode root = parseResource( "unsolvable.txt" ); 118 119 assertSame( root, transform( root ) ); 120 } 121 122 @Test( expected = UnsolvableVersionConflictException.class ) 123 public void testUnsolvableRangeConflictWithUnrelatedCycle() 124 throws Exception 125 { 126 DependencyNode root = parseResource( "unsolvable-with-cycle.txt" ); 127 128 transform( root ); 129 } 130 131 @Test 132 public void testSolvableConflictBetweenHardConstraints() 133 throws Exception 134 { 135 DependencyNode root = parseResource( "ranges.txt" ); 136 137 assertSame( root, transform( root ) ); 138 } 139 140 @Test 141 public void testConflictGroupCompletelyDroppedFromResolvedTree() 142 throws Exception 143 { 144 DependencyNode root = parseResource( "dead-conflict-group.txt" ); 145 146 assertSame( root, transform( root ) ); 147 148 assertEquals( 2, root.getChildren().size() ); 149 assertEquals( "a", root.getChildren().get( 0 ).getArtifact().getArtifactId() ); 150 assertEquals( "b", root.getChildren().get( 1 ).getArtifact().getArtifactId() ); 151 assertTrue( root.getChildren().get( 0 ).getChildren().isEmpty() ); 152 assertTrue( root.getChildren().get( 1 ).getChildren().isEmpty() ); 153 } 154 155 @Test 156 public void testNearestSoftVersionPrunedByFartherRange() 157 throws Exception 158 { 159 DependencyNode root = parseResource( "soft-vs-range.txt" ); 160 161 assertSame( root, transform( root ) ); 162 163 assertEquals( 2, root.getChildren().size() ); 164 assertEquals( "a", root.getChildren().get( 0 ).getArtifact().getArtifactId() ); 165 assertEquals( 0, root.getChildren().get( 0 ).getChildren().size() ); 166 assertEquals( "b", root.getChildren().get( 1 ).getArtifact().getArtifactId() ); 167 assertEquals( 1, root.getChildren().get( 1 ).getChildren().size() ); 168 } 169 170 @Test 171 public void testCyclicGraph() 172 throws Exception 173 { 174 DependencyNode root = parseResource( "cycle.txt" ); 175 176 assertSame( root, transform( root ) ); 177 178 assertEquals( 2, root.getChildren().size() ); 179 assertEquals( 1, root.getChildren().get( 0 ).getChildren().size() ); 180 assertEquals( 0, root.getChildren().get( 0 ).getChildren().get( 0 ).getChildren().size() ); 181 assertEquals( 0, root.getChildren().get( 1 ).getChildren().size() ); 182 } 183 184 @Test 185 public void testLoop() 186 throws Exception 187 { 188 DependencyNode root = parseResource( "loop.txt" ); 189 190 assertSame( root, transform( root ) ); 191 192 assertEquals( 0, root.getChildren().size() ); 193 } 194 195 @Test 196 public void testOverlappingCycles() 197 throws Exception 198 { 199 DependencyNode root = parseResource( "overlapping-cycles.txt" ); 200 201 assertSame( root, transform( root ) ); 202 203 assertEquals( 2, root.getChildren().size() ); 204 } 205 206 @Test 207 public void testScopeDerivationAndConflictResolutionCantHappenForAllNodesBeforeVersionSelection() 208 throws Exception 209 { 210 DependencyNode root = parseResource( "scope-vs-version.txt" ); 211 212 assertSame( root, transform( root ) ); 213 214 DependencyNode[] nodes = find( root, "y" ).toArray( new DependencyNode[0] ); 215 assertEquals( 3, nodes.length ); 216 assertEquals( "test", nodes[1].getDependency().getScope() ); 217 assertEquals( "test", nodes[0].getDependency().getScope() ); 218 } 219 220 @Test 221 public void testVerboseMode() 222 throws Exception 223 { 224 DependencyNode root = parseResource( "verbose.txt" ); 225 226 session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, Boolean.TRUE ); 227 assertSame( root, transform( root ) ); 228 229 assertEquals( 2, root.getChildren().size() ); 230 assertEquals( 1, root.getChildren().get( 0 ).getChildren().size() ); 231 DependencyNode winner = root.getChildren().get( 0 ).getChildren().get( 0 ); 232 assertEquals( "test", winner.getDependency().getScope() ); 233 assertEquals( "compile", winner.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_SCOPE ) ); 234 assertEquals( false, winner.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_OPTIONALITY) ); 235 assertEquals( 1, root.getChildren().get( 1 ).getChildren().size() ); 236 DependencyNode loser = root.getChildren().get( 1 ).getChildren().get( 0 ); 237 assertEquals( "test", loser.getDependency().getScope() ); 238 assertEquals( 0, loser.getChildren().size() ); 239 assertSame( winner, loser.getData().get( ConflictResolver.NODE_DATA_WINNER ) ); 240 assertEquals( "compile", loser.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_SCOPE ) ); 241 assertEquals( false, loser.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_OPTIONALITY ) ); 242 } 243 244}