This is an automated email from the ASF dual-hosted git repository. sai_boorlagadda pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push: new 94586e1 GEODE-4807: Pulse UI tests using locator/cluster rule. (#1584) 94586e1 is described below commit 94586e1945d4e48313e60a39b91077450bf8525b Author: Sai Boorlagadda <sai.boorlaga...@gmail.com> AuthorDate: Mon Mar 12 18:16:48 2018 -0700 GEODE-4807: Pulse UI tests using locator/cluster rule. (#1584) These UI tests uses locator and cluster rules to setup VMs with integrated security. * Added selenium based pulse UI tests to setup using locator and cluster rules * Added pulse as a test dependency to geode-assembly * Added selenium and chrome driver dependency to geode-assembly * Added uiTest task to geode-assembly gradle --- geode-assembly/build.gradle | 14 + .../tools/pulse/ui/PulseAcceptanceAuthTest.java | 102 ++++++ .../tools/pulse/ui/PulseAcceptanceNoAuthTest.java | 94 ++++++ .../tools/pulse/ui/PulseAcceptanceTestBase.java | 354 +++++++++++++++++++++ 4 files changed, 564 insertions(+) diff --git a/geode-assembly/build.gradle b/geode-assembly/build.gradle index 02cbf81..1c3e92b 100755 --- a/geode-assembly/build.gradle +++ b/geode-assembly/build.gradle @@ -72,6 +72,7 @@ dependencies { testCompile project(':geode-junit') testCompile project(':geode-pulse') testCompile files(project(':geode-core').sourceSets.test.output) + testCompile files(project(':geode-pulse').sourceSets.test.output) testCompile ('org.springframework:spring-web:' + project.'springframework.version') { exclude module: 'aopalliance' exclude module: 'spring-aop' @@ -95,6 +96,10 @@ dependencies { testCompile project(':extensions/session-testing-war') + testCompile 'org.seleniumhq.selenium:selenium-api:' + project.'selenium.version' + testCompile 'org.seleniumhq.selenium:selenium-chrome-driver:' + project.'selenium.version' + testCompile 'org.seleniumhq.selenium:selenium-support:' + project.'selenium.version' + testRuntime files("${System.getProperty('java.home')}/../lib/tools.jar") testRuntime files("$buildDir/install/${distributions.main.baseName}/lib/geode-dependencies.jar") @@ -433,11 +438,20 @@ def dependOnInstalledProduct = { environment ('GEODE_HOME', install) } +task uiTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.UITest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + forkEvery(1) +} + // Add the configuration closure to the test targets so they depend on the install directory test dependOnInstalledProduct acceptanceTest dependOnInstalledProduct distributedTest dependOnInstalledProduct integrationTest dependOnInstalledProduct +uiTest dependOnInstalledProduct flakyTest dependOnInstalledProduct // Make build final task to generate all test and product resources diff --git a/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceAuthTest.java b/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceAuthTest.java new file mode 100644 index 0000000..caae0b7 --- /dev/null +++ b/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceAuthTest.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ +package org.apache.geode.tools.pulse.ui; + +import java.util.Properties; + +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.experimental.categories.Category; +import org.openqa.selenium.WebDriver; + +import org.apache.geode.examples.SimpleSecurityManager; +import org.apache.geode.test.dunit.rules.ClusterStartupRule; +import org.apache.geode.test.junit.categories.UITest; +import org.apache.geode.test.junit.rules.EmbeddedPulseRule; +import org.apache.geode.test.junit.rules.GfshCommandRule; +import org.apache.geode.test.junit.rules.LocatorStarterRule; +import org.apache.geode.tools.pulse.internal.data.Cluster; +import org.apache.geode.tools.pulse.tests.rules.ScreenshotOnFailureRule; +import org.apache.geode.tools.pulse.tests.rules.WebDriverRule; + +@Category(UITest.class) +public class PulseAcceptanceAuthTest extends PulseAcceptanceTestBase { + + @ClassRule + public static LocatorStarterRule locator = new LocatorStarterRule().withJMXManager() + .withSecurityManager(SimpleSecurityManager.class).withAutoStart(); + + @ClassRule + public static ClusterStartupRule clusterRule = new ClusterStartupRule(); + + @ClassRule + public static GfshCommandRule gfsh = new GfshCommandRule(); + + @Rule + public EmbeddedPulseRule pulseRule = new EmbeddedPulseRule(); + + @Rule + public WebDriverRule webDriverRule = + new WebDriverRule("clusterRead,dataRead", "clusterRead,dataRead", getPulseURL()); + + @Rule + public ScreenshotOnFailureRule screenshotOnFailureRule = + new ScreenshotOnFailureRule(this::getWebDriver); + + private Cluster cluster; + + @BeforeClass + public static void beforeClass() throws Exception { + int locatorPort = locator.getPort(); + + Properties serverProps = new Properties(); + serverProps.setProperty("security-username", "cluster"); + serverProps.setProperty("security-password", "cluster"); + clusterRule.startServerVM(1, serverProps, locatorPort); + + gfsh.connectAndVerify(locator.getJmxPort(), GfshCommandRule.PortType.jmxManager); + gfsh.executeAndAssertThat("create region --name=FOO --type=REPLICATE").statusIsSuccess(); + gfsh.executeAndAssertThat("put --key=A --value=APPLE --region=/FOO"); + } + + @AfterClass + public static void afterClass() { + gfsh.executeAndAssertThat("destroy region --name=FOO").statusIsSuccess(); + } + + @Before + public void before() { + pulseRule.useJmxManager("localhost", locator.getJmxPort()); + cluster = pulseRule.getRepository().getCluster("clusterRead", "clusterRead"); + } + + public WebDriver getWebDriver() { + return webDriverRule.getDriver(); + } + + @Override + public String getPulseURL() { + return "http://localhost:" + locator.getHttpPort() + "/pulse/"; + } + + @Override + public Cluster getCluster() { + return this.cluster; + } +} diff --git a/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceNoAuthTest.java b/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceNoAuthTest.java new file mode 100644 index 0000000..6b9a806 --- /dev/null +++ b/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceNoAuthTest.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ +package org.apache.geode.tools.pulse.ui; + +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.experimental.categories.Category; +import org.openqa.selenium.WebDriver; + +import org.apache.geode.test.dunit.rules.ClusterStartupRule; +import org.apache.geode.test.junit.categories.UITest; +import org.apache.geode.test.junit.rules.EmbeddedPulseRule; +import org.apache.geode.test.junit.rules.GfshCommandRule; +import org.apache.geode.test.junit.rules.LocatorStarterRule; +import org.apache.geode.tools.pulse.internal.data.Cluster; +import org.apache.geode.tools.pulse.tests.rules.ScreenshotOnFailureRule; +import org.apache.geode.tools.pulse.tests.rules.WebDriverRule; + +@Category(UITest.class) +public class PulseAcceptanceNoAuthTest extends PulseAcceptanceTestBase { + + @ClassRule + public static LocatorStarterRule locator = + new LocatorStarterRule().withJMXManager().withAutoStart(); + + @ClassRule + public static ClusterStartupRule clusterRule = new ClusterStartupRule(); + + @ClassRule + public static GfshCommandRule gfsh = new GfshCommandRule(); + + @Rule + public EmbeddedPulseRule pulseRule = new EmbeddedPulseRule(); + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule("admin", "admin", getPulseURL()); + + @Rule + public ScreenshotOnFailureRule screenshotOnFailureRule = + new ScreenshotOnFailureRule(this::getWebDriver); + + private Cluster cluster; + + @BeforeClass + public static void beforeClass() throws Exception { + int locatorPort = locator.getPort(); + clusterRule.startServerVM(1, locatorPort); + + gfsh.connectAndVerify(locator.getJmxPort(), GfshCommandRule.PortType.jmxManager); + gfsh.executeAndAssertThat("create region --name=FOO --type=REPLICATE").statusIsSuccess(); + gfsh.executeAndAssertThat("put --key=A --value=APPLE --region=/FOO"); + } + + @AfterClass + public static void afterClass() { + gfsh.executeAndAssertThat("destroy region --name=FOO").statusIsSuccess(); + } + + @Before + public void before() { + pulseRule.useJmxManager("localhost", locator.getJmxPort()); + cluster = pulseRule.getRepository().getCluster("admin", null); + } + + public WebDriver getWebDriver() { + return webDriverRule.getDriver(); + } + + @Override + public String getPulseURL() { + return "http://localhost:" + locator.getHttpPort() + "/pulse/"; + } + + @Override + public Cluster getCluster() { + return this.cluster; + } +} diff --git a/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceTestBase.java b/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceTestBase.java new file mode 100644 index 0000000..38a4335 --- /dev/null +++ b/geode-assembly/src/test/java/org/apache/geode/tools/pulse/ui/PulseAcceptanceTestBase.java @@ -0,0 +1,354 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * + */ +package org.apache.geode.tools.pulse.ui; + +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_CLIENTS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_FUNCTIONS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_GCPAUSES_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_QUERIESPERSEC_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_SUBSCRIPTION_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_UNIQUECQS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_VIEW_GRID_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_VIEW_LABEL; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_VIEW_LOCATORS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_VIEW_MEMBERS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_VIEW_REGIONS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.DATA_BROWSER_LABEL; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.DATA_BROWSER_REGION1_CHECKBOX; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.DATA_BROWSER_REGIONName1; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.DATA_DROPDOWN_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.MEMBER_VIEW_JVMPAUSES_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.MEMBER_VIEW_REGION_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.MEMBER_VIEW_SOCKETS_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.REDUNDANCY_GRID_ID; +import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.SERVER_GROUP_GRID_ID; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; + +import java.text.DecimalFormat; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import org.apache.geode.tools.pulse.internal.data.Cluster; + +public abstract class PulseAcceptanceTestBase { + public abstract WebDriver getWebDriver(); + + public abstract String getPulseURL(); + + public abstract Cluster getCluster(); + + private DecimalFormat df = new DecimalFormat("0.00"); + + @Before + public void setup() { + // Make sure we go to the home page first + searchByXPathAndClick("//a[text()='Cluster View']"); + } + + protected void searchByLinkAndClick(String linkText) { + WebElement element = new WebDriverWait(getWebDriver(), 2) + .until(ExpectedConditions.elementToBeClickable(By.linkText(linkText))); + assertNotNull(element); + element.click(); + } + + protected void searchByIdAndClick(String id) { + WebElement element = getWebDriver().findElement(By.id(id)); + assertNotNull(element); + element.click(); + } + + protected void searchByXPathAndClick(String xpath) { + WebElement element = getWebDriver().findElement(By.xpath(xpath)); + assertNotNull(element); + element.click(); + } + + @Test + public void testClusterDetailsAndWidgets() { + String displayedLocatorCount = + getWebDriver().findElement(By.id(CLUSTER_VIEW_LOCATORS_ID)).getText(); + assertThat(String.valueOf(getCluster().getLocatorCount())).isEqualTo(displayedLocatorCount); + + String displayedRegionCount = + getWebDriver().findElement(By.id(CLUSTER_VIEW_REGIONS_ID)).getText(); + assertThat(String.valueOf(getCluster().getTotalRegionCount())).isEqualTo(displayedRegionCount); + + String displayedClusterMemberCount = + getWebDriver().findElement(By.id(CLUSTER_VIEW_MEMBERS_ID)).getText(); + assertThat(String.valueOf(getCluster().getMemberCount())) + .isEqualTo(displayedClusterMemberCount); + + String displyedClusterClients = getWebDriver().findElement(By.id(CLUSTER_CLIENTS_ID)).getText(); + assertThat(String.valueOf(getCluster().getClientConnectionCount())) + .isEqualTo(displyedClusterClients); + + String displayedFnRunningCount = + getWebDriver().findElement(By.id(CLUSTER_FUNCTIONS_ID)).getText(); + assertThat(String.valueOf(getCluster().getRunningFunctionCount())) + .isEqualTo(displayedFnRunningCount); + + String displayedUniqueCQs = getWebDriver().findElement(By.id(CLUSTER_UNIQUECQS_ID)).getText(); + assertThat(String.valueOf(getCluster().getRegisteredCQCount())).isEqualTo(displayedUniqueCQs); + + String displayedSubscriptionCount = + getWebDriver().findElement(By.id(CLUSTER_SUBSCRIPTION_ID)).getText(); + assertThat(String.valueOf(getCluster().getSubscriptionCount())) + .isEqualTo(displayedSubscriptionCount); + + // TODO: verify it is the right counter + String displayedGCPauses = getWebDriver().findElement(By.id(CLUSTER_GCPAUSES_ID)).getText(); + assertThat(String.valueOf(getCluster().getPreviousJVMPauseCount())) + .isEqualTo(displayedGCPauses); + + String clusterQueriesPerSec = + getWebDriver().findElement(By.id(CLUSTER_QUERIESPERSEC_ID)).getText(); + assertThat(df.format(getCluster().getQueriesPerSec())).isEqualTo(clusterQueriesPerSec); + } + + @Test + public void testClusterGridViewMemberDetails() { + searchByIdAndClick("default_grid_button"); + List<WebElement> elements = + getWebDriver().findElements(By.xpath("//table[@id='memberList']/tbody/tr")); + + Cluster.Member[] actualMembers = getCluster().getMembers(); + // table contains header row so actual members is one less than the tr elements. + assertThat(actualMembers.length).isEqualTo(elements.size() - 1); + + for (int i = 0; i < actualMembers.length; i++) { + // reset from member view as we are looping + searchByXPathAndClick("//a[text()='Cluster View']"); + searchByIdAndClick("default_grid_button"); + String displayedMemberId = + getWebDriver().findElement(By.xpath("//table[@id='memberList']/tbody/tr[contains(@id, '" + + actualMembers[i].getName() + "')]/td")).getText(); + assertThat(actualMembers[i].getId()).contains(displayedMemberId); + + String displayedMemberName = + getWebDriver().findElement(By.xpath("//table[@id='memberList']/tbody/tr[contains(@id, '" + + actualMembers[i].getName() + "')]/td[2]")).getText(); + assertThat(actualMembers[i].getName()).isEqualTo(displayedMemberName); + + String displayedMemberHost = + getWebDriver().findElement(By.xpath("//table[@id='memberList']/tbody/tr[contains(@id, '" + + actualMembers[i].getName() + "')]/td[3]")).getText(); + assertThat(actualMembers[i].getHost()).isEqualTo(displayedMemberHost); + + // now click the grid row to go to member view and assert details displayed + searchByXPathAndClick("//table[@id='memberList']/tbody/tr[contains(@id, '" + + actualMembers[i].getName() + "')]/td"); + + String displayedRegionCount = + getWebDriver().findElement(By.id(MEMBER_VIEW_REGION_ID)).getText(); + assertThat(String.valueOf(actualMembers[i].getTotalRegionCount())) + .isEqualTo(displayedRegionCount); + + String displaySocketCount = + getWebDriver().findElement(By.id(MEMBER_VIEW_SOCKETS_ID)).getText(); + if (actualMembers[i].getTotalFileDescriptorOpen() < 0) + assertThat("NA").isEqualTo(displaySocketCount); + else + assertThat(String.valueOf(actualMembers[i].getTotalFileDescriptorOpen())) + .isEqualTo(displaySocketCount); + + String displayedJVMPauses = + getWebDriver().findElement(By.id(MEMBER_VIEW_JVMPAUSES_ID)).getText(); + assertThat(String.valueOf(actualMembers[i].getPreviousJVMPauseCount())) + .isEqualTo(displayedJVMPauses); + } + } + + @Test + public void testDropDownList() throws InterruptedException { + searchByIdAndClick("default_grid_button"); + searchByXPathAndClick("//table[@id='memberList']/tbody/tr[contains(@id, 'locator')]/td"); + searchByIdAndClick("memberName"); + searchByLinkAndClick("locator"); + searchByIdAndClick("memberName"); + // searchByLinkAndClick("server-1"); + } + + @Test + public void userCanGetToPulseDetails() { + getWebDriver().get(getPulseURL() + "pulseVersion"); + assertThat(getWebDriver().getPageSource()).contains("sourceRevision"); + } + + @Test + public void testMemberGridViewData() { + searchByXPathAndClick("//a[text()='Cluster View']"); + searchByIdAndClick("default_grid_button"); + searchByXPathAndClick("//table[@id='memberList']/tbody/tr[contains(@id, 'server-1')]/td"); + searchByXPathAndClick("//a[@id='btngridIcon']"); + + // get the number of rows on the grid + List<WebElement> displayedRegionsList = + getWebDriver().findElements(By.xpath("//table[@id='memberRegionsList']/tbody/tr")); + Cluster.Region[] actualRegions = getCluster().getMember("server-1").getMemberRegionsList(); + // table contains header row so actual regions is one less than the tr elements. + assertThat(actualRegions.length).isEqualTo(displayedRegionsList.size() - 1); + + for (int i = 0; i < actualRegions.length; i++) { + String displayedMemberRegionName = getWebDriver() + .findElement(By.xpath( + "//table[@id='memberRegionsList']/tbody/tr[contains(@id, '" + (i + 1) + "')]/td[1]")) + .getText(); + assertThat(actualRegions[i].getName()).isEqualTo(displayedMemberRegionName); + + String displayedMemberRegionType = getWebDriver() + .findElement(By.xpath( + "//table[@id='memberRegionsList']/tbody/tr[contains(@id, '" + (i + 1) + "')]/td[2]")) + .getText(); + assertThat(actualRegions[i].getRegionType()).isEqualTo(displayedMemberRegionType); + + String displayedMemberRegionEntryCount = getWebDriver() + .findElement(By.xpath( + "//table[@id='memberRegionsList']/tbody/tr[contains(@id, '" + (i + 1) + "')]/td[3]")) + .getText(); + assertThat(String.valueOf(actualRegions[i].getSystemRegionEntryCount())) + .isEqualTo(displayedMemberRegionEntryCount); + } + } + + @Test + public void testDataBrowserRegionName() { + if (getCluster().getTotalRegionCount() > 0) { + Cluster.Member server = getCluster().getMember("server-1"); + // click data browser + searchByLinkAndClick(DATA_BROWSER_LABEL); + + List<WebElement> regionList = + getWebDriver().findElements(By.xpath("//ul[@id='treeDemo']/li")); + assertThat(getCluster().getTotalRegionCount()).isEqualTo(regionList.size()); + String displayedRegionName = + getWebDriver().findElement(By.id(DATA_BROWSER_REGIONName1)).getText(); + assertThat(server.getMemberRegionsList()[0].getName()).isEqualTo(displayedRegionName); + + searchByIdAndClick(DATA_BROWSER_REGION1_CHECKBOX); + List<WebElement> memberList = + getWebDriver().findElements(By.xpath("//ul[@id='membersList']/li")); + assertThat(getCluster().getClusterRegion("/FOO").getMemberCount()) + .isEqualTo(memberList.size()); + String DataBrowserMember1Name1 = + getWebDriver().findElement(By.xpath("//label[@for='Member0']")).getText(); + assertThat("server-1").isEqualTo(DataBrowserMember1Name1); + searchByIdAndClick(DATA_BROWSER_REGION1_CHECKBOX); + + // execute a query + WebElement queryTextArea = getWebDriver().findElement(By.id("dataBrowserQueryText")); + queryTextArea.sendKeys("select * from /FOO"); + WebElement executeButton = getWebDriver().findElement(By.id("btnExecuteQuery")); + executeButton.click(); + String queryResultHeader = getWebDriver() + .findElement(By.xpath("//div[@id='clusterDetails']/div/div/span[@class='n-title']")) + .getText(); + assertThat("java.lang.String").isEqualTo(queryResultHeader); + } + } + + @Test + public void testRegionViewTreeMapPopUpData() { + if (getCluster().getTotalRegionCount() > 0) { + searchByLinkAndClick(CLUSTER_VIEW_LABEL); + searchByLinkAndClick(DATA_DROPDOWN_ID); + searchByIdAndClick("GraphTreeMapClusterData-canvas"); + } + } + + @Test + public void testDataViewTreeMapPopUpData() { + if (getCluster().getTotalRegionCount() > 0) { + Cluster.Region actualRegion = getCluster().getClusterRegion("/FOO"); + searchByLinkAndClick(CLUSTER_VIEW_LABEL); + searchByLinkAndClick(DATA_DROPDOWN_ID); + WebElement TreeMapMember = + getWebDriver().findElement(By.id("GraphTreeMapClusterData-canvas")); + Actions builder = new Actions(getWebDriver()); + builder.clickAndHold(TreeMapMember).perform(); + + String displayedRegionType = getWebDriver() + .findElement(By.xpath("//div[@id='_tooltip']/div/div/div[2]/div/div[2]/div")).getText(); + assertThat(actualRegion.getRegionType()).isEqualTo(displayedRegionType); + + String displayedEntryCount = getWebDriver() + .findElement(By.xpath("//div[@id='_tooltip']/div/div/div[2]/div[2]/div[2]/div")) + .getText(); + assertThat(String.valueOf(actualRegion.getSystemRegionEntryCount())) + .isEqualTo(displayedEntryCount); + + String displayedEntrySize = getWebDriver() + .findElement(By.xpath("//div[@id='_tooltip']/div/div/div[2]/div[3]/div[2]/div")) + .getText(); + if (actualRegion.getEntrySize() > 0) + assertThat(new DecimalFormat("##.####").format(actualRegion.getEntrySize())) + .isEqualTo(displayedEntrySize); + else + assertThat("NA").isEqualTo(displayedEntrySize); + builder.moveToElement(TreeMapMember).release().perform(); + } + } + + public void testTreeMapPopUpData(String gridIcon) { + for (String member : getCluster().getMembersHMap().keySet()) { + searchByLinkAndClick(CLUSTER_VIEW_LABEL); + if (gridIcon.equals(SERVER_GROUP_GRID_ID)) { + WebElement serverGroupRadio = + getWebDriver().findElement(By.xpath("//label[@for='radio-servergroups']")); + serverGroupRadio.click(); + } else if (gridIcon.equals(REDUNDANCY_GRID_ID)) { + WebElement redundancyGroupRadio = + getWebDriver().findElement(By.xpath("//label[@for='radio-redundancyzones']")); + redundancyGroupRadio.click(); + } + searchByIdAndClick(gridIcon); + WebElement TreeMapMember = new WebDriverWait(getWebDriver(), 5).until(ExpectedConditions + .elementToBeClickable(By.xpath("//*[contains(text(), '" + member + "')]"))); + Actions builder = new Actions(getWebDriver()); + builder.clickAndHold(TreeMapMember).perform(); + + Cluster.Member actualMember = getCluster().getMembersHMap().get(member); + String displayedThreadCount = getWebDriver() + .findElement(By.xpath("//div[@id='_tooltip']/div/div/div[2]/div[4]/div[2]/div")) + .getText(); + assertThat(String.valueOf(actualMember.getNumThreads())).isEqualTo(displayedThreadCount); + + String displayedSocketCount = getWebDriver() + .findElement(By.xpath("//div[@id='_tooltip']/div/div/div[2]/div[5]/div[2]/div")) + .getText(); + if (actualMember.getTotalFileDescriptorOpen() > 0) + assertThat(String.valueOf(actualMember.getTotalFileDescriptorOpen())) + .isEqualTo(displayedSocketCount); + else + assertThat("NA").isEqualTo(displayedSocketCount); + builder.moveToElement(TreeMapMember).release().perform(); + } + } + + @Test + public void testTopologyPopUpData() { + testTreeMapPopUpData(CLUSTER_VIEW_GRID_ID); + } +} -- To stop receiving notification emails like this one, please contact sai_boorlaga...@apache.org.