]> source.dussan.org Git - sonarqube.git/commitdiff
Add ServerTester#clearDataStores()
authorSimon Brandhof <simon.brandhof@gmail.com>
Wed, 30 Apr 2014 15:25:32 +0000 (17:25 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Wed, 30 Apr 2014 15:25:32 +0000 (17:25 +0200)
sonar-server/src/main/java/org/sonar/server/platform/Platform.java
sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
sonar-server/src/main/java/org/sonar/server/rule2/RuleQuery.java
sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java
sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java
sonar-server/src/test/java/org/sonar/server/tester/DataStoreCleanup.java [new file with mode: 0644]
sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java

index 49bb4bdc734633e2b568d8d901a935f80d99d3aa..40caa840d28e93e0671f82bc65cf84d67e89b748 100644 (file)
@@ -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);
   }
 
index c76338c9e57908e159c1f2ed00d5940418dd66d2..70f511e7b12dd3395eb981f022a091483a554311 100644 (file)
@@ -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) {
index 3b6e261c80c980a4396208fd3f5164a6a9fd273e..e60fe20540d813e52cd9d31b92b07635fa52c280 100644 (file)
@@ -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<String> languages;
-  private List<String> repositories;
-  private List<String> severities;
-  private List<RuleStatus> statuses;
-  private List<String> tags;
-  private List<String> debtCharacteristics;
+  private Collection<String> languages;
+  private Collection<String> repositories;
+  private Collection<String> severities;
+  private Collection<RuleStatus> statuses;
+  private Collection<String> tags;
+  private Collection<String> debtCharacteristics;
   private Boolean hasDebtCharacteristic;
   private SortField sortField;
   private boolean ascendingSort = true;
@@ -72,31 +72,31 @@ public class RuleQuery {
   }
 
   @CheckForNull
-  public List<String> getLanguages() {
+  public Collection<String> getLanguages() {
     return languages;
   }
 
-  public RuleQuery setLanguages(@Nullable List<String> languages) {
+  public RuleQuery setLanguages(@Nullable Collection<String> languages) {
     this.languages = languages;
     return this;
   }
 
   @CheckForNull
-  public List<String> getRepositories() {
+  public Collection<String> getRepositories() {
     return repositories;
   }
 
-  public RuleQuery setRepositories(@Nullable List<String> repositories) {
+  public RuleQuery setRepositories(@Nullable Collection<String> repositories) {
     this.repositories = repositories;
     return this;
   }
 
   @CheckForNull
-  public List<String> getSeverities() {
+  public Collection<String> getSeverities() {
     return severities;
   }
 
-  public RuleQuery setSeverities(@Nullable List<String> severities) {
+  public RuleQuery setSeverities(@Nullable Collection<String> 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<RuleStatus> getStatuses() {
+  public Collection<RuleStatus> getStatuses() {
     return statuses;
   }
 
-  public RuleQuery setStatuses(@Nullable List<RuleStatus> statuses) {
+  public RuleQuery setStatuses(@Nullable Collection<RuleStatus> statuses) {
     this.statuses = statuses;
     return this;
   }
 
   @CheckForNull
-  public List<String> getTags() {
+  public Collection<String> getTags() {
     return tags;
   }
 
-  public RuleQuery setTags(@Nullable List<String> tags) {
+  public RuleQuery setTags(@Nullable Collection<String> tags) {
     this.tags = tags;
     return this;
   }
 
   @CheckForNull
-  public List<String> getDebtCharacteristics() {
+  public Collection<String> getDebtCharacteristics() {
     return debtCharacteristics;
   }
 
-  public RuleQuery setDebtCharacteristics(@Nullable List<String> debtCharacteristics) {
+  public RuleQuery setDebtCharacteristics(@Nullable Collection<String> debtCharacteristics) {
     this.debtCharacteristics = debtCharacteristics;
     return this;
   }
index cecb47d4631e2db3d714b23ae484de272b0e55c5..25fa57c060a2b6f7bb48357d8fe1b20304015612 100644 (file)
@@ -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<RuleStatus> toStatuses(@Nullable List<String> statuses) {
+    if (statuses == null) {
+      return null;
+    }
+    return Collections2.transform(statuses, new Function<String, RuleStatus>() {
+      @Override
+      public RuleStatus apply(@Nullable String input) {
+        return input == null ? null : RuleStatus.valueOf(input);
+      }
+    });
+  }
 }
index f9c7f499ea2467b7e7f357abc98049afd88716d4..ddc00ee07ff4473f3406affa8634b85d125066a3 100644 (file)
  */
 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 (file)
index 0000000..0e1da62
--- /dev/null
@@ -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();
+
+  }
+}
index a2b3bacc173f7f1c16f19d9d13e91e71af5f8593..e3b0e48063be2f42e7f4712625bdd993f0e5d41a 100644 (file)
  */
 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
    */