Skip to content

Commit 495d1c9

Browse files
MSONAR-202 Improve logging with information about Maven options, Java version and OS (#202)
1 parent b637acd commit 495d1c9

File tree

3 files changed

+108
-3
lines changed

3 files changed

+108
-3
lines changed

src/main/java/org/sonarsource/scanner/maven/bootstrap/ScannerBootstrapper.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
package org.sonarsource.scanner.maven.bootstrap;
2121

2222
import com.google.common.annotations.VisibleForTesting;
23-
2423
import java.io.IOException;
2524
import java.nio.file.Files;
2625
import java.nio.file.Path;
@@ -32,7 +31,6 @@
3231
import java.util.Properties;
3332
import java.util.Set;
3433
import java.util.stream.Collectors;
35-
3634
import org.apache.maven.artifact.versioning.ComparableVersion;
3735
import org.apache.maven.execution.MavenSession;
3836
import org.apache.maven.plugin.MojoExecutionException;
@@ -69,6 +67,7 @@ public ScannerBootstrapper(Log log, MavenSession session, EmbeddedScanner scanne
6967

7068
public void execute() throws MojoExecutionException {
7169
try {
70+
logEnvironmentInformation();
7271
scanner.start();
7372
serverVersion = scanner.serverVersion();
7473

@@ -184,4 +183,25 @@ boolean isVersionPriorTo(String version) {
184183
return new ComparableVersion(serverVersion).compareTo(new ComparableVersion(version)) < 0;
185184
}
186185

186+
private void logEnvironmentInformation() {
187+
String vmInformation = String.format(
188+
"Java %s %s (%s-bit)",
189+
SystemWrapper.getProperty("java.version"),
190+
SystemWrapper.getProperty("java.vm.vendor"),
191+
SystemWrapper.getProperty("sun.arch.data.model")
192+
);
193+
log.info(vmInformation);
194+
String operatingSystem = String.format(
195+
"%s %s (%s)",
196+
SystemWrapper.getProperty("os.name"),
197+
SystemWrapper.getProperty("os.version"),
198+
SystemWrapper.getProperty("os.arch")
199+
);
200+
log.info(operatingSystem);
201+
String mavenOptions = SystemWrapper.getenv("MAVEN_OPTS");
202+
if (mavenOptions != null) {
203+
log.info(String.format("MAVEN_OPTS=%s", mavenOptions));
204+
}
205+
}
206+
187207
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* SonarQube Scanner for Maven
3+
* Copyright (C) 2009-2024 SonarSource SA
4+
* mailto:info AT sonarsource DOT com
5+
*
6+
* This program is free software; you can redistribute it and/or
7+
* modify it under the terms of the GNU Lesser General Public
8+
* License as published by the Free Software Foundation; either
9+
* version 3 of the License, or (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
* Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with this program; if not, write to the Free Software Foundation,
18+
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
*/
20+
package org.sonarsource.scanner.maven.bootstrap;
21+
22+
/**
23+
* A wrapper around some java.lang.System methods that allows us to mock and work around the default access limitations
24+
* enforced in Java 16+.
25+
*/
26+
class SystemWrapper {
27+
private SystemWrapper() {
28+
/* Nothing done here */
29+
}
30+
static String getenv(String name) {
31+
return System.getenv(name);
32+
}
33+
34+
static String getProperty(String name) {
35+
return System.getProperty(name);
36+
}
37+
}

src/test/java/org/sonarsource/scanner/maven/bootstrap/ScannerBootstrapperTest.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
import org.apache.maven.plugin.MojoExecutionException;
3333
import org.apache.maven.plugin.logging.Log;
3434
import org.apache.maven.project.MavenProject;
35-
35+
import org.junit.jupiter.api.AfterEach;
3636
import org.junit.jupiter.api.BeforeEach;
37+
import org.junit.jupiter.api.Nested;
3738
import org.junit.jupiter.api.Test;
3839
import org.junit.jupiter.api.io.TempDir;
40+
import org.mockito.InOrder;
3941
import org.mockito.Mock;
4042
import org.mockito.MockedStatic;
4143
import org.mockito.Mockito;
@@ -48,7 +50,10 @@
4850
import static org.junit.Assert.assertThrows;
4951
import static org.mockito.ArgumentMatchers.any;
5052
import static org.mockito.ArgumentMatchers.anyString;
53+
import static org.mockito.ArgumentMatchers.contains;
54+
import static org.mockito.Mockito.inOrder;
5155
import static org.mockito.Mockito.mock;
56+
import static org.mockito.Mockito.mockStatic;
5257
import static org.mockito.Mockito.never;
5358
import static org.mockito.Mockito.times;
5459
import static org.mockito.Mockito.verify;
@@ -273,6 +278,49 @@ void test_not_logging_the_version_when_sonarcloud_is_used() throws MojoExecution
273278
verify(log, never()).info("Communicating with SonarQube Server 8.0");
274279
}
275280

281+
@Nested
282+
class EnvironmentInformation {
283+
MockedStatic<SystemWrapper> mockedSystem;
284+
285+
@BeforeEach
286+
void before() {
287+
when(scanner.serverVersion()).thenReturn("9.9");
288+
mockedSystem = mockStatic(SystemWrapper.class);
289+
}
290+
291+
@AfterEach
292+
void after() {
293+
mockedSystem.close();
294+
}
295+
296+
@Test
297+
void environment_information_is_logged_at_info_level() throws MojoExecutionException {
298+
mockedSystem.when(() -> SystemWrapper.getProperty("os.name")).thenReturn("Solaris");
299+
mockedSystem.when(() -> SystemWrapper.getProperty("os.version")).thenReturn("42.1");
300+
mockedSystem.when(() -> SystemWrapper.getProperty("os.arch")).thenReturn("x16");
301+
302+
mockedSystem.when(() -> SystemWrapper.getProperty("java.vm.vendor")).thenReturn("Artisanal Distribution");
303+
mockedSystem.when(() -> SystemWrapper.getProperty("java.version")).thenReturn("4.2.0");
304+
mockedSystem.when(() -> SystemWrapper.getProperty("sun.arch.data.model")).thenReturn("16");
305+
306+
mockedSystem.when(() -> SystemWrapper.getenv("MAVEN_OPTS")).thenReturn("-XX:NotAnActualOption=42");
307+
308+
scannerBootstrapper.execute();
309+
InOrder inOrderVerifier = inOrder(log);
310+
311+
inOrderVerifier.verify(log, times(1)).info("Java 4.2.0 Artisanal Distribution (16-bit)");
312+
inOrderVerifier.verify(log, times(1)).info("Solaris 42.1 (x16)");
313+
inOrderVerifier.verify(log, times(1)).info("MAVEN_OPTS=-XX:NotAnActualOption=42");
314+
}
315+
316+
@Test
317+
void maven_opts_is_not_logged_at_info_level_when_not_absent_from_environment_variables() throws MojoExecutionException {
318+
mockedSystem.when(() -> SystemWrapper.getenv("MAVEN_OPTS")).thenReturn(null);
319+
scannerBootstrapper.execute();
320+
verify(log, never()).info(contains("MAVEN_OPTS="));
321+
}
322+
}
323+
276324
private void verifyCommonCalls() {
277325
verify(scanner).start();
278326
verify(scanner).serverVersion();

0 commit comments

Comments
 (0)