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.cli.event;
20  
21  import java.io.File;
22  import java.util.List;
23  
24  import org.apache.maven.execution.ExecutionEvent;
25  import org.apache.maven.execution.MavenSession;
26  import org.apache.maven.jline.JLineMessageBuilderFactory;
27  import org.apache.maven.jline.MessageUtils;
28  import org.apache.maven.project.MavenProject;
29  import org.junit.jupiter.api.AfterAll;
30  import org.junit.jupiter.api.BeforeAll;
31  import org.junit.jupiter.api.BeforeEach;
32  import org.junit.jupiter.api.Test;
33  import org.mockito.InOrder;
34  import org.mockito.Mockito;
35  import org.slf4j.Logger;
36  
37  import static org.mockito.ArgumentMatchers.matches;
38  import static org.mockito.Mockito.inOrder;
39  import static org.mockito.Mockito.mock;
40  import static org.mockito.Mockito.never;
41  import static org.mockito.Mockito.when;
42  
43  @Deprecated
44  class ExecutionEventLoggerTest {
45  
46      private Logger logger;
47      private ExecutionEventLogger executionEventLogger;
48      private JLineMessageBuilderFactory messageBuilderFactory = new JLineMessageBuilderFactory();
49  
50      @BeforeAll
51      static void setUp() {
52          MessageUtils.setColorEnabled(false);
53      }
54  
55      @AfterAll
56      static void tearDown() {
57          MessageUtils.setColorEnabled(true);
58      }
59  
60      @BeforeEach
61      void beforeEach() {
62          logger = mock(Logger.class);
63          when(logger.isInfoEnabled()).thenReturn(true);
64          executionEventLogger = new ExecutionEventLogger(messageBuilderFactory, logger);
65      }
66  
67      @Test
68      void testProjectStarted() {
69          // prepare
70          File basedir = new File("").getAbsoluteFile();
71          ExecutionEvent event = mock(ExecutionEvent.class);
72          MavenProject project = mock(MavenProject.class);
73          when(project.getGroupId()).thenReturn("org.apache.maven");
74          when(project.getArtifactId()).thenReturn("maven-embedder");
75          when(project.getPackaging()).thenReturn("jar");
76          when(project.getName()).thenReturn("Apache Maven Embedder");
77          when(project.getVersion()).thenReturn("3.5.4-SNAPSHOT");
78          when(project.getFile()).thenReturn(new File(basedir, "maven-embedder/pom.xml"));
79          when(event.getProject()).thenReturn(project);
80  
81          MavenProject rootProject = mock(MavenProject.class);
82          when(rootProject.getBasedir()).thenReturn(basedir);
83          MavenSession session = mock(MavenSession.class);
84          when(session.getTopLevelProject()).thenReturn(rootProject);
85          when(session.getTopDirectory()).thenReturn(basedir.toPath());
86          when(event.getSession()).thenReturn(session);
87  
88          // execute
89          executionEventLogger.projectStarted(event);
90  
91          // verify
92          InOrder inOrder = inOrder(logger);
93          inOrder.verify(logger).info("");
94          inOrder.verify(logger).info("------------------< org.apache.maven:maven-embedder >-------------------");
95          inOrder.verify(logger).info("Building Apache Maven Embedder 3.5.4-SNAPSHOT");
96          inOrder.verify(logger).info(adaptDirSeparator("  from maven-embedder/pom.xml"));
97          inOrder.verify(logger).info("--------------------------------[ jar ]---------------------------------");
98      }
99  
100     @Test
101     void testProjectStartedOverflow() {
102         // prepare
103         File basedir = new File("").getAbsoluteFile();
104         ExecutionEvent event = mock(ExecutionEvent.class);
105         MavenProject project = mock(MavenProject.class);
106         when(project.getGroupId()).thenReturn("org.apache.maven.plugins.overflow");
107         when(project.getArtifactId()).thenReturn("maven-project-info-reports-plugin");
108         when(project.getPackaging()).thenReturn("maven-plugin");
109         when(project.getName()).thenReturn("Apache Maven Project Info Reports Plugin");
110         when(project.getVersion()).thenReturn("3.0.0-SNAPSHOT");
111         when(event.getProject()).thenReturn(project);
112         when(project.getFile()).thenReturn(new File(basedir, "pom.xml"));
113         when(project.getBasedir()).thenReturn(basedir);
114 
115         MavenSession session = mock(MavenSession.class);
116         when(session.getTopLevelProject()).thenReturn(project);
117         when(event.getSession()).thenReturn(session);
118         when(session.getTopDirectory()).thenReturn(basedir.toPath());
119 
120         // execute
121         executionEventLogger.projectStarted(event);
122 
123         // verify
124         InOrder inOrder = inOrder(logger);
125         inOrder.verify(logger).info("");
126         inOrder.verify(logger).info("--< org.apache.maven.plugins.overflow:maven-project-info-reports-plugin >--");
127         inOrder.verify(logger).info("Building Apache Maven Project Info Reports Plugin 3.0.0-SNAPSHOT");
128         inOrder.verify(logger).info(adaptDirSeparator("  from pom.xml"));
129         inOrder.verify(logger).info("----------------------------[ maven-plugin ]----------------------------");
130     }
131 
132     @Test
133     void testTerminalWidth() {
134         // prepare
135         Logger logger = mock(Logger.class);
136         when(logger.isInfoEnabled()).thenReturn(true);
137 
138         ExecutionEvent event = mock(ExecutionEvent.class);
139         MavenProject project = mock(MavenProject.class);
140         when(project.getGroupId()).thenReturn("org.apache.maven.plugins.overflow");
141         when(project.getArtifactId()).thenReturn("maven-project-info-reports-plugin");
142         when(project.getPackaging()).thenReturn("maven-plugin");
143         when(project.getName()).thenReturn("Apache Maven Project Info Reports Plugin");
144         when(project.getVersion()).thenReturn("3.0.0-SNAPSHOT");
145         when(event.getProject()).thenReturn(project);
146 
147         // default width
148         new ExecutionEventLogger(messageBuilderFactory, logger, -1).projectStarted(event);
149         Mockito.verify(logger).info("----------------------------[ maven-plugin ]----------------------------");
150 
151         // terminal width: 30
152         new ExecutionEventLogger(messageBuilderFactory, logger, 30).projectStarted(event);
153         Mockito.verify(logger).info("------------------[ maven-plugin ]------------------");
154 
155         // terminal width: 70
156         new ExecutionEventLogger(messageBuilderFactory, logger, 70).projectStarted(event);
157         Mockito.verify(logger).info("-----------------------[ maven-plugin ]-----------------------");
158 
159         // terminal width: 110
160         new ExecutionEventLogger(messageBuilderFactory, logger, 110).projectStarted(event);
161         Mockito.verify(logger)
162                 .info(
163                         "-------------------------------------------[ maven-plugin ]-------------------------------------------");
164 
165         // terminal width: 200
166         new ExecutionEventLogger(messageBuilderFactory, logger, 200).projectStarted(event);
167         Mockito.verify(logger)
168                 .info(
169                         "-----------------------------------------------------[ maven-plugin ]-----------------------------------------------------");
170     }
171 
172     @Test
173     void testProjectStartedNoPom() {
174         // prepare
175         File basedir = new File("").getAbsoluteFile();
176         ExecutionEvent event = mock(ExecutionEvent.class);
177         MavenProject project = mock(MavenProject.class);
178         when(project.getGroupId()).thenReturn("org.apache.maven");
179         when(project.getArtifactId()).thenReturn("standalone-pom");
180         when(project.getPackaging()).thenReturn("pom");
181         when(project.getName()).thenReturn("Maven Stub Project (No POM)");
182         when(project.getVersion()).thenReturn("1");
183         when(event.getProject()).thenReturn(project);
184         when(project.getFile()).thenReturn(null);
185         when(project.getBasedir()).thenReturn(basedir);
186 
187         // execute
188         executionEventLogger.projectStarted(event);
189 
190         // verify
191         InOrder inOrder = inOrder(logger);
192         inOrder.verify(logger).info("");
193         inOrder.verify(logger).info("------------------< org.apache.maven:standalone-pom >-------------------");
194         inOrder.verify(logger).info("Building Maven Stub Project (No POM) 1");
195         inOrder.verify(logger).info("--------------------------------[ pom ]---------------------------------");
196     }
197 
198     @Test
199     void testMultiModuleProjectProgress() {
200         // prepare
201         MavenProject project1 = generateMavenProject("Apache Maven Embedder 1");
202         MavenProject project2 = generateMavenProject("Apache Maven Embedder 2");
203         MavenProject project3 = generateMavenProject("Apache Maven Embedder 3");
204 
205         MavenSession session = mock(MavenSession.class);
206         when(session.getProjects()).thenReturn(List.of(project1, project2, project3));
207         when(session.getAllProjects()).thenReturn(List.of(project1, project2, project3));
208 
209         ExecutionEvent sessionStartedEvent = mock(ExecutionEvent.class);
210         when(sessionStartedEvent.getSession()).thenReturn(session);
211         ExecutionEvent projectStartedEvent1 = mock(ExecutionEvent.class);
212         when(projectStartedEvent1.getProject()).thenReturn(project1);
213         ExecutionEvent projectStartedEvent2 = mock(ExecutionEvent.class);
214         when(projectStartedEvent2.getProject()).thenReturn(project2);
215         ExecutionEvent projectStartedEvent3 = mock(ExecutionEvent.class);
216         when(projectStartedEvent3.getProject()).thenReturn(project3);
217 
218         // execute
219         executionEventLogger.sessionStarted(sessionStartedEvent);
220         executionEventLogger.projectStarted(projectStartedEvent1);
221         executionEventLogger.projectStarted(projectStartedEvent2);
222         executionEventLogger.projectStarted(projectStartedEvent3);
223 
224         // verify
225         InOrder inOrder = inOrder(logger);
226         inOrder.verify(logger).info(matches(".*Apache Maven Embedder 1.*\\[1\\/3\\]"));
227         inOrder.verify(logger).info(matches(".*Apache Maven Embedder 2.*\\[2\\/3\\]"));
228         inOrder.verify(logger).info(matches(".*Apache Maven Embedder 3.*\\[3\\/3\\]"));
229     }
230 
231     @Test
232     void testMultiModuleProjectResumeFromProgress() {
233         // prepare
234         MavenProject project1 = generateMavenProject("Apache Maven Embedder 1");
235         MavenProject project2 = generateMavenProject("Apache Maven Embedder 2");
236         MavenProject project3 = generateMavenProject("Apache Maven Embedder 3");
237 
238         MavenSession session = mock(MavenSession.class);
239         when(session.getProjects()).thenReturn(List.of(project2, project3));
240         when(session.getAllProjects()).thenReturn(List.of(project1, project2, project3));
241 
242         ExecutionEvent sessionStartedEvent = mock(ExecutionEvent.class);
243         when(sessionStartedEvent.getSession()).thenReturn(session);
244         ExecutionEvent projectStartedEvent2 = mock(ExecutionEvent.class);
245         when(projectStartedEvent2.getProject()).thenReturn(project2);
246         ExecutionEvent projectStartedEvent3 = mock(ExecutionEvent.class);
247         when(projectStartedEvent3.getProject()).thenReturn(project3);
248 
249         // execute
250         executionEventLogger.sessionStarted(sessionStartedEvent);
251         executionEventLogger.projectStarted(projectStartedEvent2);
252         executionEventLogger.projectStarted(projectStartedEvent3);
253 
254         // verify
255         InOrder inOrder = inOrder(logger);
256         inOrder.verify(logger, never()).info(matches(".*Apache Maven Embedder 1.*\\[1\\/3\\]"));
257         inOrder.verify(logger).info(matches(".*Apache Maven Embedder 2.*\\[2\\/3\\]"));
258         inOrder.verify(logger).info(matches(".*Apache Maven Embedder 3.*\\[3\\/3\\]"));
259     }
260 
261     private static MavenProject generateMavenProject(String projectName) {
262         MavenProject project = mock(MavenProject.class);
263         when(project.getPackaging()).thenReturn("jar");
264         when(project.getVersion()).thenReturn("3.5.4-SNAPSHOT");
265         when(project.getName()).thenReturn(projectName);
266         return project;
267     }
268 
269     private static String adaptDirSeparator(String path) {
270         return path.replace('/', File.separatorChar).replace('\\', File.separatorChar);
271     }
272 }