Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SCAN4NET-160 ComputeProjectBaseDir: Respect SONARQUBE_SCANNER_PARAMS #2263

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1257,7 +1257,7 @@ public void ComputeProjectBaseDir_BestCommonRoot_CaseSensitive_NoRoot_ReturnsNul
var runtimeInformationWrapper = Substitute.For<IRuntimeInformationWrapper>();
runtimeInformationWrapper.IsOS(OSPlatform.Windows).Returns(false);
var additionalFileService = Substitute.For<IAdditionalFilesService>();
var sut = new PropertiesFileGenerator(new() { SonarOutputDir = @"C:\fallback"}, logger, new RoslynV1SarifFixer(logger), runtimeInformationWrapper, additionalFileService);
var sut = new PropertiesFileGenerator(new() { SonarOutputDir = @"C:\fallback" }, logger, new RoslynV1SarifFixer(logger), runtimeInformationWrapper, additionalFileService);
var projectPaths = new[]
{
new DirectoryInfo(@"C:\Projects\Name\Lib"),
Expand Down Expand Up @@ -1313,6 +1313,37 @@ public void ComputeProjectBaseDir_WorkingDirectory_FilesOutsideWorkingDirectory_
logger.AssertSingleInfoMessageExists(ProjectBaseDirInfoMessage);
}

[DataTestMethod] // the priority is local > scannerEnv > server.
[DataRow("local", null, null, "local")]
[DataRow("local", "scannerEnv", null, "local")]
[DataRow("local", null, "server", "local")]
[DataRow("local", "scannerEnv", "server", "local")]
[DataRow(null, "scannerEnv", null, "scannerEnv")]
[DataRow(null, "scannerEnv", "server", "scannerEnv")]
[DataRow(null, null, "server", "server")]
public void ComputeProjectBaseDir_SetFromMultipleSources(string local, string scannerEnv, string server, string expected)
{
var projectBaseDirKey = "sonar.projectBaseDir";
using var scope = new EnvironmentVariableScope();
var config = new AnalysisConfig { LocalSettings = [], ServerSettings = [] };

if (local is not null)
{
config.LocalSettings.Add(new(projectBaseDirKey, local));
}
if (server is not null)
{
config.ServerSettings.Add(new(projectBaseDirKey, server));
}
if (scannerEnv is not null)
{
scope.SetVariable("SONARQUBE_SCANNER_PARAMS", $$"""{"{{projectBaseDirKey}}": "{{scannerEnv}}"}""");
}

new PropertiesFileGenerator(config, logger).ComputeProjectBaseDir([]).Name.Should().Be(expected);
logger.DebugMessages.Should().ContainSingle(x => x.StartsWith("Using user supplied project base directory:"));
}

[TestMethod]
public void GenerateFile_AdditionalFiles_EndToEnd()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
*/
package com.sonar.it.scanner.msbuild.sonarqube;

import com.eclipsesource.json.Json;
import com.sonar.it.scanner.msbuild.utils.AzureDevOpsUtils;
import com.sonar.it.scanner.msbuild.utils.EnvironmentVariable;
import com.sonar.it.scanner.msbuild.utils.ProxyAuthenticator;
Expand Down Expand Up @@ -293,6 +294,39 @@ void testExcludedAndTest_simulateAzureDevopsEnvironmentSettingMalformedJson_Logs
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.'.");
}

@Test
void testScannerRespectsSonarqubeScannerParams() throws Exception {
var projectKeyName = "TestProject";
var token = TestUtils.getNewToken(ORCHESTRATOR);
var projectDir = TestUtils.projectDir(basePath, "ProjectUnderTest");

var scannerParamsValue = Json.object()
.add("sonar.testKey", "testValue")
.add("sonar.projectBaseDir", projectDir.toString())
.toString();
var sonarQubeScannerParams = new EnvironmentVariable("SONARQUBE_SCANNER_PARAMS", scannerParamsValue);

var beginStep = TestUtils.newScanner(ORCHESTRATOR, projectDir, ScannerClassifier.NET_FRAMEWORK, token)
// do NOT set sonar.projectBaseDir here, only from SONARQUBE_SCANNER_PARAMS.
.addArgument("begin")
.setProjectKey(projectKeyName)
.setProjectName(projectKeyName)
.setProperty("sonar.verbose", "true")
.setProjectVersion("1.0");
beginStep.setEnvironmentVariable(sonarQubeScannerParams.getName(), sonarQubeScannerParams.getValue());
var beginResult = ORCHESTRATOR.executeBuild(beginStep);
assertThat(beginResult.isSuccess()).isTrue();

TestUtils.buildMSBuild(ORCHESTRATOR, projectDir);

var endResult = TestUtils.executeEndStepAndDumpResults(ORCHESTRATOR, projectDir, projectKeyName, token, List.of(sonarQubeScannerParams));
var endLogs = endResult.getLogs();
assertThat(endResult.isSuccess()).isTrue();
assertThat(endLogs).contains("Using user supplied project base directory: '" + projectDir);
assertThat(endLogs).contains("sonar.testKey=testValue");
assertThat(endLogs).contains("sonar.projectBaseDir=" + projectDir.toString().replace("\\", "\\\\"));
}

@Test
void testMultiLanguage() throws Exception {
// SonarQube 10.8 changed the way the numbers are reported.
Expand Down
4 changes: 1 addition & 3 deletions src/SonarScanner.MSBuild.Shim/PropertiesFileGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,9 +257,7 @@ public bool TryWriteProperties(PropertiesWriter writer, IList<ProjectInfo> proje
/// </summary>
public DirectoryInfo ComputeProjectBaseDir(IList<DirectoryInfo> projectPaths)
{
var projectBaseDir = analysisConfig.LocalSettings
?.Find(x => ConfigSetting.SettingKeyComparer.Equals(SonarProperties.ProjectBaseDir, x.Id))
?.Value;
var projectBaseDir = analysisConfig.GetSettingOrDefault(SonarProperties.ProjectBaseDir, includeServerSettings: true, defaultValue: null, logger);
if (!string.IsNullOrWhiteSpace(projectBaseDir))
{
var baseDirectory = new DirectoryInfo(projectBaseDir);
Expand Down