]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6089 Clear views cache when indexing views
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 4 Feb 2015 13:20:36 +0000 (14:20 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 5 Feb 2015 15:46:30 +0000 (16:46 +0100)
server/sonar-server/src/test/java/org/sonar/server/component/ComponentTesting.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexViewsStepMediumTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexViewsStepTest.java

index d675d7438055f13db4e30677348f621ba7868f97..620accd0afcae66b14db0be7aad704fbe490c323 100644 (file)
@@ -102,7 +102,7 @@ public class ComponentTesting {
       .setName(name)
       .setLongName(name)
       .setScope(Scopes.PROJECT)
-      // XXX No constant !
+        // XXX No constant !
       .setQualifier("DEV")
       .setPath(null)
       .setLanguage(null)
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexViewsStepMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexViewsStepMediumTest.java
new file mode 100644 (file)
index 0000000..ddab04e
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * 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.computation.step;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.web.UserRole;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.issue.db.IssueDto;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.server.component.ComponentTesting;
+import org.sonar.server.component.db.ComponentDao;
+import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.issue.IssueQuery;
+import org.sonar.server.issue.IssueTesting;
+import org.sonar.server.issue.db.IssueDao;
+import org.sonar.server.issue.index.IssueIndex;
+import org.sonar.server.issue.index.IssueIndexer;
+import org.sonar.server.permission.InternalPermissionService;
+import org.sonar.server.permission.PermissionChange;
+import org.sonar.server.rule.RuleTesting;
+import org.sonar.server.rule.db.RuleDao;
+import org.sonar.server.search.QueryContext;
+import org.sonar.server.tester.ServerTester;
+import org.sonar.server.user.MockUserSession;
+import org.sonar.server.view.index.ViewIndexer;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * It's still not possible to only used EsTester as IssueIndex does not support it yet.
+ */
+public class IndexViewsStepMediumTest {
+
+  ComputationContext context;
+
+  DbSession dbSession;
+
+  ViewIndexer indexer;
+
+  IndexViewsStep step;
+
+  @ClassRule
+  public static ServerTester tester = new ServerTester().addComponents(IndexViewsStep.class);
+
+  IssueIndex index;
+
+  @Before
+  public void setUp() throws Exception {
+    tester.clearIndexes();
+    context = mock(ComputationContext.class);
+    dbSession = tester.get(DbClient.class).openSession(false);
+    index = tester.get(IssueIndex.class);
+    step = tester.get(IndexViewsStep.class);
+  }
+
+  @After
+  public void after() {
+    dbSession.close();
+  }
+
+  @Test
+  public void clear_cache_of_issue_on_view_filter() throws Exception {
+    String viewUuid = "ABCD";
+    when(context.getProject()).thenReturn(ComponentTesting.newProjectDto(viewUuid).setQualifier(Qualifiers.VIEW));
+
+    RuleDto rule = RuleTesting.newXooX1();
+    tester.get(RuleDao.class).insert(dbSession, rule);
+    ComponentDto project1 = addProjectWithIssue(rule);
+
+    ComponentDto view = ComponentTesting.newView("ABCD");
+    ComponentDto techProject1 = ComponentTesting.newTechnicalProject("CDEF", project1, view);
+    tester.get(ComponentDao.class).insert(dbSession, view, techProject1);
+    dbSession.commit();
+    tester.get(ViewIndexer.class).index(viewUuid);
+
+    // Execute issue query on view -> 1 issue on view (and filter on view will be set in cache)
+    assertThat(tester.get(IssueIndex.class).search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new QueryContext()).getHits()).hasSize(1);
+
+    // Add a project to the view
+    ComponentDto project2 = addProjectWithIssue(rule);
+    ComponentDto techProject2 = ComponentTesting.newTechnicalProject("EFGH", project2, view);
+    tester.get(ComponentDao.class).insert(dbSession, techProject2);
+    dbSession.commit();
+
+    // Execute issue query on view -> Still 1 issue on view, issue on project2 is not yet visible
+    assertThat(tester.get(IssueIndex.class).search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new QueryContext()).getHits()).hasSize(1);
+
+    step.execute(context);
+
+    // Execute issue query on view -> issue of project2 are well taken into account
+    assertThat(tester.get(IssueIndex.class).search(IssueQuery.builder().viewUuids(newArrayList(viewUuid)).build(), new QueryContext()).getHits()).hasSize(2);
+  }
+
+  private ComponentDto addProjectWithIssue(RuleDto rule) {
+    ComponentDto project = ComponentTesting.newProjectDto();
+    ComponentDto file = ComponentTesting.newFileDto(project);
+    tester.get(ComponentDao.class).insert(dbSession, project, file);
+
+    IssueDto issue = IssueTesting.newDto(rule, file, project);
+    tester.get(IssueDao.class).insert(dbSession, issue);
+    dbSession.commit();
+
+    setDefaultProjectPermission(project);
+    tester.get(IssueIndexer.class).indexAll();
+
+    return project;
+  }
+
+  private void setDefaultProjectPermission(ComponentDto project) {
+    // project can be seen by anyone and by code viewer
+    MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+    tester.get(InternalPermissionService.class).addPermission(new PermissionChange().setComponentKey(project.getKey()).setGroup(DefaultGroups.ANYONE).setPermission(UserRole.USER));
+    MockUserSession.set();
+  }
+}
index 8c8fbd5409fa2d74a0e30fd65d2995e193559735..9966cfb3b81be3a5094e949eb4c2d08d276c59fb 100644 (file)
@@ -30,7 +30,7 @@ import static org.mockito.Mockito.*;
 
 public class IndexViewsStepTest {
 
-  ComputationContext context = mock(ComputationContext.class);
+   ComputationContext context = mock(ComputationContext.class);
   ViewIndexer indexer = mock(ViewIndexer.class);
   IndexViewsStep sut = new IndexViewsStep(indexer);