View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.util.graph.traverser;
20  
21  import java.util.Collections;
22  
23  import org.eclipse.aether.RepositorySystemSession;
24  import org.eclipse.aether.artifact.DefaultArtifact;
25  import org.eclipse.aether.collection.DependencyCollectionContext;
26  import org.eclipse.aether.collection.DependencyTraverser;
27  import org.eclipse.aether.graph.Dependency;
28  import org.eclipse.aether.internal.test.util.TestFileUtils;
29  import org.eclipse.aether.internal.test.util.TestUtils;
30  import org.junit.After;
31  import org.junit.Before;
32  import org.junit.Test;
33  
34  import static java.util.Objects.requireNonNull;
35  import static org.junit.Assert.*;
36  
37  public class AndDependencyTraverserTest {
38  
39      static class DummyDependencyTraverser implements DependencyTraverser {
40  
41          private final boolean traverse;
42  
43          private final DependencyTraverser child;
44  
45          public DummyDependencyTraverser() {
46              this(true);
47          }
48  
49          public DummyDependencyTraverser(boolean traverse) {
50              this.traverse = traverse;
51              this.child = this;
52          }
53  
54          public DummyDependencyTraverser(boolean traverse, DependencyTraverser child) {
55              this.traverse = traverse;
56              this.child = child;
57          }
58  
59          public boolean traverseDependency(Dependency dependency) {
60              requireNonNull(dependency, "dependency cannot be null");
61              return traverse;
62          }
63  
64          public DependencyTraverser deriveChildTraverser(DependencyCollectionContext context) {
65              requireNonNull(context, "context cannot be null");
66              return child;
67          }
68      }
69  
70      private RepositorySystemSession session;
71      private DependencyCollectionContext context;
72  
73      @Before
74      public void setup() {
75          session = TestUtils.newSession();
76          context = TestUtils.newCollectionContext(session, null, Collections.emptyList());
77      }
78  
79      @After
80      public void teardown() throws Exception {
81          if (session.getLocalRepository() != null) {
82              TestFileUtils.deleteFile(session.getLocalRepository().getBasedir());
83          }
84          session = null;
85          context = null;
86      }
87  
88      @Test
89      public void testNewInstance() {
90          assertNull(AndDependencyTraverser.newInstance(null, null));
91          DependencyTraverser traverser = new DummyDependencyTraverser();
92          assertSame(traverser, AndDependencyTraverser.newInstance(traverser, null));
93          assertSame(traverser, AndDependencyTraverser.newInstance(null, traverser));
94          assertSame(traverser, AndDependencyTraverser.newInstance(traverser, traverser));
95          assertNotNull(AndDependencyTraverser.newInstance(traverser, new DummyDependencyTraverser()));
96      }
97  
98      @Test
99      public void testTraverseDependency() {
100         Dependency dependency = new Dependency(new DefaultArtifact("g:a:v:1"), "runtime");
101 
102         DependencyTraverser traverser = new AndDependencyTraverser();
103         assertTrue(traverser.traverseDependency(dependency));
104 
105         traverser =
106                 new AndDependencyTraverser(new DummyDependencyTraverser(false), new DummyDependencyTraverser(false));
107         assertFalse(traverser.traverseDependency(dependency));
108 
109         traverser = new AndDependencyTraverser(new DummyDependencyTraverser(true), new DummyDependencyTraverser(false));
110         assertFalse(traverser.traverseDependency(dependency));
111 
112         traverser = new AndDependencyTraverser(new DummyDependencyTraverser(true), new DummyDependencyTraverser(true));
113         assertTrue(traverser.traverseDependency(dependency));
114     }
115 
116     @Test
117     public void testDeriveChildTraverser_Unchanged() {
118         DependencyTraverser other1 = new DummyDependencyTraverser(true);
119         DependencyTraverser other2 = new DummyDependencyTraverser(false);
120         DependencyTraverser traverser = new AndDependencyTraverser(other1, other2);
121         assertSame(traverser, traverser.deriveChildTraverser(context));
122     }
123 
124     @Test
125     public void testDeriveChildTraverser_OneRemaining() {
126         DependencyTraverser other1 = new DummyDependencyTraverser(true);
127         DependencyTraverser other2 = new DummyDependencyTraverser(false, null);
128         DependencyTraverser traverser = new AndDependencyTraverser(other1, other2);
129         assertSame(other1, traverser.deriveChildTraverser(context));
130     }
131 
132     @Test
133     public void testDeriveChildTraverser_ZeroRemaining() {
134         DependencyTraverser other1 = new DummyDependencyTraverser(true, null);
135         DependencyTraverser other2 = new DummyDependencyTraverser(false, null);
136         DependencyTraverser traverser = new AndDependencyTraverser(other1, other2);
137         assertNull(traverser.deriveChildTraverser(context));
138     }
139 
140     @Test
141     public void testEquals() {
142         DependencyTraverser other1 = new DummyDependencyTraverser(true);
143         DependencyTraverser other2 = new DummyDependencyTraverser(false);
144         DependencyTraverser traverser1 = new AndDependencyTraverser(other1, other2);
145         DependencyTraverser traverser2 = new AndDependencyTraverser(other2, other1);
146         DependencyTraverser traverser3 = new AndDependencyTraverser(other1);
147         assertEquals(traverser1, traverser1);
148         assertEquals(traverser1, traverser2);
149         assertNotEquals(traverser1, traverser3);
150         assertNotEquals(traverser1, this);
151         assertNotEquals(traverser1, null);
152     }
153 
154     @Test
155     public void testHashCode() {
156         DependencyTraverser other1 = new DummyDependencyTraverser(true);
157         DependencyTraverser other2 = new DummyDependencyTraverser(false);
158         DependencyTraverser traverser1 = new AndDependencyTraverser(other1, other2);
159         DependencyTraverser traverser2 = new AndDependencyTraverser(other2, other1);
160         assertEquals(traverser1.hashCode(), traverser2.hashCode());
161     }
162 }