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.enforcer.rules;
20  
21  import java.util.ArrayList;
22  import java.util.Collections;
23  import java.util.List;
24  
25  import org.apache.maven.enforcer.rule.api.EnforcerLogger;
26  import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
27  import org.apache.maven.execution.MavenSession;
28  import org.apache.maven.execution.ProjectDependencyGraph;
29  import org.apache.maven.model.Model;
30  import org.apache.maven.model.Repository;
31  import org.apache.maven.model.RepositoryPolicy;
32  import org.apache.maven.project.MavenProject;
33  import org.apache.maven.settings.Settings;
34  import org.junit.jupiter.api.BeforeEach;
35  import org.junit.jupiter.api.Test;
36  
37  import static org.junit.jupiter.api.Assertions.assertThrows;
38  import static org.mockito.Mockito.mock;
39  import static org.mockito.Mockito.when;
40  
41  /**
42   * Test the "require no repositories" rule.
43   *
44   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
45   * @author <a href="mailto:khmarbaise@apache.org">Karl Heinz Marbaise</a>
46   */
47  class TestRequireNoRepositories {
48  
49      private RequireNoRepositories rule;
50  
51      private MavenSession session;
52  
53      @BeforeEach
54      void before() {
55          session = mock(MavenSession.class);
56  
57          rule = new RequireNoRepositories(session);
58          rule.setMessage("my message");
59          rule.setLog(mock(EnforcerLogger.class));
60      }
61  
62      private MavenProject createMavenProject() {
63          MavenProject mp = mock(MavenProject.class);
64          when(mp.getGroupId()).thenReturn("org.apache.maven.plugins.enforcer.test");
65          when(mp.getArtifactId()).thenReturn("no-repositories-child");
66          when(mp.getVersion()).thenReturn("1.0-SNAPSHOT");
67  
68          return mp;
69      }
70  
71      private Model createOriginalModel() {
72          Model m = mock(Model.class);
73          when(m.getGroupId()).thenReturn("org.apache.maven.plugins.enforcer.test");
74          when(m.getArtifactId()).thenReturn("no-repositories");
75          when(m.getVersion()).thenReturn("1.0-SNAPSHOT");
76          return m;
77      }
78  
79      private MavenProject createStandAloneProject() {
80          MavenProject mp = createMavenProject();
81          Model originalModel = createOriginalModel();
82          // This means the interpolated model is the same
83          // as the non interpolated.
84          when(mp.getModel()).thenReturn(originalModel);
85          when(mp.getOriginalModel()).thenReturn(originalModel);
86          return mp;
87      }
88  
89      private void setupSortedProjects(List<MavenProject> projectList) {
90          ProjectDependencyGraph pdg = mock(ProjectDependencyGraph.class);
91          when(session.getProjectDependencyGraph()).thenReturn(pdg);
92          when(pdg.getSortedProjects()).thenReturn(projectList);
93          when(session.getSettings()).thenReturn(mock(Settings.class));
94      }
95  
96      private Repository createRepository(String id, String url) {
97          Repository r = new Repository();
98          r.setId(id);
99          r.setUrl(url);
100         RepositoryPolicy snapshotPolicy = new RepositoryPolicy();
101         snapshotPolicy.setEnabled(false);
102         snapshotPolicy.setUpdatePolicy("daily");
103         r.setSnapshots(snapshotPolicy);
104 
105         RepositoryPolicy releasePolicy = new RepositoryPolicy();
106         releasePolicy.setEnabled(true);
107         releasePolicy.setUpdatePolicy("never");
108         r.setReleases(releasePolicy);
109 
110         return r;
111     }
112 
113     private Repository createSnapshotRepository(String id, String url) {
114         Repository r = new Repository();
115         r.setId(id);
116         r.setUrl(url);
117 
118         RepositoryPolicy snapshotPolicy = new RepositoryPolicy();
119         snapshotPolicy.setEnabled(true);
120         snapshotPolicy.setUpdatePolicy("daily");
121         r.setSnapshots(snapshotPolicy);
122 
123         RepositoryPolicy releasePolicy = new RepositoryPolicy();
124         releasePolicy.setEnabled(false);
125         r.setReleases(releasePolicy);
126 
127         return r;
128     }
129 
130     private void addRepository(MavenProject project, Repository r) {
131         Model originalModel = project.getOriginalModel();
132         List<Repository> repositories = new ArrayList<>();
133         repositories.add(r);
134         when(originalModel.getRepositories()).thenReturn(repositories);
135     }
136 
137     private void addEmptyRepository(MavenProject project) {
138         Model originalModel = project.getOriginalModel();
139         List<Repository> repositories = new ArrayList<>();
140         when(originalModel.getRepositories()).thenReturn(repositories);
141     }
142 
143     private void addPluginRepository(MavenProject project, Repository r) {
144         Model originalModel = project.getOriginalModel();
145         List<Repository> repositories = new ArrayList<>();
146         repositories.add(r);
147         when(originalModel.getPluginRepositories()).thenReturn(repositories);
148     }
149 
150     private void addEmptyPluginRepository(MavenProject project) {
151         Model originalModel = project.getOriginalModel();
152         List<Repository> repositories = new ArrayList<>();
153         when(originalModel.getPluginRepositories()).thenReturn(repositories);
154     }
155 
156     /**
157      * This model contains a single module maven project without any repository.
158      */
159     @Test
160     void testAllBannedNoRepositories() throws EnforcerRuleException {
161         MavenProject baseProject = createStandAloneProject();
162         setupSortedProjects(Collections.singletonList(baseProject));
163 
164         rule.execute();
165     }
166 
167     /**
168      * The model contains a single repository which is not allowed by the default rules.
169      */
170     @Test
171     void testAllBannedWithRepository() {
172         assertThrows(EnforcerRuleException.class, () -> {
173             MavenProject baseProject = createStandAloneProject();
174             addRepository(baseProject, createRepository("repo", "http://example.com/repo"));
175             setupSortedProjects(Collections.singletonList(baseProject));
176 
177             rule.execute();
178         });
179     }
180 
181     /**
182      * The model contains a single plugin repository which is not allowed by the default rules.
183      */
184     @Test
185     void testAllBannedWithPluginRepository() {
186         assertThrows(EnforcerRuleException.class, () -> {
187             MavenProject baseProject = createStandAloneProject();
188             addPluginRepository(baseProject, createRepository("repo", "http://example.com/repo"));
189             setupSortedProjects(Collections.singletonList(baseProject));
190 
191             rule.execute();
192         });
193     }
194 
195     /**
196      * The model contains a single repository which is allowed by setting allowedRepositories to the id.
197      */
198     @Test
199     void testAllBannedWithAllowedRepositories() throws EnforcerRuleException {
200         final String repositoryId = "repo";
201         rule.setAllowedRepositories(Collections.singletonList(repositoryId));
202 
203         MavenProject baseProject = createStandAloneProject();
204         addRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
205         setupSortedProjects(Collections.singletonList(baseProject));
206 
207         rule.execute();
208     }
209 
210     /**
211      * The model contains a single repository. Turned off ban repositories.
212      */
213     @Test
214     void testRepositoriesNotBannedWithSingleRepository() throws EnforcerRuleException {
215         final String repositoryId = "repo";
216 
217         rule.setBanRepositories(false);
218 
219         MavenProject baseProject = createStandAloneProject();
220         addRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
221         setupSortedProjects(Collections.singletonList(baseProject));
222 
223         rule.execute();
224     }
225 
226     /**
227      * The model contains no repository at all. Turned off ban repositories.
228      */
229     @Test
230     void testRepositoriesNotBannedWithOutAnyRepository() throws EnforcerRuleException {
231         rule.setBanRepositories(false);
232 
233         MavenProject baseProject = createStandAloneProject();
234         setupSortedProjects(Collections.singletonList(baseProject));
235 
236         rule.execute();
237     }
238 
239     /**
240      * This model contains a single plugin repository. The given plugin repository is added to the list of allowed
241      * plugin repositories.
242      */
243     @Test
244     void testAllBannedWithAllowedPluginRepositories() throws EnforcerRuleException {
245         final String repositoryId = "repo";
246         rule.setAllowedPluginRepositories(Collections.singletonList(repositoryId));
247 
248         MavenProject baseProject = createStandAloneProject();
249         addPluginRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
250         setupSortedProjects(Collections.singletonList(baseProject));
251 
252         rule.execute();
253     }
254 
255     /**
256      * The model contains a single plugin repository. Turned off ban plugin repositories.
257      */
258     @Test
259     void testPluginRepositoriesNotBannedWithSinglePluginRepository() throws EnforcerRuleException {
260         final String repositoryId = "repo";
261 
262         rule.setBanPluginRepositories(false);
263 
264         MavenProject baseProject = createStandAloneProject();
265         addPluginRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
266         setupSortedProjects(Collections.singletonList(baseProject));
267 
268         rule.execute();
269     }
270 
271     /**
272      * The model contains no repository at all. Turned off ban plugin repositories.
273      */
274     @Test
275     void testPluginRepositoriesNotBannedWithOutAnyRepository() throws EnforcerRuleException {
276         rule.setBanPluginRepositories(false);
277 
278         MavenProject baseProject = createStandAloneProject();
279         setupSortedProjects(Collections.singletonList(baseProject));
280 
281         rule.execute();
282     }
283 
284     @Test
285     void testAllBannedWithSnapshotRepository() {
286         assertThrows(EnforcerRuleException.class, () -> {
287             MavenProject baseProject = createStandAloneProject();
288             addRepository(baseProject, createSnapshotRepository("repo", "http://example.com/repo"));
289             setupSortedProjects(Collections.singletonList(baseProject));
290 
291             rule.execute();
292         });
293     }
294 
295     @Test
296     void testAllBannedWithSnapshotRepositoryAllowedRepositories() throws EnforcerRuleException {
297         final String repositoryId = "repo";
298         rule.setAllowedRepositories(Collections.singletonList(repositoryId));
299 
300         MavenProject baseProject = createStandAloneProject();
301         addRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo"));
302         setupSortedProjects(Collections.singletonList(baseProject));
303 
304         rule.execute();
305     }
306 
307     @Test
308     void testAllBannedWithSnapshotRepositoryAndSetAllowSnapshotRepositories() throws EnforcerRuleException {
309         final String repositoryId = "repo";
310         rule.setAllowSnapshotRepositories(true);
311 
312         MavenProject baseProject = createStandAloneProject();
313         addRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo"));
314         setupSortedProjects(Collections.singletonList(baseProject));
315 
316         rule.execute();
317     }
318 
319     @Test
320     void testAllBannedWithSnapshotPluginRepositoryAndSetAllowSnapshotPluginRepositories() throws EnforcerRuleException {
321         final String repositoryId = "repo";
322         rule.setAllowSnapshotPluginRepositories(true);
323 
324         MavenProject baseProject = createStandAloneProject();
325         addPluginRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo"));
326         setupSortedProjects(Collections.singletonList(baseProject));
327 
328         rule.execute();
329     }
330 
331     @Test
332     void testAllBannedWithEmptyRepository() throws EnforcerRuleException {
333         MavenProject baseProject = createStandAloneProject();
334         addEmptyRepository(baseProject);
335         setupSortedProjects(Collections.singletonList(baseProject));
336 
337         rule.execute();
338     }
339 
340     @Test
341     void testAllBannedWithEmptyPluginRepository() throws EnforcerRuleException {
342         MavenProject baseProject = createStandAloneProject();
343         addEmptyPluginRepository(baseProject);
344         setupSortedProjects(Collections.singletonList(baseProject));
345 
346         rule.execute();
347     }
348 }