From d46113d7fe9f9c3f9fd82c7e71da3b5b8342098d Mon Sep 17 00:00:00 2001 From: Benjamin Campomenosi Date: Thu, 29 Sep 2022 17:26:32 +0200 Subject: [PATCH] SONAR-17305 prevent set sonar.global.XX properties in scanner --- .../scan/ModuleConfigurationProvider.java | 10 ++ .../scan/ProjectConfigurationProvider.java | 12 +++ .../scan/ProjectServerSettingsProvider.java | 2 +- .../scan/SonarGlobalPropertiesFilter.java | 57 +++++++++++ .../scan/SpringModuleScanContainer.java | 3 +- .../scan/SpringProjectScanContainer.java | 3 +- .../scan/filesystem/ProjectFileIndexer.java | 7 +- .../scan/ModuleConfigurationProviderTest.java | 97 ++++++++++++++++++ .../ProjectConfigurationProviderTest.java | 99 +++++++++++++++++++ .../scan/SonarGlobalPropertiesFilterTest.java | 67 +++++++++++++ 10 files changed, 352 insertions(+), 5 deletions(-) create mode 100644 sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilter.java create mode 100644 sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleConfigurationProviderTest.java create mode 100644 sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectConfigurationProviderTest.java create mode 100644 sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilterTest.java diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java index 5cb88b0e7b3..72d212bab43 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java @@ -30,6 +30,14 @@ import org.sonar.scanner.bootstrap.GlobalServerSettings; import org.springframework.context.annotation.Bean; public class ModuleConfigurationProvider { + + private final SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter; + + public ModuleConfigurationProvider(SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter) { + this.sonarGlobalPropertiesFilter = sonarGlobalPropertiesFilter; + } + + @Bean("ModuleConfiguration") public ModuleConfiguration provide(GlobalConfiguration globalConfig, DefaultInputModule module, GlobalServerSettings globalServerSettings, ProjectServerSettings projectServerSettings) { @@ -38,6 +46,8 @@ public class ModuleConfigurationProvider { settings.putAll(projectServerSettings.properties()); addScannerSideProperties(settings, module.definition()); + settings = sonarGlobalPropertiesFilter.enforceOnlyServerSideSonarGlobalPropertiesAreUsed(settings, globalServerSettings.properties()); + return new ModuleConfiguration(globalConfig.getDefinitions(), globalConfig.getEncryption(), settings); } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java index d20ff578439..e53fe9b4490 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java @@ -26,7 +26,15 @@ import org.sonar.scanner.bootstrap.GlobalConfiguration; import org.sonar.scanner.bootstrap.GlobalServerSettings; import org.springframework.context.annotation.Bean; + public class ProjectConfigurationProvider { + + private final SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter; + + public ProjectConfigurationProvider(SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter) { + this.sonarGlobalPropertiesFilter = sonarGlobalPropertiesFilter; + } + @Bean("ProjectConfiguration") public ProjectConfiguration provide(DefaultInputProject project, GlobalConfiguration globalConfig, GlobalServerSettings globalServerSettings, ProjectServerSettings projectServerSettings, MutableProjectSettings projectSettings) { @@ -35,8 +43,12 @@ public class ProjectConfigurationProvider { settings.putAll(projectServerSettings.properties()); settings.putAll(project.properties()); + settings = sonarGlobalPropertiesFilter.enforceOnlyServerSideSonarGlobalPropertiesAreUsed(settings, globalServerSettings.properties()); + ProjectConfiguration projectConfig = new ProjectConfiguration(globalConfig.getDefinitions(), globalConfig.getEncryption(), settings); projectSettings.complete(projectConfig); return projectConfig; } + + } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectServerSettingsProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectServerSettingsProvider.java index 55516177aa9..3f2825b7288 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectServerSettingsProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectServerSettingsProvider.java @@ -30,7 +30,7 @@ import org.springframework.context.annotation.Bean; public class ProjectServerSettingsProvider { - private static final Logger LOG = Loggers.get(ProjectConfigurationProvider.class); + private static final Logger LOG = Loggers.get(ProjectServerSettingsProvider.class); private static final String MODULE_LEVEL_ARCHIVED_SETTINGS_WARNING = "Settings that were previously configured at " + "sub-project level are not used anymore. Transition the settings listed in ‘General Settings -> General -> " + diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilter.java new file mode 100644 index 00000000000..2dec13058b8 --- /dev/null +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilter.java @@ -0,0 +1,57 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.scanner.scan; + +import com.google.common.annotations.VisibleForTesting; +import java.util.Map; +import java.util.stream.Collectors; + +public class SonarGlobalPropertiesFilter { + + @VisibleForTesting + static final String SONAR_GLOBAL_PROPERTIES_PREFIX = "sonar.global."; + + public Map enforceOnlyServerSideSonarGlobalPropertiesAreUsed(Map settingProperties, Map globalServerSettingsProperties) { + Map settings = getNonSonarGlobalProperties(settingProperties); + settings.putAll(getSonarGlobalProperties(globalServerSettingsProperties)); + return settings; + } + + + private static Map getNonSonarGlobalProperties(Map settingProperties) { + return settingProperties.entrySet() + .stream() + .filter(entry -> !isSonarGlobalProperty(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + private static Map getSonarGlobalProperties(Map properties) { + return properties + .entrySet() + .stream() + .filter(entry -> isSonarGlobalProperty(entry.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + private static boolean isSonarGlobalProperty(String propertiesCode) { + return propertiesCode.startsWith(SONAR_GLOBAL_PROPERTIES_PREFIX); + } + +} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringModuleScanContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringModuleScanContainer.java index 4707354a706..0f80f0f3c74 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringModuleScanContainer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringModuleScanContainer.java @@ -55,7 +55,8 @@ public class SpringModuleScanContainer extends SpringComponentContainer { module.definition(), module, MutableModuleSettings.class, - new ModuleConfigurationProvider(), + SonarGlobalPropertiesFilter.class, + ModuleConfigurationProvider.class, ModuleSensorsExecutor.class, diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringProjectScanContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringProjectScanContainer.java index e3d2f50f631..38198a08e42 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringProjectScanContainer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/SpringProjectScanContainer.java @@ -228,7 +228,8 @@ public class SpringProjectScanContainer extends SpringComponentContainer { MutableProjectSettings.class, ScannerProperties.class, - new ProjectConfigurationProvider(), + SonarGlobalPropertiesFilter.class, + ProjectConfigurationProvider.class, ProjectCoverageAndDuplicationExclusions.class, diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java index e70f14ee468..e648fe77c79 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java @@ -50,6 +50,7 @@ import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.scan.ModuleConfiguration; import org.sonar.scanner.scan.ModuleConfigurationProvider; import org.sonar.scanner.scan.ProjectServerSettings; +import org.sonar.scanner.scan.SonarGlobalPropertiesFilter; import org.sonar.scanner.scm.ScmConfiguration; import org.sonar.scanner.util.ProgressReport; @@ -63,6 +64,7 @@ public class ProjectFileIndexer { private static final Logger LOG = Loggers.get(ProjectFileIndexer.class); private final ProjectExclusionFilters projectExclusionFilters; + private final SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter; private final ProjectCoverageAndDuplicationExclusions projectCoverageAndDuplicationExclusions; private final ScmConfiguration scmConfiguration; private final InputComponentStore componentStore; @@ -77,9 +79,10 @@ public class ProjectFileIndexer { private ProgressReport progressReport; public ProjectFileIndexer(InputComponentStore componentStore, ProjectExclusionFilters exclusionFilters, - InputModuleHierarchy inputModuleHierarchy, GlobalConfiguration globalConfig, GlobalServerSettings globalServerSettings, ProjectServerSettings projectServerSettings, + SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter, InputModuleHierarchy inputModuleHierarchy, GlobalConfiguration globalConfig, GlobalServerSettings globalServerSettings, ProjectServerSettings projectServerSettings, FileIndexer fileIndexer, ProjectCoverageAndDuplicationExclusions projectCoverageAndDuplicationExclusions, ScmConfiguration scmConfiguration) { this.componentStore = componentStore; + this.sonarGlobalPropertiesFilter = sonarGlobalPropertiesFilter; this.inputModuleHierarchy = inputModuleHierarchy; this.globalConfig = globalConfig; this.globalServerSettings = globalServerSettings; @@ -140,7 +143,7 @@ public class ProjectFileIndexer { private void index(DefaultInputModule module, ExclusionCounter exclusionCounter) { // Emulate creation of module level settings - ModuleConfiguration moduleConfig = new ModuleConfigurationProvider().provide(globalConfig, module, globalServerSettings, projectServerSettings); + ModuleConfiguration moduleConfig = new ModuleConfigurationProvider(sonarGlobalPropertiesFilter).provide(globalConfig, module, globalServerSettings, projectServerSettings); ModuleExclusionFilters moduleExclusionFilters = new ModuleExclusionFilters(moduleConfig); ModuleCoverageAndDuplicationExclusions moduleCoverageAndDuplicationExclusions = new ModuleCoverageAndDuplicationExclusions(moduleConfig); if (componentStore.allModules().size() > 1) { diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleConfigurationProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleConfigurationProviderTest.java new file mode 100644 index 00000000000..c9fcd51b7ab --- /dev/null +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleConfigurationProviderTest.java @@ -0,0 +1,97 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.scanner.scan; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.sonar.api.batch.fs.internal.DefaultInputModule; +import org.sonar.api.config.PropertyDefinitions; +import org.sonar.api.utils.System2; +import org.sonar.scanner.bootstrap.GlobalConfiguration; +import org.sonar.scanner.bootstrap.GlobalServerSettings; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class ModuleConfigurationProviderTest { + + private static final String GLOBAL_KEY_PROPERTIES_1 = "sonar.global.key1"; + private static final String NON_GLOBAL_KEY_PROPERTIES_1 = "sonar.key1"; + private static final String DEFAULT_KEY_PROPERTIES_1 = "default.key1"; + private static final String GLOBAL_VALUE_PROPERTIES_1 = "Value for " + GLOBAL_KEY_PROPERTIES_1; + private static final String NON_GLOBAL_VALUE_PROPERTIES_1 = "Value for " + NON_GLOBAL_KEY_PROPERTIES_1; + private static final String DEFAULT_VALUE_1 = "Value for " + DEFAULT_KEY_PROPERTIES_1; + + private static final Map GLOBAL_SERVER_PROPERTIES = Map.of(GLOBAL_KEY_PROPERTIES_1, GLOBAL_VALUE_PROPERTIES_1); + private static final Map PROJECT_SERVER_PROPERTIES = Map.of(NON_GLOBAL_KEY_PROPERTIES_1, NON_GLOBAL_VALUE_PROPERTIES_1); + private static final Map DEFAULT_PROJECT_PROPERTIES = Map.of(DEFAULT_KEY_PROPERTIES_1, DEFAULT_VALUE_1); + + private static final Map ALL_PROPERTIES_MAP = + Stream.of(GLOBAL_SERVER_PROPERTIES, PROJECT_SERVER_PROPERTIES) + .flatMap(map -> map.entrySet().stream()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + private static final Map PROPERTIES_AFTER_FILTERING = Map.of("aKey", "aValue"); + + @Mock + private GlobalServerSettings globalServerSettings; + @Mock + private ProjectServerSettings projectServerSettings; + @Mock + private GlobalConfiguration globalConfiguration; + @Mock + private DefaultInputModule defaultInputProject; + + + @Mock + private SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter; + + @InjectMocks + private ModuleConfigurationProvider provider; + + @Before + public void init() { + when(globalConfiguration.getDefinitions()).thenReturn(new PropertyDefinitions(System2.INSTANCE)); + } + + @Test + public void should_concatAllPropertiesForCallFilterAndApplyFilterChanges() { + when(globalServerSettings.properties()).thenReturn(GLOBAL_SERVER_PROPERTIES); + when(projectServerSettings.properties()).thenReturn(PROJECT_SERVER_PROPERTIES); + when(sonarGlobalPropertiesFilter.enforceOnlyServerSideSonarGlobalPropertiesAreUsed(ALL_PROPERTIES_MAP, GLOBAL_SERVER_PROPERTIES)) + .thenReturn(PROPERTIES_AFTER_FILTERING); + + ModuleConfiguration provide = provider.provide(globalConfiguration, defaultInputProject, globalServerSettings, projectServerSettings); + + verify(sonarGlobalPropertiesFilter).enforceOnlyServerSideSonarGlobalPropertiesAreUsed(ALL_PROPERTIES_MAP, GLOBAL_SERVER_PROPERTIES); + assertThat(provide.getOriginalProperties()).containsExactlyEntriesOf(PROPERTIES_AFTER_FILTERING); + } + + +} \ No newline at end of file diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectConfigurationProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectConfigurationProviderTest.java new file mode 100644 index 00000000000..b3cad5d5177 --- /dev/null +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectConfigurationProviderTest.java @@ -0,0 +1,99 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.scanner.scan; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.sonar.api.batch.fs.internal.DefaultInputProject; +import org.sonar.api.config.PropertyDefinitions; +import org.sonar.api.utils.System2; +import org.sonar.scanner.bootstrap.GlobalConfiguration; +import org.sonar.scanner.bootstrap.GlobalServerSettings; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class ProjectConfigurationProviderTest { + + private static final String GLOBAL_KEY_PROPERTIES_1 = "sonar.global.key1"; + private static final String NON_GLOBAL_KEY_PROPERTIES_1 = "sonar.key1"; + private static final String DEFAULT_KEY_PROPERTIES_1 = "default.key1"; + private static final String GLOBAL_VALUE_PROPERTIES_1 = "Value for " + GLOBAL_KEY_PROPERTIES_1; + private static final String NON_GLOBAL_VALUE_PROPERTIES_1 = "Value for " + NON_GLOBAL_KEY_PROPERTIES_1; + private static final String DEFAULT_VALUE_1 = "Value for " + DEFAULT_KEY_PROPERTIES_1; + + private static final Map GLOBAL_SERVER_PROPERTIES = Map.of(GLOBAL_KEY_PROPERTIES_1, GLOBAL_VALUE_PROPERTIES_1); + private static final Map PROJECT_SERVER_PROPERTIES = Map.of(NON_GLOBAL_KEY_PROPERTIES_1, NON_GLOBAL_VALUE_PROPERTIES_1); + private static final Map DEFAULT_PROJECT_PROPERTIES = Map.of(DEFAULT_KEY_PROPERTIES_1, DEFAULT_VALUE_1); + + private static final Map ALL_PROPERTIES_MAP = + Stream.of(GLOBAL_SERVER_PROPERTIES, PROJECT_SERVER_PROPERTIES, DEFAULT_PROJECT_PROPERTIES) + .flatMap(map -> map.entrySet().stream()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + private static final Map PROPERTIES_AFTER_FILTERING = Map.of("aKey", "aValue"); + + @Mock + private GlobalServerSettings globalServerSettings; + @Mock + private ProjectServerSettings projectServerSettings; + @Mock + private GlobalConfiguration globalConfiguration; + @Mock + private MutableProjectSettings mutableProjectSettings; + @Mock + private DefaultInputProject defaultInputProject; + @Mock + private SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter; + + @InjectMocks + private ProjectConfigurationProvider provider; + + + @Before + public void init() { + when(globalConfiguration.getDefinitions()).thenReturn(new PropertyDefinitions(System2.INSTANCE)); + } + + @Test + public void should_concatAllPropertiesForCallFilterAndApplyFilterChanges() { + when(globalServerSettings.properties()).thenReturn(GLOBAL_SERVER_PROPERTIES); + when(projectServerSettings.properties()).thenReturn(PROJECT_SERVER_PROPERTIES); + when(defaultInputProject.properties()).thenReturn(DEFAULT_PROJECT_PROPERTIES); + when(sonarGlobalPropertiesFilter.enforceOnlyServerSideSonarGlobalPropertiesAreUsed(ALL_PROPERTIES_MAP, GLOBAL_SERVER_PROPERTIES)) + .thenReturn(PROPERTIES_AFTER_FILTERING); + + ProjectConfiguration provide = provider.provide(defaultInputProject, globalConfiguration, globalServerSettings, projectServerSettings, mutableProjectSettings); + + verify(sonarGlobalPropertiesFilter).enforceOnlyServerSideSonarGlobalPropertiesAreUsed(ALL_PROPERTIES_MAP, GLOBAL_SERVER_PROPERTIES); + assertThat(provide.getOriginalProperties()).containsExactlyEntriesOf(PROPERTIES_AFTER_FILTERING); + + } + +} \ No newline at end of file diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilterTest.java new file mode 100644 index 00000000000..f1c02def868 --- /dev/null +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/SonarGlobalPropertiesFilterTest.java @@ -0,0 +1,67 @@ +/* + * SonarQube + * Copyright (C) 2009-2022 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.scanner.scan; + +import java.util.Map; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.scanner.scan.SonarGlobalPropertiesFilter.SONAR_GLOBAL_PROPERTIES_PREFIX; + +public class SonarGlobalPropertiesFilterTest { + + private static final String SONAR_GLOBAL_KEY_1 = SONAR_GLOBAL_PROPERTIES_PREFIX + "key1"; + private static final String SONAR_GLOBAL_VALUE_1 = "value for " + SONAR_GLOBAL_KEY_1; + private static final String SONAR_GLOBAL_KEY_2 = SONAR_GLOBAL_PROPERTIES_PREFIX + "key2"; + private static final String SONAR_GLOBAL_KEY_3 = SONAR_GLOBAL_PROPERTIES_PREFIX + "key3"; + private static final String SONAR_GLOBAL_VALUE_3 = "value for " + SONAR_GLOBAL_KEY_3; + + private static final String SONAR_NON_GLOBAL_KEY_4 = "sonar.key4"; + private static final String SONAR_NON_GLOBAL_VALUE_4 = "value for " + SONAR_NON_GLOBAL_KEY_4; + private static final String ANOTHER_KEY = "another key"; + private static final String ANOTHER_VALUE = "another value"; + + private final SonarGlobalPropertiesFilter sonarGlobalPropertiesFilter = new SonarGlobalPropertiesFilter(); + + @Test + public void should_filterSonarGlobalProperties() { + Map settingProperties = Map.of( + SONAR_GLOBAL_KEY_1, "shouldBeOverride", + SONAR_GLOBAL_KEY_2, "shouldBeRemove", + SONAR_NON_GLOBAL_KEY_4, SONAR_NON_GLOBAL_VALUE_4, + ANOTHER_KEY, ANOTHER_VALUE); + + Map globalServerSettingsProperties = Map.of( + SONAR_GLOBAL_KEY_1, SONAR_GLOBAL_VALUE_1, + SONAR_GLOBAL_KEY_3, SONAR_GLOBAL_VALUE_3, + SONAR_NON_GLOBAL_KEY_4, "shouldBeIgnored" + ); + + Map properties = sonarGlobalPropertiesFilter.enforceOnlyServerSideSonarGlobalPropertiesAreUsed(settingProperties, globalServerSettingsProperties); + + assertThat(properties).hasSize(4) + .containsEntry(SONAR_GLOBAL_KEY_1, SONAR_GLOBAL_VALUE_1) + .containsEntry(SONAR_GLOBAL_KEY_3, SONAR_GLOBAL_VALUE_3) + .containsEntry(SONAR_NON_GLOBAL_KEY_4, SONAR_NON_GLOBAL_VALUE_4) + .containsEntry(ANOTHER_KEY, ANOTHER_VALUE); + + + } +} \ No newline at end of file -- 2.39.5