001package org.eclipse.aether.util.graph.traverser;
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 java.util.Objects.requireNonNull;
023import static org.junit.Assert.*;
024
025import org.eclipse.aether.RepositorySystemSession;
026import org.eclipse.aether.artifact.DefaultArtifact;
027import org.eclipse.aether.collection.DependencyCollectionContext;
028import org.eclipse.aether.collection.DependencyTraverser;
029import org.eclipse.aether.graph.Dependency;
030import org.eclipse.aether.internal.test.util.TestFileUtils;
031import org.eclipse.aether.internal.test.util.TestUtils;
032import org.junit.After;
033import org.junit.Before;
034import org.junit.Test;
035
036import java.util.Collections;
037
038public class AndDependencyTraverserTest
039{
040
041    static class DummyDependencyTraverser
042        implements DependencyTraverser
043    {
044
045        private final boolean traverse;
046
047        private final DependencyTraverser child;
048
049        public DummyDependencyTraverser()
050        {
051            this( true );
052        }
053
054        public DummyDependencyTraverser( boolean traverse )
055        {
056            this.traverse = traverse;
057            this.child = this;
058        }
059
060        public DummyDependencyTraverser( boolean traverse, DependencyTraverser child )
061        {
062            this.traverse = traverse;
063            this.child = child;
064        }
065
066        public boolean traverseDependency( Dependency dependency )
067        {
068            requireNonNull( dependency, "dependency cannot be null" );
069            return traverse;
070        }
071
072        public DependencyTraverser deriveChildTraverser( DependencyCollectionContext context )
073        {
074            requireNonNull( context, "context cannot be null" );
075            return child;
076        }
077
078    }
079
080    private RepositorySystemSession session;
081    private DependencyCollectionContext context;
082
083    @Before
084    public void setup()
085    {
086        session = TestUtils.newSession();
087        context = TestUtils.newCollectionContext( session, null, Collections.emptyList() );
088    }
089
090    @After
091    public void teardown() throws Exception
092    {
093        if ( session.getLocalRepository() != null )
094        {
095            TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
096        }
097        session = null;
098        context = null;
099    }
100
101    @Test
102    public void testNewInstance()
103    {
104        assertNull( AndDependencyTraverser.newInstance( null, null ) );
105        DependencyTraverser traverser = new DummyDependencyTraverser();
106        assertSame( traverser, AndDependencyTraverser.newInstance( traverser, null ) );
107        assertSame( traverser, AndDependencyTraverser.newInstance( null, traverser ) );
108        assertSame( traverser, AndDependencyTraverser.newInstance( traverser, traverser ) );
109        assertNotNull( AndDependencyTraverser.newInstance( traverser, new DummyDependencyTraverser() ) );
110    }
111
112    @Test
113    public void testTraverseDependency()
114    {
115        Dependency dependency = new Dependency( new DefaultArtifact( "g:a:v:1" ), "runtime" );
116
117        DependencyTraverser traverser = new AndDependencyTraverser();
118        assertTrue( traverser.traverseDependency( dependency ) );
119
120        traverser =
121            new AndDependencyTraverser( new DummyDependencyTraverser( false ), new DummyDependencyTraverser( false ) );
122        assertFalse( traverser.traverseDependency( dependency ) );
123
124        traverser =
125            new AndDependencyTraverser( new DummyDependencyTraverser( true ), new DummyDependencyTraverser( false ) );
126        assertFalse( traverser.traverseDependency( dependency ) );
127
128        traverser =
129            new AndDependencyTraverser( new DummyDependencyTraverser( true ), new DummyDependencyTraverser( true ) );
130        assertTrue( traverser.traverseDependency( dependency ) );
131    }
132
133    @Test
134    public void testDeriveChildTraverser_Unchanged()
135    {
136        DependencyTraverser other1 = new DummyDependencyTraverser( true );
137        DependencyTraverser other2 = new DummyDependencyTraverser( false );
138        DependencyTraverser traverser = new AndDependencyTraverser( other1, other2 );
139        assertSame( traverser, traverser.deriveChildTraverser( context ) );
140    }
141
142    @Test
143    public void testDeriveChildTraverser_OneRemaining()
144    {
145        DependencyTraverser other1 = new DummyDependencyTraverser( true );
146        DependencyTraverser other2 = new DummyDependencyTraverser( false, null );
147        DependencyTraverser traverser = new AndDependencyTraverser( other1, other2 );
148        assertSame( other1, traverser.deriveChildTraverser( context ) );
149    }
150
151    @Test
152    public void testDeriveChildTraverser_ZeroRemaining()
153    {
154        DependencyTraverser other1 = new DummyDependencyTraverser( true, null );
155        DependencyTraverser other2 = new DummyDependencyTraverser( false, null );
156        DependencyTraverser traverser = new AndDependencyTraverser( other1, other2 );
157        assertNull( traverser.deriveChildTraverser( context ) );
158    }
159
160    @Test
161    public void testEquals()
162    {
163        DependencyTraverser other1 = new DummyDependencyTraverser( true );
164        DependencyTraverser other2 = new DummyDependencyTraverser( false );
165        DependencyTraverser traverser1 = new AndDependencyTraverser( other1, other2 );
166        DependencyTraverser traverser2 = new AndDependencyTraverser( other2, other1 );
167        DependencyTraverser traverser3 = new AndDependencyTraverser( other1 );
168        assertEquals( traverser1, traverser1 );
169        assertEquals( traverser1, traverser2 );
170        assertNotEquals( traverser1, traverser3 );
171        assertNotEquals( traverser1, this );
172        assertNotEquals( traverser1, null );
173    }
174
175    @Test
176    public void testHashCode()
177    {
178        DependencyTraverser other1 = new DummyDependencyTraverser( true );
179        DependencyTraverser other2 = new DummyDependencyTraverser( false );
180        DependencyTraverser traverser1 = new AndDependencyTraverser( other1, other2 );
181        DependencyTraverser traverser2 = new AndDependencyTraverser( other2, other1 );
182        assertEquals( traverser1.hashCode(), traverser2.hashCode() );
183    }
184
185}