]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9802 Add IT for cluster mode system info page
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>
Thu, 21 Sep 2017 08:01:29 +0000 (10:01 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 26 Sep 2017 21:49:38 +0000 (23:49 +0200)
server/sonar-web/src/main/js/apps/system/components/ClusterSysInfos.tsx
tests/src/test/java/org/sonarqube/pageobjects/SystemInfoPage.java
tests/src/test/java/org/sonarqube/tests/cluster/ClusterTest.java
tests/src/test/java/org/sonarqube/tests/cluster/Node.java
tests/src/test/java/org/sonarqube/tests/cluster/NodeConfig.java

index 54c70b1999cbe0019a264493ecfcf5cedd3b8973..281c0f5d7aedbddad4b75aedcb8833c43c4a9220 100644 (file)
@@ -54,7 +54,7 @@ export default function ClusterSysInfos({ expandedCards, sysInfoData, toggleCard
       <li className="note system-info-health-title">
         {translate('system.application_nodes_title')}
       </li>
-      {sortBy(getAppNodes(sysInfoData), 'name').map(node => (
+      {sortBy(getAppNodes(sysInfoData), getNodeName).map(node => (
         <HealthCard
           key={getNodeName(node)}
           health={getHealth(node)}
@@ -66,7 +66,7 @@ export default function ClusterSysInfos({ expandedCards, sysInfoData, toggleCard
         />
       ))}
       <li className="note system-info-health-title">{translate('system.search_nodes_title')}</li>
-      {sortBy(getSearchNodes(sysInfoData), 'name').map(node => (
+      {sortBy(getSearchNodes(sysInfoData), getNodeName).map(node => (
         <HealthCard
           key={getNodeName(node)}
           health={getHealth(node)}
index 84ba01b2333bb912e2615df0bccf7609db31a97a..64d3576873f9698133998259280a3c84e348e8a1 100644 (file)
@@ -32,8 +32,13 @@ public class SystemInfoPage {
     $(".page-title").should(exist).shouldHave(text("System Info"));
   }
 
+  public SystemInfoPage shouldHaveCard(String title) {
+    $$(".system-info-health-card-title").find(text(title)).should(exist);
+    return this;
+  }
+
   public SystemInfoPage shouldHaveCards(String... titles) {
-    $$(".system-info-health-card").shouldHave(CollectionCondition.texts(titles));
+    $$(".system-info-health-card-title").shouldHave(CollectionCondition.texts(titles));
     return this;
   }
 
index a6afc2ca1fba6aa8c8cdb75d1869e35512cd33ea..169e9a2caade1151fa7d9a8be36b12207d948961 100644 (file)
@@ -39,6 +39,8 @@ import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestRule;
 import org.junit.rules.Timeout;
+import org.sonarqube.pageobjects.Navigation;
+import org.sonarqube.pageobjects.SystemInfoPage;
 import org.sonarqube.ws.WsSystem;
 import org.sonarqube.ws.client.HttpException;
 import org.sonarqube.ws.client.issue.SearchWsRequest;
@@ -110,6 +112,9 @@ public class ClusterTest {
         app.waitForCeLogsContain("Compute Engine is operational");
         assertThat(app.anyLogsContain("Process[ce] is up")).isTrue();
       });
+
+      testSystemInfoPage(cluster, cluster.getAppNode(0));
+      testSystemInfoPage(cluster, cluster.getAppNode(1));
     }
   }
 
@@ -128,6 +133,50 @@ public class ClusterTest {
     });
   }
 
+  private void testSystemInfoPage(Cluster cluster, Node node) {
+    Navigation nav = node.openBrowser().logIn().submitCredentials("admin");
+    node.wsClient().users().skipOnboardingTutorial();
+    SystemInfoPage page = nav.openSystemInfo();
+
+    page.getCardItem("System")
+      .shouldHaveHealth()
+      .shouldHaveMainSection()
+      .shouldNotHaveSection("Database")
+      .shouldNotHaveSection("Settings")
+      .shouldNotHaveSection("Plugins")
+      .shouldHaveField("High Availability")
+      .shouldNotHaveField("Official Distribution")
+      .shouldNotHaveField("Version")
+      .shouldNotHaveField("Logs Level")
+      .shouldNotHaveField("Health")
+      .shouldNotHaveField("Health Causes");
+
+    cluster.getNodes().forEach(clusterNodes -> {
+      page.shouldHaveCard(clusterNodes.getConfig().getName().get());
+    });
+
+    page.getCardItem(String.valueOf(node.getConfig().getName().get()))
+      .shouldHaveHealth()
+      .shouldHaveSection("System")
+      .shouldHaveSection("Database")
+      .shouldHaveSection("Web Logging")
+      .shouldHaveSection("Compute Engine Logging")
+      .shouldNotHaveSection("Settings")
+      .shouldHaveField("Version")
+      .shouldHaveField("Official Distribution")
+      .shouldHaveField("Processors")
+      .shouldNotHaveField("Health")
+      .shouldNotHaveField("Health Causes");
+
+    page.getCardItem(cluster.getSearchNode(0).getConfig().getName().get())
+      .shouldHaveHealth()
+      .shouldHaveSection("Search State")
+      .shouldHaveField("Disk Available")
+      .shouldHaveField("Max File Descriptors")
+      .shouldNotHaveField("Health")
+      .shouldNotHaveField("Health Causes");
+  }
+
   @Test
   public void minimal_cluster_is_2_search_and_1_application_nodes() throws Exception {
     try (Cluster cluster = newCluster(2, 1)) {
@@ -156,9 +205,9 @@ public class ClusterTest {
   @Test
   public void configuration_of_connection_to_other_nodes_can_be_non_exhaustive() throws Exception {
     try (Cluster cluster = new Cluster(null)) {
-      NodeConfig searchConfig1 = newSearchConfig();
-      NodeConfig searchConfig2 = newSearchConfig();
-      NodeConfig appConfig = newApplicationConfig();
+      NodeConfig searchConfig1 = newSearchConfig("Search 1");
+      NodeConfig searchConfig2 = newSearchConfig("Search 2");
+      NodeConfig appConfig = newApplicationConfig("App 1");
 
       // HZ bus : app -> search 2 -> search1, which is not recommended at all !!!
       searchConfig2.addConnectionToBus(searchConfig1);
@@ -186,14 +235,14 @@ public class ClusterTest {
   @Test
   public void node_fails_to_join_cluster_if_different_cluster_name() throws Exception {
     try (Cluster cluster = new Cluster("foo")) {
-      NodeConfig searchConfig1 = newSearchConfig();
-      NodeConfig searchConfig2 = newSearchConfig();
+      NodeConfig searchConfig1 = newSearchConfig("Search 1");
+      NodeConfig searchConfig2 = newSearchConfig("Search 2");
       NodeConfig.interconnectBus(searchConfig1, searchConfig2);
       NodeConfig.interconnectSearch(searchConfig1, searchConfig2);
       cluster.startNode(searchConfig1, nothing());
       cluster.startNode(searchConfig2, nothing());
 
-      NodeConfig searchConfig3 = newSearchConfig()
+      NodeConfig searchConfig3 = newSearchConfig("Search 3")
         .addConnectionToSearch(searchConfig1)
         .addConnectionToBus(searchConfig1, searchConfig2);
       Node search3 = cluster.addNode(searchConfig3, b -> b
@@ -322,7 +371,7 @@ public class ClusterTest {
 
     try (Cluster cluster = newCluster(2, 0)) {
       // add an application node that pauses during startup
-      NodeConfig appConfig = NodeConfig.newApplicationConfig()
+      NodeConfig appConfig = NodeConfig.newApplicationConfig("App 1")
         .addConnectionToBus(cluster.getSearchNode(0).getConfig())
         .addConnectionToSearch(cluster.getSearchNode(0).getConfig());
       Node appNode = cluster.addNode(appConfig, b -> b.setServerProperty("sonar.web.startupLock.path", startupLock.getAbsolutePath()));
@@ -358,8 +407,8 @@ public class ClusterTest {
     Cluster cluster = new Cluster(null);
 
     List<NodeConfig> configs = new ArrayList<>();
-    IntStream.range(0, nbOfSearchNodes).forEach(i -> configs.add(newSearchConfig()));
-    IntStream.range(0, nbOfAppNodes).forEach(i -> configs.add(newApplicationConfig()));
+    IntStream.range(0, nbOfSearchNodes).forEach(i -> configs.add(newSearchConfig("Search " + i)));
+    IntStream.range(0, nbOfAppNodes).forEach(i -> configs.add(newApplicationConfig("App " + i)));
     NodeConfig[] configsArray = configs.toArray(new NodeConfig[configs.size()]);
 
     // a node is connected to all nodes, including itself (see sonar.cluster.hosts)
index 5b684ac4a244222184e9ece0b2d11233d176e81a..8b200f496b81518827a6b4188c1e3471b3c83870 100644 (file)
@@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 import javax.annotation.Nullable;
 import org.apache.commons.io.FileUtils;
+import org.sonarqube.pageobjects.Navigation;
 import org.sonarqube.tests.LogsTailer;
 import org.sonarqube.ws.WsSystem;
 import org.sonarqube.ws.client.WsClient;
@@ -214,6 +215,10 @@ class Node {
     return fileContains(orchestrator.getServer().getWebLogs(), message);
   }
 
+  Navigation openBrowser() {
+    return Navigation.create(orchestrator);
+  }
+
   private static boolean fileContains(@Nullable File logFile, String message) {
     try {
       return logFile != null && logFile.exists() && FileUtils.readFileToString(logFile).contains(message);
index df3d2ed7dcf71dbf2ee54f1a69b87c80cb4cdc60..cd7951a0bb7da55279e00438b48a772ff094115d 100644 (file)
@@ -136,12 +136,12 @@ class NodeConfig {
     return searchNodes;
   }
 
-  static NodeConfig newApplicationConfig() {
-    return new NodeConfig(NodeType.APPLICATION, null);
+  static NodeConfig newApplicationConfig(String name) {
+    return new NodeConfig(NodeType.APPLICATION, name);
   }
 
-  static NodeConfig newSearchConfig() {
-    return new NodeConfig(NodeType.SEARCH, null);
+  static NodeConfig newSearchConfig(String name) {
+    return new NodeConfig(NodeType.SEARCH, name);
   }
 
   /**