Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 9EE9E200CE9 for ; Sat, 5 Aug 2017 01:25:38 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 9D6C716B0B5; Fri, 4 Aug 2017 23:25:38 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id BDE6016AFE5 for ; Sat, 5 Aug 2017 01:25:36 +0200 (CEST) Received: (qmail 91334 invoked by uid 500); 4 Aug 2017 23:25:30 -0000 Mailing-List: contact commits-help@geode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.apache.org Delivered-To: mailing list commits@geode.apache.org Received: (qmail 91096 invoked by uid 99); 4 Aug 2017 23:25:30 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 04 Aug 2017 23:25:30 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 99D05F553A; Fri, 4 Aug 2017 23:25:29 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: klund@apache.org To: commits@geode.apache.org Date: Fri, 04 Aug 2017 23:25:32 -0000 Message-Id: In-Reply-To: <978ac0f6ebb8465e92bfe2b053c4eda7@git.apache.org> References: <978ac0f6ebb8465e92bfe2b053c4eda7@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [04/27] geode git commit: GEODE-1359: Refactor IndexCommandsDUnitTest to use test rules and allow for removal of CliCommandTestBase archived-at: Fri, 04 Aug 2017 23:25:38 -0000 GEODE-1359: Refactor IndexCommandsDUnitTest to use test rules and allow for removal of CliCommandTestBase * this closes #670 Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/636e970d Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/636e970d Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/636e970d Branch: refs/heads/feature/GEODE-3299 Commit: 636e970d93f2fe67c4bb8cbc59c5243b44f4a89d Parents: 67026df Author: YehEmily Authored: Wed Jul 26 16:53:27 2017 -0700 Committer: Jinmei Liao Committed: Wed Aug 2 09:01:45 2017 -0700 ---------------------------------------------------------------------- .../cli/commands/IndexCommandsDUnitTest.java | 943 ++++--------------- ...ndexCommandsShareConfigurationDUnitTest.java | 175 ++++ .../cli/commands/CommandOverHttpDUnitTest.java | 2 +- .../cli/commands/IndexCommandOverHttpTest.java | 30 + 4 files changed, 374 insertions(+), 776 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/636e970d/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsDUnitTest.java index 16f708d..794c588 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsDUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsDUnitTest.java @@ -14,854 +14,247 @@ */ package org.apache.geode.management.internal.cli.commands; -import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION; -import static org.apache.geode.distributed.ConfigurationProperties.GROUPS; -import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT; -import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER; -import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_BIND_ADDRESS; -import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT; -import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START; -import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS; -import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL; -import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT; -import static org.apache.geode.distributed.ConfigurationProperties.NAME; -import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION; -import static org.apache.geode.test.dunit.Assert.assertEquals; -import static org.apache.geode.test.dunit.Assert.assertFalse; -import static org.apache.geode.test.dunit.Assert.assertNotNull; -import static org.apache.geode.test.dunit.Assert.assertNull; -import static org.apache.geode.test.dunit.Assert.assertTrue; -import static org.apache.geode.test.dunit.Assert.fail; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Properties; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; import org.apache.geode.cache.Cache; import org.apache.geode.cache.DataPolicy; -import org.apache.geode.cache.DiskStoreFactory; -import org.apache.geode.cache.EvictionAction; -import org.apache.geode.cache.EvictionAttributes; import org.apache.geode.cache.Region; import org.apache.geode.cache.RegionFactory; -import org.apache.geode.cache.query.Index; -import org.apache.geode.distributed.Locator; -import org.apache.geode.distributed.internal.ClusterConfigurationService; -import org.apache.geode.distributed.internal.InternalLocator; -import org.apache.geode.internal.AvailablePort; -import org.apache.geode.internal.AvailablePortHelper; +import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.management.cli.Result; -import org.apache.geode.management.cli.Result.Status; import org.apache.geode.management.internal.cli.domain.Stock; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.result.CommandResult; import org.apache.geode.management.internal.cli.util.CommandStringBuilder; -import org.apache.geode.test.dunit.Assert; -import org.apache.geode.test.dunit.Host; -import org.apache.geode.test.dunit.LogWriterUtils; -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.Wait; -import org.apache.geode.test.dunit.WaitCriterion; +import org.apache.geode.test.dunit.rules.GfshShellConnectionRule; +import org.apache.geode.test.dunit.rules.LocatorServerStartupRule; +import org.apache.geode.test.dunit.rules.MemberVM; import org.apache.geode.test.junit.categories.DistributedTest; -import org.apache.geode.test.junit.categories.FlakyTest; -import org.junit.Test; -import org.junit.experimental.categories.Category; - -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Properties; @Category(DistributedTest.class) -public class IndexCommandsDUnitTest extends CliCommandTestBase { - - private static final long serialVersionUID = 1L; - private static final String VM1Name = "VM1"; - private static final String group1 = "G1"; - private static final String indexName = "Id1"; - private static final String parRegPersName = "ParRegPers"; - private static final String repRegPersName = "RepRegPer"; - - Region createParReg(String regionName, Cache cache, Class keyConstraint, - Class valueConstraint) { - RegionFactory regionFactory = cache.createRegionFactory(); - regionFactory.setDataPolicy(DataPolicy.PARTITION); - regionFactory.setKeyConstraint(keyConstraint); - regionFactory.setValueConstraint(valueConstraint); - return regionFactory.create(regionName); +public class IndexCommandsDUnitTest { + + @Rule + public GfshShellConnectionRule gfsh = new GfshShellConnectionRule(); + + @Rule + public LocatorServerStartupRule startupRule = new LocatorServerStartupRule(); + private static final String partitionedRegionName = "partitionedRegion"; + private static final String indexName = "index1"; + private static final String groupName = "group1"; + + @Before + public void before() throws Exception { + Properties props = new Properties(); + props.setProperty("groups", groupName); + MemberVM serverVM = startupRule.startServerAsJmxManager(0, props); + serverVM.invoke(() -> { + InternalCache cache = LocatorServerStartupRule.serverStarter.getCache(); + Region parReg = + createPartitionedRegion(partitionedRegionName, cache, String.class, Stock.class); + parReg.put("VMW", new Stock("VMW", 98)); + parReg.put("APPL", new Stock("APPL", 600)); + }); + connect(serverVM); } - private Region createParRegWithPersistence(String regionName, String diskStoreName, - String diskDirName) { - Cache cache = getCache(); - File diskStoreDirFile = new File(diskDirName); - diskStoreDirFile.deleteOnExit(); - - if (!diskStoreDirFile.exists()) { - diskStoreDirFile.mkdirs(); - } - - DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory(); - diskStoreFactory.setDiskDirs(new File[] {diskStoreDirFile}); - diskStoreFactory.setMaxOplogSize(1); - diskStoreFactory.setAllowForceCompaction(true); - diskStoreFactory.setAutoCompact(false); - diskStoreFactory.create(diskStoreName); - - /**** - * Eviction Attributes - */ - EvictionAttributes ea = - EvictionAttributes.createLRUEntryAttributes(1, EvictionAction.OVERFLOW_TO_DISK); - - RegionFactory regionFactory = cache.createRegionFactory(); - regionFactory.setDiskStoreName(diskStoreName); - regionFactory.setDiskSynchronous(true); - regionFactory.setDataPolicy(DataPolicy.PERSISTENT_PARTITION); - regionFactory.setEvictionAttributes(ea); + public void connect(MemberVM serverVM) throws Exception { + gfsh.connectAndVerify(serverVM.getJmxPort(), GfshShellConnectionRule.PortType.jmxManger); + } - return regionFactory.create(regionName); + @Test + public void testCreateAndDestroyIndex() throws Exception { + // Create an index + CommandStringBuilder createStringBuilder = new CommandStringBuilder(CliStrings.CREATE_INDEX); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__NAME, indexName); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__REGION, "/" + partitionedRegionName); + gfsh.executeAndVerifyCommand(createStringBuilder.toString()); + + assertTrue(indexIsListed()); + + // Destroy the index + CommandStringBuilder destroyStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + destroyStringBuilder.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); + destroyStringBuilder.addOption(CliStrings.DESTROY_INDEX__REGION, "/" + partitionedRegionName); + gfsh.executeAndVerifyCommand(destroyStringBuilder.toString()); + + assertFalse(indexIsListed()); } - private Region createRepRegWithPersistence(String regionName, String diskStoreName, - String diskDirName) { - Cache cache = getCache(); - File diskStoreDirFile = new File(diskDirName); - diskStoreDirFile.deleteOnExit(); - - if (!diskStoreDirFile.exists()) { - diskStoreDirFile.mkdirs(); - } - - DiskStoreFactory diskStoreFactory = cache.createDiskStoreFactory(); - diskStoreFactory.setDiskDirs(new File[] {diskStoreDirFile}); - diskStoreFactory.setMaxOplogSize(1); - diskStoreFactory.setAllowForceCompaction(true); - diskStoreFactory.setAutoCompact(false); - diskStoreFactory.create(diskStoreName); - - /**** - * Eviction Attributes - */ - EvictionAttributes ea = - EvictionAttributes.createLRUEntryAttributes(1, EvictionAction.OVERFLOW_TO_DISK); + @Test + public void testCreateIndexWithMultipleIterators() throws Exception { + CommandStringBuilder createStringBuilder = new CommandStringBuilder(CliStrings.CREATE_INDEX); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__NAME, indexName); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "\"h.low\""); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__REGION, + "\"/" + partitionedRegionName + " s, s.history h\""); - RegionFactory regionFactory = cache.createRegionFactory(); - regionFactory.setDiskStoreName(diskStoreName); - regionFactory.setDiskSynchronous(true); - regionFactory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE); - regionFactory.setEvictionAttributes(ea); + gfsh.executeAndVerifyCommand(createStringBuilder.toString()); - return regionFactory.create(regionName); + assertTrue(indexIsListed()); } - public void testCreateKeyIndexOnRegionWithPersistence() { - setupSystemPersist(); + @Test + public void testCannotCreateIndexWithExistingIndexName() throws Exception { + createBaseIndexForTesting(); - // Creating key indexes on Persistent Partitioned Region + // CREATE the same index CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, "id1"); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "ty"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + parRegPersName); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "key"); - String commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("Command Result :\n", resultAsString); - assertTrue(Status.OK.equals(commandResult.getStatus())); - // Creating key indexes on Persistent Replicated Regions - csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, "id2"); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "ee"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + repRegPersName); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "key"); - commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command Result :\n", resultAsString); - assertTrue(Status.OK.equals(commandResult.getStatus())); + csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); + csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); + csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + partitionedRegionName); + csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); + + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); } - public void testCreateAndDestroyIndex() { - setupSystem(); - /*** - * Basic Create and Destroy - */ + @Test + public void testCannotCreateIndexInIncorrectRegion() throws Exception { + // Create index on a wrong regionPath CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - - String commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("testCreateAndDestroyIndex", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - assertTrue(resultAsString.contains(indexName)); - - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg"); - commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("testCreateAndDestroyIndex", resultAsString); - assertEquals(commandResult.getStatus(), Status.OK); - - commandResult = executeCommand(CliStrings.LIST_INDEX); - resultAsString = commandResultToString(commandResult); - assertEquals(commandResult.getStatus(), Status.OK); - assertFalse(resultAsString.contains(indexName)); + csb.addOption(CliStrings.CREATE_INDEX__REGION, "/InvalidRegionName"); + csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); + + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); } - public void testCreateIndexMultipleIterators() { - setupSystem(); + @Test + public void testCannotCreateIndexWithInvalidIndexExpression() throws Exception { + // Create index with wrong expression CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "\"h.low\""); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "\"/StocksParReg s, s.history h\""); - - String commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("testCreateIndexMultipleIterators", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("testCreateIndexMultipleIterators", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - assertTrue(resultAsString.contains(indexName)); + csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "InvalidExpressionOption"); + csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + partitionedRegionName); + csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); + + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); } - @Category(FlakyTest.class) // GEODE-1048: HeadlessGFSH, random ports @Test - public void testCreateMultipleIndexes() { - setupSystem(); - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX); + public void testCannotCreateIndexWithInvalidIndexType() throws Exception { + // Create index with wrong type + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); + csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + partitionedRegionName); + csb.addOption(CliStrings.CREATE_INDEX__TYPE, "InvalidIndexType"); - String commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("testCreateMultipleIndexes", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName + "2"); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - - csb = new CommandStringBuilder(CliStrings.CREATE_DEFINED_INDEXES); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - assertTrue(resultAsString.contains(indexName)); + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); } - @Category(FlakyTest.class) // GEODE-689: random ports, unused returns, HeadlessGfsh @Test - public void testClearMultipleIndexes() { - setupSystem(); - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); + public void testCannotDestroyIndexWithInvalidIndexName() throws Exception { + createBaseIndexForTesting(); - String commandString = csb.toString(); - writeToLog("Command String :\n ", commandString); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("testClearMultipleIndexes", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.DEFINE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName + "2"); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - - csb = new CommandStringBuilder(CliStrings.CLEAR_DEFINED_INDEXES); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - assertTrue(!resultAsString.contains(indexName)); + // Destroy index with incorrect indexName + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + csb.addOption(CliStrings.DESTROY_INDEX__NAME, "IncorrectIndexName"); + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); + assertThat(gfsh.getGfshOutput()).contains( + CliStrings.format(CliStrings.DESTROY_INDEX__INDEX__NOT__FOUND, "IncorrectIndexName")); } @Test - public void testCreateAndDestroyIndexOnMember() { - setupSystem(); - /*** - * Basic Create and Destroy - */ - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.MEMBER, VM1Name); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "key"); - - String commandString = csb.toString(); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnMember", resultAsString); - - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnMember", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - assertTrue(resultAsString.contains(indexName)); - assertTrue(resultAsString.contains(VM1Name)); - - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + public void testCannotDestroyIndexWithInvalidRegion() throws Exception { + createBaseIndexForTesting(); + + // Destroy index with incorrect region + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.MEMBER, VM1Name); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnMember", resultAsString); - assertEquals(commandResult.getStatus(), Status.OK); - - commandResult = executeCommand(CliStrings.LIST_INDEX); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnMember", resultAsString); - assertEquals(commandResult.getStatus(), Status.OK); - assertFalse(resultAsString.contains(VM1Name)); + csb.addOption(CliStrings.DESTROY_INDEX__REGION, "IncorrectRegion"); + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); + assertThat(gfsh.getGfshOutput()).contains( + CliStrings.format(CliStrings.DESTROY_INDEX__REGION__NOT__FOUND, "IncorrectRegion")); } - @Category(FlakyTest.class) // GEODE-1684 @Test - public void testCreateAndDestroyIndexOnGroup() { - setupSystem(); - /*** - * Basic Create and Destroy - */ - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); - csb.addOption(CliStrings.GROUP, group1); - - String commandString = csb.toString(); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnGroup", resultAsString); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - assertEquals(true, resultAsString.contains(indexName)); - assertEquals(true, resultAsString.contains(VM1Name)); - - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + public void testCannotDestroyIndexWithInvalidMember() throws Exception { + createBaseIndexForTesting(); + + // Destroy index with incorrect member name + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.GROUP, group1); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnGroup", resultAsString); - assertEquals(commandResult.getStatus(), Status.OK); - - commandResult = executeCommand(CliStrings.LIST_INDEX); - resultAsString = commandResultToString(commandResult); - assertEquals(commandResult.getStatus(), Status.OK); - assertFalse(resultAsString.contains(VM1Name)); - - /*** - * In case of a partitioned region , the index might get created on a member which hosts the - * region and is not the member of the group1 - */ - if (resultAsString.contains(indexName)) { - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "/StocksParReg"); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(commandResult.getStatus(), Status.OK); - - commandResult = executeCommand(CliStrings.LIST_INDEX); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexOnGroup", resultAsString); - - assertEquals(commandResult.getStatus(), Status.OK); - assertFalse(resultAsString.contains(indexName)); - assertTrue(resultAsString.contains(CliStrings.LIST_INDEX__INDEXES_NOT_FOUND_MESSAGE)); - } + csb.addOption(CliStrings.DESTROY_INDEX__REGION, "Region"); + csb.addOption(CliStrings.MEMBER, "InvalidMemberName"); + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); } @Test - public void testCreateAndDestroyIndexWithIncorrectInput() { - setupSystem(); - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); - String commandString = csb.toString(); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); + public void testCannotDestroyIndexWithNoOptions() throws Exception { + createBaseIndexForTesting(); - assertEquals(commandResult.getStatus(), Status.OK); - - // CREATE the same index - csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); - - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); - // assertTrue(resultAsString.contains(CliStrings.format(CliStrings.CREATE_INDEX__NAME__CONFLICT, - // indexName))); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - - - // Create index on a wrong regionPath - csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocsParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); - - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); - // assertTrue(resultAsString.contains(CliStrings.format(CliStrings.CREATE_INDEX__INVALID__REGIONPATH, - // "/StocsParReg"))); + // Destroy index with no option + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + CommandResult result = gfsh.executeCommand(csb.toString()); + assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR); + } - // Create index with wrong expression - csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, "Id2"); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "rey"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); + @Test + public void testDestroyIndexViaRegion() throws Exception { + createBaseIndexForTesting(); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + csb.addOption(CliStrings.DESTROY_INDEX__REGION, partitionedRegionName); + gfsh.executeAndVerifyCommand(csb.toString()); - // Create index with wrong type - csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "bash"); + assertFalse(indexIsListed()); + } - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(resultAsString.contains(CliStrings.CREATE_INDEX__INVALID__INDEX__TYPE__MESSAGE)); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); + @Test + public void testDestroyIndexViaGroup() throws Exception { + createBaseIndexForTesting(); - // Destroy index with incorrect indexName - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.DESTROY_INDEX__NAME, "Id2"); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); - assertTrue(resultAsString - .contains(CliStrings.format(CliStrings.DESTROY_INDEX__INDEX__NOT__FOUND, "Id2"))); + CommandStringBuilder csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + csb.addOption(CliStrings.GROUP, groupName); + gfsh.executeAndVerifyCommand(csb.toString()); - // Destroy index with incorrect region - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "Region"); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); - assertTrue(resultAsString - .contains(CliStrings.format(CliStrings.DESTROY_INDEX__REGION__NOT__FOUND, "Region"))); - - // Destroy index with incorrect memberName - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "Region"); - csb.addOption(CliStrings.MEMBER, "wrongOne"); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); + assertFalse(indexIsListed()); - // Destroy index with no option - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - writeToLog("Command String :\n ", commandString); - writeToLog("testCreateAndDestroyIndexWithIncorrectInput", resultAsString); - assertTrue(commandResult.getStatus().equals(Status.ERROR)); } - @Category(FlakyTest.class) // GEODE-1315 - @Test - public void testDestroyIndexWithoutIndexName() { - setupSystem(); + private void createBaseIndexForTesting() throws Exception { CommandStringBuilder csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); + csb.addOption(CliStrings.CREATE_INDEX__REGION, "/" + partitionedRegionName); csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); - String commandString = csb.toString(); - CommandResult commandResult = executeCommand(commandString); - String resultAsString = commandResultToString(commandResult); - assertEquals(commandResult.getStatus(), Status.OK); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - assertEquals(true, resultAsString.contains(indexName)); - assertEquals(true, resultAsString.contains(VM1Name)); - - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.GROUP, group1); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.CREATE_INDEX); - csb.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - csb.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - csb.addOption(CliStrings.CREATE_INDEX__REGION, "/StocksParReg"); - csb.addOption(CliStrings.CREATE_INDEX__TYPE, "hash"); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - csb.addOption(CliStrings.DESTROY_INDEX__REGION, "StocksParReg"); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - - csb = new CommandStringBuilder(CliStrings.LIST_INDEX); - commandString = csb.toString(); - commandResult = executeCommand(commandString); - resultAsString = commandResultToString(commandResult); - assertEquals(Status.OK, commandResult.getStatus()); - assertTrue(resultAsString.contains(CliStrings.LIST_INDEX__INDEXES_NOT_FOUND_MESSAGE)); - } - - /** - * Asserts that creating and destroying indexes correctly updates the shared configuration. - */ - @Category(FlakyTest.class) // GEODE-1954 - @Test - public void testCreateDestroyUpdatesSharedConfig() { - disconnectAllFromDS(); - final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); - jmxPort = ports[0]; - httpPort = ports[1]; - try { - jmxHost = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException ignore) { - jmxHost = "localhost"; - } - - final String regionName = "testIndexSharedConfigRegion"; - final String groupName = "testIndexSharedConfigGroup"; - - final Properties locatorProps = new Properties(); - locatorProps.setProperty(NAME, "Locator"); - locatorProps.setProperty(MCAST_PORT, "0"); - locatorProps.setProperty(LOG_LEVEL, "fine"); - locatorProps.setProperty(ENABLE_CLUSTER_CONFIGURATION, "true"); - locatorProps.setProperty(JMX_MANAGER, "true"); - locatorProps.setProperty(JMX_MANAGER_START, "true"); - locatorProps.setProperty(JMX_MANAGER_BIND_ADDRESS, String.valueOf(jmxHost)); - locatorProps.setProperty(JMX_MANAGER_PORT, String.valueOf(jmxPort)); - locatorProps.setProperty(HTTP_SERVICE_PORT, String.valueOf(httpPort)); - - // Start the Locator and wait for shared configuration to be available - final int locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET); - Host.getHost(0).getVM(0).invoke(new SerializableRunnable() { - @Override - public void run() { - final File locatorLogFile = new File("locator-" + locatorPort + ".log"); - try { - final InternalLocator locator = (InternalLocator) Locator.startLocatorAndDS(locatorPort, - locatorLogFile, null, locatorProps); - - WaitCriterion wc = new WaitCriterion() { - @Override - public boolean done() { - return locator.isSharedConfigurationRunning(); - } - - @Override - public String description() { - return "Waiting for shared configuration to be started"; - } - }; - Wait.waitForCriterion(wc, 5000, 500, true); - } catch (IOException ioex) { - fail("Unable to create a locator with a shared configuration"); - } - } - }); - - // Start the default manager - connect(jmxHost, jmxPort, httpPort, getDefaultShell()); - - // Create a cache in VM 1 - VM vm = Host.getHost(0).getVM(1); - vm.invoke(new SerializableRunnable() { - @Override - public void run() { - Properties localProps = new Properties(); - localProps.setProperty(MCAST_PORT, "0"); - localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]"); - localProps.setProperty(GROUPS, groupName); - getSystem(localProps); - assertNotNull(getCache()); - - Region parReg = createParReg(regionName, getCache(), String.class, Stock.class); - parReg.put("VMW", new Stock("VMW", 98)); - } - }); - - // Test creating the index - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_INDEX); - commandStringBuilder.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); - commandStringBuilder.addOption(CliStrings.CREATE_INDEX__NAME, indexName); - commandStringBuilder.addOption(CliStrings.GROUP, groupName); - commandStringBuilder.addOption(CliStrings.CREATE_INDEX__REGION, "\"/" + regionName + " p\""); - CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - - // Make sure the index exists in the shared config - Host.getHost(0).getVM(0).invoke(new SerializableRunnable() { - @Override - public void run() { - ClusterConfigurationService sharedConfig = - ((InternalLocator) Locator.getLocator()).getSharedConfiguration(); - String xmlFromConfig; - try { - xmlFromConfig = sharedConfig.getConfiguration(groupName).getCacheXmlContent(); - assertTrue(xmlFromConfig.contains(indexName)); - } catch (Exception e) { - Assert.fail("Error occurred in cluster configuration service", e); - } - } - }); - - // Restart a member and make sure he gets the shared configuration - vm = Host.getHost(0).getVM(1); - vm.invoke(new SerializableRunnable() { - @Override - public void run() { - getCache().close(); - - Properties localProps = new Properties(); - localProps.setProperty(MCAST_PORT, "0"); - localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]"); - localProps.setProperty(GROUPS, groupName); - localProps.setProperty(USE_CLUSTER_CONFIGURATION, "true"); - getSystem(localProps); - Cache cache = getCache(); - assertNotNull(cache); - Region region = cache.getRegion(regionName); - assertNotNull(region); - Index index = cache.getQueryService().getIndex(region, indexName); - assertNotNull(index); - } - }); - - // Test destroying the index - commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_INDEX); - commandStringBuilder.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); - commandStringBuilder.addOption(CliStrings.GROUP, groupName); - commandStringBuilder.addOption(CliStrings.DESTROY_INDEX__REGION, "/" + regionName); - cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - - // Make sure the index was removed from the shared config - Host.getHost(0).getVM(0).invoke(new SerializableRunnable() { - @Override - public void run() { - ClusterConfigurationService sharedConfig = - ((InternalLocator) Locator.getLocator()).getSharedConfiguration(); - String xmlFromConfig; - try { - xmlFromConfig = sharedConfig.getConfiguration(groupName).getCacheXmlContent(); - assertFalse(xmlFromConfig.contains(indexName)); - } catch (Exception e) { - Assert.fail("Error occurred in cluster configuration service", e); - } - } - }); - - // Restart the data member cache to make sure that the index is destroyed. - vm = Host.getHost(0).getVM(1); - vm.invoke(new SerializableRunnable() { - @Override - public void run() { - getCache().close(); - - Properties localProps = new Properties(); - localProps.setProperty(MCAST_PORT, "0"); - localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]"); - localProps.setProperty(GROUPS, groupName); - localProps.setProperty(USE_CLUSTER_CONFIGURATION, "true"); - getSystem(localProps); - Cache cache = getCache(); - assertNotNull(cache); - Region region = cache.getRegion(regionName); - assertNotNull(region); - Index index = cache.getQueryService().getIndex(region, indexName); - assertNull(index); - } - }); + gfsh.executeAndVerifyCommand(csb.toString()); + assertTrue(indexIsListed()); } - private void writeToLog(String text, String resultAsString) { - LogWriterUtils.getLogWriter().info(getTestMethodName() + "\n"); - LogWriterUtils.getLogWriter().info(resultAsString); + private boolean indexIsListed() throws Exception { + gfsh.executeAndVerifyCommand(CliStrings.LIST_INDEX); + return gfsh.getGfshOutput().contains(indexName); } - private void setupSystem() { - disconnectAllFromDS(); - setUpJmxManagerOnVm0ThenConnect(null); - final String parRegName = "StocksParReg"; - - final VM manager = Host.getHost(0).getVM(0); - final VM vm1 = Host.getHost(0).getVM(1); - - manager.invoke(new SerializableCallable() { - public Object call() { - Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class); - parReg.put("VMW", new Stock("VMW", 98)); - return parReg.put("APPL", new Stock("APPL", 600)); - } - }); - - vm1.invoke(new SerializableCallable() { - @Override - public Object call() throws Exception { - Properties props = new Properties(); - props.setProperty(NAME, VM1Name); - props.setProperty(GROUPS, group1); - getSystem(props); - Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class); - parReg.put("MSFT", new Stock("MSFT", 27)); - return parReg.put("GOOG", new Stock("GOOG", 540)); - } - }); + private static Region createPartitionedRegion(String regionName, Cache cache, + Class keyConstraint, Class valueConstraint) { + RegionFactory regionFactory = cache.createRegionFactory(); + regionFactory.setDataPolicy(DataPolicy.PARTITION); + regionFactory.setKeyConstraint(keyConstraint); + regionFactory.setValueConstraint(valueConstraint); + return regionFactory.create(regionName); } - private void setupSystemPersist() { - disconnectAllFromDS(); - setUpJmxManagerOnVm0ThenConnect(null); - final String parRegName = "StocksParReg"; - - final VM manager = Host.getHost(0).getVM(0); - final VM vm1 = Host.getHost(0).getVM(1); - - manager.invoke(new SerializableCallable() { - public Object call() { - Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class); - parReg.put("VMW", new Stock("VMW", 98)); - Region parRegPers = createParRegWithPersistence(parRegPersName, "testCreateIndexDiskstore1", - "testCreateIndexDiskDir1"); - Region repRegPers = createRepRegWithPersistence(repRegPersName, "testCreateIndexDiskstore1", - "testCreateIndexDiskDir1"); - return parReg.put("APPL", new Stock("APPL", 600)); - } - }); - - vm1.invoke(new SerializableCallable() { - @Override - public Object call() throws Exception { - Properties props = new Properties(); - props.setProperty(NAME, VM1Name); - props.setProperty(GROUPS, group1); - getSystem(props); - Region parReg = createParReg(parRegName, getCache(), String.class, Stock.class); - parReg.put("MSFT", new Stock("MSFT", 27)); - Region parRegPers = createParRegWithPersistence(parRegPersName, "testCreateIndexDiskstore2", - "testCreateIndexDiskDir2"); - Region repRegPers = createRepRegWithPersistence(repRegPersName, "testCreateIndexDiskstore2", - "testCreateIndexDiskDir2"); - return parReg.put("GOOG", new Stock("GOOG", 540)); - } - }); - } } + http://git-wip-us.apache.org/repos/asf/geode/blob/636e970d/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsShareConfigurationDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsShareConfigurationDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsShareConfigurationDUnitTest.java new file mode 100644 index 0000000..1a5fc34 --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandsShareConfigurationDUnitTest.java @@ -0,0 +1,175 @@ +/* + * 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.ENABLE_CLUSTER_CONFIGURATION; +import static org.apache.geode.distributed.ConfigurationProperties.GROUPS; +import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT; +import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER; +import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT; +import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START; +import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL; +import static org.apache.geode.distributed.ConfigurationProperties.NAME; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Properties; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import org.apache.geode.cache.Cache; +import org.apache.geode.cache.DataPolicy; +import org.apache.geode.cache.Region; +import org.apache.geode.cache.RegionFactory; +import org.apache.geode.cache.query.Index; +import org.apache.geode.distributed.Locator; +import org.apache.geode.distributed.internal.ClusterConfigurationService; +import org.apache.geode.distributed.internal.InternalLocator; +import org.apache.geode.internal.AvailablePortHelper; +import org.apache.geode.internal.cache.InternalCache; +import org.apache.geode.management.internal.cli.domain.Stock; +import org.apache.geode.management.internal.cli.i18n.CliStrings; +import org.apache.geode.management.internal.cli.util.CommandStringBuilder; +import org.apache.geode.test.dunit.Assert; +import org.apache.geode.test.dunit.rules.GfshShellConnectionRule; +import org.apache.geode.test.dunit.rules.LocatorServerStartupRule; +import org.apache.geode.test.dunit.rules.MemberVM; +import org.apache.geode.test.junit.categories.DistributedTest; + +@Category(DistributedTest.class) +public class IndexCommandsShareConfigurationDUnitTest { + + @Rule + public GfshShellConnectionRule gfsh = new GfshShellConnectionRule(); + + @Rule + public LocatorServerStartupRule startupRule = new LocatorServerStartupRule(); + private static String partitionedRegionName = "partitionedRegion"; + private static String indexName = "index1"; + private static String groupName = "group1"; + private MemberVM serverVM; + private MemberVM locator; + + @Before + public void before() throws Exception { + int jmxPort, httpPort; + + final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); + jmxPort = ports[0]; + httpPort = ports[1]; + + final Properties locatorProps = new Properties(); + locatorProps.setProperty(NAME, "Locator"); + locatorProps.setProperty(LOG_LEVEL, "fine"); + locatorProps.setProperty(ENABLE_CLUSTER_CONFIGURATION, "true"); + locatorProps.setProperty(JMX_MANAGER, "true"); + locatorProps.setProperty(JMX_MANAGER_START, "true"); + locatorProps.setProperty(JMX_MANAGER_PORT, String.valueOf(jmxPort)); + locatorProps.setProperty(HTTP_SERVICE_PORT, String.valueOf(httpPort)); + + locator = startupRule.startLocatorVM(0, locatorProps); + + gfsh.connectAndVerify(locator.getJmxPort(), GfshShellConnectionRule.PortType.jmxManger); + + Properties props = new Properties(); + props.setProperty(GROUPS, groupName); + serverVM = startupRule.startServerVM(1, props, locator.getPort()); + serverVM.invoke(() -> { + InternalCache cache = LocatorServerStartupRule.serverStarter.getCache(); + Region parReg = + createPartitionedRegion(partitionedRegionName, cache, String.class, Stock.class); + parReg.put("VMW", new Stock("VMW", 98)); + }); + } + + @Test + public void testCreateAndDestroyUpdatesSharedConfiguration() throws Exception { + CommandStringBuilder createStringBuilder = new CommandStringBuilder(CliStrings.CREATE_INDEX); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__NAME, indexName); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__EXPRESSION, "key"); + createStringBuilder.addOption(CliStrings.GROUP, groupName); + createStringBuilder.addOption(CliStrings.CREATE_INDEX__REGION, "/" + partitionedRegionName); + gfsh.executeAndVerifyCommand(createStringBuilder.toString()); + + assertTrue(indexIsListed()); + + locator.invoke(() -> { + ClusterConfigurationService sharedConfig = + ((InternalLocator) Locator.getLocator()).getSharedConfiguration(); + String xmlFromConfig; + try { + xmlFromConfig = sharedConfig.getConfiguration(groupName).getCacheXmlContent(); + assertTrue(xmlFromConfig.contains(indexName)); + } catch (Exception e) { + Assert.fail("Error occurred in cluster configuration service", e); + } + }); + + createStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_INDEX); + createStringBuilder.addOption(CliStrings.DESTROY_INDEX__NAME, indexName); + createStringBuilder.addOption(CliStrings.GROUP, groupName); + createStringBuilder.addOption(CliStrings.DESTROY_INDEX__REGION, "/" + partitionedRegionName); + gfsh.executeAndVerifyCommand(createStringBuilder.toString()); + + locator.invoke(() -> { + ClusterConfigurationService sharedConfig = + ((InternalLocator) Locator.getLocator()).getSharedConfiguration(); + String xmlFromConfig; + try { + xmlFromConfig = sharedConfig.getConfiguration(groupName).getCacheXmlContent(); + assertFalse(xmlFromConfig.contains(indexName)); + } catch (Exception e) { + Assert.fail("Error occurred in cluster configuration service", e); + } + }); + + // Restart the data member cache to make sure that the index is destroyed. + + startupRule.stopMember(1); + + Properties props = new Properties(); + props.setProperty(GROUPS, groupName); + serverVM = startupRule.startServerVM(1, props, locator.getPort()); + + serverVM.invoke(() -> { + InternalCache restartedCache = LocatorServerStartupRule.serverStarter.getCache(); + assertNotNull(restartedCache); + Region region = restartedCache.getRegion(partitionedRegionName); + assertNotNull(region); + Index index = restartedCache.getQueryService().getIndex(region, indexName); + assertNull(index); + }); + } + + private static Region createPartitionedRegion(String regionName, Cache cache, + Class keyConstraint, Class valueConstraint) { + RegionFactory regionFactory = cache.createRegionFactory(); + regionFactory.setDataPolicy(DataPolicy.PARTITION); + regionFactory.setKeyConstraint(keyConstraint); + regionFactory.setValueConstraint(valueConstraint); + return regionFactory.create(regionName); + } + + private boolean indexIsListed() throws Exception { + gfsh.executeAndVerifyCommand(CliStrings.LIST_INDEX); + return gfsh.getGfshOutput().contains(indexName); + } +} + http://git-wip-us.apache.org/repos/asf/geode/blob/636e970d/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/CommandOverHttpDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/CommandOverHttpDUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/CommandOverHttpDUnitTest.java index 2fe9407..7753aaf 100644 --- a/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/CommandOverHttpDUnitTest.java +++ b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/CommandOverHttpDUnitTest.java @@ -29,7 +29,7 @@ import org.apache.geode.test.junit.runner.SuiteRunner; @Suite.SuiteClasses({ConfigCommandsDUnitTest.class, DeployCommandsDUnitTest.class, DiskStoreCommandsDUnitTest.class, FunctionCommandsDUnitTest.class, GemfireDataCommandsDUnitTest.class, - GetCommandOnRegionWithCacheLoaderDuringCacheMissDUnitTest.class, IndexCommandsDUnitTest.class, + GetCommandOnRegionWithCacheLoaderDuringCacheMissDUnitTest.class, ListAndDescribeDiskStoreCommandsDUnitTest.class, ListIndexCommandDUnitTest.class, MiscellaneousCommandsDUnitTest.class, QueueCommandsDUnitTest.class, ShellCommandsDUnitTest.class, ShowDeadlockDUnitTest.class, ShowMetricsDUnitTest.class, http://git-wip-us.apache.org/repos/asf/geode/blob/636e970d/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandOverHttpTest.java ---------------------------------------------------------------------- diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandOverHttpTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandOverHttpTest.java new file mode 100644 index 0000000..9406aa2 --- /dev/null +++ b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/IndexCommandOverHttpTest.java @@ -0,0 +1,30 @@ +/* + * 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 org.junit.experimental.categories.Category; + +import org.apache.geode.test.dunit.rules.GfshShellConnectionRule; +import org.apache.geode.test.dunit.rules.MemberVM; +import org.apache.geode.test.junit.categories.DistributedTest; + +@Category(DistributedTest.class) +public class IndexCommandOverHttpTest extends IndexCommandsDUnitTest { + @Override + public void connect(MemberVM serverVM) throws Exception { + gfsh.connectAndVerify(serverVM.getHttpPort(), GfshShellConnectionRule.PortType.http); + } +}