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.apache.maven.artifact;
20  
21  import javax.inject.Inject;
22  
23  import java.io.File;
24  import java.io.FileOutputStream;
25  import java.io.IOException;
26  import java.io.OutputStreamWriter;
27  import java.io.Writer;
28  import java.nio.charset.StandardCharsets;
29  import java.util.ArrayList;
30  import java.util.List;
31  
32  import org.apache.maven.artifact.factory.ArtifactFactory;
33  import org.apache.maven.artifact.repository.ArtifactRepository;
34  import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
35  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
36  import org.apache.maven.artifact.resolver.TestMavenWorkspaceReader;
37  import org.apache.maven.execution.DefaultMavenExecutionRequest;
38  import org.apache.maven.execution.DefaultMavenExecutionResult;
39  import org.apache.maven.execution.MavenSession;
40  import org.apache.maven.plugin.LegacySupport;
41  import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
42  import org.eclipse.aether.DefaultRepositorySystemSession;
43  import org.eclipse.aether.RepositorySystemSession;
44  import org.eclipse.aether.collection.DependencyGraphTransformer;
45  import org.eclipse.aether.collection.DependencyManager;
46  import org.eclipse.aether.collection.DependencySelector;
47  import org.eclipse.aether.collection.DependencyTraverser;
48  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
49  import org.eclipse.aether.repository.LocalRepository;
50  import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
51  import org.eclipse.aether.util.graph.selector.AndDependencySelector;
52  import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
53  import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
54  import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
55  import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
56  import org.eclipse.aether.util.graph.transformer.ConflictResolver;
57  import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
58  import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
59  import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
60  import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
61  import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
62  import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
63  import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
64  import org.junit.jupiter.api.BeforeEach;
65  
66  import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
67  import static org.junit.jupiter.api.Assertions.fail;
68  
69  /**
70   * @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
71   */
72  public abstract class AbstractArtifactComponentTest {
73  
74      @Inject
75      protected ArtifactFactory artifactFactory;
76  
77      @Inject
78      protected ArtifactRepositoryFactory artifactRepositoryFactory;
79  
80      @Inject
81      private LegacySupport legacySupport;
82  
83      @Inject
84      private ArtifactRepositoryLayout repoLayout;
85  
86      @BeforeEach
87      protected void setUp() throws Exception {
88  
89          RepositorySystemSession repoSession = initRepoSession();
90          MavenSession session = new MavenSession(
91                  null, repoSession, new DefaultMavenExecutionRequest(), new DefaultMavenExecutionResult());
92  
93          legacySupport.setSession(session);
94      }
95  
96      protected abstract String component();
97  
98      protected ArtifactRepository localRepository() throws Exception {
99          String path = "target/test-repositories/" + component() + "/local-repository";
100 
101         File f = new File(getBasedir(), path);
102 
103         return artifactRepositoryFactory.createArtifactRepository(
104                 "local", "file://" + f.getPath(), repoLayout, null, null);
105     }
106 
107     protected ArtifactRepository remoteRepository() throws Exception {
108         String path = "target/test-repositories/" + component() + "/remote-repository";
109 
110         File f = new File(getBasedir(), path);
111 
112         return artifactRepositoryFactory.createArtifactRepository(
113                 "test",
114                 "file://" + f.getPath(),
115                 repoLayout,
116                 new ArtifactRepositoryPolicy(),
117                 new ArtifactRepositoryPolicy());
118     }
119 
120     protected ArtifactRepository badRemoteRepository() throws Exception {
121 
122         return artifactRepositoryFactory.createArtifactRepository(
123                 "test", "http://foo.bar/repository", repoLayout, null, null);
124     }
125 
126     protected void assertLocalArtifactPresent(Artifact artifact) throws Exception {
127         ArtifactRepository localRepo = localRepository();
128 
129         String path = localRepo.pathOf(artifact);
130 
131         File file = new File(localRepo.getBasedir(), path);
132 
133         if (!file.exists()) {
134             fail("Local artifact " + file + " should be present.");
135         }
136     }
137 
138     // ----------------------------------------------------------------------
139     //
140     // ----------------------------------------------------------------------
141 
142     protected List<ArtifactRepository> remoteRepositories() throws Exception {
143         List<ArtifactRepository> remoteRepositories = new ArrayList<>();
144 
145         remoteRepositories.add(remoteRepository());
146 
147         return remoteRepositories;
148     }
149 
150     // ----------------------------------------------------------------------
151     // Test artifact generation for unit tests
152     // ----------------------------------------------------------------------
153 
154     protected Artifact createLocalArtifact(String artifactId, String version) throws Exception {
155         Artifact artifact = createArtifact(artifactId, version);
156 
157         createArtifact(artifact, localRepository());
158 
159         return artifact;
160     }
161 
162     protected Artifact createRemoteArtifact(String artifactId, String version) throws Exception {
163         Artifact artifact = createArtifact(artifactId, version);
164 
165         createArtifact(artifact, remoteRepository());
166 
167         return artifact;
168     }
169 
170     protected void createArtifact(Artifact artifact, ArtifactRepository repository) throws Exception {
171         String path = repository.pathOf(artifact);
172 
173         File artifactFile = new File(repository.getBasedir(), path);
174 
175         if (!artifactFile.getParentFile().exists()) {
176             artifactFile.getParentFile().mkdirs();
177         }
178         try (Writer writer = new OutputStreamWriter(new FileOutputStream(artifactFile), StandardCharsets.ISO_8859_1)) {
179             writer.write(artifact.getId());
180         }
181     }
182 
183     protected Artifact createArtifact(String artifactId, String version) throws Exception {
184         return createArtifact(artifactId, version, "jar");
185     }
186 
187     protected Artifact createArtifact(String artifactId, String version, String type) throws Exception {
188         return createArtifact("org.apache.maven", artifactId, version, type);
189     }
190 
191     protected Artifact createArtifact(String groupId, String artifactId, String version, String type) throws Exception {
192         Artifact a = artifactFactory.createBuildArtifact(groupId, artifactId, version, type);
193 
194         return a;
195     }
196 
197     protected void deleteLocalArtifact(Artifact artifact) throws Exception {
198         deleteArtifact(artifact, localRepository());
199     }
200 
201     protected void deleteArtifact(Artifact artifact, ArtifactRepository repository) throws Exception {
202         String path = repository.pathOf(artifact);
203 
204         File artifactFile = new File(repository.getBasedir(), path);
205 
206         if (artifactFile.exists()) {
207             if (!artifactFile.delete()) {
208                 throw new IOException("Failure while attempting to delete artifact " + artifactFile);
209             }
210         }
211     }
212 
213     protected RepositorySystemSession initRepoSession() throws Exception {
214         DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
215         session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));
216         DependencyTraverser depTraverser = new FatArtifactTraverser();
217         session.setDependencyTraverser(depTraverser);
218 
219         DependencyManager depManager = new ClassicDependencyManager();
220         session.setDependencyManager(depManager);
221 
222         DependencySelector depFilter = new AndDependencySelector(
223                 new ScopeDependencySelector("test", "provided"),
224                 new OptionalDependencySelector(),
225                 new ExclusionDependencySelector());
226         session.setDependencySelector(depFilter);
227 
228         DependencyGraphTransformer transformer = new ConflictResolver(
229                 new NearestVersionSelector(), new JavaScopeSelector(),
230                 new SimpleOptionalitySelector(), new JavaScopeDeriver());
231         transformer = new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner());
232         session.setDependencyGraphTransformer(transformer);
233 
234         LocalRepository localRepo = new LocalRepository(localRepository().getBasedir());
235         session.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory().newInstance(session, localRepo));
236         session.setWorkspaceReader(new TestMavenWorkspaceReader());
237 
238         return session;
239     }
240 }