You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by hi...@apache.org on 2016/09/09 21:43:50 UTC

[53/83] [abbrv] incubator-geode git commit: GEODE-37 renamed pulse package

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseBaseTest.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseBaseTest.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseBaseTest.java
new file mode 100644
index 0000000..47b4e7e
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseBaseTest.java
@@ -0,0 +1,693 @@
+/*
+ *
+ * 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.tests;
+
+import static org.apache.geode.tools.pulse.tests.PulseAbstractTest.*;
+import static org.junit.Assert.*;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
+
+import org.openqa.selenium.By;
+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;
+
+public class PulseBaseTest {
+
+  public static int maxWaitTime = 20;
+
+  WebElement element = null;
+
+	public WebElement findElementUsingId(String id) {
+		return driver.findElement(By.id(id));
+	}
+	public WebElement findElementUsingXpath(String xpath) {
+		return driver.findElement(By.xpath(xpath));
+	}
+
+	public void clickElementUsingId(String id) {
+		findElementUsingId(id).click();
+	}
+
+	public void clickElementUsingXpath(String xpath) {
+		findElementUsingXpath(xpath).click();
+	}
+
+	public void enterTextUsingId(String id, String textToEnter) {
+		findElementUsingId(id).sendKeys(textToEnter);
+
+	}
+
+	public void enterTextUsingXpath(String xpath, String textToEnter) {
+		findElementUsingXpath(xpath).sendKeys(textToEnter);
+	}
+
+	public String getValueFromPropertiesFile(String key) {
+		return JMXProperties.getInstance().getProperty(key);
+	}
+
+	public void sendKeysUsingId(String Id, String textToEnter){
+		findElementById(Id).sendKeys(textToEnter);
+	}
+
+	public void waitForElement(WebElement element) {
+		driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
+		WebDriverWait wait = new WebDriverWait(driver, 20);
+		wait.until(ExpectedConditions.visibilityOf(element));
+	}
+
+	public WebElement findElementById(String id) {
+		return driver.findElement(By.id(id));
+	}
+
+	public WebElement findElementByXpath(String xpath) {
+		return driver.findElement(By.xpath(xpath));
+	}
+
+	public String getTextUsingXpath(String xpath) {
+		return findElementByXpath(xpath).getText();
+	}
+
+	public String getTextUsingId(String id) {
+		return findElementById(id).getText();
+	}
+
+	public String getPersistanceEnabled(Region r) {
+		String persitance = null;
+
+		if (r.getPersistentEnabled()) {
+			persitance = "ON";
+		} else if (!r.getPersistentEnabled()) {
+			persitance = "OFF";
+		}
+		return persitance;
+	}
+
+	public String getPersistanceEnabled(String trueOrFalse) {
+		String persitance = null;
+
+		if (trueOrFalse.contains("true")) {
+			persitance = "ON";
+		} else if (trueOrFalse.contains("false")) {
+			persitance = "OFF";
+		}
+		return persitance;
+	}
+
+	public String HeapUsage(String valueInKB) {
+
+		return null;
+	}
+
+	// WIP - need to work on this --
+	public HashMap<String, HashMap<String, Region>> getRegionDetailsFromUI(String regionName) {
+
+		String[] regionNames = JMXProperties.getInstance().getProperty("regions").split(" ");
+		HashMap<String, HashMap<String, Region>> regionUiMap = new HashMap<String, HashMap<String, Region>>();
+
+		for (String region : regionNames) {
+			HashMap<String, Region> regionMap = regionUiMap.get(region);
+		}
+
+		return regionUiMap;
+	}
+
+	public void validateServerGroupGridData() {
+		List<WebElement> serverGridRows = driver.findElements(By.xpath("//table[@id='memberListSG']/tbody/tr"));
+		int rowsCount = serverGridRows.size();
+		String[][] gridDataFromUI = new String[rowsCount][7];
+
+		for (int j = 2, x = 0; j <= serverGridRows.size(); j++, x++) {
+			for (int i = 0; i <= 6; i++) {
+				gridDataFromUI[x][i] = driver.findElement(
+						By.xpath("//table[@id='memberListSG']/tbody/tr[" + j + "]/td[" + (i + 1) + "]")).getText();
+			}
+		}
+
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, HashMap<String, Member>> sgMap = new HashMap<String, HashMap<String, Member>>();
+
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			String[] sgs = thisMember.getGroups();
+
+			for (String sgName : sgs) {
+				HashMap<String, Member> sgMembers = sgMap.get(sgName);
+				if (sgMembers == null) {
+					sgMembers = new HashMap<String, Member>();
+					sgMap.put(sgName, sgMembers);
+				}
+				sgMembers.put(thisMember.getMember(), thisMember);
+			}
+		}
+
+		for (int i = 0; i < gridDataFromUI.length - 1; i++) {
+			String sgName = gridDataFromUI[i][0];
+			String memName = gridDataFromUI[i][1];
+			Member m = sgMap.get(sgName).get(memName);
+
+			assertEquals(sgName, gridDataFromUI[i][0]);
+			assertEquals(memName, gridDataFromUI[i][1]);
+			assertEquals(m.getMember(), gridDataFromUI[i][2]);
+			assertEquals(m.getHost(), gridDataFromUI[i][3]);
+			String cupUsage = String.valueOf(m.getCpuUsage());
+			assertEquals(cupUsage, gridDataFromUI[i][5]);
+		}
+
+	}
+
+	public void validateRedundancyZonesGridData() {
+		List<WebElement> rzGridRows = driver.findElements(By.xpath("//table[@id='memberListRZ']/tbody/tr"));
+		int rowsCount = rzGridRows.size();
+		String[][] gridDataFromUI = new String[rowsCount][7];
+
+		for (int j = 2, x = 0; j <= rzGridRows.size(); j++, x++) {
+			for (int i = 0; i <= 6; i++) {
+				gridDataFromUI[x][i] = driver.findElement(
+						By.xpath("//table[@id='memberListRZ']/tbody/tr[" + j + "]/td[" + (i + 1) + "]")).getText();
+			}
+		}
+
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, HashMap<String, Member>> rzMap = new HashMap<String, HashMap<String, Member>>();
+
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			//String[] rz = thisMember.getRedundancyZone();
+			String sgName = thisMember.getRedundancyZone();
+
+			//for (String sgName : rz) {
+				HashMap<String, Member> rzMembers = rzMap.get(sgName);
+
+				if (rzMembers == null) {
+					rzMembers = new HashMap<String, Member>();
+					rzMap.put(sgName, rzMembers);
+				}
+
+				rzMembers.put(thisMember.getMember(), thisMember);
+			//}
+		}
+
+		for (int i = 0; i < gridDataFromUI.length - 1; i++) {
+			String sgName = gridDataFromUI[i][0];
+			String memName = gridDataFromUI[i][1];
+			Member m = rzMap.get(sgName).get(memName);
+
+			assertEquals(sgName, gridDataFromUI[i][0]);
+			assertEquals(memName, gridDataFromUI[i][1]);
+			assertEquals(m.getMember(), gridDataFromUI[i][2]);
+			assertEquals(m.getHost(), gridDataFromUI[i][3]);
+			String cupUsage = String.valueOf(m.getCpuUsage());
+			assertEquals(cupUsage, gridDataFromUI[i][5]);
+		}
+
+	}
+
+	public void validateTopologyGridData() {
+		List<WebElement> rzGridRows = driver.findElements(By.xpath("//table[@id='memberList']/tbody/tr"));
+		int rowsCount = rzGridRows.size();
+		String[][] gridDataFromUI = new String[rowsCount][8];
+
+		for (int j = 2, x = 0; j <= rzGridRows.size(); j++, x++) {
+			for (int i = 0; i <= 7; i++) {
+				gridDataFromUI[x][i] = driver.findElement(
+						By.xpath("//table[@id='memberList']/tbody/tr[" + j + "]/td[" + (i + 1) + "]")).getText();
+			}
+		}
+
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, Member> tpMap = new HashMap<String, Member>();
+
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			tpMap.put(thisMember.getMember(), thisMember);
+
+		}
+
+		for (int i = 0; i < gridDataFromUI.length - 1; i++) {
+
+			String memName = gridDataFromUI[i][0];
+			Member m = tpMap.get(memName);
+
+			assertEquals(m.getMember(), gridDataFromUI[i][0]);
+			assertEquals(m.getMember(), gridDataFromUI[i][1]);
+			assertEquals(m.getHost(), gridDataFromUI[i][2]);
+			String cupUsage = String.valueOf(m.getCpuUsage());
+			assertEquals(cupUsage, gridDataFromUI[i][5]);
+		}
+	}
+
+	public void validateDataPrespectiveGridData() {
+		List<WebElement> serverGridRows = driver.findElements(By.xpath("//table[@id='regionsList']/tbody/tr"));
+		int rowsCount = serverGridRows.size();
+		String[][] gridDataFromUI = new String[rowsCount][7];
+
+		for (int j = 2, x = 0; j <= serverGridRows.size(); j++, x++) {
+			for (int i = 0; i <= 6; i++) {
+				if (i < 5) {
+					gridDataFromUI[x][i] = driver.findElement(
+							By.xpath("//table[@id='regionsList']/tbody/tr[" + j + "]/td[" + (i + 1) + "]")).getText();
+				} else if (i == 5) {
+					gridDataFromUI[x][i] = driver.findElement(
+							By.xpath("//table[@id='regionsList']/tbody/tr[" + j + "]/td[" + (i + 4) + "]")).getText();
+				}
+			}
+		}
+
+		String[] regionNames = JMXProperties.getInstance().getProperty("regions").split(" ");
+		HashMap<String, Region> dataMap = new HashMap<String, Region>();
+
+		for (String region : regionNames) {
+			Region thisRegion = new Region(region);
+			dataMap.put(thisRegion.getName(), thisRegion);
+
+		}
+
+		for (int i = 0; i < gridDataFromUI.length - 1; i++) {
+			String memName = gridDataFromUI[i][0];
+			Region r = dataMap.get(memName);
+
+			assertEquals(r.getName(), gridDataFromUI[i][0]);
+			assertEquals(r.getRegionType(), gridDataFromUI[i][1]);
+
+			assertEquals(String.valueOf(r.getSystemRegionEntryCount()), gridDataFromUI[i][2]);
+			assertEquals(r.getFullPath(), gridDataFromUI[i][4]);
+			assertEquals(getPersistanceEnabled(r), gridDataFromUI[i][5]);
+		}
+	}
+
+	public void validateRegionDetailsGridData() {
+		List<WebElement> serverGridRows = driver.findElements(By.xpath("//table[@id='memberList']/tbody/tr"));
+		int rowsCount = serverGridRows.size();
+		String[][] gridDataFromUI = new String[rowsCount][7];
+
+		for (int j = 2, x = 0; j <= serverGridRows.size(); j++, x++) {
+			for (int i = 0; i < 2; i++) {
+				gridDataFromUI[x][i] = driver.findElement(
+						By.xpath("//table[@id='memberList']/tbody/tr[" + j + "]/td[" + (i + 1) + "]")).getText();
+			}
+		}
+
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, Member> tpMap = new HashMap<String, Member>();
+
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			tpMap.put(thisMember.getMember(), thisMember);
+		}
+
+		for (int i = 0; i < gridDataFromUI.length - 1; i++) {
+
+			String memName = gridDataFromUI[i][0];
+			Member m = tpMap.get(memName);
+			assertEquals(m.getMember(), gridDataFromUI[i][0]);
+		}
+
+	}
+
+	public void navigateToToplogyView(){
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.TopologyView.radioButtonXpath);
+	}
+
+	public void navigateToServerGroupGView(){
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.ServerGroups.radioButtonXpath);
+	}
+
+	public void navigateToRedundancyZoneView(){
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.RedundancyZone.radioButtonXpath);
+	}
+
+	//  ------ 	Topology / Server Group / Redundancy Group - Tree View
+
+	public void navigateToTopologyTreeView(){
+		navigateToToplogyView();
+		clickElementUsingId(PulseTestLocators.TopologyView.treeMapButtonId);
+	}
+
+	public void navigateToServerGroupTreeView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.ServerGroups.radioButtonXpath);
+	}
+
+	public void navigateToRedundancyZonesTreeView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.RedundancyZone.radioButtonXpath);
+	}
+
+	//  ------ 	Topology / Server Group / Redundancy Group - Grid View
+
+	public void navigateToTopologyGridView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.TopologyView.radioButtonXpath);
+		clickElementUsingId(PulseTestLocators.TopologyView.gridButtonId);
+	}
+
+	public void navigateToServerGroupGridView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.ServerGroups.radioButtonXpath);
+		clickElementUsingId(PulseTestLocators.ServerGroups.gridButtonId);
+	}
+
+	public void navigateToRedundancyZonesGridView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.RedundancyZone.radioButtonXpath);
+		clickElementUsingId(PulseTestLocators.RedundancyZone.gridButtonId);
+	}
+
+	// ----- Data perspective / region details
+
+	public void navigateToDataPrespectiveGridView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.DataPerspectiveView.downarrowButtonXpath);
+		clickElementUsingXpath(PulseTestLocators.DataPerspectiveView.dataViewButtonXpath);
+		clickElementUsingId(PulseTestLocators.DataPerspectiveView.gridButtonId);
+	}
+
+	public void navigateToRegionDetailsView() {
+		clickElementUsingXpath(PulseTestLocators.TopNavigation.clusterViewLinkXpath);
+		clickElementUsingXpath(PulseTestLocators.DataPerspectiveView.downarrowButtonXpath);
+		clickElementUsingXpath(PulseTestLocators.DataPerspectiveView.dataViewButtonXpath);
+		// clickElementUsingXpath(PulseTestLocators.RegionDetailsView.regionNameXpath);
+		// // WIP - region navigation defect needs to fixed
+		clickElementUsingXpath(PulseTestLocators.RegionDetailsView.treeMapCanvasXpath);
+	}
+
+	public void navigateToRegionDetailsGridView() {
+		navigateToRegionDetailsView();
+		clickElementUsingXpath(PulseTestLocators.RegionDetailsView.gridButtonXpath);
+	}
+
+	public String getPropertyValue(String propertyKey) {
+		String propertyValue = JMXProperties.getInstance().getProperty(propertyKey);
+		return propertyValue;
+	}
+
+	public void verifyElementPresentById(String id) {
+		WebDriverWait wait = new WebDriverWait(driver, maxWaitTime, 500);
+		wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id(id)));
+	}
+
+	public void verifyElementPresentByLinkText(String lnkText) {
+		WebDriverWait wait = new WebDriverWait(driver, maxWaitTime, 500);
+		wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.linkText(lnkText)));
+	}
+
+	public void verifyElementPresentByXpath(String xpath) {
+		WebDriverWait wait = new WebDriverWait(driver, maxWaitTime, 500);
+		wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xpath)));
+	}
+
+	public void verifyTextPresrntById(String id, String text) {
+		WebDriverWait wait = new WebDriverWait(driver, maxWaitTime, 500);
+		wait.until(ExpectedConditions.textToBePresentInElementLocated(By.id(id), text));
+	}
+
+	public void verifyTextPresrntByXpath(String xpath, String text) {
+		WebDriverWait wait = new WebDriverWait(driver, maxWaitTime, 500);
+		wait.until(ExpectedConditions.textToBePresentInElementLocated(By.xpath(xpath), text));
+	}
+
+	public void verifyElementAttributeById(String id, String attribute, String value) {
+		String actualValue = findElementById(id).getAttribute(attribute);
+		assertTrue(actualValue.equals(value) || actualValue.contains(value));
+	}
+
+
+	public void mouseReleaseById(String id){
+		verifyElementPresentById(id);
+		Actions action = new Actions(driver);
+		WebElement we = driver.findElement(By.id(id));
+		action.moveToElement(we).release().perform();
+	}
+	public void mouseClickAndHoldOverElementById(String id) {
+		verifyElementPresentById(id);
+		Actions action = new Actions(driver);
+		WebElement we = driver.findElement(By.id(id));
+		action.moveToElement(we).clickAndHold().perform();
+	}
+
+	public void mouseOverElementByXpath(String xpath) {
+		Actions action = new Actions(driver);
+		WebElement we = driver.findElement(By.xpath(xpath));
+		action.moveToElement(we).build().perform();
+	}
+
+
+	public float stringToFloat(String stringValue){
+		float floatNum = Float.parseFloat(stringValue);
+		return floatNum;
+	}
+
+	public String floatToString(float floatValue){
+		String stringValue = Float.toString(floatValue);
+		return stringValue;
+	}
+
+
+	public String[] splitString(String stringToSplit, String splitDelimiter){
+		String [] stringArray = stringToSplit.split(splitDelimiter);
+		return stringArray;
+	}
+
+	public void assertMemberSortingByCpuUsage(){
+		Map<Double, String> memberMap = new TreeMap<>(Collections.reverseOrder());
+		String [] membersNames = splitString(JMXProperties.getInstance().getProperty("members"), " ");
+		for (String member : membersNames) {
+			Member thisMember = new Member(member);
+			memberMap.put(thisMember.getCpuUsage(), thisMember.getMember());
+		}
+		for(Map.Entry<Double,String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberCPUUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberCPUUsage = PulseTestData.Topology.cpuUsagePaintStyleM1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberCPUUsage = PulseTestData.Topology.cpuUsagePaintStyleM2;
+			}else{
+				refMemberCPUUsage = PulseTestData.Topology.cpuUsagePaintStyleM3;
+			}
+			assertTrue(findElementById(entry.getValue()).getAttribute("style").contains(refMemberCPUUsage));
+	    }
+	}
+
+	public void assertMemberSortingByHeapUsage(){
+		Map<Long, String> memberMap = new TreeMap<Long,String>(Collections.reverseOrder());
+		String [] membersNames = splitString(JMXProperties.getInstance().getProperty("members"), " ");
+		for (String member : membersNames) {
+			Member thisMember = new Member(member);
+			memberMap.put(thisMember.getCurrentHeapSize(), thisMember.getMember());
+		}
+		for(Map.Entry<Long, String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberHeapUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberHeapUsage = PulseTestData.Topology.heapUsagePaintStyleM1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberHeapUsage = PulseTestData.Topology.heapUsagePaintStyleM2;
+			}else{
+				refMemberHeapUsage = PulseTestData.Topology.heapUsagePaintStyleM3;
+			}
+			assertTrue(findElementById(entry.getValue()).getAttribute("style").contains(refMemberHeapUsage));
+	    }
+	}
+
+	public void assertMemberSortingBySGCpuUsage(){
+		Map<Double, String> memberMap = new TreeMap<>(Collections.reverseOrder());
+		String [] membersNames = splitString(JMXProperties.getInstance().getProperty("members"), " ");
+		for (String member : membersNames) {
+			Member thisMember = new Member(member);
+			memberMap.put(thisMember.getCpuUsage(), thisMember.getMember());
+		}
+		for(Map.Entry<Double,String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberCPUUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberCPUUsage = PulseTestData.Topology.cpuUsagePaintStyleM1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberCPUUsage = PulseTestData.Topology.cpuUsagePaintStyleM2;
+			}else{
+				refMemberCPUUsage = PulseTestData.Topology.cpuUsagePaintStyleM3;
+			}
+			assertTrue(findElementById(entry.getValue()).getAttribute("style").contains(refMemberCPUUsage));
+	    }
+	}
+
+
+	public void assertMemberSortingBySgHeapUsage(){
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, HashMap<String, Member>> sgMap = new HashMap<String, HashMap<String, Member>>();
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			String[] sgs = thisMember.getGroups();
+
+			for (String sgName : sgs) {
+				HashMap<String, Member> sgMembers = sgMap.get(sgName);
+				if (sgMembers == null) {
+					sgMembers = new HashMap<String, Member>();
+					sgMap.put(sgName, sgMembers);
+				}
+				sgMembers.put(thisMember.getMember(), thisMember);
+			}
+		}
+		Map<Float, String> memberMap = new TreeMap<Float,String>(Collections.reverseOrder());
+
+		for(int sgId=1; sgId<=3; sgId++){
+			String sgName = "SG1";
+			String memName = "M" + sgId;
+			Member m = sgMap.get(sgName).get(memName);
+			memberMap.put((float) m.getCurrentHeapSize(), m.getMember());
+		}
+
+		for(Map.Entry<Float,String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberCPUUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberCPUUsage = PulseTestData.ServerGroups.heapUsagePaintStyleSG1M1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberCPUUsage = PulseTestData.ServerGroups.heapUsagePaintStyleSG1M2;
+			}else{
+				refMemberCPUUsage = PulseTestData.ServerGroups.heapUsagePaintStyleSG1M3;
+			}
+			assertTrue(findElementById("SG1(!)"+entry.getValue()).getAttribute("style").contains(refMemberCPUUsage));
+	    }
+	}
+
+
+
+	public void assertMemberSortingBySgCpuUsage(){
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, HashMap<String, Member>> sgMap = new HashMap<String, HashMap<String, Member>>();
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			String[] sgs = thisMember.getGroups();
+
+			for (String sgName : sgs) {
+				HashMap<String, Member> sgMembers = sgMap.get(sgName);
+				if (sgMembers == null) {
+					sgMembers = new HashMap<String, Member>();
+					sgMap.put(sgName, sgMembers);
+				}
+				sgMembers.put(thisMember.getMember(), thisMember);
+			}
+		}
+		Map<Double, String> memberMap = new TreeMap<>(Collections.reverseOrder());
+		//SG3(!)M3
+		for(int sgId=1; sgId<=3; sgId++){
+			String sgName = "SG1";
+			String memName = "M" + sgId;
+			Member m = sgMap.get(sgName).get(memName);
+			memberMap.put(m.getCpuUsage(), m.getMember());
+		}
+
+		for(Map.Entry<Double,String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberCPUUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberCPUUsage = PulseTestData.ServerGroups.cpuUsagePaintStyleSG1M1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberCPUUsage = PulseTestData.ServerGroups.cpuUsagePaintStyleSG1M2;
+			}else{
+				refMemberCPUUsage = PulseTestData.ServerGroups.cpuUsagePaintStyleSG1M3;
+			}
+			assertTrue(findElementById("SG1(!)"+entry.getValue()).getAttribute("style").contains(refMemberCPUUsage));
+	    }
+	}
+
+	public void assertMemberSortingByRzHeapUsage(){
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, HashMap<String, Member>> rzMap = new HashMap<String, HashMap<String, Member>>();
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			String sgName = thisMember.getRedundancyZone();
+				HashMap<String, Member> rzMembers = rzMap.get(sgName);
+
+				if (rzMembers == null) {
+					rzMembers = new HashMap<String, Member>();
+					rzMap.put(sgName, rzMembers);
+				}
+
+				rzMembers.put(thisMember.getMember(), thisMember);
+		}
+		Map<Float, String> memberMap = new TreeMap<Float,String>(Collections.reverseOrder());
+		String rzName = "RZ1 RZ2";
+		String memName = "M1" ;
+		Member m = rzMap.get(rzName).get(memName);
+		memberMap.put((float) m.getCurrentHeapSize(), m.getMember());
+
+		for(Map.Entry<Float,String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberHeapUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberHeapUsage = PulseTestData.RedundancyZone.heapUsagePaintStyleRZ1RZ2M1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberHeapUsage = PulseTestData.RedundancyZone.heapUsagePaintStyleRZ1RZ2M2;
+			}else{
+				refMemberHeapUsage = PulseTestData.RedundancyZone.heapUsagePaintStyleRZ3M3;
+			}
+			assertTrue(findElementById("RZ1 RZ2(!)"+entry.getValue()).getAttribute("style").contains(refMemberHeapUsage));
+	    }
+	}
+
+	public void assertMemeberSortingByRzCpuUsage(){
+		String[] memberNames = JMXProperties.getInstance().getProperty("members").split(" ");
+		HashMap<String, HashMap<String, Member>> rzMap = new HashMap<String, HashMap<String, Member>>();
+		for (String member : memberNames) {
+			Member thisMember = new Member(member);
+			String sgName = thisMember.getRedundancyZone();
+				HashMap<String, Member> rzMembers = rzMap.get(sgName);
+
+				if (rzMembers == null) {
+					rzMembers = new HashMap<String, Member>();
+					rzMap.put(sgName, rzMembers);
+				}
+
+				rzMembers.put(thisMember.getMember(), thisMember);
+		}
+		Map<Double, String> memberMap = new TreeMap<>(Collections.reverseOrder());
+		String rzName = "RZ1 RZ2";
+		String memName = "M1" ;
+		Member m = rzMap.get(rzName).get(memName);
+		memberMap.put(m.getCpuUsage(), m.getMember());
+
+		for(Map.Entry<Double,String> entry : memberMap.entrySet()) {
+			//here matching painting style to validation that the members are painted according to their cpu usage
+			String refMemberCPUUsage = null;
+			if(entry.getValue().equalsIgnoreCase("M1")){
+				refMemberCPUUsage = PulseTestData.RedundancyZone.cpuUsagePaintStyleRZ1RZ2M1;
+			}else if(entry.getValue().equalsIgnoreCase("M2")){
+				refMemberCPUUsage = PulseTestData.RedundancyZone.cpuUsagePaintStyleRZ1RZ2M2;
+			}
+			assertTrue(findElementById("RZ1 RZ2(!)"+entry.getValue()).getAttribute("style").contains(refMemberCPUUsage));
+	    }
+	}
+
+	public List<WebElement> getRegionsFromDataBrowser(){
+		List<WebElement> regionList = driver.findElements(By.xpath("//span[starts-with(@ID,'treeDemo_')][contains(@id,'_span')]"));
+		return regionList;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseNoAuthTest.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseNoAuthTest.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseNoAuthTest.java
new file mode 100644
index 0000000..e1021df
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseNoAuthTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.tests;
+
+import org.apache.geode.test.junit.categories.UITest;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.experimental.categories.Category;
+import org.junit.runners.MethodSorters;
+
+@Category(UITest.class)
+@FixMethodOrder(MethodSorters.JVM)
+public class PulseNoAuthTest extends PulseAbstractTest {
+
+  @BeforeClass
+  public static void beforeClassSetup() throws Exception {
+    setUpServer("admin", "admin", null);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestData.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestData.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestData.java
new file mode 100644
index 0000000..e299786
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestData.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * 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.tests;
+
+public class PulseTestData {
+	
+	public static class TopNavigation{
+
+	}
+	
+	public static class ClusterStatus {
+
+		public static final String membersProperty = "members";
+	}
+	public static class Topology{
+		public static final String hotSpotHeapLbl = "Heap Usage";
+		public static final String hotSpotCPULbl = "CPU Usage";		
+		
+		public static final String cpuUsagePaintStyleM1 = "left: 497px; top: 0px;";
+		public static final String cpuUsagePaintStyleM2 = "left: 0px; top: 0px;";
+		public static final String cpuUsagePaintStyleM3 = "left: 265px; top: 0px;";		
+		
+		public static final String heapUsagePaintStyleM1 = "left: 0px; top: 0px;";
+		public static final String heapUsagePaintStyleM2 = "left: 559px; top: 0px;";
+		public static final String heapUsagePaintStyleM3 = "left: 280px; top: 0px;";
+	}
+	
+	public static class ServerGroups{
+		public static final String hotSpotHeapLbl = "Heap Usage";
+		public static final String hotSpotCPULbl = "CPU Usage";
+		
+		//Cpu Usage sorting
+//		public static final String cpuUsagePaintStyleM1 = "left: 497px; top: 0px;";
+//		public static final String cpuUsagePaintStyleM2 = "left: 0px; top: 0px;";
+//		public static final String cpuUsagePaintStyleM3 = "left: 265px; top: 0px;";		
+		
+		public static final String cpuUsagePaintStyleSG1M1 = "left: 0px; top: 295px;";
+		public static final String cpuUsagePaintStyleSG1M2 = "left: 0px; top: 30px;";
+		public static final String cpuUsagePaintStyleSG1M3 = "left: 0px; top: 171px;";
+		
+		public static final String cpuUsagePaintStyleSG2M1 = "left: 240px; top: 239px;";
+		public static final String cpuUsagePaintStyleSG2M2 = "left: 240px; top: 30px;";	
+		
+		public static final String cpuUsagePaintStyleSG3M3 = "left: 479px; top: 30px;"; 
+		
+		//heap usage sorting
+		public static final String heapUsagePaintStyleSG1M1 = "left: 0px; top: 30px;";
+		public static final String heapUsagePaintStyleSG1M2 = "left: 152px; top: 179px;";
+		public static final String heapUsagePaintStyleSG1M3 = "left: 0px; top: 179px;";
+		
+		public static final String heapUsagePaintStyleSG2M1 = "left: 240px; top: 30px;";
+		public static final String heapUsagePaintStyleSG2M2 = "left: 240px; top: 274px;";	
+		
+		public static final String heapUsagePaintStyleSG3M3 = "left: 479px; top: 30px;"; 
+	}
+	
+	public static class RedundancyZone{
+		
+		public static final String hotSpotHeapLbl = "Heap Usage";
+		public static final String hotSpotCPULbl = "CPU Usage";
+		
+		public static final String heapUsagePaintStyleRZ1RZ2M1 = "left: 0px; top: 30px;";
+		public static final String heapUsagePaintStyleRZ1RZ2M2 = "left: 0px; top: 274px;";
+		
+		public static final String heapUsagePaintStyleRZ3M3 = "left: 360px; top: 30px;";	
+		
+		public static final String cpuUsagePaintStyleRZ1RZ2M1 ="left: 0px; top: 239px;";
+		public static final String cpuUsagePaintStyleRZ1RZ2M2 ="left: 0px; top: 30px;";
+
+		
+	}
+	
+	public static class DataPerspectiveView {
+		
+	}
+
+	public static class DataBrowser {
+		public static final String partialRgnName = "R";
+		public static final String chkRgnClassName = "bttn chk checkbox_true_full";
+		public static final String notChkRgnClassName = "bttn chk checkbox_false_full";
+		
+		public static final String regName = "R1";
+		public static final String query1Text = "select * from /R1";
+		
+		public static final String datePattern = "EEE, MMM dd yyyy, HH:mm:ss z";		
+
+	}
+
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestLocators.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestLocators.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestLocators.java
new file mode 100644
index 0000000..6e76218
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/PulseTestLocators.java
@@ -0,0 +1,225 @@
+/*
+ *
+ * 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.tests;
+
+public class PulseTestLocators {
+	public static class HtmlAttributes{
+		public static final String classAttribute = "class";
+		public static final String typeAttribute = "type";
+		public static final String idAttribute = "id";
+		public static final String nameAttribute = "name";
+		public static final String placeholderAttribute = "placeholder";
+		public static final String valueAttribute = "value";	
+		public static final String styleAttribute ="style";
+	}
+	
+	public static class TopNavigation {
+		public static final String clusterViewLinkXpath = "//a[text()='Cluster View']";
+	}
+
+	public static class ClusterStatus {
+
+	}
+
+	public static class MemberDetailsView {
+    public static final String gridButtonXpath = "//a[@id='btngridIcon']";
+  }
+
+  public static class TopologyView {
+
+		public static final String radioButtonId = "radio-default";
+		public static final String radioButtonXpath = "//label[text()='Topology']";
+		public static final String gridButtonId = "default_grid_button";
+		public static final String nodeH1Id = "h1";
+		public static final String nodeH2Id = "h2";
+		public static final String nodeH3Id = "h3";
+		public static final String memberM1Id = "M1";
+		public static final String memberM2Id = "M2";
+		public static final String memberM3Id = "M3";
+		public static final String treeMapButtonId = "default_treemap_button";
+		
+		// Host tootips
+		public static final String hostNameTTXpath = ".//*[@id='_tooltip']/div/div/div[1]";
+		public static final String cpuUsageTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[1]/div[2]/div";
+		public static final String memoryUsageTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[2]/div[2]/div";
+		public static final String loadAvgTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[3]/div[2]/div";
+		public static final String soketsTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[4]/div[2]/div";
+		
+		// Member tooltips
+		public static final String memNameTTXpath = ".//*[@id='_tooltip']/div/div/div[1]";
+		public static final String memCpuUsageTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[1]/div[2]/div";
+		public static final String threadsTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[2]/div[2]/div/text()";
+		public static final String jvmPausesTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[3]/div[2]/div";
+		public static final String regionsTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[4]/div[2]/div";
+		public static final String clientsTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[5]/div[2]/div";
+		public static final String gatewaySenderTtXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[6]/div[2]/div";
+		public static final String portTTXpath = ".//*[@id='_tooltip']/div/div/div[2]/div[7]/div[2]/div";
+
+		// Grid view
+		public static final String idM1Xpath = ".//*[@id='M1&M1']/td[1]";
+		public static final String nameM1Xpath = ".//*[@id='M1&M1']/td[2]";
+		public static final String hostH1Xpath = ".//*[@id='M1&M1']/td[3]";
+		public static final String idM2Xpath = ".//*[@id='M2&M2']/td[1]";
+		public static final String nameM2Xpath = ".//*[@id='M2&M2']/td[2]";
+		public static final String hostH2Xpath = ".//*[@id='M2&M2']/td[3]";
+		public static final String idM3Xpath = ".//*[@id='M3&M3']/td[1]";
+		public static final String nameM3Xpath = ".//*[@id='M3&M3']/td[2]";
+		public static final String hostH3Xpath = ".//*[@id='M3&M3']/td[3]";
+
+		// HotSpot locators 
+		public static final String hotSpotId = "currentHotSpot";
+		public static final String hotspotListDivId = "hotspotList";
+		public static final String heapUsageXpath = "//a[text()='Heap Usage']";
+		public static final String cpuUsageXpath = "//a[text()='CPU Usage']";
+		public static final String graphTreeMapLblId = "//div[@id='GraphTreeMap-label']/child::node()";
+
+    }
+
+	public static class ServerGroups {
+
+		public static final String radioButtonId = "radio-servergroups";
+		public static final String radioButtonXpath = "//label[text()='Server Groups']";
+		public static final String gridButtonId = "servergroups_grid_button";
+		public static final String gridBlockId = "servergroups_grid_block";
+
+		public static final String serverGrpsRadioId = "member_view_option_servergroups";
+		
+		public static final String serverGrpsRadioXpath = "//label[@for='radio-servergroups']";
+
+		public static final String serverGrp1Id = "SG1";
+		public static final String serverGrp2Id = "SG2";
+		public static final String serverGrp3Id = "SG3";
+
+		public static final String serverGrp1Xpath = ".//*[@id='SG1']/div";
+		public static final String serverGrp2Xpath = ".//*[@id='SG2']/div";
+		public static final String serverGrp3Xpath = ".//*[@id='SG3']/div";
+
+		public static final String sg1M1Id = "SG1(!)M1";
+		public static final String sg1M2Id = "SG1(!)M2";
+		public static final String sg1M3Id = "SG1(!)M3";
+		public static final String sg2M1Id = "SG2(!)M1";
+		public static final String sg2M2Id = "SG2(!)M2";
+		public static final String sg3M3Id = "SG3(!)M3";
+
+		// Grid view
+		public static final String idSG1M3Xpath = ".//*[@id='M3&M3']/td[2]";
+		public static final String idSG1M2Xpath = ".//*[@id='M2&M2']/td[2]";
+		public static final String idSG1M1Xpath = ".//*[@id='M1&M1']/td[2]";
+		public static final String nameM3Xpath = ".//*[@id='M3&M3']/td[3]";
+		public static final String nameM2Xpath = ".//*[@id='M2&M2']/td[3]";
+		public static final String nameM1Xpath = ".//*[@id='M1&M1']/td[3]";
+		
+		//HotSpot locators
+		public static final String hotSpotId = "currentHotSpot";
+		public static final String hotspotListDivId= "hotspotList";
+		public static final String heapUsageXpath= "//a[text()='Heap Usage']";
+		public static final String cpuUsageXpath= "//a[text()='CPU Usage']";
+		public static final String graphTreeMapLblId = "//div[@id='GraphTreeMap-label']/child::node()";		
+		
+	}
+
+	public static class RedundancyZone {
+
+		public static final String radioButtonId = "radio-redundancyzones";
+		public static final String radioButtonXpathAlt = "//label[text()='Redundancy Zones']";		
+		public static final String radioButtonXpath = "//label[@for='radio-redundancyzones']";
+		
+		public static final String gridButtonId = "redundancyzones_grid_button";
+
+		public static final String zoneRZ1Id = "RZ1 RZ2";
+		public static final String zoneRZ2Id = "RZ2";
+		
+
+		public static final String zoneRZ1RZ2Xpath = ".//*[@id='RZ1 RZ2']/div";
+		public static final String zoneRZ2Xpath = ".//*[@id='RZ2']/div";
+
+		public static final String m1RZ1RZ2Id = "RZ1 RZ2(!)M1";
+		public static final String m2RZ1Id = "RZ1 RZ2(!)M2";
+		public static final String m3RZ2Id = "RZ2(!)M3";
+//		public static final String m3RZ2Id = "RZ2(!)M3";
+//		public static final String m2RZ2Id = "RZ2(!)M2";
+		// Grid
+		public static final String idM2Xpath = ".//*[@id='M2&M2']/td[2]";
+		public static final String idM1Xpath = ".//*[@id='M1&M1']/td[2]";
+		public static final String idM3Xpath = ".//*[@id='M3&M3']/td[2]";
+		
+		//HotSpot locators
+		public static final String hotSpotId = "currentHotSpot";
+		public static final String hotspotListDivId= "hotspotList";
+		public static final String heapUsageXpath= "//a[text()='Heap Usage']";
+		public static final String cpuUsageXpath= "//a[text()='CPU Usage']";
+		public static final String graphTreeMapLblId = "//div[@id='GraphTreeMap-label']/child::node()";
+	}
+
+	public static class DataPerspectiveView {
+		public static final String downarrowButtonXpath = "//a[text()='Members']";
+		public static final String dataViewButtonXpath = "//a[text()='Data']";
+		public static final String gridButtonId = "data_grid_button";
+	}
+
+	public static class RegionDetailsView {
+
+		public static final String regionNameDivId = "regionNameText";
+		public static final String regionPathId = "regionPath";
+		public static final String treeMapCanvasXpath = "//canvas[@id='GraphTreeMapClusterData-canvas']";
+		public static final String regionTypeId = "regionType";
+		public static final String regionMembersTextId = "regionMembersText";
+		public static final String regionEmptyNodesId = "regionEmptyNodes";
+		public static final String regionEntryCountTextId = "regionEntryCountText";
+		public static final String regionDiskUsageId = "regionDiskUsage";
+		public static final String regionPersistenceId = "regionPersistence";
+
+		public static final String gridButtonXpath = "//a[@id='btngridIcon']";
+		public static final String memoryUsedId = "memoryUsed";
+		public static final String totalMemoryId = "totalMemory";
+
+		public static final String inMemoryReadsId = "currentReadsPerSec";
+		public static final String inMemoryWritesId = "currentWritesPerSec";
+		public static final String diskReadsId = "currentDiskReadsPerSec";
+		public static final String diskWritesId = "currentDiskWritesPerSec";
+
+		public static final String memberNameId = "memberName";
+
+	}
+
+	public static class DataBrowser {
+		public static final String rgnFilterTxtBoxId = "filterTextRegion";
+		public static final String rgnNameSpanXpath = "//span[starts-with(@ID,'treeDemo_')][contains(@id,'_span')]";
+		public static final String rgnNameTxtBoxXpath = "//span[starts-with(@ID,'treeDemo_')][contains(@id,'_span')]";
+		public static final String rgnSpanFirstPart = "//span[@id='treeDemo_";
+		public static final String rgnSpanSecondPart = "_span']";
+		public static final String rgn1ChkBoxId = "treeDemo_1_check";
+		public static final String queryEditorTxtBoxId = "dataBrowserQueryText";
+		public static final String btnExecuteQueryId = "btnExecuteQuery";
+		
+		public static final String divDataRegions = "//div/ul[@id='treeDemo']/li";
+		
+		// History section		
+		public static final String historyIcon = "historyIcon";
+		public static final String historyLst = "//div[@id='detailsHistoryList']/div/div";
+		public static final String queryText = ".wrapHistoryContent";
+		public static final String historyDateTime = ".dateTimeHistory";
+		
+		//Clear button 
+		
+		public static final String btnClearXpath = "//input[@value='Clear']";
+
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Region.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Region.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Region.java
new file mode 100644
index 0000000..1c1ef9f
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Region.java
@@ -0,0 +1,187 @@
+/*
+ *
+ * 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.tests;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+
+public class Region extends JMXBaseBean implements RegionMBean {
+  private String name = null;
+
+  private static String[] regAttItemNames = { "compressionCodec",
+    "enableOffHeapMemory", "scope", "diskStoreName",
+    "diskSynchronous" };
+  private static String[] regAttItemDescriptions = { "compressionCodec",
+    "enableOffHeapMemory", "scope", "diskStoreName",
+    "diskSynchronous" };
+  private static OpenType[] regAttItemTypes = { SimpleType.STRING,
+    SimpleType.BOOLEAN, SimpleType.STRING,
+    SimpleType.STRING, SimpleType.BOOLEAN };
+  private static CompositeType listRegionAttributesCompData = null;
+
+  static {
+    try {
+      listRegionAttributesCompData = new CompositeType("listRegionAttributes",
+          "Regions attributes", regAttItemNames, regAttItemDescriptions,
+          regAttItemTypes);
+
+    } catch (OpenDataException e) {
+      e.printStackTrace();
+    }
+  }
+
+  public Region(String name) {
+    this.name = name;
+  }
+
+  protected String getKey(String propName) {
+    return "region." + name + "." + propName;
+  }
+
+  @Override
+  public String[] getMembers() {
+    return getStringArray("members");
+  }
+
+  @Override
+  public String getFullPath() {
+    return getString("fullPath");
+  }
+
+  @Override
+  public double getDiskReadsRate() {
+    return getDouble("diskReadsRate");
+  }
+
+  @Override
+  public double getDiskWritesRate() {
+    return getDouble("diskWritesRate");
+  }
+
+  @Override
+  public int getEmptyNodes() {
+    return getInt("emptyNodes");
+  }
+
+  @Override
+  public double getGetsRate() {
+    return getDouble("getsRate");
+  }
+
+  @Override
+  public double getLruEvictionRate() {
+    return getDouble("lruEvictionRate");
+  }
+
+  @Override
+  public double getPutsRate() {
+    return getDouble("putsRate");
+  }
+
+  @Override
+  public String getRegionType() {
+    return getString("regionType");
+  }
+
+  @Override
+  public long getEntrySize() {
+    return getLong("entrySize");
+  }
+
+  @Override
+  public long getSystemRegionEntryCount() {
+    return getLong("systemRegionEntryCount");
+  }
+
+  @Override
+  public int getMemberCount() {
+    return getInt("memberCount");
+  }
+
+  @Override
+  public boolean getPersistentEnabled() {
+    return getBoolean("persistentEnabled");
+  }
+
+  @Override
+  public String getName() {
+    return getString("name");
+  }
+
+  @Override
+  public boolean getGatewayEnabled() {
+    return getBoolean("gatewayEnabled");
+  }
+
+  @Override
+  public long getDiskUsage() {
+    return getLong("diskUsage");
+  }
+
+  @Override
+  public CompositeData listRegionAttributes() {
+    String value = JMXProperties.getInstance().getProperty(
+        getKey("listRegionAttributes"), "");
+    String[] itemValues = value.split(",");
+    Map<String, Object> itemValuesHM = new HashMap<String, Object>();
+    
+    // compressionCodec
+    if (null != itemValues[0]) {
+      itemValuesHM.put(regAttItemNames[0], itemValues[0]);
+    }
+
+    // enableOffHeapMemory
+    if (null != itemValues[1]) {
+      itemValuesHM.put(regAttItemNames[1], Boolean.parseBoolean(itemValues[1]));
+    }
+
+    // scope
+    if (null != itemValues[3]) {
+      itemValuesHM.put(regAttItemNames[3], itemValues[3]);
+    }
+
+    // diskStoreName
+    if (null != itemValues[4]) {
+      itemValuesHM.put(regAttItemNames[4], itemValues[4]);
+    }
+
+    // diskSynchronous
+    if (null != itemValues[5]) {
+      itemValuesHM.put(regAttItemNames[5], Boolean.parseBoolean(itemValues[5]));
+    }
+
+    CompositeData lraCompData;
+    try {
+      lraCompData = new CompositeDataSupport(listRegionAttributesCompData,
+          itemValuesHM);
+    } catch (OpenDataException e) {
+      e.printStackTrace();
+      lraCompData = null;
+    }
+    return lraCompData;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionMBean.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionMBean.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionMBean.java
new file mode 100644
index 0000000..c0a32e6
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionMBean.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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.tests;
+
+import javax.management.openmbean.CompositeData;
+
+public interface RegionMBean {
+  String OBJECT_NAME = "GemFire:service=Region,type=Distributed";
+
+  String[] getMembers();
+
+  String getFullPath();
+
+  double getDiskReadsRate();
+
+  double getDiskWritesRate();
+
+  int getEmptyNodes();
+
+  double getGetsRate();
+
+  double getLruEvictionRate();
+
+  double getPutsRate();
+
+  String getRegionType();
+
+  long getEntrySize();
+
+  long getSystemRegionEntryCount();
+
+  int getMemberCount();
+
+  boolean getPersistentEnabled();
+
+  String getName();
+
+  boolean getGatewayEnabled();
+
+  long getDiskUsage();
+
+  CompositeData listRegionAttributes();
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMember.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMember.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMember.java
new file mode 100644
index 0000000..18259f1
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMember.java
@@ -0,0 +1,95 @@
+/*
+ *
+ * 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.tests;
+
+/**
+ * Region on member mbean
+ *
+ *
+ *
+ */
+public class RegionOnMember extends JMXBaseBean implements RegionOnMemberMBean {
+  private String fullPath = null;
+  private String member = null;
+
+  public RegionOnMember(String fullPath, String member) {
+    this.fullPath = fullPath;
+    this.member = member;
+  }
+
+  @Override
+  protected String getKey(String propName) {
+    return "regionOnMember." + fullPath + "." + member + "." + propName;
+  }
+
+  @Override
+  public String getFullPath(){
+    return this.fullPath;
+  }
+
+  @Override
+  public String getMember(){
+    return this.member;
+  }
+
+  @Override
+  public String getName(){
+    return getString("name");
+  }
+
+  @Override
+  public String getRegionType(){
+    return getString("regionType");
+  }
+
+  @Override
+  public long getEntrySize(){
+    return getLong("entrySize");
+  }
+
+  @Override
+  public long getEntryCount(){
+    return getLong("entryCount");
+  }
+
+  @Override
+  public double getGetsRate(){
+    return getDouble("getsRate");
+  }
+
+  @Override
+  public double getPutsRate(){
+    return getDouble("putsRate");
+  }
+
+  @Override
+  public double getDiskReadsRate(){
+    return getDouble("diskGetsRate");
+  }
+
+  @Override
+  public double getDiskWritesRate(){
+    return getDouble("diskPutsRate");
+  }
+
+  @Override
+  public int getLocalMaxMemory(){
+    return getInt("localMaxMemory");
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMemberMBean.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMemberMBean.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMemberMBean.java
new file mode 100644
index 0000000..c63eb33
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/RegionOnMemberMBean.java
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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.tests;
+
+/**
+ * Region on members mbean
+ *
+ *
+ */
+public interface RegionOnMemberMBean {
+
+  String getName();
+
+  String getRegionType(); // Ideally should be an Enum
+
+  String getFullPath();
+
+  String getMember();
+
+  long getEntrySize();
+
+  long getEntryCount();
+
+  double getGetsRate();
+
+  double getPutsRate();
+
+  double getDiskReadsRate();
+
+  double getDiskWritesRate();
+
+  int getLocalMaxMemory();
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Server.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Server.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Server.java
new file mode 100644
index 0000000..ecf15eb
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/Server.java
@@ -0,0 +1,247 @@
+/*
+ *
+ * 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.tests;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXConnectorServerFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.apache.geode.tools.pulse.internal.data.PulseConstants;
+import org.apache.geode.security.templates.SampleSecurityManager;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.mgt.DefaultSecurityManager;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.realm.Realm;
+
+import org.apache.geode.internal.security.shiro.CustomAuthRealm;
+import org.apache.geode.internal.security.shiro.JMXShiroAuthenticator;
+import org.apache.geode.management.internal.security.AccessControlMBean;
+import org.apache.geode.management.internal.security.MBeanServerWrapper;
+import org.apache.geode.management.internal.security.ResourceConstants;
+
+public class Server {
+
+  private static final String DEFAULT_HOST = "127.0.0.1"; //"localhost"
+  private static final int DEFAULT_PORT = 9999;
+  private final JMXServiceURL url;
+  private MBeanServer mbs;
+  private JMXConnectorServer cs;
+  private String propFile = null;
+
+  public Server(int port, String properties, String jsonAuthFile) throws Exception {
+    this.propFile = properties;
+    mbs = ManagementFactory.getPlatformMBeanServer();
+    url = new JMXServiceURL(formJMXServiceURLString(DEFAULT_HOST, port));
+
+    // Load the beans first, otherwise we get access denied
+    loadMBeans();
+
+    if (jsonAuthFile != null) {
+      System.setProperty("spring.profiles.active", "pulse.authentication.gemfire");
+
+      Map<String, Object> env = new HashMap<String, Object>();
+
+      // set up Shiro Security Manager
+      Properties securityProperties = new Properties();
+      securityProperties.setProperty(SampleSecurityManager.SECURITY_JSON, jsonAuthFile);
+      Realm realm = new CustomAuthRealm(SampleSecurityManager.class.getName(), securityProperties);
+      SecurityManager securityManager = new DefaultSecurityManager(realm);
+      SecurityUtils.setSecurityManager(securityManager);
+
+      // register the AccessControll bean
+      AccessControlMBean acc = new AccessControlMBean();
+      ObjectName accessControlMBeanON = new ObjectName(ResourceConstants.OBJECT_NAME_ACCESSCONTROL);
+      MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+      platformMBeanServer.registerMBean(acc, accessControlMBeanON);
+
+      // wire in the authenticator and authorizaton
+      JMXShiroAuthenticator interceptor = new JMXShiroAuthenticator();
+      env.put(JMXConnectorServer.AUTHENTICATOR, interceptor);
+      cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
+      cs.setMBeanServerForwarder(new MBeanServerWrapper());
+
+      //set up the AccessControlMXBean
+
+    } else {
+      System.setProperty("spring.profiles.active", "pulse.authentication.default");
+      cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
+    }
+
+    try {
+      java.rmi.registry.LocateRegistry.createRegistry(port);
+      System.out.println("RMI registry ready.");
+    } catch (Exception e) {
+      System.out.println("Exception starting RMI registry:");
+      e.printStackTrace();
+    }
+
+    cs.start();
+  }
+
+  private String formJMXServiceURLString(String host, int port) throws UnknownHostException {
+    String jmxSerURL = "";
+
+    InetAddress inetAddr = InetAddress.getByName(host);
+    if (inetAddr instanceof Inet4Address) {
+      // Create jmx service url for IPv4 address
+      jmxSerURL = "service:jmx:rmi://" + host + "/jndi/rmi://" + host + ":" + port + "/jmxrmi";
+    } else if (inetAddr instanceof Inet6Address) {
+      // Create jmx service url for IPv6 address
+      jmxSerURL = "service:jmx:rmi://[" + host + "]/jndi/rmi://[" + host + "]:" + port + "/jmxrmi";
+    }
+
+    return jmxSerURL;
+  }
+
+  public void stop() {
+    try {
+      cs.stop();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+
+  private synchronized void loadMBeans() {
+    JMXProperties props = JMXProperties.getInstance();
+    try {
+      props.load(propFile);
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+    // Add servers
+    String[] servers = getArrayProperty(props, "servers");
+    for (String server : servers) {
+      try {
+        addServerMBean(server);
+      } catch (InstanceAlreadyExistsException e) {
+        e.printStackTrace();
+      } catch (MBeanRegistrationException e) {
+        e.printStackTrace();
+      } catch (NotCompliantMBeanException e) {
+        e.printStackTrace();
+      } catch (MalformedObjectNameException e) {
+        e.printStackTrace();
+      } catch (NullPointerException e) {
+        e.printStackTrace();
+      }
+    }
+
+    // Add members
+    String[] members = getArrayProperty(props, "members");
+    for (String m : members) {
+      try {
+        addMemberMBean(m);
+      } catch (InstanceAlreadyExistsException e) {
+        e.printStackTrace();
+      } catch (MBeanRegistrationException e) {
+        e.printStackTrace();
+      } catch (NotCompliantMBeanException e) {
+        e.printStackTrace();
+      } catch (MalformedObjectNameException e) {
+        e.printStackTrace();
+      } catch (NullPointerException e) {
+        e.printStackTrace();
+      }
+    }
+
+    // Add regions
+    String[] regions = getArrayProperty(props, "regions");
+    for (String reg : regions) {
+      try {
+        addRegionMBean(reg);
+      } catch (InstanceAlreadyExistsException e) {
+        e.printStackTrace();
+      } catch (MBeanRegistrationException e) {
+        e.printStackTrace();
+      } catch (NotCompliantMBeanException e) {
+        e.printStackTrace();
+      } catch (MalformedObjectNameException e) {
+        e.printStackTrace();
+      } catch (NullPointerException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  private void addMemberMBean(
+      String m) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException, NullPointerException {
+    Member m1 = new Member(m);
+    mbs.registerMBean(m1, new ObjectName(Member.OBJECT_NAME + ",member=" + m));
+  }
+
+  // For GemFire XD
+  private void addGemFireXDMemberMBean(
+      String xdm) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException, NullPointerException {
+    GemFireXDMember xdmo = new GemFireXDMember(xdm);
+    mbs.registerMBean(xdmo, new ObjectName(GemFireXDMember.OBJECT_NAME + ",member=" + xdm));
+  }
+
+  private void addRegionMBean(
+      String reg) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException, NullPointerException {
+    Region regionObject = new Region(reg);
+    mbs.registerMBean(regionObject, new ObjectName(Region.OBJECT_NAME + ",name=/" + reg));
+
+    for (String member : regionObject.getMembers()) {
+      RegionOnMember regionOnMemberObject = new RegionOnMember(regionObject.getFullPath(), member);
+      mbs.registerMBean(regionOnMemberObject, new ObjectName(
+          PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_REGION + regionObject.getFullPath() + PulseConstants.OBJECT_NAME_REGION_ON_MEMBER_MEMBER + member));
+    }
+  }
+
+  private void addServerMBean(
+      String server) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException, NullPointerException {
+    ServerObject so = new ServerObject(server);
+    mbs.registerMBean(so, new ObjectName(ServerObject.OBJECT_NAME));
+  }
+
+  private String[] getArrayProperty(JMXProperties props, String propName) {
+    String propVal = props.getProperty(propName, "");
+    return propVal.split(" ");
+  }
+
+  public static Server createServer(int port, String properties, String jsonAuthFile)
+      throws MalformedObjectNameException {
+    Server s = null;
+    try {
+      s = new Server(port, properties, jsonAuthFile);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+
+    return s;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObject.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObject.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObject.java
new file mode 100644
index 0000000..11afb70
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObject.java
@@ -0,0 +1,267 @@
+/*
+ *
+ * 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.tests;
+
+import java.io.IOException;
+
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
+public class ServerObject extends NotificationBroadcasterSupport implements
+    ServerObjectMBean {
+  private String name = null;
+
+  private TabularDataSupport wanInfo;
+  private static String[] itemNames = { "key", "value" };
+  private static String[] itemDescriptions = { "Key", "Value" };
+  private static OpenType[] itemTypes = { SimpleType.STRING, SimpleType.BOOLEAN };
+  private static CompositeType wanInfoType = null;
+
+  private static String[] indexNames = { "key" };
+  private static TabularType wanType = null;
+
+  static {
+    try {
+      wanInfoType = new CompositeType("wanInfo", "WAN Information", itemNames,
+          itemDescriptions, itemTypes);
+
+      wanType = new TabularType("wanInfo", "WAN Information", wanInfoType,
+          indexNames);
+
+    } catch (OpenDataException e) {
+      e.printStackTrace();
+    }
+  }
+
+  public ServerObject(String name) {
+    this.name = name;
+    this.wanInfo = new TabularDataSupport(wanType);
+  }
+
+  private String getKey(String propName) {
+    return "server." + name + "." + propName;
+  }
+
+  @Override
+  public String[] listCacheServers() {
+    return JMXProperties.getInstance()
+        .getProperty(getKey("listCacheServers"), "").split(" ");
+  }
+
+  @Override
+  public String[] listServers() {
+    return JMXProperties.getInstance()
+            .getProperty(getKey("listServers"), "").split(" ");
+  }
+
+  @Override
+  public TabularData viewRemoteClusterStatus() {
+    wanInfo.clear();
+    String[] wan = JMXProperties.getInstance()
+        .getProperty(getKey("wanInfo"), "").split(" ");
+    int cnt = 0;
+    while (wan.length >= (cnt + 2)) {
+      try {
+        wanInfo.put(buildWanInfoType(new String(wan[cnt]),
+            Boolean.parseBoolean(wan[cnt + 1])));
+      } catch (OpenDataException e) {
+        e.printStackTrace();
+      }
+      cnt += 2;
+    }
+
+    return (TabularData) wanInfo.clone();
+  }
+
+  @Override
+  public int getMemberCount() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("memberCount")));
+  }
+
+  @Override
+  public int getNumClients() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("numClients")));
+  }
+
+  @Override
+  public int getDistributedSystemId() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("distributedSystemId")));
+  }
+
+  @Override
+  public int getLocatorCount() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("locatorCount")));
+  }
+
+  @Override
+  public int getTotalRegionCount() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("totalRegionCount")));
+  }
+
+  @Override
+  public int getNumRunningFunctions() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("numRunningFunctions")));
+  }
+
+  @Override
+  public long getRegisteredCQCount() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("registeredCQCount")));
+  }
+
+  @Override
+  public int getNumSubscriptions() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("numSubscriptions")));
+  }
+
+  // For SQLFire/GemFireXD
+  @Override
+  public int getTransactionCommitted() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("TransactionCommitted")));
+  }
+
+  // For SQLFire/GemFireXD
+  @Override
+  public int getTransactionRolledBack() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("TransactionRolledBack")));
+  }
+
+  @Override
+  public long getTotalHeapSize() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("totalHeapSize")));
+  }
+
+  @Override
+  public long getUsedHeapSize() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("usedHeapSize")));
+  }
+
+  @Override
+  public long getMaxMemory() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("MaxMemory")));
+  }
+
+  @Override
+  public long getUsedMemory() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("UsedMemory")));
+  }
+
+  @Override
+  public long getTotalRegionEntryCount() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("totalRegionEntryCount")));
+  }
+
+  @Override
+  public int getCurrentQueryCount() {
+    return Integer.parseInt(JMXProperties.getInstance().getProperty(
+        getKey("currentQueryCount")));
+  }
+
+  @Override
+  public long getTotalDiskUsage() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("totalDiskUsage")));
+  }
+
+  @Override
+  public double getDiskWritesRate() {
+    return Double.parseDouble(JMXProperties.getInstance().getProperty(
+        getKey("diskWritesRate")));
+  }
+
+  @Override
+  public double getAverageWrites() {
+    String val = JMXProperties.getInstance().getProperty(getKey("averageWrites"), "");
+    double ret = Double.parseDouble(val);
+    return ret;
+//    return Double.parseDouble(JMXProperties.getInstance().getProperty(
+//        getKey("averageWrites"), ""));
+  }
+
+  @Override
+  public double getAverageReads() {
+    return Double.parseDouble(JMXProperties.getInstance().getProperty(
+        getKey("averageReads"), ""));
+  }
+
+  @Override
+  public double getQueryRequestRate() {
+    return Double.parseDouble(JMXProperties.getInstance().getProperty(
+        getKey("queryRequestRate"), ""));
+  }
+
+  @Override
+  public double getDiskReadsRate() {
+    return Double.parseDouble(JMXProperties.getInstance().getProperty(
+        getKey("diskReadsRate"), ""));
+  }
+
+  @Override
+  public long getJVMPauses() {
+    return Long.parseLong(JMXProperties.getInstance().getProperty(
+        getKey("jvmPauses"), ""));
+  }
+
+  private CompositeData buildWanInfoType(String key, Boolean state)
+      throws OpenDataException {
+    Object[] itemValues = { key, state };
+    CompositeData result = new CompositeDataSupport(wanInfoType, itemNames,
+        itemValues);
+
+    return result;
+  }
+
+  @Override
+  public String queryData(String p0, String p1, int p2) {
+    // p0 : query
+    // p1 : comma separated members
+    // p2 : limit
+    
+    DataBrowserResultLoader dbrLoader = DataBrowserResultLoader.getInstance();
+    
+    try {
+      return dbrLoader.load(p0);
+    } catch (IOException e) {
+      e.printStackTrace();
+      return e.getMessage();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/eff7f216/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObjectMBean.java
----------------------------------------------------------------------
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObjectMBean.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObjectMBean.java
new file mode 100644
index 0000000..46ad620
--- /dev/null
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ServerObjectMBean.java
@@ -0,0 +1,79 @@
+/*
+ *
+ * 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.tests;
+
+import javax.management.openmbean.TabularData;
+
+public interface ServerObjectMBean {
+  String OBJECT_NAME = "GemFire:service=System,type=Distributed";
+
+  TabularData viewRemoteClusterStatus();
+
+  int getMemberCount();
+
+  int getNumClients();
+
+  int getDistributedSystemId();
+
+  int getLocatorCount();
+
+  int getTotalRegionCount();
+
+  int getNumRunningFunctions();
+
+  long getRegisteredCQCount();
+
+  int getNumSubscriptions();
+
+  int getTransactionCommitted();
+
+  int getTransactionRolledBack();
+
+  long getTotalHeapSize();
+
+  long getUsedHeapSize();
+
+  long getMaxMemory();
+
+  long getUsedMemory();
+
+  long getTotalRegionEntryCount();
+
+  int getCurrentQueryCount();
+
+  long getTotalDiskUsage();
+
+  double getDiskWritesRate();
+
+  double getAverageWrites();
+
+  double getAverageReads();
+
+  double getQueryRequestRate();
+
+  double getDiskReadsRate();
+
+  long getJVMPauses();
+
+  String[] listCacheServers();
+
+  String[] listServers();
+
+  String queryData(String p0, String p1, int p2);
+}