/* * 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.management.internal.cli.commands; import static org.apache.geode.distributed.ConfigurationProperties.*; import static org.apache.geode.test.dunit.Assert.*; import static org.apache.geode.test.dunit.IgnoredException.*; import static org.apache.geode.test.dunit.LogWriterUtils.*; import static org.apache.geode.test.dunit.Wait.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Random; import java.util.Set; import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.DataPolicy; import org.apache.geode.cache.PartitionAttributes; import org.apache.geode.cache.PartitionAttributesFactory; import org.apache.geode.cache.Region; import org.apache.geode.cache.RegionFactory; import org.apache.geode.cache.RegionShortcut; import org.apache.geode.cache.query.QueryInvalidException; import org.apache.geode.cache.query.data.Portfolio; import org.apache.geode.cache.query.internal.CompiledValue; import org.apache.geode.cache.query.internal.QCompiler; import org.apache.geode.distributed.DistributedMember; import org.apache.geode.internal.cache.GemFireCacheImpl; import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.DistributedRegionMXBean; import org.apache.geode.management.ManagementService; import org.apache.geode.management.ManagerMXBean; import org.apache.geode.management.MemberMXBean; import org.apache.geode.management.cli.Result; import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.HeadlessGfsh; import org.apache.geode.management.internal.cli.domain.DataCommandRequest; import org.apache.geode.management.internal.cli.dto.Car; import org.apache.geode.management.internal.cli.dto.Key1; import org.apache.geode.management.internal.cli.dto.ObjectWithCharAttr; import org.apache.geode.management.internal.cli.dto.Value1; import org.apache.geode.management.internal.cli.dto.Value2; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.json.GfJsonArray; import org.apache.geode.management.internal.cli.json.GfJsonException; import org.apache.geode.management.internal.cli.result.CommandResult; import org.apache.geode.management.internal.cli.result.CompositeResultData; import org.apache.geode.management.internal.cli.result.CompositeResultData.SectionResultData; import org.apache.geode.management.internal.cli.result.ResultData; import org.apache.geode.management.internal.cli.result.TabularResultData; import org.apache.geode.management.internal.cli.util.CommandStringBuilder; import org.apache.geode.test.dunit.Host; import org.apache.geode.test.dunit.IgnoredException; import org.apache.geode.test.dunit.SerializableCallable; import org.apache.geode.test.dunit.SerializableRunnable; import org.apache.geode.test.dunit.VM; import org.apache.geode.test.dunit.WaitCriterion; import org.apache.geode.test.junit.categories.DistributedTest; import org.apache.geode.test.junit.categories.FlakyTest; /** * Dunit class for testing gemfire data commands : get, put, remove, select, rebalance */ @Category(DistributedTest.class) @SuppressWarnings("serial") public class GemfireDataCommandsDUnitTest extends CliCommandTestBase { private static final String REGION_NAME = "FunctionCommandsReplicatedRegion"; private static final String REBALANCE_REGION_NAME = "GemfireDataCommandsDUnitTestRegion"; private static final String REBALANCE_REGION2_NAME = "GemfireDataCommandsDUnitTestRegion2"; private static final String DATA_REGION_NAME = "GemfireDataCommandsTestRegion"; private static final String DATA_REGION_NAME_VM1 = "GemfireDataCommandsTestRegion_Vm1"; private static final String DATA_REGION_NAME_VM2 = "GemfireDataCommandsTestRegion_Vm2"; private static final String DATA_REGION_NAME_PATH = "/GemfireDataCommandsTestRegion"; private static final String DATA_REGION_NAME_VM1_PATH = "/GemfireDataCommandsTestRegion_Vm1"; private static final String DATA_REGION_NAME_VM2_PATH = "/GemfireDataCommandsTestRegion_Vm2"; private static final String DATA_PAR_REGION_NAME = "GemfireDataCommandsTestParRegion"; private static final String DATA_PAR_REGION_NAME_VM1 = "GemfireDataCommandsTestParRegion_Vm1"; private static final String DATA_PAR_REGION_NAME_VM2 = "GemfireDataCommandsTestParRegion_Vm2"; private static final String DATA_PAR_REGION_NAME_PATH = "/GemfireDataCommandsTestParRegion"; private static final String DATA_PAR_REGION_NAME_VM1_PATH = "/GemfireDataCommandsTestParRegion_Vm1"; private static final String DATA_PAR_REGION_NAME_VM2_PATH = "/GemfireDataCommandsTestParRegion_Vm2"; private static final String DATA_REGION_NAME_CHILD_1 = "ChildRegionRegion1"; private static final String DATA_REGION_NAME_CHILD_1_PATH = "/GemfireDataCommandsTestRegion/ChildRegionRegion1"; private static final String DATA_REGION_NAME_CHILD_1_2 = "ChildRegionRegion12"; private static final String DATA_REGION_NAME_CHILD_1_2_PATH = "/GemfireDataCommandsTestRegion/ChildRegionRegion1/ChildRegionRegion12"; private static final String keyTemplate = "('id':'?','name':'name?')"; private static final String valueTemplate = "('stateName':'State?','population':?1,'capitalCity':'capital?','areaInSqKm':?2)"; private static final String carTemplate = "\"('attributes':?map,'make':'?make','model':'?model','colors':?list,'attributeSet':?set)\""; final static int COUNT = 5; public String getMemberId() { Cache cache = getCache(); return cache.getDistributedSystem().getDistributedMember().getId(); } void setupForGetPutRemoveLocateEntry(String testName) { final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); Properties props = new Properties(); props.setProperty(NAME, testName + "Manager"); HeadlessGfsh gfsh = setUpJmxManagerOnVm0ThenConnect(props); assertNotNull(gfsh); assertEquals(true, gfsh.isConnectedAndReady()); vm1.invoke(new SerializableRunnable() { public void run() { Cache cache = getCache(); RegionFactory regionFactory = cache.createRegionFactory(RegionShortcut.REPLICATE); Region dataRegion = regionFactory.create(DATA_REGION_NAME); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); dataRegion = dataRegion.createSubregion(DATA_REGION_NAME_CHILD_1, dataRegion.getAttributes()); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); dataRegion = dataRegion.createSubregion(DATA_REGION_NAME_CHILD_1_2, dataRegion.getAttributes()); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); dataRegion = regionFactory.create(DATA_REGION_NAME_VM1); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); PartitionAttributes partitionAttrs = new PartitionAttributesFactory().setRedundantCopies(2).create(); RegionFactory<Object, Object> partitionRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); partitionRegionFactory.setPartitionAttributes(partitionAttrs); Region dataParRegion = partitionRegionFactory.create(DATA_PAR_REGION_NAME); assertNotNull(dataParRegion); getLogWriter().info("Created Region " + dataParRegion); dataParRegion = partitionRegionFactory.create(DATA_PAR_REGION_NAME_VM1); assertNotNull(dataParRegion); getLogWriter().info("Created Region " + dataParRegion); } }); vm2.invoke(new SerializableRunnable() { public void run() { Cache cache = getCache(); RegionFactory regionFactory = cache.createRegionFactory(RegionShortcut.REPLICATE); Region dataRegion = regionFactory.create(DATA_REGION_NAME); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); dataRegion = dataRegion.createSubregion(DATA_REGION_NAME_CHILD_1, dataRegion.getAttributes()); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); dataRegion = dataRegion.createSubregion(DATA_REGION_NAME_CHILD_1_2, dataRegion.getAttributes()); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); dataRegion = regionFactory.create(DATA_REGION_NAME_VM2); assertNotNull(dataRegion); getLogWriter().info("Created Region " + dataRegion); PartitionAttributes partitionAttrs = new PartitionAttributesFactory().setRedundantCopies(2).create(); RegionFactory<Object, Object> partitionRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); partitionRegionFactory.setPartitionAttributes(partitionAttrs); Region dataParRegion = partitionRegionFactory.create(DATA_PAR_REGION_NAME); assertNotNull(dataParRegion); getLogWriter().info("Created Region " + dataParRegion); dataParRegion = partitionRegionFactory.create(DATA_PAR_REGION_NAME_VM2); assertNotNull(dataParRegion); getLogWriter().info("Created Region " + dataParRegion); } }); final String vm1MemberId = (String) vm1.invoke(() -> getMemberId()); final String vm2MemberId = (String) vm2.invoke(() -> getMemberId()); getLogWriter().info("Vm1 ID : " + vm1MemberId); getLogWriter().info("Vm2 ID : " + vm2MemberId); final VM manager = Host.getHost(0).getVM(0); SerializableRunnable checkRegionMBeans = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); final ManagementService service = ManagementService.getManagementService(cache); final WaitCriterion waitForMaangerMBean = new WaitCriterion() { @Override public boolean done() { ManagerMXBean bean1 = service.getManagerMXBean(); DistributedRegionMXBean bean2 = service.getDistributedRegionMXBean(DATA_REGION_NAME_PATH); if (bean1 == null) { getLogWriter().info("Still probing for ManagerMBean"); return false; } else { getLogWriter().info("Still probing for DistributedRegionMXBean=" + bean2); return (bean2 != null); } } @Override public String description() { return "Probing for ManagerMBean"; } }; waitForCriterion(waitForMaangerMBean, 30000, 2000, true); assertNotNull(service.getMemberMXBean()); assertNotNull(service.getManagerMXBean()); DistributedRegionMXBean bean = service.getDistributedRegionMXBean(DATA_REGION_NAME_PATH); assertNotNull(bean); WaitCriterion waitForRegionMBeans = new WaitCriterion() { @Override public boolean done() { DistributedRegionMXBean beans[] = new DistributedRegionMXBean[6]; beans[0] = service.getDistributedRegionMXBean(DATA_REGION_NAME_PATH); beans[1] = service.getDistributedRegionMXBean(DATA_REGION_NAME_VM1_PATH); beans[2] = service.getDistributedRegionMXBean(DATA_REGION_NAME_VM2_PATH); beans[3] = service.getDistributedRegionMXBean(DATA_PAR_REGION_NAME_PATH); beans[4] = service.getDistributedRegionMXBean(DATA_PAR_REGION_NAME_VM1_PATH); beans[5] = service.getDistributedRegionMXBean(DATA_PAR_REGION_NAME_VM2_PATH); // SubRegion Bug : Proxy creation has some issues. // beans[6] = service.getDistributedRegionMXBean(DATA_REGION_NAME_CHILD_1_PATH); // beans[7] = service.getDistributedRegionMXBean(DATA_REGION_NAME_CHILD_1_2_PATH); boolean flag = true; for (DistributedRegionMXBean b : beans) { if (b == null) { flag = false; break; } } if (!flag) { getLogWriter().info("Still probing for regionMbeans " + DATA_REGION_NAME_PATH + "=" + beans[0] + " " + DATA_REGION_NAME_VM1_PATH + "=" + beans[1] + " " + DATA_REGION_NAME_VM2_PATH + "=" + beans[2] + " " + DATA_PAR_REGION_NAME_PATH + "=" + beans[3] + " " + DATA_PAR_REGION_NAME_VM1_PATH + "=" + beans[4] + " " + DATA_PAR_REGION_NAME_VM2_PATH + "=" + beans[5] + " " // + DATA_REGION_NAME_CHILD_1_PATH // +"="+ beans[6] + " " + DATA_REGION_NAME_CHILD_1_2_PATH // +"=" + beans[7] ); return false; } else { getLogWriter().info("Probing complete for regionMbeans " + DATA_REGION_NAME_PATH + "=" + beans[0] + " " + DATA_REGION_NAME_VM1_PATH + "=" + beans[1] + " " + DATA_REGION_NAME_VM2_PATH + "=" + beans[2] + " " + DATA_PAR_REGION_NAME_PATH + "=" + beans[3] + " " + DATA_PAR_REGION_NAME_VM1_PATH + "=" + beans[4] + " " + DATA_PAR_REGION_NAME_VM2_PATH + "=" + beans[5] + " " // + DATA_REGION_NAME_CHILD_1_PATH // +"="+ beans[6] + " " + DATA_REGION_NAME_CHILD_1_2_PATH // +"=" + beans[7] ); // Fails here Rishi Need Fix here // if(bean1.getMemberCount()==2 && bean1.getMemberCount()==1 && // bean1.getMemberCount()==1) return true; // else{ // getLogWriter().info("Still probing for regionMbeans for aggregation bean1=" + // bean1.getMemberCount() + " bean2="+ bean2.getMemberCount() + " bean3" + // bean3.getMemberCount()); // return false; // } } } @Override public String description() { return "Probing for regionMbeans"; } }; waitForCriterion(waitForRegionMBeans, 30000, 2000, true); String regions[] = {DATA_REGION_NAME_PATH, DATA_REGION_NAME_VM1_PATH, DATA_REGION_NAME_VM2_PATH, DATA_PAR_REGION_NAME_PATH, DATA_PAR_REGION_NAME_VM1_PATH, DATA_PAR_REGION_NAME_VM2_PATH, /* * DATA_REGION_NAME_CHILD_1_PATH, * DATA_REGION_NAME_CHILD_1_2_PATH */}; for (String region : regions) { bean = service.getDistributedRegionMXBean(region); assertNotNull(bean); String[] membersName = bean.getMembers(); getLogWriter().info("Members Array for region " + region + " : " + StringUtils.objectToString(membersName, true, 10)); if (bean.getMemberCount() < 1) fail("Even after waiting mbean reports number of member hosting region " + DATA_REGION_NAME_VM1_PATH + " is less than one"); // assertIndexDetailsEquals(1, membersName.length); //exists in one members vm1 } } }; manager.invoke(checkRegionMBeans); } void setupForSelect() { setupForGetPutRemoveLocateEntry("setupForSelect"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); // To avoid pagination issues and Gfsh waiting for user input executeCommand("set variable --name=APP_FETCH_SIZE --value=" + COUNT); vm1.invoke(new SerializableRunnable() { public void run() { Cache cache = CacheFactory.getAnyInstance(); String regions[] = {DATA_PAR_REGION_NAME_PATH, DATA_PAR_REGION_NAME_VM1_PATH, DATA_REGION_NAME_CHILD_1_PATH, DATA_REGION_NAME_CHILD_1_2_PATH}; for (String r : regions) { Region dataRegion = cache.getRegion(r); for (int j = 0; j < 10; j++) { dataRegion.put(new Integer(j), new Portfolio(j)); } } Region dataRegion = cache.getRegion(DATA_REGION_NAME_PATH); for (int j = 0; j < 10; j++) { dataRegion.put(new Integer(j), new Value1(j)); } dataRegion = cache.getRegion(DATA_REGION_NAME_VM1_PATH); for (int j = 0; j < 10; j++) { dataRegion.put(new Integer(j), new Value1WithValue2(j)); } } }); vm2.invoke(new SerializableRunnable() { public void run() { Cache cache = CacheFactory.getAnyInstance(); String regions[] = {DATA_REGION_NAME_VM2_PATH, DATA_PAR_REGION_NAME_VM2_PATH}; for (String r : regions) { Region dataRegion = cache.getRegion(r); for (int j = 0; j < 10; j++) { dataRegion.put(new Integer(j), new Portfolio(j)); } } } }); } private void doQueryRegionsAssociatedMembers(String queryTemplate, int expectedMembers, boolean returnAll, String... regions) { Cache cache = CacheFactory.getAnyInstance(); String query = queryTemplate; int i = 1; for (String r : regions) { query = query.replace("?" + i, r); i++; } getLogWriter().info("Checking members for query : " + query); QCompiler compiler = new QCompiler(); Set<String> regionsInQuery = null; try { CompiledValue compiledQuery = compiler.compileQuery(query); Set regionSet = new HashSet(); compiledQuery.getRegionsInQuery(regionSet, null);// GFSH ENV VARIBLES regionsInQuery = Collections.unmodifiableSet(regionSet); getLogWriter().info("Region in query : " + regionsInQuery); if (regionsInQuery.size() > 0) { Set<DistributedMember> members = DataCommands.getQueryRegionsAssociatedMembers(regionsInQuery, cache, returnAll); getLogWriter().info("Members for Region in query : " + members); if (expectedMembers != -1) { assertNotNull(members); assertEquals(expectedMembers, members.size()); } else assertEquals(0, members.size()); } else { assertEquals(-1, expectedMembers);// Regions do not exist at all } } catch (QueryInvalidException qe) { fail("Invalid Query", qe); } } public void doTestGetRegionAssociatedMembersForSelect() { final VM manager = Host.getHost(0).getVM(0); final String queryTemplate1 = "select * from ?1, ?2 "; // final String queryTemplate2 = "select * from ?1, ?2, ?3"; manager.invoke(new SerializableRunnable() { @Override public void run() { doQueryRegionsAssociatedMembers(queryTemplate1, 0, true, new String[] {DATA_REGION_NAME_VM1_PATH, DATA_REGION_NAME_VM2_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 2, true, new String[] {DATA_REGION_NAME_PATH, DATA_REGION_NAME_CHILD_1_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 1, false, new String[] {DATA_REGION_NAME_PATH, DATA_REGION_NAME_CHILD_1_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 1, true, new String[] {DATA_REGION_NAME_VM1_PATH, DATA_REGION_NAME_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 1, false, new String[] {DATA_REGION_NAME_VM1_PATH, DATA_REGION_NAME_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 1, true, new String[] {DATA_REGION_NAME_VM2_PATH, DATA_REGION_NAME_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 1, false, new String[] {DATA_REGION_NAME_VM2_PATH, DATA_REGION_NAME_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 0, true, new String[] {DATA_PAR_REGION_NAME_VM2_PATH, DATA_PAR_REGION_NAME_VM1_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, 0, false, new String[] {DATA_PAR_REGION_NAME_VM2_PATH, DATA_PAR_REGION_NAME_VM1_PATH}); doQueryRegionsAssociatedMembers(queryTemplate1, -1, true, new String[] {DATA_PAR_REGION_NAME_VM2_PATH, "/jfgkdfjgkd"}); // one wrong region doQueryRegionsAssociatedMembers(queryTemplate1, -1, false, new String[] {DATA_PAR_REGION_NAME_VM2_PATH, "/jfgkdfjgkd"}); // one wrong region doQueryRegionsAssociatedMembers(queryTemplate1, -1, true, new String[] {"/dhgfdhgf", "/dhgddhd"}); // both regions wrong doQueryRegionsAssociatedMembers(queryTemplate1, -1, false, new String[] {"/dhgfdhgf", "/dhgddhd"}); // both regions wrong } }); } public void doTestSelectProjection() { Random random = new Random(System.nanoTime()); int randomInteger = random.nextInt(COUNT); String query = "query --query=\"select ID , status , createTime , pk, floatMinValue from " + DATA_PAR_REGION_NAME_PATH + " where ID <= " + randomInteger + "\" --interactive=false"; CommandResult cmdResult = executeCommand(query); printCommandOutput(cmdResult); validateSelectResult(cmdResult, true, (randomInteger + 1), new String[] {"ID", "status", "createTime", "pk", "floatMinValue"}); } public void doTestSelectProjectionProcessCommand() { final VM manager = Host.getHost(0).getVM(0); manager.invoke(new SerializableRunnable() { @Override public void run() { Random random = new Random(System.nanoTime()); int randomInteger = random.nextInt(COUNT); String query = "query --query=\"select ID , status , createTime , pk, floatMinValue from " + DATA_PAR_REGION_NAME_PATH + " where ID <= " + randomInteger + "\" --interactive=false"; ManagementService service = ManagementService.getExistingManagementService(getCache()); MemberMXBean member = service.getMemberMXBean(); String cmdResult = member.processCommand(query); assertNotNull(cmdResult); getLogWriter().info("Text Command Output : " + cmdResult); } }); } public void doTestSelectProjectionWithNestedField() { Random random = new Random(System.nanoTime()); int randomInteger = random.nextInt(COUNT); String query = "query --query=\"select employeeId, name, department, value2 from " + DATA_REGION_NAME_VM1_PATH + " where employeeId <= " + randomInteger + "\" --interactive=false"; CommandResult cmdResult = executeCommand(query); printCommandOutput(cmdResult); String expectedCols[] = {"employeeId", "name", "department", "value2"}; validateSelectResult(cmdResult, true, (randomInteger + 1), expectedCols); // Test with collections query = "query --query=\"select ID , status , createTime , pk, floatMinValue, collectionHolderMap from " + DATA_PAR_REGION_NAME_PATH + " where ID <= " + randomInteger + "\" --interactive=false"; cmdResult = executeCommand(query); printCommandOutput(cmdResult); expectedCols = new String[] {"ID", "status", "createTime", "pk", "floatMinValue", "collectionHolderMap"}; validateSelectResult(cmdResult, true, (randomInteger + 1), expectedCols); } public void doTestSelectBeansAsResult() { Random random = new Random(System.nanoTime()); int randomInteger = random.nextInt(COUNT); String query = "query --query=\"select * from " + DATA_REGION_NAME_PATH + " where employeeId <= " + randomInteger + "\" --interactive=false"; CommandResult cmdResult = executeCommand(query); printCommandOutput(cmdResult); String expectedCols[] = {"name", "lastName", "department", "age", "employeeId"}; validateSelectResult(cmdResult, true, (randomInteger + 1), expectedCols); } public void doTestSelectBeansWithNestedFieldAsResult() { Random random = new Random(System.nanoTime()); int randomInteger = random.nextInt(COUNT); String query = "query --query=\"select employeeId, name, department, value2 from " + DATA_REGION_NAME_VM1_PATH + " where employeeId <= " + randomInteger + "\" --interactive=false"; CommandResult cmdResult = executeCommand(query); printCommandOutput(cmdResult); String expectedCols[] = {"employeeId", "name", "department", "value2"}; validateSelectResult(cmdResult, true, (randomInteger + 1), expectedCols); } public void doTestSelectWithGfshEnvVariables(boolean statusActive) { Random random = new Random(System.nanoTime()); int randomInteger = random.nextInt(COUNT); String query = "query --query=\"select ID , status , createTime , pk, floatMinValue from ${DATA_REGION} where ID <= ${PORTFOLIO_ID}" + " and status='${STATUS}'" + "\" --interactive=false"; executeCommand("set variable --name=DATA_REGION --value=" + DATA_REGION_NAME_PATH); executeCommand("set variable --name=PORTFOLIO_ID --value=" + randomInteger); executeCommand("set variable --name=STATUS --value=" + (statusActive ? "active" : "inactive")); CommandResult cmdResult = executeCommand(query); printCommandOutput(cmdResult); validateSelectResult(cmdResult, true, -1, null); IgnoredException ex = addIgnoredException(QueryInvalidException.class.getSimpleName(), Host.getHost(0).getVM(0)); try { query = "query --query=\"select ID , status , createTime , pk, floatMinValue from ${DATA_REGION2} where ID <= ${PORTFOLIO_ID2}" + " and status='${STATUS2}'" + "\" --interactive=false"; cmdResult = executeCommand(query); printCommandOutput(cmdResult); validateSelectResult(cmdResult, false, 0, null); } finally { ex.remove(); } } public void doTestBug48013() { String query = "query --query=\"SELECT e FROM " + DATA_REGION_NAME_PATH + ".entries e\" --interactive=false"; CommandResult cmdResult = executeCommand(query); printCommandOutput(cmdResult); validateResult(cmdResult, true); } @Category(FlakyTest.class) // GEODE-2006 @Test public void testSelectCommand() { setupForSelect(); doTestGetRegionAssociatedMembersForSelect(); doTestSelectWithGfshEnvVariables(true); doTestSelectWithGfshEnvVariables(false); doTestSelectProjection(); doTestBug48013(); doTestSelectProjectionProcessCommand(); doTestSelectProjectionWithNestedField(); doTestSelectBeansAsResult(); doTestSelectBeansWithNestedFieldAsResult(); } @Test public void testPrimitivesWithDataCommands() { setupForGetPutRemoveLocateEntry("testPrimitives"); Byte byteKey = Byte.parseByte("41"); Byte byteValue = Byte.parseByte("31"); Short shortKey = Short.parseShort("123"); Short shortValue = Short.parseShort("121"); Integer integerKey = Integer.parseInt("123456"); Integer integerValue = Integer.parseInt("12345678"); Float floatKey = Float.valueOf("12432.2325"); Float flaotValue = Float.valueOf("111111.1111"); Double doubleKey = Double.valueOf("12432.235425"); Double doubleValue = Double.valueOf("111111.111111"); getLogWriter().info("Testing Byte Wrappers"); testGetPutLocateEntryFromShellAndGemfire(byteKey, byteValue, Byte.class, true, true); getLogWriter().info("Testing Short Wrappers"); testGetPutLocateEntryFromShellAndGemfire(shortKey, shortValue, Short.class, true, true); getLogWriter().info("Testing Integer Wrappers"); testGetPutLocateEntryFromShellAndGemfire(integerKey, integerValue, Integer.class, true, true); getLogWriter().info("Testing Float Wrappers"); testGetPutLocateEntryFromShellAndGemfire(floatKey, flaotValue, Float.class, true, true); getLogWriter().info("Testing Double Wrappers"); testGetPutLocateEntryFromShellAndGemfire(doubleKey, doubleValue, Double.class, true, true); } private void testGetPutLocateEntryFromShellAndGemfire(final Object key, final Object value, Class klass, boolean addRegionPath, boolean expResult) { final VM vm1 = Host.getHost(0).getVM(1); SerializableRunnable putTask = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); region.put(key, value); } }; SerializableRunnable getTask = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); assertEquals(true, region.containsKey(key)); assertEquals(value, region.get(key)); } }; SerializableRunnable removeTask = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); assertEquals(true, region.containsKey(key)); region.remove(key); } }; SerializableRunnable clearTask = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); } }; String getCommand = "get --key=" + key + " --key-class=" + klass.getCanonicalName() + " --value-class=" + klass.getCanonicalName(); if (addRegionPath) getCommand += " --region=" + DATA_REGION_NAME_PATH; String locateEntryCommand = "locate entry --key=" + key + " --key-class=" + klass.getCanonicalName() + " --value-class=" + klass.getCanonicalName(); if (addRegionPath) locateEntryCommand += " --region=" + DATA_REGION_NAME_PATH; String removeCommand = "remove --key=" + key + " --key-class=" + klass.getCanonicalName(); if (addRegionPath) removeCommand += " --region=" + DATA_REGION_NAME_PATH; String putCommand = "put --key=" + key + " --key-class=" + klass.getCanonicalName() + " --value=" + value + " --value-class=" + klass.getCanonicalName(); if (addRegionPath) putCommand += " --region=" + DATA_REGION_NAME_PATH; if (expResult) { // Do put from shell check gemfire get do gemfire remove CommandResult cmdResult = executeCommand(putCommand); printCommandOutput(cmdResult); validateResult(cmdResult, true); vm1.invoke(getTask); vm1.invoke(removeTask); vm1.invoke(clearTask); // Do put from gemfire check from shell do gemfire remove vm1.invoke(putTask); cmdResult = executeCommand(getCommand); printCommandOutput(cmdResult); validateResult(cmdResult, true); cmdResult = executeCommand(locateEntryCommand); printCommandOutput(cmdResult); validateResult(cmdResult, true); vm1.invoke(removeTask); vm1.invoke(clearTask); // Do put from shell check from gemfire do remove from shell get from shell exepct false cmdResult = executeCommand(putCommand); printCommandOutput(cmdResult); validateResult(cmdResult, true); vm1.invoke(getTask); cmdResult = executeCommand(removeCommand); printCommandOutput(cmdResult); validateResult(cmdResult, true); cmdResult = executeCommand(getCommand); printCommandOutput(cmdResult); validateResult(cmdResult, false); cmdResult = executeCommand(locateEntryCommand); printCommandOutput(cmdResult); validateResult(cmdResult, false); } else { // Do put from shell check gemfire get do gemfire remove CommandResult cmdResult = executeCommand(putCommand); printCommandOutput(cmdResult); validateResult(cmdResult, false); vm1.invoke(clearTask); // Do put from gemfire check from shell do gemfire remove vm1.invoke(putTask); cmdResult = executeCommand(getCommand); printCommandOutput(cmdResult); validateResult(cmdResult, false); cmdResult = executeCommand(locateEntryCommand); printCommandOutput(cmdResult); validateResult(cmdResult, false); vm1.invoke(removeTask); vm1.invoke(clearTask); // Do put from shell check from gemfire do remove from shell get from shell exepct false cmdResult = executeCommand(putCommand); printCommandOutput(cmdResult); validateResult(cmdResult, false); } } @Test public void testSimplePutCommand() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("tesSimplePut"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); for (int i = 0; i < COUNT; i++) { String command = "put"; String key = keyPrefix + i; String value = valuePrefix + i; command = command + " " + "--key=" + key + " --value=" + value + " --region=" + DATA_REGION_NAME_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); validateResult(cmdResult, true); assertEquals(Result.Status.OK, cmdResult.getStatus()); } // Bug : 51587 : GFSH command failing when ; is present in either key or value in put operation String command = "put"; String key = keyPrefix + "\\;" + COUNT; String value = valuePrefix + "\\;" + COUNT; command = command + " " + "--key=" + key + " --value=" + value + " --region=" + DATA_REGION_NAME_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); validateResult(cmdResult, true); assertEquals(Result.Status.OK, cmdResult.getStatus()); SerializableRunnable checkPutKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; assertEquals(true, region.containsKey(key)); } // Validation for Bug 51587 String key = keyPrefix + "\\;" + COUNT; assertEquals(true, region.containsKey(key)); } }; vm1.invoke(checkPutKeys); vm2.invoke(checkPutKeys); } private void validateResult(CommandResult cmdResult, boolean expected) { if (ResultData.TYPE_COMPOSITE.equals(cmdResult.getType())) { CompositeResultData rd = (CompositeResultData) cmdResult.getResultData(); SectionResultData section = rd.retrieveSectionByIndex(0); boolean result = (Boolean) section.retrieveObject("Result"); assertEquals(expected, result); } else fail("Expected CompositeResult Returned Result Type " + cmdResult.getType()); } private void validateLocationsResult(CommandResult cmdResult, int expected) { if (ResultData.TYPE_COMPOSITE.equals(cmdResult.getType())) { CompositeResultData rd = (CompositeResultData) cmdResult.getResultData(); SectionResultData section = rd.retrieveSectionByIndex(0); int result = (Integer) section.retrieveObject("Locations Found"); assertEquals(expected, result); } else fail("Expected CompositeResult Returned Result Type " + cmdResult.getType()); } private void validateJSONGetResult(CommandResult cmdResult, String[] expectedCols) { CompositeResultData rd = (CompositeResultData) cmdResult.getResultData(); SectionResultData section = rd.retrieveSectionByIndex(0); TabularResultData table = section.retrieveTableByIndex(0); GfJsonArray array = table.getHeaders(); assertEquals(expectedCols.length, array.size()); try { for (String col : expectedCols) { boolean found = false; getLogWriter().info("Validating column " + col); for (int i = 0; i < array.size(); i++) { String header = (String) array.get(i); if (col.equals(header)) found = true; } assertEquals(true, found); } } catch (GfJsonException e) { fail("Error accessing table data", e); } } private void validateJSONGetResultValues(CommandResult cmdResult, String[] expectedCols) { CompositeResultData rd = (CompositeResultData) cmdResult.getResultData(); SectionResultData section = rd.retrieveSectionByIndex(0); TabularResultData table = section.retrieveTableByIndex(0); GfJsonArray array = table.getHeaders(); assertEquals(expectedCols.length, array.size()); try { for (String col : expectedCols) { boolean found = false; getLogWriter().info("Validating column " + col); for (int i = 0; i < array.size(); i++) { String header = (String) array.get(i); if (col.equals(header)) found = true; } assertEquals(true, found); List<String> values = table.retrieveAllValues(col); for (String value : values) { assertNotSame("null", value); } } } catch (GfJsonException e) { fail("Error accessing table data", e); } } private void validateSelectResult(CommandResult cmdResult, boolean expectedFlag, int expectedRows, String[] cols) { if (ResultData.TYPE_COMPOSITE.equals(cmdResult.getType())) { CompositeResultData rd = (CompositeResultData) cmdResult.getResultData(); SectionResultData section = rd.retrieveSectionByIndex(0); boolean result = (Boolean) section.retrieveObject("Result"); assertEquals(expectedFlag, result); if (expectedFlag && expectedRows != -1) { int rowsReturned = (Integer) section.retrieveObject("Rows"); assertEquals(expectedRows, rowsReturned); if (rowsReturned > 0 && cols != null) { try { TabularResultData table = section.retrieveTableByIndex(0); GfJsonArray array = table.getHeaders(); assertEquals(cols.length, array.size()); for (String col : cols) { boolean found = false; getLogWriter().info("Validating column " + col); for (int i = 0; i < array.size(); i++) { String header = (String) array.get(i); if (col.equals(header)) found = true; } assertEquals(true, found); } } catch (GfJsonException e) { fail("Error accessing table data", e); } } } } else fail("Expected CompositeResult Returned Result Type " + cmdResult.getType()); } @Test @Category(FlakyTest.class) // GEODE-1249 public void testSimplePutIfAbsentCommand() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testSimplePutIfAbsent"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); // Seed the region with some keys SerializableRunnable putKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); } assertEquals(COUNT, region.size()); } }; vm1.invoke(putKeys); // Now try to replace all existing keys with new values to test --skip-if-exists. Values should // not be replaced if the key is present. for (int i = 0; i < COUNT; i++) { String command = "put"; String key = keyPrefix + i; String value = valuePrefix + i + i; command = command + " " + "--key=" + key + " --value=" + value + " --region=" + DATA_REGION_NAME_PATH + " --skip-if-exists=true"; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } // Verify that none of the values were replaced SerializableRunnable checkPutIfAbsentKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String expected = valuePrefix + i; String actual = (String) region.get(key); assertEquals("--skip-if-exists=true failed to preserve value", expected, actual); } } }; vm1.invoke(checkPutIfAbsentKeys); vm2.invoke(checkPutIfAbsentKeys); } @Category(FlakyTest.class) // GEODE-1496 (http) @Test public void testSimpleRemoveCommand() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testSimpleRemove"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); SerializableRunnable putKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); } assertEquals(COUNT, region.size()); } }; vm1.invoke(putKeys); for (int i = 0; i < COUNT; i++) { String command = "remove"; String key = keyPrefix + i; String value = valuePrefix + i; command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } SerializableRunnable checkRemoveKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; assertEquals(false, region.containsKey(key)); } assertEquals(0, region.size()); } }; vm1.invoke(checkRemoveKeys); vm2.invoke(checkRemoveKeys); } @Test public void testSimpleGetLocateEntryCommand() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testSimpleGetLocateEntry"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); SerializableRunnable putKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); } } }; vm1.invoke(putKeys); for (int i = 0; i < COUNT; i++) { String command = "get"; String key = keyPrefix + i; String value = valuePrefix + i; command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); command = "locate entry"; command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } } @Test public void testRecursiveLocateEntryCommand() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testRecursiveLocateEntry"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); SerializableRunnable putKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); Region region2 = cache.getRegion(DATA_REGION_NAME_CHILD_1_PATH); Region region3 = cache.getRegion(DATA_REGION_NAME_CHILD_1_2_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); region2.put(key, value); region3.put(key, value); } } }; vm1.invoke(putKeys); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String command = "locate entry"; command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_PATH + " --recursive=true"; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); validateLocationsResult(cmdResult, 6); // 3 Regions X 2 members = 6 } } @Test public void testGetLocateEntryFromRegionOnDifferentVM() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testGetLocateEntryFromRegionOnDifferentVM"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); SerializableRunnable putKeys1 = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_VM1_PATH); Region parRegion = cache.getRegion(DATA_PAR_REGION_NAME_VM1_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { if (i % 2 == 0) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); parRegion.put(key, value); } } } }; SerializableRunnable putKeys2 = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_VM2_PATH); Region parRegion = cache.getRegion(DATA_PAR_REGION_NAME_VM2_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { if (i % 2 != 0) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); parRegion.put(key, value); } } } }; vm1.invoke(putKeys1); vm2.invoke(putKeys2); for (int i = 0; i < COUNT; i++) { String command = "get"; String key = keyPrefix + i; String value = valuePrefix + i; if (i % 2 == 0) command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_VM1_PATH; else if (i % 2 == 1) command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_VM2_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); command = "locate entry"; if (i % 2 == 0) command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_VM1_PATH; else if (i % 2 == 1) command = command + " " + "--key=" + key + " --region=" + DATA_REGION_NAME_VM2_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); command = "locate entry"; if (i % 2 == 0) command = command + " " + "--key=" + key + " --region=" + DATA_PAR_REGION_NAME_VM1_PATH; else if (i % 2 == 1) command = command + " " + "--key=" + key + " --region=" + DATA_PAR_REGION_NAME_VM2_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); validateLocationsResult(cmdResult, 1); // 1 Regions X (2-1) 2 Copies but redundancy not // satisfied = 1 } } @Category(FlakyTest.class) // GEODE-1822 @Test public void testGetLocateEntryLocationsForPR() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testGetLocateEntryLocationsForPR"); final VM vm1 = Host.getHost(0).getVM(1); SerializableRunnable putKeys1 = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_PAR_REGION_NAME_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String value = valuePrefix + i; region.put(key, value); } } }; vm1.invoke(putKeys1); for (int i = 0; i < COUNT; i++) { String key = keyPrefix + i; String command = "locate entry"; command = command + " " + "--key=" + key + " --region=" + DATA_PAR_REGION_NAME_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); validateLocationsResult(cmdResult, 2); // 2 Members } } @Test public void testPutFromRegionOnDifferentVM() { final String keyPrefix = "testKey"; final String valuePrefix = "testValue"; setupForGetPutRemoveLocateEntry("testPutFromRegionOnDifferentVM"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); for (int i = 0; i < COUNT; i++) { String command = "put"; String key = keyPrefix + i; String value = valuePrefix + i; if (i % 2 == 0) command = command + " " + "--key=" + key + " --value=" + value + " --region=" + DATA_REGION_NAME_VM1_PATH; else command = command + " " + "--key=" + key + " --value=" + value + " --region=" + DATA_REGION_NAME_VM2_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } SerializableRunnable checkPutKeysInVM1 = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_VM1_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { if (i % 2 == 0) { String key = keyPrefix + i; assertEquals(true, region.containsKey(key)); } } } }; SerializableRunnable checkPutKeysInVM2 = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_VM2_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { if (i % 2 != 0) { String key = keyPrefix + i; assertEquals(true, region.containsKey(key)); } } } }; vm1.invoke(checkPutKeysInVM1); vm2.invoke(checkPutKeysInVM2); } @Category(FlakyTest.class) // GEODE-1182: random ports, BindException, HeadlessGFSH, // waitForCriterion, time sensitive @Test public void testGetLocateEntryJsonKeys() { final String keyPrefix = "testKey"; setupForGetPutRemoveLocateEntry("testGetLocateEntryJsonKeys"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); SerializableRunnable putKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { String keyString = keyPrefix + i; Key1 key = new Key1(); key.setId(keyString); key.setName("name" + keyString); Value2 value2 = new Value2(); value2.setStateName("State" + keyString); value2.setCapitalCity("capital" + keyString); value2.setPopulation(i * 100); value2.setAreaInSqKm(i * 100.4365); region.put(key, value2); } // Added for Bug #51175 List<String> colors = new ArrayList<String>(); colors.add("White"); colors.add("Red"); colors.add("Blue"); Map<String, String> attrMap = new HashMap<String, String>(); attrMap.put("power", "90hp"); attrMap.put("turningRadius", "4mtr"); attrMap.put("engineCapacity", "1248cc"); attrMap.put("turboGeometry", "VGT"); Set<String> attrSet = new HashSet<String>(); attrSet.add("power"); attrSet.add("turningRadius"); for (int i = COUNT; i < COUNT + 5; i++) { String keyString = keyPrefix + i; Key1 key = new Key1(); key.setId(keyString); key.setName("name" + keyString); Car car = new Car(); car.setMake("Make" + keyString); car.setModel("Model" + keyString); car.setColors(colors); car.setAttributes(attrMap); car.setAttributeSet(attrSet); region.put(key, car); } } }; String expectedCols[] = {"id", "name", "stateName", "capitalCity", "population", "areaInSqKm"}; vm1.invoke(putKeys); for (int i = 0; i < COUNT; i++) { String command = "get"; String keyString = keyPrefix + i; String population = "" + i * 100; String area = "" + i * (100.4365); String keyJson = keyTemplate.replaceAll("\\?", keyString); String valueJson = valueTemplate.replaceAll("\\?1", population); valueJson = valueJson.replaceAll("\\?2", area); valueJson = valueJson.replaceAll("\\?", keyString); getLogWriter().info("Getting key with json key : " + keyJson); command = command + " " + "--key=" + keyJson + " --region=" + DATA_REGION_NAME_PATH + " --key-class=" + Key1.class.getCanonicalName(); command = command + " --value-class=" + Value2.class.getCanonicalName(); CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); validateJSONGetResult(cmdResult, expectedCols); command = "locate entry"; command = command + " " + "--key=" + keyJson + " --region=" + DATA_REGION_NAME_PATH + " --key-class=" + Key1.class.getCanonicalName(); command = command + " --value-class=" + Value2.class.getCanonicalName(); cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } // Added for Bug #51175 expectedCols = new String[] {"id", "name", "attributes", "make", "model", "colors", "attributeSet"}; for (int i = COUNT; i < COUNT + 5; i++) { String command = "get"; String keyString = keyPrefix + i; String population = "" + i * 100; String area = "" + i * (100.4365); String keyJson = keyTemplate.replaceAll("\\?", keyString); String valueJson = valueTemplate.replaceAll("\\?1", population); valueJson = valueJson.replaceAll("\\?2", area); valueJson = valueJson.replaceAll("\\?", keyString); getLogWriter().info("Getting key with json key : " + keyJson); command = command + " " + "--key=" + keyJson + " --region=" + DATA_REGION_NAME_PATH + " --key-class=" + Key1.class.getCanonicalName(); command = command + " --value-class=" + Value2.class.getCanonicalName(); CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); // validateJSONGetResult(cmdResult, expectedCols); validateJSONGetResultValues(cmdResult, expectedCols); command = "locate entry"; command = command + " " + "--key=" + keyJson + " --region=" + DATA_REGION_NAME_PATH + " --key-class=" + Key1.class.getCanonicalName(); command = command + " --value-class=" + Value2.class.getCanonicalName(); cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } } @Category(FlakyTest.class) // GEODE-1430 @Test public void testPutJsonKeys() { final String keyPrefix = "testKey"; setupForGetPutRemoveLocateEntry("testPutJsonKeys"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); for (int i = 0; i < COUNT; i++) { String command = "put"; String keyString = keyPrefix + i; String population = "" + i * 100; String area = "" + i * (100.4365); String keyJson = keyTemplate.replaceAll("\\?", keyString); String valueJson = valueTemplate.replaceAll("\\?1", population); valueJson = valueJson.replaceAll("\\?2", area); valueJson = valueJson.replaceAll("\\?", keyString); getLogWriter().info("Putting key with json key : " + keyJson); getLogWriter().info("Putting key with json valye : " + valueJson); command = command + " " + "--key=" + keyJson + " --value=" + valueJson + " --region=" + DATA_REGION_NAME_PATH; command = command + " --key-class=" + Key1.class.getCanonicalName() + " --value-class=" + Value2.class.getCanonicalName();; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } // Bug #51175 for (int i = COUNT; i < COUNT + 5; i++) { String command = "put"; String keyString = keyPrefix + i; String id = "" + i * 100; String make = "" + i * (100.4365); String model = "" + i * (100.4365); String list = "['red','white','blue']"; String set = "['red','white','blue']"; String map = "{'power':'90hp'}"; String keyJson = keyTemplate.replaceAll("\\?", keyString); String valueJson = carTemplate.replaceAll("\\?make", make); valueJson = valueJson.replaceAll("\\?model", model); valueJson = valueJson.replaceAll("\\?list", list); valueJson = valueJson.replaceAll("\\?set", set); valueJson = valueJson.replaceAll("\\?map", map); getLogWriter().info("Putting key with json key : " + keyJson); getLogWriter().info("Putting key with json valye : " + valueJson); command = command + " " + "--key=" + keyJson + " --value=" + valueJson + " --region=" + DATA_REGION_NAME_PATH; command = command + " --key-class=" + Key1.class.getCanonicalName() + " --value-class=" + Car.class.getCanonicalName();; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } SerializableRunnable checkPutKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); for (int i = 0; i < COUNT + 5; i++) { String keyString = keyPrefix + i; Key1 key = new Key1(); key.setId(keyString); key.setName("name" + keyString); assertEquals(true, region.containsKey(key)); // Bug #51175 if (i >= COUNT) { Car car = (Car) region.get(key); assertNotNull(car.getAttributes()); assertNotNull(car.getAttributeSet()); assertNotNull(car.getColors()); } } } }; vm1.invoke(checkPutKeys); vm2.invoke(checkPutKeys); doBugCheck50449(); } public void doBugCheck50449() { String command = "put --key-class=" + ObjectWithCharAttr.class.getCanonicalName() + " --value=456 --key=\"('name':'hesdfdsfy2','t':456, 'c':'d')\"" + " --region=" + DATA_REGION_NAME_PATH; CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); command = "put --key-class=" + ObjectWithCharAttr.class.getCanonicalName() + " --value=123 --key=\"('name':'hesdfdsfy2','t':123, 'c':'d')\"" + " --region=" + DATA_REGION_NAME_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); command = "get --key-class=" + ObjectWithCharAttr.class.getCanonicalName() + " --key=\"('name':'','t':123, 'c':'d')\"" + " --region=" + DATA_REGION_NAME_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); command = "get --key-class=" + ObjectWithCharAttr.class.getCanonicalName() + " --key=\"('name':'','t':456, 'c':'d')\"" + " --region=" + DATA_REGION_NAME_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); // check wrong key command = "get --key-class=" + ObjectWithCharAttr.class.getCanonicalName() + " --key=\"('name':'','t':999, 'c':'d')\"" + " --region=" + DATA_REGION_NAME_PATH; cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, false); } @Test public void testRemoveJsonCommand() { final String keyPrefix = "testKey"; setupForGetPutRemoveLocateEntry("testRemoveJsonCommand"); final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); SerializableRunnable putKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); region.clear(); for (int i = 0; i < COUNT; i++) { String keyString = keyPrefix + i; Key1 key = new Key1(); key.setId(keyString); key.setName("name" + keyString); Value2 value2 = new Value2(); value2.setStateName("State" + keyString); value2.setCapitalCity("capital" + keyString); value2.setPopulation(i * 100); value2.setAreaInSqKm(i * 100.4365); region.put(key, value2); } } }; vm1.invoke(putKeys); for (int i = 0; i < COUNT; i++) { String command = "remove"; String keyString = keyPrefix + i; String keyJson = keyTemplate.replaceAll("\\?", keyString); getLogWriter().info("Removing key with json key : " + keyJson); command = command + " " + "--key=" + keyJson + " --region=" + DATA_REGION_NAME_PATH + " --key-class=" + Key1.class.getCanonicalName(); CommandResult cmdResult = executeCommand(command); printCommandOutput(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); validateResult(cmdResult, true); } SerializableRunnable checkRemoveKeys = new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); Region region = cache.getRegion(DATA_REGION_NAME_PATH); assertNotNull(region); for (int i = 0; i < COUNT; i++) { String keyString = keyPrefix + i; Key1 key = new Key1(); key.setId(keyString); key.setName("name" + keyString); assertEquals(false, region.containsKey(key)); } assertEquals(0, region.size()); } }; vm1.invoke(checkRemoveKeys); vm2.invoke(checkRemoveKeys); } private Region<?, ?> createParReg(String regionName, Cache cache) { RegionFactory regionFactory = cache.createRegionFactory(); regionFactory.setDataPolicy(DataPolicy.PARTITION); return regionFactory.create(regionName); } private Region<?, ?> createReplicatedRegion(String regionName, Cache cache) { RegionFactory regionFactory = cache.createRegionFactory(); regionFactory.setDataPolicy(DataPolicy.REPLICATE); return regionFactory.create(regionName); } @Category(FlakyTest.class) // GEODE-1404 @Test public void testImportExportData() throws InterruptedException, IOException { final String regionName = "Region1"; final String exportFileName = "export.gfd"; final VM manager = Host.getHost(0).getVM(0); final VM vm1 = Host.getHost(0).getVM(1); final File exportFile = new File(exportFileName); final String filePath = exportFile.getCanonicalPath(); try { if (!exportFile.exists()) { exportFile.createNewFile(); } exportFile.deleteOnExit(); setUpJmxManagerOnVm0ThenConnect(null); manager.invoke(new SerializableCallable() { public Object call() { Region region = createParReg(regionName, getCache()); return region.put("Manager", "ASD"); } }); vm1.invoke(new SerializableCallable() { @Override public Object call() throws Exception { Region region = createParReg(regionName, getCache()); return region.put("VM1", "QWE"); } }); CommandStringBuilder csb = new CommandStringBuilder(CliStrings.EXPORT_DATA); csb.addOption(CliStrings.EXPORT_DATA__REGION, regionName); csb.addOption(CliStrings.EXPORT_DATA__MEMBER, "Manager"); csb.addOption(CliStrings.EXPORT_DATA__FILE, filePath); String commandString = csb.toString(); CommandResult cmdResult = executeCommand(commandString); String resultAsString = commandResultToString(cmdResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); getLogWriter().info("Command Output"); getLogWriter().info(resultAsString); vm1.invoke(new SerializableRunnable() { public void run() { Region region = getCache().getRegion(regionName); region.destroy("Manager"); region.destroy("VM1"); } }); /** * Import the data */ csb = new CommandStringBuilder(CliStrings.IMPORT_DATA); csb.addOption(CliStrings.IMPORT_DATA__REGION, regionName); csb.addOption(CliStrings.IMPORT_DATA__FILE, filePath); csb.addOption(CliStrings.IMPORT_DATA__MEMBER, "Manager"); commandString = csb.toString(); cmdResult = executeCommand(commandString); resultAsString = commandResultToString(cmdResult); getLogWriter().info("Result of import data"); getLogWriter().info(resultAsString); assertEquals(Result.Status.OK, cmdResult.getStatus()); /** * Validate the region entries after import They must match the entries before export */ manager.invoke(new SerializableRunnable() { public void run() { Region region = getCache().getRegion(regionName); assertEquals(region.get("Manager"), "ASD"); assertEquals(region.get("VM1"), "QWE"); } }); // Test for bad input csb = new CommandStringBuilder(CliStrings.EXPORT_DATA); csb.addOption(CliStrings.EXPORT_DATA__REGION, "FDSERW"); csb.addOption(CliStrings.EXPORT_DATA__FILE, filePath); csb.addOption(CliStrings.EXPORT_DATA__MEMBER, "Manager"); commandString = csb.getCommandString(); cmdResult = executeCommand(commandString); resultAsString = commandResultToString(cmdResult); getLogWriter().info("Result of import data with wrong region name"); getLogWriter().info(resultAsString); assertEquals(Result.Status.ERROR, cmdResult.getStatus()); csb = new CommandStringBuilder(CliStrings.IMPORT_DATA); csb.addOption(CliStrings.IMPORT_DATA__REGION, regionName); csb.addOption(CliStrings.IMPORT_DATA__FILE, "#WEQW"); csb.addOption(CliStrings.IMPORT_DATA__MEMBER, "Manager"); commandString = csb.getCommandString(); cmdResult = executeCommand(commandString); resultAsString = commandResultToString(cmdResult); getLogWriter().info("Result of import data with wrong file"); getLogWriter().info(resultAsString); assertEquals(Result.Status.ERROR, cmdResult.getStatus()); } finally { exportFile.delete(); } } void setupWith2Regions() { final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); setUpJmxManagerOnVm0ThenConnect(null); vm1.invoke(new SerializableRunnable() { public void run() { // no need to close cache as it will be closed as part of teardown2 Cache cache = getCache(); RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); Region region = dataRegionFactory.create(REBALANCE_REGION_NAME); for (int i = 0; i < 10; i++) { region.put("key" + (i + 200), "value" + (i + 200)); } region = dataRegionFactory.create(REBALANCE_REGION2_NAME); for (int i = 0; i < 50; i++) { region.put("key" + (i + 200), "value" + (i + 200)); } } }); vm2.invoke(new SerializableRunnable() { public void run() { // no need to close cache as it will be closed as part of teardown2 Cache cache = getCache(); RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); Region region = dataRegionFactory.create(REBALANCE_REGION_NAME); for (int i = 0; i < 150; i++) { region.put("key" + (i + 400), "value" + (i + 400)); } region = dataRegionFactory.create(REBALANCE_REGION2_NAME); for (int i = 0; i < 100; i++) { region.put("key" + (i + 200), "value" + (i + 200)); } } }); } SerializableRunnable checkRegionMBeans = new SerializableRunnable() { @Override public void run() { final WaitCriterion waitForMaangerMBean = new WaitCriterion() { @Override public boolean done() { final ManagementService service = ManagementService.getManagementService(getCache()); final DistributedRegionMXBean bean = service.getDistributedRegionMXBean(Region.SEPARATOR + REBALANCE_REGION_NAME); if (bean == null) { getLogWriter().info("Still probing for checkRegionMBeans ManagerMBean"); return false; } else { // verify that bean is proper before executing tests if (bean.getMembers() != null && bean.getMembers().length > 1 && bean.getMemberCount() > 0 && service.getDistributedSystemMXBean().listRegions().length >= 2) { return true; } else { return false; } } } @Override public String description() { return "Probing for testRebalanceCommandForSimulateWithNoMember ManagerMBean"; } }; waitForCriterion(waitForMaangerMBean, 2 * 60 * 1000, 2000, true); DistributedRegionMXBean bean = ManagementService.getManagementService(getCache()) .getDistributedRegionMXBean("/" + REBALANCE_REGION_NAME); assertNotNull(bean); } }; @Test public void testRebalanceCommandForTimeOut() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter().info("testRebalanceCommandForTimeOut verified Mbean and executin command"); String command = "rebalance --time-out=1"; CommandResult cmdResult = executeCommand(command); getLogWriter().info("testRebalanceCommandForTimeOut just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testRebalanceCommandForTimeOut stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceCommandForTimeOut failed as did not get CommandResult"); } } @Test public void testRebalanceCommandForTimeOutForRegion() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter() .info("testRebalanceCommandForTimeOutForRegion verified Mbean and executin command"); String command = "rebalance --time-out=1 --include-region=" + "/" + REBALANCE_REGION_NAME; CommandResult cmdResult = executeCommand(command); getLogWriter() .info("testRebalanceCommandForTimeOutForRegion just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testRebalanceCommandForTimeOutForRegion stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceCommandForTimeOut failed as did not get CommandResult"); } } @Test public void testRebalanceCommandForSimulate() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter().info("testRebalanceCommandForSimulate verified Mbean and executin command"); String command = "rebalance --simulate=true --include-region=" + "/" + REBALANCE_REGION_NAME; CommandResult cmdResult = executeCommand(command); getLogWriter().info("testRebalanceCommandForSimulate just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testRebalanceCommandForSimulate stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceCommandForSimulate failed as did not get CommandResult"); } } @Test public void testRebalanceCommandForSimulateWithNoMember() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter() .info("testRebalanceCommandForSimulateWithNoMember verified Mbean and executin command"); String command = "rebalance --simulate=true"; CommandResult cmdResult = executeCommand(command); getLogWriter() .info("testRebalanceCommandForSimulateWithNoMember just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter() .info("testRebalanceCommandForSimulateWithNoMember stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceCommandForSimulateWithNoMember failed as did not get CommandResult"); } } @Test public void testRebalanceForIncludeRegionFunction() { // setup(); setupWith2Regions(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter() .info("testRebalanceForIncludeRegionFunction verified Mbean and executin command"); String command = "rebalance --include-region=" + "/" + REBALANCE_REGION_NAME + ",/" + REBALANCE_REGION2_NAME; CommandResult cmdResult = executeCommand(command); getLogWriter().info("testRebalanceForIncludeRegionFunction just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testRebalanceForIncludeRegionFunction stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceForIncludeRegionFunction failed as did not get CommandResult"); } } @Category(FlakyTest.class) // GEODE-1561 @Test public void testSimulateForEntireDS() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter().info("testSimulateForEntireDS verified MBean and executing command"); String command = "rebalance --simulate=true"; CommandResult cmdResult = executeCommand(command); getLogWriter().info("testSimulateForEntireDS just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testSimulateForEntireDS stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceForIncludeRegionFunction failed as did not get CommandResult"); } } @Test public void testSimulateForEntireDSWithTimeout() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter().info("testSimulateForEntireDS verified MBean and executing command"); String command = "rebalance --simulate=true --time-out=-1"; CommandResult cmdResult = executeCommand(command); getLogWriter().info("testSimulateForEntireDS just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testSimulateForEntireDS stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceForIncludeRegionFunction failed as did not get CommandResult"); } } @Category(FlakyTest.class) // GEODE-1487 @Test public void testRebalanceForEntireDS() { setupTestRebalanceForEntireDS(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter().info("testRebalanceForEntireDS verified Mbean and executin command"); String command = "rebalance"; CommandResult cmdResult = executeCommand(command); getLogWriter().info("testRebalanceForEntireDS just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testRebalanceForEntireDS stringResult : " + stringResult); assertEquals(Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceForIncludeRegionFunction failed as did not get CommandResult"); } } void setupTestRebalanceForEntireDS() { final VM vm1 = Host.getHost(0).getVM(1); final VM vm2 = Host.getHost(0).getVM(2); setUpJmxManagerOnVm0ThenConnect(null); vm1.invoke(new SerializableRunnable() { public void run() { // no need to close cache as it will be closed as part of teardown2 Cache cache = getCache(); RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); Region region = dataRegionFactory.create(REBALANCE_REGION_NAME); for (int i = 0; i < 10; i++) { region.put("key" + (i + 200), "value" + (i + 200)); } region = dataRegionFactory.create(REBALANCE_REGION_NAME + "Another1"); for (int i = 0; i < 100; i++) { region.put("key" + (i + 200), "value" + (i + 200)); } } }); vm2.invoke(new SerializableRunnable() { public void run() { // no need to close cache as it will be closed as part of teardown2 Cache cache = getCache(); RegionFactory<Integer, Integer> dataRegionFactory = cache.createRegionFactory(RegionShortcut.PARTITION); Region region = dataRegionFactory.create(REBALANCE_REGION_NAME); for (int i = 0; i < 100; i++) { region.put("key" + (i + 400), "value" + (i + 400)); } region = dataRegionFactory.create(REBALANCE_REGION_NAME + "Another2"); for (int i = 0; i < 10; i++) { region.put("key" + (i + 200), "value" + (i + 200)); } } }); } private static void printCommandOutput(CommandResult cmdResult) { assertNotNull(cmdResult); getLogWriter().info("Command Output : "); StringBuilder sb = new StringBuilder(); cmdResult.resetToFirstLine(); while (cmdResult.hasNextLine()) { sb.append(cmdResult.nextLine()).append(DataCommandRequest.NEW_LINE); } getLogWriter().info(sb.toString()); getLogWriter().info(""); } public static class Value1WithValue2 extends Value1 { private Value2 value2 = null; public Value1WithValue2(int i) { super(i); value2 = new Value2(i); } public Value2 getValue2() { return value2; } public void setValue2(Value2 value2) { this.value2 = value2; } } @Test public void testRebalanceForExcludeRegionFunction() { setupWith2Regions(); // check if DistributedRegionMXBean is available so that command will not fail final VM manager = Host.getHost(0).getVM(0); manager.invoke(checkRegionMBeans); getLogWriter() .info("testRebalanceForExcludeRegionFunction verified Mbean and executing command"); String command = "rebalance --exclude-region=" + "/" + REBALANCE_REGION2_NAME; getLogWriter().info("testRebalanceForExcludeRegionFunction command : " + command); CommandResult cmdResult = executeCommand(command); getLogWriter().info("testRebalanceForExcludeRegionFunction just after executing " + cmdResult); if (cmdResult != null) { String stringResult = commandResultToString(cmdResult); getLogWriter().info("testRebalanceForExcludeRegionFunction stringResult : " + stringResult); assertEquals("CommandResult=" + cmdResult, Result.Status.OK, cmdResult.getStatus()); } else { fail("testRebalanceForIncludeRegionFunction failed as did not get CommandResult"); } } public void waitForListClientMbean(final String regionName) { final VM manager = Host.getHost(0).getVM(0); manager.invoke(new SerializableRunnable() { @Override public void run() { Cache cache = getCache(); final ManagementService service = ManagementService.getManagementService(cache); final WaitCriterion waitForMaangerMBean = new WaitCriterion() { @Override public boolean done() { ManagerMXBean bean1 = service.getManagerMXBean(); DistributedRegionMXBean bean2 = service.getDistributedRegionMXBean(regionName); if (bean1 == null) { getLogWriter().info("waitForListClientMbean Still probing for ManagerMBean"); return false; } else { getLogWriter().info( "waitForListClientMbean Still probing for DistributedRegionMXBean=" + bean2); if (bean2 == null) { bean2 = service.getDistributedRegionMXBean(Region.SEPARATOR + regionName); } if (bean2 == null) { getLogWriter().info( "waitForListClientMbean Still probing for DistributedRegionMXBean with separator = " + bean2); return false; } else { getLogWriter().info( "waitForListClientMbean Still probing for DistributedRegionMXBean with separator Not null " + bean2.getMembers().length); if (bean2.getMembers().length > 1) { return true; } else { return false; } } } } @Override public String description() { return "waitForListClientMbean Probing for ManagerMBean"; } }; waitForCriterion(waitForMaangerMBean, 30000, 2000, true); DistributedRegionMXBean bean = service.getDistributedRegionMXBean(regionName); if (bean == null) { bean = service.getDistributedRegionMXBean(Region.SEPARATOR + regionName); } assertNotNull(bean); } }); } @Test public void testRegionsViaMbeanAndFunctions() { setupForGetPutRemoveLocateEntry("tesSimplePut"); waitForListClientMbean(DATA_REGION_NAME_PATH); final VM manager = Host.getHost(0).getVM(0); String memSizeFromMbean = (String) manager.invoke(new SerializableCallable() { public Object call() { Cache cache = GemFireCacheImpl.getInstance(); DistributedRegionMXBean bean = ManagementService.getManagementService(cache) .getDistributedRegionMXBean(DATA_REGION_NAME_PATH); if (bean == null)// try with slash ahead bean = ManagementService.getManagementService(cache) .getDistributedRegionMXBean(Region.SEPARATOR + DATA_REGION_NAME_PATH); if (bean == null) { return null; } String[] membersName = bean.getMembers(); return "" + membersName.length; } }); getLogWriter().info("testRegionsViaMbeanAndFunctions memSizeFromMbean= " + memSizeFromMbean); String memSizeFromFunctionCall = (String) manager.invoke(new SerializableCallable() { public Object call() { Cache cache = GemFireCacheImpl.getInstance(); CliUtil.getMembersForeRegionViaFunction(cache, DATA_REGION_NAME_PATH, true); return "" + CliUtil.getMembersForeRegionViaFunction(cache, DATA_REGION_NAME_PATH, true).size(); } }); getLogWriter().info( "testRegionsViaMbeanAndFunctions memSizeFromFunctionCall= " + memSizeFromFunctionCall); assertTrue(memSizeFromFunctionCall.equals(memSizeFromMbean)); } @Test public void testRegionsViaMbeanAndFunctionsForPartRgn() { setupWith2Regions(); waitForListClientMbean(REBALANCE_REGION_NAME); final VM manager = Host.getHost(0).getVM(0); String memSizeFromMbean = (String) manager.invoke(new SerializableCallable() { public Object call() { Cache cache = GemFireCacheImpl.getInstance(); DistributedRegionMXBean bean = ManagementService.getManagementService(cache) .getDistributedRegionMXBean(REBALANCE_REGION_NAME); if (bean == null) { bean = ManagementService.getManagementService(cache) .getDistributedRegionMXBean(Region.SEPARATOR + REBALANCE_REGION_NAME); } if (bean == null) { return null; } String[] membersName = bean.getMembers(); return "" + membersName.length; } }); getLogWriter() .info("testRegionsViaMbeanAndFunctionsForPartRgn memSizeFromMbean= " + memSizeFromMbean); String memSizeFromFunctionCall = (String) manager.invoke(new SerializableCallable() { public Object call() { Cache cache = GemFireCacheImpl.getInstance(); return "" + CliUtil.getMembersForeRegionViaFunction(cache, REBALANCE_REGION_NAME, true).size(); } }); getLogWriter().info("testRegionsViaMbeanAndFunctionsForPartRgn memSizeFromFunctionCall= " + memSizeFromFunctionCall); assertTrue(memSizeFromFunctionCall.equals(memSizeFromMbean)); } }