Skip to content

Commit 5d4c523

Browse files
SCAN4NET-160 ComputeProjectBaseDir: Respect SONARQUBE_SCANNER_PARAMS (#2263)
1 parent 9a8f9ef commit 5d4c523

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

Tests/SonarScanner.MSBuild.Shim.Test/PropertiesFileGeneratorTests.cs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1257,7 +1257,7 @@ public void ComputeProjectBaseDir_BestCommonRoot_CaseSensitive_NoRoot_ReturnsNul
12571257
var runtimeInformationWrapper = Substitute.For<IRuntimeInformationWrapper>();
12581258
runtimeInformationWrapper.IsOS(OSPlatform.Windows).Returns(false);
12591259
var additionalFileService = Substitute.For<IAdditionalFilesService>();
1260-
var sut = new PropertiesFileGenerator(new() { SonarOutputDir = @"C:\fallback"}, logger, new RoslynV1SarifFixer(logger), runtimeInformationWrapper, additionalFileService);
1260+
var sut = new PropertiesFileGenerator(new() { SonarOutputDir = @"C:\fallback" }, logger, new RoslynV1SarifFixer(logger), runtimeInformationWrapper, additionalFileService);
12611261
var projectPaths = new[]
12621262
{
12631263
new DirectoryInfo(@"C:\Projects\Name\Lib"),
@@ -1313,6 +1313,37 @@ public void ComputeProjectBaseDir_WorkingDirectory_FilesOutsideWorkingDirectory_
13131313
logger.AssertSingleInfoMessageExists(ProjectBaseDirInfoMessage);
13141314
}
13151315

1316+
[DataTestMethod] // the priority is local > scannerEnv > server.
1317+
[DataRow("local", null, null, "local")]
1318+
[DataRow("local", "scannerEnv", null, "local")]
1319+
[DataRow("local", null, "server", "local")]
1320+
[DataRow("local", "scannerEnv", "server", "local")]
1321+
[DataRow(null, "scannerEnv", null, "scannerEnv")]
1322+
[DataRow(null, "scannerEnv", "server", "scannerEnv")]
1323+
[DataRow(null, null, "server", "server")]
1324+
public void ComputeProjectBaseDir_SetFromMultipleSources(string local, string scannerEnv, string server, string expected)
1325+
{
1326+
var projectBaseDirKey = "sonar.projectBaseDir";
1327+
using var scope = new EnvironmentVariableScope();
1328+
var config = new AnalysisConfig { LocalSettings = [], ServerSettings = [] };
1329+
1330+
if (local is not null)
1331+
{
1332+
config.LocalSettings.Add(new(projectBaseDirKey, local));
1333+
}
1334+
if (server is not null)
1335+
{
1336+
config.ServerSettings.Add(new(projectBaseDirKey, server));
1337+
}
1338+
if (scannerEnv is not null)
1339+
{
1340+
scope.SetVariable("SONARQUBE_SCANNER_PARAMS", $$"""{"{{projectBaseDirKey}}": "{{scannerEnv}}"}""");
1341+
}
1342+
1343+
new PropertiesFileGenerator(config, logger).ComputeProjectBaseDir([]).Name.Should().Be(expected);
1344+
logger.DebugMessages.Should().ContainSingle(x => x.StartsWith("Using user supplied project base directory:"));
1345+
}
1346+
13161347
[TestMethod]
13171348
public void GenerateFile_AdditionalFiles_EndToEnd()
13181349
{

its/src/test/java/com/sonar/it/scanner/msbuild/sonarqube/ScannerMSBuildTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
package com.sonar.it.scanner.msbuild.sonarqube;
2121

22+
import com.eclipsesource.json.Json;
2223
import com.sonar.it.scanner.msbuild.utils.AzureDevOpsUtils;
2324
import com.sonar.it.scanner.msbuild.utils.EnvironmentVariable;
2425
import com.sonar.it.scanner.msbuild.utils.ProxyAuthenticator;
@@ -293,6 +294,39 @@ void testExcludedAndTest_simulateAzureDevopsEnvironmentSettingMalformedJson_Logs
293294
assertThat(msBuildResult.getLogs()).contains("Failed to parse properties from the environment variable 'SONARQUBE_SCANNER_PARAMS' because 'Invalid character after parsing property name. Expected ':' but got: }. Path '', line 1, position 36.'.");
294295
}
295296

297+
@Test
298+
void testScannerRespectsSonarqubeScannerParams() throws Exception {
299+
var projectKeyName = "TestProject";
300+
var token = TestUtils.getNewToken(ORCHESTRATOR);
301+
var projectDir = TestUtils.projectDir(basePath, "ProjectUnderTest");
302+
303+
var scannerParamsValue = Json.object()
304+
.add("sonar.testKey", "testValue")
305+
.add("sonar.projectBaseDir", projectDir.toString())
306+
.toString();
307+
var sonarQubeScannerParams = new EnvironmentVariable("SONARQUBE_SCANNER_PARAMS", scannerParamsValue);
308+
309+
var beginStep = TestUtils.newScanner(ORCHESTRATOR, projectDir, ScannerClassifier.NET_FRAMEWORK, token)
310+
// do NOT set sonar.projectBaseDir here, only from SONARQUBE_SCANNER_PARAMS.
311+
.addArgument("begin")
312+
.setProjectKey(projectKeyName)
313+
.setProjectName(projectKeyName)
314+
.setProperty("sonar.verbose", "true")
315+
.setProjectVersion("1.0");
316+
beginStep.setEnvironmentVariable(sonarQubeScannerParams.getName(), sonarQubeScannerParams.getValue());
317+
var beginResult = ORCHESTRATOR.executeBuild(beginStep);
318+
assertThat(beginResult.isSuccess()).isTrue();
319+
320+
TestUtils.buildMSBuild(ORCHESTRATOR, projectDir);
321+
322+
var endResult = TestUtils.executeEndStepAndDumpResults(ORCHESTRATOR, projectDir, projectKeyName, token, List.of(sonarQubeScannerParams));
323+
var endLogs = endResult.getLogs();
324+
assertThat(endResult.isSuccess()).isTrue();
325+
assertThat(endLogs).contains("Using user supplied project base directory: '" + projectDir);
326+
assertThat(endLogs).contains("sonar.testKey=testValue");
327+
assertThat(endLogs).contains("sonar.projectBaseDir=" + projectDir.toString().replace("\\", "\\\\"));
328+
}
329+
296330
@Test
297331
void testMultiLanguage() throws Exception {
298332
// SonarQube 10.8 changed the way the numbers are reported.

src/SonarScanner.MSBuild.Shim/PropertiesFileGenerator.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,7 @@ public bool TryWriteProperties(PropertiesWriter writer, IList<ProjectInfo> proje
257257
/// </summary>
258258
public DirectoryInfo ComputeProjectBaseDir(IList<DirectoryInfo> projectPaths)
259259
{
260-
var projectBaseDir = analysisConfig.LocalSettings
261-
?.Find(x => ConfigSetting.SettingKeyComparer.Equals(SonarProperties.ProjectBaseDir, x.Id))
262-
?.Value;
260+
var projectBaseDir = analysisConfig.GetSettingOrDefault(SonarProperties.ProjectBaseDir, includeServerSettings: true, defaultValue: null, logger);
263261
if (!string.IsNullOrWhiteSpace(projectBaseDir))
264262
{
265263
var baseDirectory = new DirectoryInfo(projectBaseDir);

0 commit comments

Comments
 (0)