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 MavenProject 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         return project;
136     }
137 
138     private MavenProject addEmptyRepository(MavenProject project) {
139         Model originalModel = project.getOriginalModel();
140         List<Repository> repositories = new ArrayList<>();
141         when(originalModel.getRepositories()).thenReturn(repositories);
142         return project;
143     }
144 
145     private MavenProject addPluginRepository(MavenProject project, Repository r) {
146         Model originalModel = project.getOriginalModel();
147         List<Repository> repositories = new ArrayList<>();
148         repositories.add(r);
149         when(originalModel.getPluginRepositories()).thenReturn(repositories);
150         return project;
151     }
152 
153     private MavenProject addEmptyPluginRepository(MavenProject project) {
154         Model originalModel = project.getOriginalModel();
155         List<Repository> repositories = new ArrayList<>();
156         when(originalModel.getPluginRepositories()).thenReturn(repositories);
157         return project;
158     }
159 
160     /**
161      * This model contains a single module maven project without any repository.
162      */
163     @Test
164     void testAllBannedNoRepositories() throws EnforcerRuleException {
165         MavenProject baseProject = createStandAloneProject();
166         setupSortedProjects(Collections.singletonList(baseProject));
167 
168         rule.execute();
169     }
170 
171     /**
172      * The model contains a single repository which is is not allowed by the default rules.
173      */
174     @Test
175     void testAllBannedWithRepository() {
176         assertThrows(EnforcerRuleException.class, () -> {
177             MavenProject baseProject = createStandAloneProject();
178             addRepository(baseProject, createRepository("repo", "http://example.com/repo"));
179             setupSortedProjects(Collections.singletonList(baseProject));
180 
181             rule.execute();
182         });
183     }
184 
185     /**
186      * The model contains a single plugin repository which is is not allowed by the default rules.
187      */
188     @Test
189     void testAllBannedWithPluginRepository() {
190         assertThrows(EnforcerRuleException.class, () -> {
191             MavenProject baseProject = createStandAloneProject();
192             addPluginRepository(baseProject, createRepository("repo", "http://example.com/repo"));
193             setupSortedProjects(Collections.singletonList(baseProject));
194 
195             rule.execute();
196         });
197     }
198 
199     /**
200      * The model contains a single repository which is allowed by setting allowedRepositories to the id.
201      */
202     @Test
203     void testAllBannedWithAllowedRepositories() throws EnforcerRuleException {
204         final String repositoryId = "repo";
205         rule.setAllowedRepositories(Collections.singletonList(repositoryId));
206 
207         MavenProject baseProject = createStandAloneProject();
208         addRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
209         setupSortedProjects(Collections.singletonList(baseProject));
210 
211         rule.execute();
212     }
213 
214     /**
215      * The model contains a single repository. Turned off ban repositories.
216      */
217     @Test
218     void testRepositoriesNotBannedWithSingleRepository() throws EnforcerRuleException {
219         final String repositoryId = "repo";
220 
221         rule.setBanRepositories(false);
222 
223         MavenProject baseProject = createStandAloneProject();
224         addRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
225         setupSortedProjects(Collections.singletonList(baseProject));
226 
227         rule.execute();
228     }
229 
230     /**
231      * The model contains no repository at all. Turned off ban repositories.
232      */
233     @Test
234     void testRepositoriesNotBannedWithOutAnyRepository() throws EnforcerRuleException {
235         rule.setBanRepositories(false);
236 
237         MavenProject baseProject = createStandAloneProject();
238         setupSortedProjects(Collections.singletonList(baseProject));
239 
240         rule.execute();
241     }
242 
243     /**
244      * This model contains a single plugin repository. The given plugin repository is added to the list of allowed
245      * plugin repositories.
246      */
247     @Test
248     void testAllBannedWithAllowedPluginRepositories() throws EnforcerRuleException {
249         final String repositoryId = "repo";
250         rule.setAllowedPluginRepositories(Collections.singletonList(repositoryId));
251 
252         MavenProject baseProject = createStandAloneProject();
253         addPluginRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
254         setupSortedProjects(Collections.singletonList(baseProject));
255 
256         rule.execute();
257     }
258 
259     /**
260      * The model contains a single plugin repository. Turned off ban plugin repositories.
261      */
262     @Test
263     void testPluginRepositoriesNotBannedWithSinglePluginRepository() throws EnforcerRuleException {
264         final String repositoryId = "repo";
265 
266         rule.setBanPluginRepositories(false);
267 
268         MavenProject baseProject = createStandAloneProject();
269         addPluginRepository(baseProject, createRepository(repositoryId, "http://example.com/repo"));
270         setupSortedProjects(Collections.singletonList(baseProject));
271 
272         rule.execute();
273     }
274 
275     /**
276      * The model contains no repository at all. Turned off ban plugin repositories.
277      */
278     @Test
279     void testPluginRepositoriesNotBannedWithOutAnyRepository() throws EnforcerRuleException {
280         rule.setBanPluginRepositories(false);
281 
282         MavenProject baseProject = createStandAloneProject();
283         setupSortedProjects(Collections.singletonList(baseProject));
284 
285         rule.execute();
286     }
287 
288     @Test
289     void testAllBannedWithSnapshotRepository() {
290         assertThrows(EnforcerRuleException.class, () -> {
291             MavenProject baseProject = createStandAloneProject();
292             addRepository(baseProject, createSnapshotRepository("repo", "http://example.com/repo"));
293             setupSortedProjects(Collections.singletonList(baseProject));
294 
295             rule.execute();
296         });
297     }
298 
299     @Test
300     void testAllBannedWithSnapshotRepositoryAllowedRepositories() throws EnforcerRuleException {
301         final String repositoryId = "repo";
302         rule.setAllowedRepositories(Collections.singletonList(repositoryId));
303 
304         MavenProject baseProject = createStandAloneProject();
305         addRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo"));
306         setupSortedProjects(Collections.singletonList(baseProject));
307 
308         rule.execute();
309     }
310 
311     @Test
312     void testAllBannedWithSnapshotRepositoryAndSetAllowSnapshotRepositories() throws EnforcerRuleException {
313         final String repositoryId = "repo";
314         rule.setAllowSnapshotRepositories(true);
315 
316         MavenProject baseProject = createStandAloneProject();
317         addRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo"));
318         setupSortedProjects(Collections.singletonList(baseProject));
319 
320         rule.execute();
321     }
322 
323     @Test
324     void testAllBannedWithSnapshotPluginRepositoryAndSetAllowSnapshotPluginRepositories() throws EnforcerRuleException {
325         final String repositoryId = "repo";
326         rule.setAllowSnapshotPluginRepositories(true);
327 
328         MavenProject baseProject = createStandAloneProject();
329         addPluginRepository(baseProject, createSnapshotRepository(repositoryId, "http://example.com/repo"));
330         setupSortedProjects(Collections.singletonList(baseProject));
331 
332         rule.execute();
333     }
334 
335     @Test
336     void testAllBannedWithEmptyRepository() throws EnforcerRuleException {
337         MavenProject baseProject = createStandAloneProject();
338         addEmptyRepository(baseProject);
339         setupSortedProjects(Collections.singletonList(baseProject));
340 
341         rule.execute();
342     }
343 
344     @Test
345     void testAllBannedWithEmptyPluginRepository() throws EnforcerRuleException {
346         MavenProject baseProject = createStandAloneProject();
347         addEmptyPluginRepository(baseProject);
348         setupSortedProjects(Collections.singletonList(baseProject));
349 
350         rule.execute();
351     }
352 }