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.graph;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.ArrayList;
24  import java.util.Collections;
25  import java.util.HashSet;
26  import java.util.List;
27  import java.util.Set;
28  
29  import org.apache.maven.MavenExecutionException;
30  import org.apache.maven.execution.MavenExecutionRequest;
31  import org.apache.maven.project.MavenProject;
32  import org.junit.jupiter.api.Test;
33  import org.junit.jupiter.api.io.TempDir;
34  import org.junit.jupiter.params.ParameterizedTest;
35  import org.junit.jupiter.params.provider.EmptySource;
36  import org.junit.jupiter.params.provider.ValueSource;
37  
38  import static org.hamcrest.MatcherAssert.assertThat;
39  import static org.hamcrest.Matchers.contains;
40  import static org.hamcrest.Matchers.containsString;
41  import static org.hamcrest.Matchers.is;
42  import static org.hamcrest.Matchers.notNullValue;
43  import static org.hamcrest.Matchers.nullValue;
44  import static org.junit.jupiter.api.Assertions.assertThrows;
45  import static org.mockito.Mockito.mock;
46  import static org.mockito.Mockito.when;
47  
48  class ProjectSelectorTest {
49      private final ProjectSelector sut = new ProjectSelector();
50      private final MavenExecutionRequest mavenExecutionRequest = mock(MavenExecutionRequest.class);
51  
52      @Test
53      void getBaseDirectoryFromRequestWhenDirectoryIsNullReturnNull() {
54          when(mavenExecutionRequest.getBaseDirectory()).thenReturn(null);
55  
56          final File baseDirectoryFromRequest = sut.getBaseDirectoryFromRequest(mavenExecutionRequest);
57  
58          assertThat(baseDirectoryFromRequest, nullValue());
59      }
60  
61      @Test
62      void getBaseDirectoryFromRequestWhenDirectoryIsValidReturnFile() {
63          when(mavenExecutionRequest.getBaseDirectory()).thenReturn("path/to/file");
64  
65          final File baseDirectoryFromRequest = sut.getBaseDirectoryFromRequest(mavenExecutionRequest);
66  
67          assertThat(baseDirectoryFromRequest, notNullValue());
68          assertThat(baseDirectoryFromRequest.getPath(), is(new File("path/to/file").getPath()));
69      }
70  
71      @ParameterizedTest
72      @ValueSource(strings = {":wrong-selector", "wrong-selector"})
73      @EmptySource
74      void isMatchingProjectNoMatchOnSelectorReturnsFalse(String selector) {
75          final boolean result = sut.isMatchingProject(createMavenProject("maven-core"), selector, null);
76          assertThat(result, is(false));
77      }
78  
79      @ParameterizedTest
80      @ValueSource(strings = {":maven-core", "org.apache.maven:maven-core"})
81      void isMatchingProjectMatchOnSelectorReturnsTrue(String selector) {
82          final boolean result = sut.isMatchingProject(createMavenProject("maven-core"), selector, null);
83          assertThat(result, is(true));
84      }
85  
86      @Test
87      void isMatchingProjectMatchOnFileReturnsTrue() throws IOException {
88          final File tempFile = File.createTempFile("maven-core-unit-test-pom", ".xml");
89          final String selector = tempFile.getName();
90          final MavenProject mavenProject = createMavenProject("maven-core");
91          mavenProject.setFile(tempFile);
92  
93          final boolean result = sut.isMatchingProject(mavenProject, selector, tempFile.getParentFile());
94  
95          tempFile.delete();
96          assertThat(result, is(true));
97      }
98  
99      @Test
100     void isMatchingProjectMatchOnDirectoryReturnsTrue(@TempDir File tempDir) {
101         String selector = "maven-core";
102         final File tempProjectDir = new File(tempDir, "maven-core");
103         tempProjectDir.mkdir();
104         final MavenProject mavenProject = createMavenProject("maven-core");
105         mavenProject.setFile(new File(tempProjectDir, "some-file.xml"));
106 
107         final boolean result = sut.isMatchingProject(mavenProject, selector, tempDir);
108 
109         tempProjectDir.delete();
110         assertThat(result, is(true));
111     }
112 
113     @Test
114     void getOptionalProjectsBySelectorsReturnsMatches() {
115         final HashSet<String> selectors = new HashSet<>();
116         selectors.add(":maven-core");
117         selectors.add(":optional");
118 
119         final MavenProject mavenProject = createMavenProject("maven-core");
120         final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
121 
122         final Set<MavenProject> optionalProjectsBySelectors =
123                 sut.getOptionalProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
124 
125         assertThat(optionalProjectsBySelectors.size(), is(1));
126         assertThat(optionalProjectsBySelectors, contains(mavenProject));
127     }
128 
129     @Test
130     void getRequiredProjectsBySelectorsThrowsMavenExecutionException() {
131         final HashSet<String> selectors = new HashSet<>();
132         selectors.add(":maven-core");
133         selectors.add(":required");
134 
135         final MavenProject mavenProject = createMavenProject("maven-core");
136         final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
137 
138         final MavenExecutionException exception = assertThrows(
139                 MavenExecutionException.class,
140                 () -> sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors));
141         assertThat(exception.getMessage(), containsString("Could not find"));
142         assertThat(exception.getMessage(), containsString(":required"));
143     }
144 
145     @Test
146     void getRequiredProjectsBySelectorsReturnsProject() throws MavenExecutionException {
147         final HashSet<String> selectors = new HashSet<>();
148         selectors.add(":maven-core");
149 
150         final MavenProject mavenProject = createMavenProject("maven-core");
151         final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
152 
153         final Set<MavenProject> requiredProjectsBySelectors =
154                 sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
155 
156         assertThat(requiredProjectsBySelectors.size(), is(1));
157         assertThat(requiredProjectsBySelectors, contains(mavenProject));
158     }
159 
160     @Test
161     void getRequiredProjectsBySelectorsReturnsProjectWithChildProjects() throws MavenExecutionException {
162         when(mavenExecutionRequest.isRecursive()).thenReturn(true);
163 
164         final HashSet<String> selectors = new HashSet<>();
165         selectors.add(":maven-core");
166 
167         final MavenProject mavenProject = createMavenProject("maven-core");
168         final MavenProject child = createMavenProject("maven-core-child");
169         mavenProject.setCollectedProjects(Collections.singletonList(child));
170         final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
171 
172         final Set<MavenProject> requiredProjectsBySelectors =
173                 sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
174 
175         assertThat(requiredProjectsBySelectors.size(), is(2));
176         assertThat(requiredProjectsBySelectors, contains(mavenProject, child));
177     }
178 
179     @Test
180     void getOptionalProjectsBySelectorsReturnsProjectWithChildProjects() {
181         when(mavenExecutionRequest.isRecursive()).thenReturn(true);
182 
183         final HashSet<String> selectors = new HashSet<>();
184         selectors.add(":maven-core");
185 
186         final MavenProject mavenProject = createMavenProject("maven-core");
187         final MavenProject child = createMavenProject("maven-core-child");
188         mavenProject.setCollectedProjects(Collections.singletonList(child));
189         final List<MavenProject> listOfProjects = Collections.singletonList(mavenProject);
190 
191         final Set<MavenProject> optionalProjectsBySelectors =
192                 sut.getOptionalProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
193 
194         assertThat(optionalProjectsBySelectors.size(), is(2));
195         assertThat(optionalProjectsBySelectors, contains(mavenProject, child));
196     }
197 
198     private MavenProject createMavenProject(String artifactId) {
199         MavenProject mavenProject = new MavenProject();
200         mavenProject.setGroupId("org.apache.maven");
201         mavenProject.setArtifactId(artifactId);
202         mavenProject.setVersion("1.0");
203         mavenProject.setFile(new File(artifactId, "some-dir"));
204         mavenProject.setCollectedProjects(new ArrayList<>());
205         return mavenProject;
206     }
207 }