From fafd6a2b35d2b7947a7727b10560e1f4c0a90e81 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Thu, 5 Jan 2017 11:24:54 +0100 Subject: [PATCH] SONAR-8573 Use api/settings to load global settings --- .../ExecuteAnalysisPermissionTest.java | 2 +- .../main/java/org/sonar/xoo/XooPlugin.java | 6 + .../java/org/sonar/xoo/XooPluginTest.java | 4 +- .../core/config/CorePropertyDefinitions.java | 6 +- .../scanner/bootstrap/GlobalContainer.java | 3 + .../scanner/bootstrap/GlobalSettings.java | 10 +- .../settings/DefaultSettingsLoader.java | 109 ++++++++++++++++++ .../repository/settings/SettingsLoader.java | 26 +++++ .../repository/settings/package-info.java | 23 ++++ .../scanner/bootstrap/GlobalSettingsTest.java | 27 ++--- .../mediumtest/ScannerMediumTester.java | 13 ++- .../log/ExceptionHandlingMediumTest.java | 29 +++-- .../settings/DefaultSettingsLoaderTest.java | 63 ++++++++++ .../scanner/scan/ModuleSettingsTest.java | 4 +- .../scanner/scan/ProjectSettingsTest.java | 4 +- 15 files changed, 284 insertions(+), 45 deletions(-) create mode 100644 sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java create mode 100644 sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java create mode 100644 sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java create mode 100644 sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java diff --git a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java index c7438fb61dc..a36a8d5ca84 100644 --- a/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java +++ b/it/it-tests/src/test/java/it/authorisation/ExecuteAnalysisPermissionTest.java @@ -82,10 +82,10 @@ public class ExecuteAnalysisPermissionTest { "You're only authorized to execute a local (preview) SonarQube analysis without pushing the results to the SonarQube server. Please contact your SonarQube administrator."); } + removeProjectPermission("anyone", "sample", "user"); try { // Execute anonymous analysis executeAnonymousAnalysis(); - ; fail(); } catch (BuildFailureException e) { assertThat(e.getResult().getLogs()).contains( diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java index 9a84189608f..5dd494efb8e 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java @@ -20,6 +20,7 @@ package org.sonar.xoo; import org.sonar.api.Plugin; +import org.sonar.api.PropertyType; import org.sonar.api.SonarProduct; import org.sonar.api.config.PropertyDefinition; import org.sonar.api.resources.Qualifiers; @@ -81,6 +82,11 @@ public class XooPlugin implements Plugin { .subCategory("General") .onQualifiers(Qualifiers.PROJECT) .build(), + // Used by DuplicationsTest. If not declared it is not returned by api/settings + PropertyDefinition.builder("sonar.cpd.xoo.minimumTokens") + .onQualifiers(Qualifiers.PROJECT) + .type(PropertyType.INTEGER) + .build(), Xoo.class, Xoo2.class, XooRulesDefinition.class, diff --git a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java index 03d8f037c4b..1969b18c482 100644 --- a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java +++ b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java @@ -36,7 +36,7 @@ public class XooPluginTest { SonarRuntime runtime = SonarRuntimeImpl.forSonarLint(Version.parse("5.4")); Plugin.Context context = new Plugin.Context(runtime); new XooPlugin().define(context); - assertThat(context.getExtensions()).hasSize(41).doesNotContain(CpdTokenizerSensor.class); + assertThat(context.getExtensions()).hasSize(42).doesNotContain(CpdTokenizerSensor.class); } @Test @@ -44,6 +44,6 @@ public class XooPluginTest { SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.parse("5.5"), SonarQubeSide.SCANNER); Plugin.Context context = new Plugin.Context(runtime); new XooPlugin().define(context); - assertThat(context.getExtensions()).hasSize(44).contains(CpdTokenizerSensor.class); + assertThat(context.getExtensions()).hasSize(45).contains(CpdTokenizerSensor.class); } } diff --git a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java index f896ae44ddd..12bbe0a1185 100644 --- a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java +++ b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java @@ -112,14 +112,16 @@ public class CorePropertyDefinitions { .build(), PropertyDefinition.builder(CoreProperties.PREVIEW_INCLUDE_PLUGINS) .name("Plugins accepted for Preview mode") - .description("Comma-separated list of plugin keys. Those plugins will be used during preview analyses.") + .description("List of plugin keys. Those plugins will be used during preview analyses.") .category(CoreProperties.CATEGORY_GENERAL) + .multiValues(true) .defaultValue(CoreProperties.PREVIEW_INCLUDE_PLUGINS_DEFAULT_VALUE) .build(), PropertyDefinition.builder(CoreProperties.PREVIEW_EXCLUDE_PLUGINS) .name("Plugins excluded for Preview mode") - .description("Comma-separated list of plugin keys. Those plugins will not be used during preview analyses.") + .description("List of plugin keys. Those plugins will not be used during preview analyses.") .category(CoreProperties.CATEGORY_GENERAL) + .multiValues(true) .defaultValue(CoreProperties.PREVIEW_EXCLUDE_PLUGINS_DEFAULT_VALUE) .build(), PropertyDefinition.builder(CoreProperties.CORE_AUTHENTICATOR_REALM) diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java index 19e2e4702fa..66811cfc6d8 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java @@ -42,6 +42,8 @@ import org.sonar.scanner.platform.DefaultServer; import org.sonar.scanner.repository.DefaultGlobalRepositoriesLoader; import org.sonar.scanner.repository.GlobalRepositoriesLoader; import org.sonar.scanner.repository.GlobalRepositoriesProvider; +import org.sonar.scanner.repository.settings.DefaultSettingsLoader; +import org.sonar.scanner.repository.settings.SettingsLoader; import org.sonar.scanner.storage.StoragesManager; import org.sonar.scanner.task.TaskContainer; @@ -94,6 +96,7 @@ public class GlobalContainer extends ComponentContainer { new GlobalRepositoriesProvider(), UuidFactoryImpl.INSTANCE); addIfMissing(ScannerPluginInstaller.class, PluginInstaller.class); + addIfMissing(DefaultSettingsLoader.class, SettingsLoader.class); addIfMissing(DefaultGlobalRepositoriesLoader.class, GlobalRepositoriesLoader.class); } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java index ea7d38c7720..9a11958b714 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalSettings.java @@ -30,7 +30,7 @@ import org.sonar.api.config.Encryption; import org.sonar.api.config.PropertyDefinitions; import org.sonar.api.config.Settings; import org.sonar.api.utils.MessageException; -import org.sonar.scanner.protocol.input.GlobalRepositories; +import org.sonar.scanner.repository.settings.SettingsLoader; public class GlobalSettings extends Settings { @@ -47,23 +47,23 @@ public class GlobalSettings extends Settings { "sonar.jdbc.password", JDBC_SPECIFIC_MESSAGE); private final GlobalProperties bootstrapProps; - private final GlobalRepositories globalReferentials; + private final SettingsLoader settingsLoader; private final GlobalMode mode; private final Map properties = new HashMap<>(); public GlobalSettings(GlobalProperties bootstrapProps, PropertyDefinitions propertyDefinitions, - GlobalRepositories globalReferentials, GlobalMode mode) { + SettingsLoader settingsLoader, GlobalMode mode) { super(propertyDefinitions, new Encryption(bootstrapProps.property(CoreProperties.ENCRYPTION_SECRET_KEY_PATH))); this.mode = mode; this.bootstrapProps = bootstrapProps; - this.globalReferentials = globalReferentials; + this.settingsLoader = settingsLoader; init(); new DroppedPropertyChecker(this.getProperties(), DROPPED_PROPERTIES).checkDroppedProperties(); } private void init() { - addProperties(globalReferentials.globalSettings()); + addProperties(settingsLoader.load(null)); addProperties(bootstrapProps.properties()); if (hasKey(CoreProperties.PERMANENT_SERVER_ID)) { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java new file mode 100644 index 00000000000..5e72ecf04ce --- /dev/null +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultSettingsLoader.java @@ -0,0 +1,109 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact 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.repository.settings; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Joiner; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Nullable; +import org.apache.commons.io.IOUtils; +import org.sonar.api.utils.log.Logger; +import org.sonar.api.utils.log.Loggers; +import org.sonar.api.utils.log.Profiler; +import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonarqube.ws.Settings.FieldValues.Value; +import org.sonarqube.ws.Settings.Setting; +import org.sonarqube.ws.Settings.ValuesWsResponse; +import org.sonarqube.ws.client.GetRequest; + +public class DefaultSettingsLoader implements SettingsLoader { + + private ScannerWsClient wsClient; + private static final Logger LOG = Loggers.get(DefaultSettingsLoader.class); + + public DefaultSettingsLoader(ScannerWsClient wsClient) { + this.wsClient = wsClient; + } + + @Override + public Map load(@Nullable String componentKey) { + String url = "api/settings/values.protobuf"; + Profiler profiler = Profiler.create(LOG); + if (componentKey != null) { + url += "?component=" + componentKey; + profiler.startInfo("Load settings for component '" + componentKey + "'"); + } else { + profiler.startInfo("Load global settings"); + } + InputStream is = wsClient.call(new GetRequest(url)).contentStream(); + ValuesWsResponse values = null; + + try { + values = ValuesWsResponse.parseFrom(is); + profiler.stopInfo(); + return toMap(values.getSettingsList()); + } catch (IOException e) { + throw new IllegalStateException("Failed to load server settings", e); + } finally { + IOUtils.closeQuietly(is); + } + } + + @VisibleForTesting + static Map toMap(List settingsList) { + Map result = new LinkedHashMap<>(); + for (Setting s : settingsList) { + if (!s.getInherited()) { + switch (s.getValueOneOfCase()) { + case VALUE: + result.put(s.getKey(), s.getValue()); + break; + case VALUES: + result.put(s.getKey(), Joiner.on(',').join(s.getValues().getValuesList())); + break; + case FIELDVALUES: + convertPropertySetToProps(result, s); + break; + default: + throw new IllegalStateException("Unknow property value for " + s.getKey()); + } + } + } + return result; + } + + private static void convertPropertySetToProps(Map result, Setting s) { + List ids = new ArrayList<>(); + int id = 1; + for (Value v : s.getFieldValues().getFieldValuesList()) { + for (Map.Entry entry : v.getValue().entrySet()) { + result.put(s.getKey() + "." + id + "." + entry.getKey(), entry.getValue()); + } + ids.add(String.valueOf(id)); + id++; + } + result.put(s.getKey(), Joiner.on(',').join(ids)); + } +} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java new file mode 100644 index 00000000000..eeebeb6b52b --- /dev/null +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/SettingsLoader.java @@ -0,0 +1,26 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact 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.repository.settings; + +import java.util.Map; + +public interface SettingsLoader { + Map load(String componentKey); +} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java new file mode 100644 index 00000000000..f508b39ceac --- /dev/null +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/package-info.java @@ -0,0 +1,23 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact 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. + */ +@ParametersAreNonnullByDefault +package org.sonar.scanner.repository.settings; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java index b4613a837b3..a3b68bacf73 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/GlobalSettingsTest.java @@ -19,8 +19,8 @@ */ package org.sonar.scanner.bootstrap; +import com.google.common.collect.ImmutableMap; import java.util.Collections; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -28,13 +28,11 @@ import org.junit.rules.ExpectedException; import org.sonar.api.config.PropertyDefinitions; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; -import org.sonar.scanner.bootstrap.GlobalMode; -import org.sonar.scanner.bootstrap.GlobalProperties; -import org.sonar.scanner.bootstrap.GlobalSettings; -import org.sonar.scanner.protocol.input.GlobalRepositories; +import org.sonar.scanner.repository.settings.SettingsLoader; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class GlobalSettingsTest { @@ -44,39 +42,38 @@ public class GlobalSettingsTest { @Rule public LogTester logTester = new LogTester(); - GlobalRepositories globalRef; + SettingsLoader settingsLoader; GlobalProperties bootstrapProps; private GlobalMode mode; @Before public void prepare() { - globalRef = new GlobalRepositories(); + settingsLoader = mock(SettingsLoader.class); bootstrapProps = new GlobalProperties(Collections.emptyMap()); mode = mock(GlobalMode.class); } @Test public void should_load_global_settings() { - globalRef.globalSettings().put("sonar.cpd.cross", "true"); + when(settingsLoader.load(null)).thenReturn(ImmutableMap.of("sonar.cpd.cross", "true")); - GlobalSettings batchSettings = new GlobalSettings(bootstrapProps, new PropertyDefinitions(), globalRef, mode); + GlobalSettings batchSettings = new GlobalSettings(bootstrapProps, new PropertyDefinitions(), settingsLoader, mode); assertThat(batchSettings.getBoolean("sonar.cpd.cross")).isTrue(); } @Test public void should_log_warn_msg_for_each_jdbc_property_if_present() { - globalRef.globalSettings().put("sonar.jdbc.url", SOME_VALUE); - globalRef.globalSettings().put("sonar.jdbc.username", SOME_VALUE); - globalRef.globalSettings().put("sonar.jdbc.password", SOME_VALUE); + when(settingsLoader.load(null)).thenReturn(ImmutableMap.of("sonar.jdbc.url", SOME_VALUE, + "sonar.jdbc.username", SOME_VALUE, + "sonar.jdbc.password", SOME_VALUE)); - new GlobalSettings(bootstrapProps, new PropertyDefinitions(), globalRef, mode); + new GlobalSettings(bootstrapProps, new PropertyDefinitions(), settingsLoader, mode); assertThat(logTester.logs(LoggerLevel.WARN)).containsOnly( "Property 'sonar.jdbc.url' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.", "Property 'sonar.jdbc.username' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.", - "Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database." - ); + "Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database."); } } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java index c64259117c0..e6b475f7515 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java @@ -30,6 +30,7 @@ import java.io.Reader; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; @@ -62,6 +63,7 @@ import org.sonar.scanner.repository.ProjectRepositories; import org.sonar.scanner.repository.ProjectRepositoriesLoader; import org.sonar.scanner.repository.QualityProfileLoader; import org.sonar.scanner.repository.ServerIssuesLoader; +import org.sonar.scanner.repository.settings.SettingsLoader; import org.sonar.scanner.rule.ActiveRulesLoader; import org.sonar.scanner.rule.LoadedActiveRule; import org.sonar.scanner.rule.RulesLoader; @@ -283,7 +285,8 @@ public class ScannerMediumTester { builder.rulesLoader, builder.projectRefProvider, builder.activeRules, - new DefaultDebtModel()) + new DefaultDebtModel(), + new FakeSettingsLoader()) .setBootstrapProperties(builder.bootstrapProperties) .setLogOutput(builder.logOutput); @@ -474,6 +477,14 @@ public class ScannerMediumTester { } } + private static class FakeSettingsLoader implements SettingsLoader { + + @Override + public Map load(String componentKey) { + return Collections.emptyMap(); + } + } + private static class FakeServerLineHashesLoader implements ServerLineHashesLoader { private Map byKey = new HashMap<>(); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java index f552f33f421..918ac2c1dd6 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/log/ExceptionHandlingMediumTest.java @@ -20,30 +20,29 @@ package org.sonar.scanner.mediumtest.log; import java.util.Collections; - -import org.hamcrest.Matchers; +import java.util.Map; import org.hamcrest.Description; +import org.hamcrest.Matchers; import org.hamcrest.TypeSafeMatcher; import org.junit.BeforeClass; -import org.sonar.api.utils.MessageException; -import org.sonar.batch.bootstrapper.Batch; -import org.sonar.batch.bootstrapper.EnvironmentInformation; -import org.sonar.scanner.protocol.input.GlobalRepositories; -import org.sonar.scanner.repository.GlobalRepositoriesLoader; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.utils.MessageException; +import org.sonar.batch.bootstrapper.Batch; +import org.sonar.batch.bootstrapper.EnvironmentInformation; +import org.sonar.scanner.repository.settings.SettingsLoader; public class ExceptionHandlingMediumTest { @Rule public ExpectedException thrown = ExpectedException.none(); private Batch batch; - private static ErrorGlobalRepositoriesLoader loader; + private static ErrorSettingsLoader loader; @BeforeClass public static void beforeClass() { - loader = new ErrorGlobalRepositoriesLoader(); + loader = new ErrorSettingsLoader(); } public void setUp(boolean verbose) { @@ -64,7 +63,7 @@ public class ExceptionHandlingMediumTest { setUp(false); loader.withCause = false; thrown.expect(MessageException.class); - thrown.expectMessage("Error loading repository"); + thrown.expectMessage("Error loading settings"); thrown.expectCause(Matchers.nullValue(Throwable.class)); batch.start(); @@ -76,7 +75,7 @@ public class ExceptionHandlingMediumTest { loader.withCause = true; thrown.expect(MessageException.class); - thrown.expectMessage("Error loading repository"); + thrown.expectMessage("Error loading settings"); thrown.expectCause(new TypeSafeMatcher() { @Override public void describeTo(Description description) { @@ -99,16 +98,16 @@ public class ExceptionHandlingMediumTest { batch.start(); } - private static class ErrorGlobalRepositoriesLoader implements GlobalRepositoriesLoader { + private static class ErrorSettingsLoader implements SettingsLoader { boolean withCause = false; @Override - public GlobalRepositories load() { + public Map load(String componentKey) { if (withCause) { IllegalStateException cause = new IllegalStateException("Code 401"); - throw MessageException.of("Error loading repository", cause); + throw MessageException.of("Error loading settings", cause); } else { - throw MessageException.of("Error loading repository"); + throw MessageException.of("Error loading settings"); } } } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java new file mode 100644 index 00000000000..8f9be5cf33d --- /dev/null +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultSettingsLoaderTest.java @@ -0,0 +1,63 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact 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.repository.settings; + +import org.junit.Test; +import org.sonarqube.ws.Settings.FieldValues; +import org.sonarqube.ws.Settings.FieldValues.Value; +import org.sonarqube.ws.Settings.FieldValues.Value.Builder; +import org.sonarqube.ws.Settings.Setting; +import org.sonarqube.ws.Settings.Values; + +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +public class DefaultSettingsLoaderTest { + + @Test + public void should_load_global_multivalue_settings() { + assertThat(DefaultSettingsLoader.toMap(asList(Setting.newBuilder() + .setKey("sonar.preview.supportedPlugins") + .setValues(Values.newBuilder().addValues("java").addValues("php")).build()))) + .containsExactly(entry("sonar.preview.supportedPlugins", "java,php")); + } + + @Test + public void should_load_global_propertyset_settings() { + Builder valuesBuilder = Value.newBuilder(); + valuesBuilder.getMutableValue().put("filepattern", "**/*.xml"); + valuesBuilder.getMutableValue().put("rulepattern", "*:S12345"); + Value value1 = valuesBuilder.build(); + valuesBuilder.clear(); + valuesBuilder.getMutableValue().put("filepattern", "**/*.java"); + valuesBuilder.getMutableValue().put("rulepattern", "*:S456"); + Value value2 = valuesBuilder.build(); + + assertThat(DefaultSettingsLoader.toMap(asList(Setting.newBuilder() + .setKey("sonar.issue.exclusions.multicriteria") + .setFieldValues(FieldValues.newBuilder().addFieldValues(value1).addFieldValues(value2)).build()))) + .containsOnly(entry("sonar.issue.exclusions.multicriteria", "1,2"), + entry("sonar.issue.exclusions.multicriteria.1.filepattern", "**/*.xml"), + entry("sonar.issue.exclusions.multicriteria.1.rulepattern", "*:S12345"), + entry("sonar.issue.exclusions.multicriteria.2.filepattern", "**/*.java"), + entry("sonar.issue.exclusions.multicriteria.2.rulepattern", "*:S456")); + } +} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java index f779b0d80f4..034bf4304a7 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleSettingsTest.java @@ -36,10 +36,10 @@ import org.sonar.scanner.analysis.DefaultAnalysisMode; import org.sonar.scanner.bootstrap.GlobalMode; import org.sonar.scanner.bootstrap.GlobalProperties; import org.sonar.scanner.bootstrap.GlobalSettings; -import org.sonar.scanner.protocol.input.GlobalRepositories; import org.sonar.scanner.report.AnalysisContextReportPublisher; import org.sonar.scanner.repository.FileData; import org.sonar.scanner.repository.ProjectRepositories; +import org.sonar.scanner.repository.settings.SettingsLoader; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -157,6 +157,6 @@ public class ModuleSettingsTest { private GlobalSettings newGlobalSettings(Map props) { GlobalProperties globalProps = new GlobalProperties(props); return new GlobalSettings(globalProps, new PropertyDefinitions(), - new GlobalRepositories(), new GlobalMode(globalProps)); + mock(SettingsLoader.class), new GlobalMode(globalProps)); } } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java index 5b889fb1340..6ec64aab7ed 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectSettingsTest.java @@ -37,9 +37,9 @@ import org.sonar.scanner.analysis.DefaultAnalysisMode; import org.sonar.scanner.bootstrap.GlobalMode; import org.sonar.scanner.bootstrap.GlobalProperties; import org.sonar.scanner.bootstrap.GlobalSettings; -import org.sonar.scanner.protocol.input.GlobalRepositories; import org.sonar.scanner.repository.FileData; import org.sonar.scanner.repository.ProjectRepositories; +import org.sonar.scanner.repository.settings.SettingsLoader; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -68,7 +68,7 @@ public class ProjectSettingsTest { project = ProjectDefinition.create().setKey("struts"); globalMode = mock(GlobalMode.class); mode = mock(DefaultAnalysisMode.class); - bootstrapProps = new GlobalSettings(new GlobalProperties(Collections.emptyMap()), new PropertyDefinitions(), new GlobalRepositories(), globalMode); + bootstrapProps = new GlobalSettings(new GlobalProperties(Collections.emptyMap()), new PropertyDefinitions(), mock(SettingsLoader.class), globalMode); } @Test -- 2.39.5