From ca2bf42757a1e6471dab4c3fe8f4d98bfd2267d4 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Wed, 30 Apr 2014 17:25:32 +0200 Subject: [PATCH] Add ServerTester#clearDataStores() --- .../org/sonar/server/platform/Platform.java | 4 +- .../server/platform/ServerComponents.java | 128 +++++++++++++++--- .../org/sonar/server/rule2/RuleQuery.java | 38 +++--- .../sonar/server/rule2/ws/SearchAction.java | 47 +++++-- .../sonar/server/rule2/RuleMediumTest.java | 36 ++++- .../sonar/server/tester/DataStoreCleanup.java | 79 +++++++++++ .../org/sonar/server/tester/ServerTester.java | 20 ++- 7 files changed, 298 insertions(+), 54 deletions(-) create mode 100644 sonar-server/src/test/java/org/sonar/server/tester/DataStoreCleanup.java diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index 49bb4bdc734..40caa840d28 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -25,7 +25,7 @@ import org.sonar.api.platform.Server; import org.sonar.core.persistence.DatabaseVersion; import javax.annotation.CheckForNull; - +import java.util.Collection; import java.util.Properties; /** @@ -148,7 +148,7 @@ public class Platform { } } - public void addComponents(Object... components){ + public void addComponents(Collection components) { serverComponents.addComponents(components); } diff --git a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index c76338c9e57..70f511e7b12 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -55,7 +55,13 @@ import org.sonar.core.measure.MeasureFilterFactory; import org.sonar.core.metric.DefaultMetricFinder; import org.sonar.core.notification.DefaultNotificationManager; import org.sonar.core.permission.PermissionFacade; -import org.sonar.core.persistence.*; +import org.sonar.core.persistence.DaoUtils; +import org.sonar.core.persistence.DatabaseVersion; +import org.sonar.core.persistence.DefaultDatabase; +import org.sonar.core.persistence.MyBatis; +import org.sonar.core.persistence.PreviewDatabaseFactory; +import org.sonar.core.persistence.SemaphoreUpdater; +import org.sonar.core.persistence.SemaphoresImpl; import org.sonar.core.preview.PreviewCache; import org.sonar.core.profiling.Profiling; import org.sonar.core.purge.PurgeProfiler; @@ -84,10 +90,32 @@ import org.sonar.server.component.DefaultRubyComponentService; import org.sonar.server.db.EmbeddedDatabaseFactory; import org.sonar.server.db.migrations.DatabaseMigrations; import org.sonar.server.db.migrations.DatabaseMigrator; -import org.sonar.server.debt.*; +import org.sonar.server.debt.DebtCharacteristicsXMLImporter; +import org.sonar.server.debt.DebtModelBackup; +import org.sonar.server.debt.DebtModelLookup; +import org.sonar.server.debt.DebtModelOperations; +import org.sonar.server.debt.DebtModelPluginRepository; +import org.sonar.server.debt.DebtModelService; +import org.sonar.server.debt.DebtModelXMLExporter; +import org.sonar.server.debt.DebtRulesXMLImporter; import org.sonar.server.es.ESIndex; import org.sonar.server.es.ESNode; -import org.sonar.server.issue.*; +import org.sonar.server.issue.ActionService; +import org.sonar.server.issue.AssignAction; +import org.sonar.server.issue.CommentAction; +import org.sonar.server.issue.DefaultIssueFinder; +import org.sonar.server.issue.InternalRubyIssueService; +import org.sonar.server.issue.IssueBulkChangeService; +import org.sonar.server.issue.IssueChangelogFormatter; +import org.sonar.server.issue.IssueChangelogService; +import org.sonar.server.issue.IssueCommentService; +import org.sonar.server.issue.IssueService; +import org.sonar.server.issue.IssueStatsFinder; +import org.sonar.server.issue.PlanAction; +import org.sonar.server.issue.PublicRubyIssueService; +import org.sonar.server.issue.ServerIssueStorage; +import org.sonar.server.issue.SetSeverityAction; +import org.sonar.server.issue.TransitionAction; import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.issue.actionplan.ActionPlanWs; import org.sonar.server.issue.filter.IssueFilterService; @@ -102,18 +130,55 @@ import org.sonar.server.permission.InternalPermissionTemplateService; import org.sonar.server.permission.PermissionFinder; import org.sonar.server.platform.ws.RestartHandler; import org.sonar.server.platform.ws.SystemWs; -import org.sonar.server.plugins.*; +import org.sonar.server.plugins.BatchWs; +import org.sonar.server.plugins.InstalledPluginReferentialFactory; +import org.sonar.server.plugins.PluginDownloader; +import org.sonar.server.plugins.ServerExtensionInstaller; +import org.sonar.server.plugins.ServerPluginJarInstaller; +import org.sonar.server.plugins.ServerPluginJarsInstaller; +import org.sonar.server.plugins.ServerPluginRepository; +import org.sonar.server.plugins.UpdateCenterClient; +import org.sonar.server.plugins.UpdateCenterMatrixFactory; import org.sonar.server.qualitygate.QgateProjectFinder; import org.sonar.server.qualitygate.QualityGates; import org.sonar.server.qualitygate.RegisterQualityGates; import org.sonar.server.qualitygate.ws.QgateAppHandler; import org.sonar.server.qualitygate.ws.QualityGatesWs; -import org.sonar.server.qualityprofile.*; +import org.sonar.server.qualityprofile.DefaultProfilesCache; +import org.sonar.server.qualityprofile.ESActiveRule; +import org.sonar.server.qualityprofile.ProfilesManager; +import org.sonar.server.qualityprofile.QProfileActiveRuleOperations; +import org.sonar.server.qualityprofile.QProfileBackup; +import org.sonar.server.qualityprofile.QProfileLookup; +import org.sonar.server.qualityprofile.QProfileOperations; +import org.sonar.server.qualityprofile.QProfileProjectLookup; +import org.sonar.server.qualityprofile.QProfileProjectOperations; +import org.sonar.server.qualityprofile.QProfileRepositoryExporter; +import org.sonar.server.qualityprofile.QProfileRuleLookup; +import org.sonar.server.qualityprofile.QProfiles; import org.sonar.server.qualityprofile.ws.QProfileBackupWsHandler; import org.sonar.server.qualityprofile.ws.QProfilesWs; -import org.sonar.server.rule.*; -import org.sonar.server.rule.ws.*; +import org.sonar.server.rule.DeprecatedRulesDefinition; +import org.sonar.server.rule.ESRuleTags; +import org.sonar.server.rule.RegisterRules; +import org.sonar.server.rule.RubyRuleService; +import org.sonar.server.rule.RuleDefinitionsLoader; +import org.sonar.server.rule.RuleOperations; +import org.sonar.server.rule.RuleRegistry; +import org.sonar.server.rule.RuleRepositories; +import org.sonar.server.rule.RuleTagLookup; +import org.sonar.server.rule.RuleTagOperations; +import org.sonar.server.rule.RuleTags; +import org.sonar.server.rule.Rules; +import org.sonar.server.rule.ws.AddTagsWsHandler; +import org.sonar.server.rule.ws.RemoveTagsWsHandler; +import org.sonar.server.rule.ws.RuleSearchWsHandler; +import org.sonar.server.rule.ws.RuleShowWsHandler; +import org.sonar.server.rule.ws.RuleTagsWs; +import org.sonar.server.rule.ws.RulesWs; import org.sonar.server.rule2.RuleService; +import org.sonar.server.rule2.ws.RulesWebService; +import org.sonar.server.rule2.ws.SearchAction; import org.sonar.server.search.IndexUtils; import org.sonar.server.source.CodeColorizers; import org.sonar.server.source.DeprecatedSourceDecorator; @@ -123,15 +188,40 @@ import org.sonar.server.source.ws.ScmAction; import org.sonar.server.source.ws.ScmWriter; import org.sonar.server.source.ws.ShowAction; import org.sonar.server.source.ws.SourcesWs; -import org.sonar.server.startup.*; +import org.sonar.server.startup.CleanPreviewAnalysisCache; +import org.sonar.server.startup.CopyRequirementsFromCharacteristicsToRules; +import org.sonar.server.startup.GeneratePluginIndex; +import org.sonar.server.startup.GwtPublisher; +import org.sonar.server.startup.JdbcDriverDeployer; +import org.sonar.server.startup.LogServerId; +import org.sonar.server.startup.RegisterDashboards; +import org.sonar.server.startup.RegisterDebtModel; +import org.sonar.server.startup.RegisterMetrics; +import org.sonar.server.startup.RegisterNewMeasureFilters; +import org.sonar.server.startup.RegisterPermissionTemplates; +import org.sonar.server.startup.RegisterQualityProfiles; +import org.sonar.server.startup.RegisterServletFilters; +import org.sonar.server.startup.RenameDeprecatedPropertyKeys; +import org.sonar.server.startup.ServerMetadataPersister; import org.sonar.server.text.MacroInterpreter; import org.sonar.server.text.RubyTextService; import org.sonar.server.ui.JRubyI18n; import org.sonar.server.ui.JRubyProfiling; import org.sonar.server.ui.PageDecorations; import org.sonar.server.ui.Views; -import org.sonar.server.user.*; -import org.sonar.server.util.*; +import org.sonar.server.user.DefaultUserService; +import org.sonar.server.user.DoPrivileged; +import org.sonar.server.user.GroupMembershipFinder; +import org.sonar.server.user.GroupMembershipService; +import org.sonar.server.user.NewUserNotifier; +import org.sonar.server.user.SecurityRealmFactory; +import org.sonar.server.util.BooleanTypeValidation; +import org.sonar.server.util.FloatTypeValidation; +import org.sonar.server.util.IntegerTypeValidation; +import org.sonar.server.util.StringListTypeValidation; +import org.sonar.server.util.StringTypeValidation; +import org.sonar.server.util.TextTypeValidation; +import org.sonar.server.util.TypeValidations; import org.sonar.server.ws.ListingWs; import org.sonar.server.ws.WebServiceEngine; @@ -142,7 +232,7 @@ import java.util.List; class ServerComponents { private final Object[] rootComponents; - private Object[] level4AddedComponents; + private List level4AddedComponents = Lists.newArrayList(); ServerComponents(Object... rootComponents) { this.rootComponents = rootComponents; @@ -290,7 +380,12 @@ class ServerComponents { pico.addSingleton(AddTagsWsHandler.class); pico.addSingleton(RemoveTagsWsHandler.class); pico.addSingleton(RulesDefinitionXmlLoader.class); + + // experimental rules pico.addSingleton(RuleService.class); + pico.addSingleton(RulesWebService.class); + pico.addSingleton(SearchAction.class); + pico.addSingleton(org.sonar.server.rule2.ws.ShowAction.class); // rule tags pico.addSingleton(ESRuleTags.class); @@ -428,12 +523,11 @@ class ServerComponents { pico.addSingleton(StringTypeValidation.class); pico.addSingleton(StringListTypeValidation.class); - if (level4AddedComponents != null) { - for (Object components : level4AddedComponents) { - pico.addSingleton(components); - } + for (Object components : level4AddedComponents) { + pico.addSingleton(components); } + ServerExtensionInstaller extensionRegistrar = pico.getComponentByType(ServerExtensionInstaller.class); extensionRegistrar.installExtensions(pico); @@ -441,8 +535,8 @@ class ServerComponents { executeStartupTaks(pico); } - void addComponents(Object... components){ - this.level4AddedComponents = components; + void addComponents(Collection components) { + this.level4AddedComponents.addAll(components); } private void executeStartupTaks(ComponentContainer pico) { diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/RuleQuery.java b/sonar-server/src/main/java/org/sonar/server/rule2/RuleQuery.java index 3b6e261c80c..e60fe20540d 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/RuleQuery.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/RuleQuery.java @@ -25,7 +25,7 @@ import org.sonar.api.rule.Severity; import javax.annotation.CheckForNull; import javax.annotation.Nullable; -import java.util.List; +import java.util.Collection; public class RuleQuery { @@ -35,12 +35,12 @@ public class RuleQuery { private String key; private String queryText; - private List languages; - private List repositories; - private List severities; - private List statuses; - private List tags; - private List debtCharacteristics; + private Collection languages; + private Collection repositories; + private Collection severities; + private Collection statuses; + private Collection tags; + private Collection debtCharacteristics; private Boolean hasDebtCharacteristic; private SortField sortField; private boolean ascendingSort = true; @@ -72,31 +72,31 @@ public class RuleQuery { } @CheckForNull - public List getLanguages() { + public Collection getLanguages() { return languages; } - public RuleQuery setLanguages(@Nullable List languages) { + public RuleQuery setLanguages(@Nullable Collection languages) { this.languages = languages; return this; } @CheckForNull - public List getRepositories() { + public Collection getRepositories() { return repositories; } - public RuleQuery setRepositories(@Nullable List repositories) { + public RuleQuery setRepositories(@Nullable Collection repositories) { this.repositories = repositories; return this; } @CheckForNull - public List getSeverities() { + public Collection getSeverities() { return severities; } - public RuleQuery setSeverities(@Nullable List severities) { + public RuleQuery setSeverities(@Nullable Collection severities) { if (severities != null) { for (String severity : severities) { Preconditions.checkArgument(Severity.ALL.contains(severity), "Unknown severity: " + severity); @@ -107,31 +107,31 @@ public class RuleQuery { } @CheckForNull - public List getStatuses() { + public Collection getStatuses() { return statuses; } - public RuleQuery setStatuses(@Nullable List statuses) { + public RuleQuery setStatuses(@Nullable Collection statuses) { this.statuses = statuses; return this; } @CheckForNull - public List getTags() { + public Collection getTags() { return tags; } - public RuleQuery setTags(@Nullable List tags) { + public RuleQuery setTags(@Nullable Collection tags) { this.tags = tags; return this; } @CheckForNull - public List getDebtCharacteristics() { + public Collection getDebtCharacteristics() { return debtCharacteristics; } - public RuleQuery setDebtCharacteristics(@Nullable List debtCharacteristics) { + public RuleQuery setDebtCharacteristics(@Nullable Collection debtCharacteristics) { this.debtCharacteristics = debtCharacteristics; return this; } diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java b/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java index cecb47d4631..25fa57c060a 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java @@ -19,6 +19,8 @@ */ package org.sonar.server.rule2.ws; +import com.google.common.base.Function; +import com.google.common.collect.Collections2; import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.api.server.ws.Request; @@ -34,6 +36,10 @@ import org.sonar.server.search.Hit; import org.sonar.server.search.QueryOptions; import org.sonar.server.search.Results; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.List; import java.util.Map; /** @@ -41,6 +47,14 @@ import java.util.Map; */ public class SearchAction implements RequestHandler { + private static final String PARAM_TEXT_QUERY = "q"; + private static final String PARAM_REPOSITORIES = "repositories"; + private static final String PARAM_SEVERITIES = "severities"; + private static final String PARAM_STATUSES = "statuses"; + private static final String PARAM_LANGUAGES = "languages"; + private static final String PARAM_TAGS = "tags"; + + private final RuleService service; public SearchAction(RuleService service) { @@ -55,30 +69,30 @@ public class SearchAction implements RequestHandler { .setHandler(this); action - .createParam("q") + .createParam(PARAM_TEXT_QUERY) .setDescription("UTF-8 search query") .setExampleValue("null pointer"); action - .createParam("repositories") + .createParam(PARAM_REPOSITORIES) .setDescription("Comma-separated list of repositories") .setExampleValue("checkstyle,findbugs"); action - .createParam("severities") + .createParam(PARAM_SEVERITIES) .setDescription("Comma-separated list of default severities. Not the same than severity of rules in Quality profiles.") .setPossibleValues(Severity.ALL) .setExampleValue("CRITICAL,BLOCKER"); action - .createParam("statuses") + .createParam(PARAM_STATUSES) .setDescription("Comma-separated list of status codes") .setPossibleValues(RuleStatus.values()) - .setExampleValue("BETA,DEPRECATED"); + .setExampleValue(RuleStatus.READY.toString()); action .createParam("tags") - .setDescription("Comma-separated list of tags") + .setDescription("Comma-separated list of tags. Returned rules match all the tags (AND operator)") .setExampleValue("security,java8"); action @@ -101,9 +115,11 @@ public class SearchAction implements RequestHandler { @Override public void handle(Request request, Response response) { RuleQuery query = service.newRuleQuery(); - query.setQueryText(request.param("q")); - query.setSeverities(request.paramAsStrings("severities")); - query.setRepositories(request.paramAsStrings("repositories")); + query.setQueryText(request.param(PARAM_TEXT_QUERY)); + query.setSeverities(request.paramAsStrings(PARAM_SEVERITIES)); + query.setRepositories(request.paramAsStrings(PARAM_REPOSITORIES)); + query.setStatuses(toStatuses(request.paramAsStrings(PARAM_STATUSES))); + query.setLanguages(request.paramAsStrings(PARAM_LANGUAGES)); Results results = service.search(query, new QueryOptions()); JsonWriter json = response.newJsonWriter().beginObject().name("hits").beginArray(); @@ -118,4 +134,17 @@ public class SearchAction implements RequestHandler { json.endArray(); json.endObject().close(); } + + @CheckForNull + private Collection toStatuses(@Nullable List statuses) { + if (statuses == null) { + return null; + } + return Collections2.transform(statuses, new Function() { + @Override + public RuleStatus apply(@Nullable String input) { + return input == null ? null : RuleStatus.valueOf(input); + } + }); + } } diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java index f9c7f499ea2..ddc00ee07ff 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java @@ -19,7 +19,10 @@ */ package org.sonar.server.rule2; -import org.junit.Rule; +import com.google.common.collect.Iterables; +import org.junit.After; +import org.junit.ClassRule; +import org.junit.Ignore; import org.junit.Test; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; @@ -28,17 +31,27 @@ import org.sonar.api.utils.DateUtils; import org.sonar.check.Cardinality; import org.sonar.core.rule.RuleDto; import org.sonar.server.search.Hit; +import org.sonar.server.search.QueryOptions; +import org.sonar.server.search.Results; import org.sonar.server.tester.ServerTester; +import java.util.Arrays; + import static org.fest.assertions.Assertions.assertThat; public class RuleMediumTest { - @Rule - public ServerTester tester = new ServerTester(); + @ClassRule + public static ServerTester tester = new ServerTester(); + //.setProperty("sonar.es.http.port", "8888"); + + @After + public void clear_data_store() { + tester.clearDataStores(); + } @Test - public void persist_and_index_new_rule() { + public void insert_in_db_and_index_in_es() { // insert db RuleKey ruleKey = RuleKey.of("javascript", "S001"); RuleDao dao = tester.get(RuleDao.class); @@ -63,6 +76,21 @@ public class RuleMediumTest { assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.STATUS.key())).isEqualTo(RuleStatus.READY.toString()); } + @Test + @Ignore + public void search_rules_by_repositories() throws InterruptedException { + RuleDao dao = tester.get(RuleDao.class); + dao.insert(newRuleDto(RuleKey.of("javascript", "S001"))); + dao.insert(newRuleDto(RuleKey.of("java", "S002"))); + + RuleService service = tester.get(RuleService.class); + RuleQuery query = service.newRuleQuery().setRepositories(Arrays.asList("findbugs", "java")); + Results results = service.search(query, new QueryOptions()); + assertThat(results.getTotal()).isEqualTo(1); + assertThat(results.getHits()).hasSize(1); + assertThat(Iterables.getFirst(results.getHits(), null).getFieldAsString("key")).isEqualTo("S002"); + } + private RuleDto newRuleDto(RuleKey ruleKey) { return new RuleDto() diff --git a/sonar-server/src/test/java/org/sonar/server/tester/DataStoreCleanup.java b/sonar-server/src/test/java/org/sonar/server/tester/DataStoreCleanup.java new file mode 100644 index 00000000000..0e1da622753 --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/tester/DataStoreCleanup.java @@ -0,0 +1,79 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.tester; + +import org.elasticsearch.client.Client; +import org.elasticsearch.index.query.QueryBuilders; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.ServerComponent; +import org.sonar.core.persistence.DatabaseVersion; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.persistence.MyBatis; +import org.sonar.server.es.ESNode; + +import java.sql.Connection; + +public class DataStoreCleanup implements ServerComponent { + + private static final Logger LOG = LoggerFactory.getLogger(DataStoreCleanup.class); + + private final ESNode esNode; + private final MyBatis myBatis; + + public DataStoreCleanup(ESNode esNode, MyBatis myBatis) { + this.esNode = esNode; + this.myBatis = myBatis; + } + + public void clear() { + truncateDb(); + truncateEs(); + } + + private void truncateDb() { + DbSession dbSession = myBatis.openSession(false); + Connection connection = dbSession.getConnection(); + try { + LOG.info("Truncate db tables"); + for (String table : DatabaseVersion.TABLES) { + try { + connection.createStatement().execute("TRUNCATE TABLE " + table.toLowerCase()); + // commit is useless on some databases + connection.commit(); + } catch (Exception e) { + throw new IllegalStateException("Fail to truncate db table " + table, e); + } + } + + } finally { + dbSession.close(); + } + } + + private void truncateEs() { + LOG.info("Truncate es indices"); + Client client = esNode.client(); + client.prepareDeleteByQuery( + client.admin().cluster().prepareState().get().getState().getMetaData().concreteAllIndices() + ).setQuery(QueryBuilders.matchAllQuery()).get(); + + } +} diff --git a/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java b/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java index a2b3bacc173..e3b0e48063b 100644 --- a/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java +++ b/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java @@ -19,13 +19,17 @@ */ package org.sonar.server.tester; +import com.google.common.collect.Lists; import org.apache.commons.io.FileUtils; import org.junit.rules.ExternalResource; import org.sonar.api.CoreProperties; import org.sonar.api.database.DatabaseProperties; import org.sonar.server.platform.Platform; +import javax.annotation.Nullable; import java.io.File; +import java.util.Arrays; +import java.util.List; import java.util.Properties; /** @@ -37,7 +41,7 @@ public class ServerTester extends ExternalResource { private Platform platform; private File tempDir; - private Object[] components; + private List components = Lists.newArrayList(DataStoreCleanup.class); private final Properties initialProps = new Properties(); /** @@ -99,9 +103,11 @@ public class ServerTester extends ExternalResource { * Add classes or objects to IoC container, as it could be done by plugins. * Must be called before {@link #start()}. */ - public ServerTester addComponents(Object... components) { + public ServerTester addComponents(@Nullable Object... components) { checkNotStarted(); - this.components = components; + if (components != null) { + this.components.addAll(Arrays.asList(components)); + } return this; } @@ -114,6 +120,14 @@ public class ServerTester extends ExternalResource { return this; } + /** + * Truncate all db tables and es indices + */ + public void clearDataStores() { + checkStarted(); + get(DataStoreCleanup.class).clear(); + } + /** * Get a component from the platform */ -- 2.39.5