http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java index a1b9ade..e913746 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java @@ -27,39 +27,37 @@ 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.apache.geode.test.dunit.LogWriterUtils.getLogWriter; import static org.awaitility.Awaitility.waitAtMost; -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.text.MessageFormat; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.Callable; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.TimeUnit; - -import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; - import org.apache.commons.io.FileUtils; -import org.junit.Test; -import org.junit.experimental.categories.Category; - import org.apache.geode.cache.Cache; +import org.apache.geode.cache.PartitionAttributes; +import org.apache.geode.cache.PartitionAttributesFactory; +import org.apache.geode.cache.PartitionResolver; import org.apache.geode.cache.Region; +import org.apache.geode.cache.RegionAttributes; +import org.apache.geode.cache.RegionFactory; +import org.apache.geode.cache.RegionShortcut; +import org.apache.geode.cache.Scope; +import org.apache.geode.cache.asyncqueue.AsyncEvent; +import org.apache.geode.cache.asyncqueue.AsyncEventListener; +import org.apache.geode.cache.wan.GatewaySenderFactory; +import org.apache.geode.compression.SnappyCompressor; 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.ClassBuilder; import org.apache.geode.internal.cache.GemFireCacheImpl; +import org.apache.geode.internal.cache.PartitionedRegion; +import org.apache.geode.internal.cache.RegionEntryContext; import org.apache.geode.management.ManagementService; import org.apache.geode.management.cli.Result; import org.apache.geode.management.internal.MBeanJMXAdapter; @@ -72,26 +70,330 @@ import org.apache.geode.test.dunit.SerializableCallable; import org.apache.geode.test.dunit.VM; import org.apache.geode.test.junit.categories.DistributedTest; import org.apache.geode.test.junit.categories.FlakyTest; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.text.MessageFormat; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; @Category(DistributedTest.class) public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBase { + private static final long serialVersionUID = 1L; - private final List<String> filesToBeDeleted = new CopyOnWriteArrayList<String>(); - private void waitForRegionMBeanCreation(final String regionPath) { + final String alterRegionName = "testAlterRegionRegion"; + final String alterAsyncEventQueueId1 = "testAlterRegionQueue1"; + final String alterAsyncEventQueueId2 = "testAlterRegionQueue2"; + final String alterAsyncEventQueueId3 = "testAlterRegionQueue3"; + final String alterGatewaySenderId1 = "testAlterRegionSender1"; + final String alterGatewaySenderId2 = "testAlterRegionSender2"; + final String alterGatewaySenderId3 = "testAlterRegionSender3"; + final String region46391 = "region46391"; + VM alterVm1; + String alterVm1Name; + VM alterVm2; + String alterVm2Name; + + final List<String> filesToBeDeleted = new CopyOnWriteArrayList<String>(); + + /** + * Asserts that the "compressor" option for the "create region" command succeeds for a recognized + * compressor. + */ + @Test + public void testCreateRegionWithGoodCompressor() { + setUpJmxManagerOnVm0ThenConnect(null); + VM vm = Host.getHost(0).getVM(1); + + // Create a cache in vm 1 + vm.invoke(() -> { + assertNotNull(getCache()); + }); + + // Run create region command with compression + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "compressedRegion"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__COMPRESSOR, + RegionEntryContext.DEFAULT_COMPRESSION_PROVIDER); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + // Make sure our region exists with compression enabled + vm.invoke(() -> { + Region region = getCache().getRegion("compressedRegion"); + assertNotNull(region); + assertTrue( + SnappyCompressor.getDefaultInstance().equals(region.getAttributes().getCompressor())); + }); + + // cleanup + commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_REGION); + commandStringBuilder.addOption(CliStrings.DESTROY_REGION__REGION, "compressedRegion"); + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + } + + /** + * Asserts that the "compressor" option for the "create region" command fails for an unrecognized + * compressorc. + */ + @Test + public void testCreateRegionWithBadCompressor() { + setUpJmxManagerOnVm0ThenConnect(null); + + VM vm = Host.getHost(0).getVM(1); + + // Create a cache in vm 1 + vm.invoke(() -> { + assertNotNull(getCache()); + }); + + // Create a region with an unrecognized compressor + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "compressedRegion"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__COMPRESSOR, "BAD_COMPRESSOR"); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + // Assert that our region was not created + vm.invoke(() -> { + Region region = getCache().getRegion("compressedRegion"); + assertNull(region); + }); + } + + /** + * Asserts that a missing "compressor" option for the "create region" command results in a region + * with no compression. + */ + @Test + public void testCreateRegionWithNoCompressor() { + setUpJmxManagerOnVm0ThenConnect(null); + + VM vm = Host.getHost(0).getVM(1); + + // Create a cache in vm 1 + vm.invoke(() -> { + assertNotNull(getCache()); + }); + + // Create a region with no compression + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "testRegion"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + // Assert that our newly created region has no compression + vm.invoke(() -> { + Region region = getCache().getRegion("testRegion"); + assertNotNull(region); + assertNull(region.getAttributes().getCompressor()); + }); + + // Cleanup + commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_REGION); + commandStringBuilder.addOption(CliStrings.DESTROY_REGION__REGION, "testRegion"); + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + } + + @Test + public void testDestroyDistributedRegion() { + setUpJmxManagerOnVm0ThenConnect(null); + + for (int i = 1; i <= 2; i++) { + Host.getHost(0).getVM(i).invoke(() -> { + final Cache cache = getCache(); + + RegionFactory<Object, Object> factory = cache.createRegionFactory(RegionShortcut.PARTITION); + factory.create("Customer"); + + PartitionAttributesFactory paFactory = new PartitionAttributesFactory(); + paFactory.setColocatedWith("Customer"); + factory.setPartitionAttributes(paFactory.create()); + factory.create("Order"); + }); + } + + waitForRegionMBeanCreation("/Customer", 2); + waitForRegionMBeanCreation("/Order", 2); + + // Test failure when region not found + String command = "destroy region --name=DOESNOTEXIST"; + getLogWriter().info("testDestroyRegion command=" + command); + CommandResult cmdResult = executeCommand(command); + String strr = commandResultToString(cmdResult); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertTrue(stringContainsLine(strr, "Could not find.*\"DOESNOTEXIST\".*")); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + // Test unable to destroy with co-location + command = "destroy region --name=/Customer"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + // Test success + command = "destroy region --name=/Order"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + assertTrue(stringContainsLine(strr, ".*Order.*destroyed successfully.*")); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + command = "destroy region --name=/Customer"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + assertTrue(stringContainsLine(strr, ".*Customer.*destroyed successfully.*")); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + } + + @Test + public void testDestroyLocalRegions() { + setUpJmxManagerOnVm0ThenConnect(null); + + for (int i = 1; i <= 3; i++) { + Host.getHost(0).getVM(i).invoke(() -> { + final Cache cache = getCache(); + + RegionFactory<Object, Object> factory = cache.createRegionFactory(RegionShortcut.REPLICATE); + factory.setScope(Scope.LOCAL); + factory.create("Customer"); + }); + } + + waitForRegionMBeanCreation("/Customer", 3); + + // Test failure when region not found + String command = "destroy region --name=DOESNOTEXIST"; + getLogWriter().info("testDestroyRegion command=" + command); + CommandResult cmdResult = executeCommand(command); + String strr = commandResultToString(cmdResult); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertTrue(stringContainsLine(strr, "Could not find.*\"DOESNOTEXIST\".*")); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + command = "destroy region --name=/Customer"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + assertTrue(stringContainsLine(strr, ".*Customer.*destroyed successfully.*")); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + for (int i = 1; i <= 3; i++) { + final int x = i; + Host.getHost(0).getVM(i).invoke(() -> { + assertNull("Region still exists in VM " + x, getCache().getRegion("Customer")); + }); + } + } + + @Test + public void testDestroyLocalAndDistributedRegions() { + setUpJmxManagerOnVm0ThenConnect(null); + + for (int i = 1; i <= 2; i++) { + Host.getHost(0).getVM(i).invoke(() -> { + final Cache cache = getCache(); + RegionFactory<Object, Object> factory = cache.createRegionFactory(RegionShortcut.PARTITION); + factory.create("Customer"); + factory.create("Customer-2"); + factory.create("Customer_3"); + }); + } + + Host.getHost(0).getVM(3).invoke(() -> { + final Cache cache = getCache(); + RegionFactory<Object, Object> factory = cache.createRegionFactory(RegionShortcut.REPLICATE); + factory.setScope(Scope.LOCAL); + factory.create("Customer"); + factory.create("Customer-2"); + factory.create("Customer_3"); + }); + + waitForRegionMBeanCreation("/Customer", 3); + + // Test failure when region not found + String command = "destroy region --name=DOESNOTEXIST"; + getLogWriter().info("testDestroyRegion command=" + command); + CommandResult cmdResult = executeCommand(command); + String strr = commandResultToString(cmdResult); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertTrue(stringContainsLine(strr, "Could not find.*\"DOESNOTEXIST\".*")); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + command = "destroy region --name=/Customer"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + assertTrue(stringContainsLine(strr, ".*Customer.*destroyed successfully.*")); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + command = "destroy region --name=/Customer_3"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + assertTrue(stringContainsLine(strr, ".*Customer_3.*destroyed successfully.*")); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + command = "destroy region --name=/Customer-2"; + getLogWriter().info("testDestroyRegion command=" + command); + cmdResult = executeCommand(command); + strr = commandResultToString(cmdResult); + assertTrue(stringContainsLine(strr, ".*Customer-2.*destroyed successfully.*")); + getLogWriter().info("testDestroyRegion strr=" + strr); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + for (int i = 1; i <= 3; i++) { + final int x = i; + Host.getHost(0).getVM(i).invoke(() -> { + assertNull("Region still exists in VM " + x, getCache().getRegion("Customer")); + assertNull("Region still exists in VM " + x, getCache().getRegion("Customer-2")); + assertNull("Region still exists in VM " + x, getCache().getRegion("Customer_3")); + }); + } + } + + private void waitForRegionMBeanCreation(final String regionPath, final int mbeanCount) { Host.getHost(0).getVM(0).invoke(() -> { - waitAtMost(5, TimeUnit.SECONDS).until(newRegionMBeanIsCreated(regionPath)); + waitAtMost(5, TimeUnit.SECONDS).until(newRegionMBeanIsCreated(regionPath, mbeanCount)); }); } - private Callable<Boolean> newRegionMBeanIsCreated(final String regionPath) { + private Callable<Boolean> newRegionMBeanIsCreated(final String regionPath, final int mbeanCount) { return () -> { try { MBeanServer mbeanServer = MBeanJMXAdapter.mbeanServer; String queryExp = MessageFormat.format(ManagementConstants.OBJECTNAME__REGION_MXBEAN, regionPath, "*"); ObjectName queryExpON = new ObjectName(queryExp); - return mbeanServer.queryNames(null, queryExpON).size() == 1; + return mbeanServer.queryNames(null, queryExpON).size() == mbeanCount; } catch (MalformedObjectNameException mone) { getLogWriter().error(mone); fail(mone.getMessage()); @@ -100,6 +402,556 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas }; } + @Category(FlakyTest.class) // GEODE-973: random ports, BindException, + // java.rmi.server.ExportException: Port already in use + @Test + public void testCreateRegion46391() throws IOException { + setUpJmxManagerOnVm0ThenConnect(null); // GEODE-973: getRandomAvailablePort + String command = CliStrings.CREATE_REGION + " --" + CliStrings.CREATE_REGION__REGION + "=" + + this.region46391 + " --" + CliStrings.CREATE_REGION__REGIONSHORTCUT + "=REPLICATE"; + + getLogWriter().info("testCreateRegion46391 create region command=" + command); + + CommandResult cmdResult = executeCommand(command); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + command = CliStrings.PUT + " --" + CliStrings.PUT__KEY + "=k1" + " --" + CliStrings.PUT__VALUE + + "=k1" + " --" + CliStrings.PUT__REGIONNAME + "=" + this.region46391; + + getLogWriter().info("testCreateRegion46391 put command=" + command); + + CommandResult cmdResult2 = executeCommand(command); + assertEquals(Result.Status.OK, cmdResult2.getStatus()); + + getLogWriter().info("testCreateRegion46391 cmdResult2=" + commandResultToString(cmdResult2)); + String str1 = "Result : true"; + String str2 = "Key : k1"; + String str3 = "Key Class : java.lang.String"; + String str4 = "Value Class : java.lang.String"; + String str5 = "Old Value : <NULL>"; + + assertTrue(commandResultToString(cmdResult) + .contains("Region \"/" + this.region46391 + "\" created on")); + + assertTrue(commandResultToString(cmdResult2).contains(str1)); + assertTrue(commandResultToString(cmdResult2).contains(str2)); + assertTrue(commandResultToString(cmdResult2).contains(str3)); + assertTrue(commandResultToString(cmdResult2).contains(str4)); + assertTrue(commandResultToString(cmdResult2).contains(str5)); + } + + @Ignore("bug51924") + @Test + public void testAlterRegion() throws IOException { + setUpJmxManagerOnVm0ThenConnect(null); + + CommandResult cmdResult = executeCommand(CliStrings.LIST_REGION); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + assertTrue(commandResultToString(cmdResult).contains("No Regions Found")); + + Host.getHost(0).getVM(0).invoke(() -> { + Cache cache = getCache(); + cache.createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true) + .create(alterRegionName); + }); + + this.alterVm1 = Host.getHost(0).getVM(1); + this.alterVm1Name = "VM" + this.alterVm1.getPid(); + this.alterVm1.invoke(() -> { + Properties localProps = new Properties(); + localProps.setProperty(NAME, alterVm1Name); + localProps.setProperty(GROUPS, "Group1"); + getSystem(localProps); + Cache cache = getCache(); + + // Setup queues and gateway senders to be used by all tests + cache.createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true) + .create(alterRegionName); + AsyncEventListener listener = new AsyncEventListener() { + @Override + public void close() { + // Nothing to do + } + + @Override + public boolean processEvents(List<AsyncEvent> events) { + return true; + } + }; + cache.createAsyncEventQueueFactory().create(alterAsyncEventQueueId1, listener); + cache.createAsyncEventQueueFactory().create(alterAsyncEventQueueId2, listener); + cache.createAsyncEventQueueFactory().create(alterAsyncEventQueueId3, listener); + + GatewaySenderFactory gatewaySenderFactory = cache.createGatewaySenderFactory(); + gatewaySenderFactory.setManualStart(true); + gatewaySenderFactory.create(alterGatewaySenderId1, 2); + gatewaySenderFactory.create(alterGatewaySenderId2, 3); + gatewaySenderFactory.create(alterGatewaySenderId3, 4); + }); + + this.alterVm2 = Host.getHost(0).getVM(2); + this.alterVm2Name = "VM" + this.alterVm2.getPid(); + this.alterVm2.invoke(() -> { + Properties localProps = new Properties(); + localProps.setProperty(NAME, alterVm2Name); + localProps.setProperty(GROUPS, "Group1,Group2"); + getSystem(localProps); + Cache cache = getCache(); + + cache.createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true) + .create(alterRegionName); + }); + + deployJarFilesForRegionAlter(); + regionAlterGroupTest(); + regionAlterSetAllTest(); + regionAlterNoChangeTest(); + regionAlterSetDefaultsTest(); + regionAlterManipulatePlugInsTest(); + + this.alterVm1.invoke(() -> { + getCache().getRegion(alterRegionName).destroyRegion(); + }); + } + + private void regionAlterGroupTest() { + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__EVICTIONMAX, "5764"); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + String stringResult = commandResultToString(cmdResult); + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(5764, attributes.getEvictionAttributes().getMaximum()); + }); + + this.alterVm2.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(5764, attributes.getEvictionAttributes().getMaximum()); + }); + + commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group2"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__EVICTIONMAX, "6963"); + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + stringResult = commandResultToString(cmdResult); + assertEquals(3, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertFalse(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(5764, attributes.getEvictionAttributes().getMaximum()); + }); + + this.alterVm2.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(6963, attributes.getEvictionAttributes().getMaximum()); + }); + } + + private void regionAlterSetAllTest() { + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__EVICTIONMAX, "35464"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CLONINGENABLED, "true"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIME, "3453"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIMEACTION, + "DESTROY"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ENTRYEXPIRATIONTIMETOLIVE, "7563"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ENTRYEXPIRATIONTTLACTION, "DESTROY"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerA"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELOADER, + "com.cadrdunit.RegionAlterCacheLoader"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHEWRITER, + "com.cadrdunit.RegionAlterCacheWriter"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIME, "6234"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIMEACTION, + "DESTROY"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGIONEXPIRATIONTTL, "4562"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGIONEXPIRATIONTTLACTION, "DESTROY"); + + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + String stringResult = commandResultToString(cmdResult); + assertEquals(5, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + "Manager.*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(35464, attributes.getEvictionAttributes().getMaximum()); + assertEquals(3453, attributes.getEntryIdleTimeout().getTimeout()); + assertTrue(attributes.getEntryIdleTimeout().getAction().isDestroy()); + assertEquals(7563, attributes.getEntryTimeToLive().getTimeout()); + assertTrue(attributes.getEntryTimeToLive().getAction().isDestroy()); + assertEquals(6234, attributes.getRegionIdleTimeout().getTimeout()); + assertTrue(attributes.getRegionIdleTimeout().getAction().isDestroy()); + assertEquals(4562, attributes.getRegionTimeToLive().getTimeout()); + assertTrue(attributes.getRegionTimeToLive().getAction().isDestroy()); + assertEquals(1, attributes.getAsyncEventQueueIds().size()); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId1)); + assertEquals(1, attributes.getGatewaySenderIds().size()); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId1)); + assertEquals(1, attributes.getCacheListeners().length); + assertEquals("com.cadrdunit.RegionAlterCacheListenerA", + attributes.getCacheListeners()[0].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheWriter", + attributes.getCacheWriter().getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheLoader", + attributes.getCacheLoader().getClass().getName()); + }); + } + + private void regionAlterNoChangeTest() { + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CLONINGENABLED, "true"); + + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + String stringResult = commandResultToString(cmdResult); + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm2.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(35464, attributes.getEvictionAttributes().getMaximum()); + assertEquals(3453, attributes.getEntryIdleTimeout().getTimeout()); + assertTrue(attributes.getEntryIdleTimeout().getAction().isDestroy()); + assertEquals(7563, attributes.getEntryTimeToLive().getTimeout()); + assertTrue(attributes.getEntryTimeToLive().getAction().isDestroy()); + assertEquals(6234, attributes.getRegionIdleTimeout().getTimeout()); + assertTrue(attributes.getRegionIdleTimeout().getAction().isDestroy()); + assertEquals(4562, attributes.getRegionTimeToLive().getTimeout()); + assertTrue(attributes.getRegionTimeToLive().getAction().isDestroy()); + assertEquals(1, attributes.getAsyncEventQueueIds().size()); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId1)); + assertEquals(1, attributes.getGatewaySenderIds().size()); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId1)); + assertEquals(1, attributes.getCacheListeners().length); + assertEquals("com.cadrdunit.RegionAlterCacheListenerA", + attributes.getCacheListeners()[0].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheWriter", + attributes.getCacheWriter().getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheLoader", + attributes.getCacheLoader().getClass().getName()); + }); + } + + private void regionAlterSetDefaultsTest() { + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__EVICTIONMAX); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CLONINGENABLED); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIME); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ENTRYEXPIRATIONTTLACTION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELOADER); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHEWRITER); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIME); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIMEACTION); + + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + String stringResult = commandResultToString(cmdResult); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(0, attributes.getEvictionAttributes().getMaximum()); + assertEquals(0, attributes.getEntryIdleTimeout().getTimeout()); + assertTrue(attributes.getEntryIdleTimeout().getAction().isDestroy()); + assertEquals(7563, attributes.getEntryTimeToLive().getTimeout()); + assertTrue(attributes.getEntryTimeToLive().getAction().isInvalidate()); + assertEquals(0, attributes.getRegionIdleTimeout().getTimeout()); + assertTrue(attributes.getRegionIdleTimeout().getAction().isInvalidate()); + assertEquals(4562, attributes.getRegionTimeToLive().getTimeout()); + assertTrue(attributes.getRegionTimeToLive().getAction().isDestroy()); + assertEquals(0, attributes.getAsyncEventQueueIds().size()); + assertEquals(0, attributes.getGatewaySenderIds().size()); + assertEquals(0, attributes.getCacheListeners().length); + }); + } + + private void regionAlterManipulatePlugInsTest() { + + // Start out by putting 3 entries into each of the plug-in sets + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId2); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId3); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId2); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId3); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerA"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerB"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerC"); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + String stringResult = commandResultToString(cmdResult); + + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(3, attributes.getAsyncEventQueueIds().size()); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId1)); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId2)); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId3)); + assertEquals(3, attributes.getGatewaySenderIds().size()); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId1)); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId2)); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId3)); + assertEquals(3, attributes.getCacheListeners().length); + assertEquals("com.cadrdunit.RegionAlterCacheListenerA", + attributes.getCacheListeners()[0].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerB", + attributes.getCacheListeners()[1].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerC", + attributes.getCacheListeners()[2].getClass().getName()); + }); + + // Now take 1 entry out of each of the sets + commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId2); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId3); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerB"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerC"); + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + stringResult = commandResultToString(cmdResult); + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm2.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(2, attributes.getAsyncEventQueueIds().size()); + Iterator iterator = attributes.getAsyncEventQueueIds().iterator(); + assertEquals(alterAsyncEventQueueId1, iterator.next()); + assertEquals(alterAsyncEventQueueId2, iterator.next()); + assertEquals(2, attributes.getGatewaySenderIds().size()); + iterator = attributes.getGatewaySenderIds().iterator(); + assertEquals(alterGatewaySenderId1, iterator.next()); + assertEquals(alterGatewaySenderId3, iterator.next()); + assertEquals(2, attributes.getCacheListeners().length); + assertEquals("com.cadrdunit.RegionAlterCacheListenerB", + attributes.getCacheListeners()[0].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerC", + attributes.getCacheListeners()[1].getClass().getName()); + }); + + // Add 1 back to each of the sets + commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId2); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, + this.alterAsyncEventQueueId3); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId1); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId3); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__GATEWAYSENDERID, + this.alterGatewaySenderId2); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerB"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerC"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerA"); + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + stringResult = commandResultToString(cmdResult); + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(3, attributes.getAsyncEventQueueIds().size()); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId1)); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId2)); + assertTrue(attributes.getAsyncEventQueueIds().contains(alterAsyncEventQueueId3)); + assertEquals(3, attributes.getGatewaySenderIds().size()); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId1)); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId3)); + assertTrue(attributes.getGatewaySenderIds().contains(alterGatewaySenderId2)); + assertEquals(3, attributes.getCacheListeners().length); + assertEquals("com.cadrdunit.RegionAlterCacheListenerB", + attributes.getCacheListeners()[0].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerC", + attributes.getCacheListeners()[1].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerA", + attributes.getCacheListeners()[2].getClass().getName()); + }); + } + + @Category(FlakyTest.class) // GEODE-3018 + @Test + public void testAlterRegionResetCacheListeners() throws IOException { + setUpJmxManagerOnVm0ThenConnect(null); + + CommandResult cmdResult = executeCommand(CliStrings.LIST_REGION); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + assertTrue(commandResultToString(cmdResult).contains("No Regions Found")); + + Host.getHost(0).getVM(0).invoke(() -> { + Cache cache = getCache(); + cache.createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true) + .create(alterRegionName); + }); + + this.alterVm1 = Host.getHost(0).getVM(1); + this.alterVm1Name = "VM" + this.alterVm1.getPid(); + this.alterVm1.invoke(() -> { + Properties localProps = new Properties(); + localProps.setProperty(NAME, alterVm1Name); + localProps.setProperty(GROUPS, "Group1"); + getSystem(localProps); + Cache cache = getCache(); + + // Setup queues and gateway senders to be used by all tests + cache.createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true) + .create(alterRegionName); + }); + + this.alterVm2 = Host.getHost(0).getVM(2); + this.alterVm2Name = "VM" + this.alterVm2.getPid(); + this.alterVm2.invoke(() -> { + Properties localProps = new Properties(); + localProps.setProperty(NAME, alterVm2Name); + localProps.setProperty(GROUPS, "Group1,Group2"); + getSystem(localProps); + Cache cache = getCache(); + + cache.createRegionFactory(RegionShortcut.PARTITION).setStatisticsEnabled(true) + .create(alterRegionName); + }); + + deployJarFilesForRegionAlter(); + + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, + "com.cadrdunit.RegionAlterCacheListenerA,com.cadrdunit.RegionAlterCacheListenerB,com.cadrdunit.RegionAlterCacheListenerC"); + + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + String stringResult = commandResultToString(cmdResult); + + assertEquals(5, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(3, attributes.getCacheListeners().length); + assertEquals("com.cadrdunit.RegionAlterCacheListenerA", + attributes.getCacheListeners()[0].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerB", + attributes.getCacheListeners()[1].getClass().getName()); + assertEquals("com.cadrdunit.RegionAlterCacheListenerC", + attributes.getCacheListeners()[2].getClass().getName()); + }); + + // Add 1 back to each of the sets + commandStringBuilder = new CommandStringBuilder(CliStrings.ALTER_REGION); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__REGION, "/" + this.alterRegionName); + commandStringBuilder.addOption(CliStrings.GROUP, "Group1"); + commandStringBuilder.addOption(CliStrings.ALTER_REGION__CACHELISTENER, "''"); + cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + stringResult = commandResultToString(cmdResult); + assertEquals(4, countLinesInString(stringResult, false)); + assertEquals(false, stringResult.contains("ERROR")); + assertTrue(stringContainsLine(stringResult, + this.alterVm1Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + assertTrue(stringContainsLine(stringResult, + this.alterVm2Name + ".*Region \"/" + this.alterRegionName + "\" altered.*")); + + this.alterVm1.invoke(() -> { + RegionAttributes attributes = getCache().getRegion(alterRegionName).getAttributes(); + assertEquals(0, attributes.getCacheListeners().length); + }); + } + /** * Asserts that creating, altering and destroying regions correctly updates the shared * configuration. @@ -117,6 +969,7 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas jmxHost = "localhost"; } + final String regionName = "testRegionSharedConfigRegion"; final String regionPath = "/" + regionName; final String groupName = "testRegionSharedConfigGroup"; @@ -141,7 +994,7 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas final InternalLocator locator = (InternalLocator) Locator.startLocatorAndDS(locatorPort, locatorLogFile, null, locatorProps); - waitAtMost(5, TimeUnit.SECONDS).until(locator::isSharedConfigurationRunning); + waitAtMost(5, TimeUnit.SECONDS).until(() -> locator.isSharedConfigurationRunning()); ManagementService managementService = ManagementService.getExistingManagementService(GemFireCacheImpl.getInstance()); @@ -177,7 +1030,7 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas assertEquals(Result.Status.OK, cmdResult.getStatus()); // Make sure that the region has been registered with the Manager MXBean - waitForRegionMBeanCreation(regionPath); + waitForRegionMBeanCreation(regionPath, 1); // Make sure the region exists in the shared config Host.getHost(0).getVM(0).invoke(() -> { @@ -256,8 +1109,251 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas return null; } }); + + } + + @Test + public void testDestroyRegionWithSharedConfig() { + 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 = "testRegionSharedConfigRegion"; + final String regionPath = "/" + regionName; + final String groupName = "testRegionSharedConfigGroup"; + + // Start the Locator and wait for shared configuration to be available + final int locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET); + + 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)); + + Host.getHost(0).getVM(0).invoke(() -> { + final File locatorLogFile = new File("locator-" + locatorPort + ".log"); + try { + final InternalLocator locator = (InternalLocator) Locator.startLocatorAndDS(locatorPort, + locatorLogFile, null, locatorProps); + + waitAtMost(5, TimeUnit.SECONDS).until(() -> locator.isSharedConfigurationRunning()); + } catch (IOException ioex) { + fail("Unable to create a locator with a shared configuration"); + } + }); + + connect(jmxHost, jmxPort, httpPort, getDefaultShell()); + + // Create a cache in VM 1 + VM vm = Host.getHost(0).getVM(1); + vm.invoke(() -> { + Properties localProps = new Properties(); + localProps.setProperty(MCAST_PORT, "0"); + localProps.setProperty(LOCATORS, "localhost[" + locatorPort + "]"); + localProps.setProperty(GROUPS, groupName); + getSystem(localProps); + assertNotNull(getCache()); + }); + + // Test creating the region + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, regionName); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__STATISTICSENABLED, "true"); + commandStringBuilder.addOption(CliStrings.GROUP, groupName); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + // Make sure that the region has been registered with the Manager MXBean + waitForRegionMBeanCreation(regionPath, 1); + + // Make sure the region exists in the shared config + Host.getHost(0).getVM(0).invoke(() -> { + ClusterConfigurationService sharedConfig = + ((InternalLocator) Locator.getLocator()).getSharedConfiguration(); + try { + assertTrue( + sharedConfig.getConfiguration(groupName).getCacheXmlContent().contains(regionName)); + } catch (Exception e) { + fail("Error occurred in cluster configuration service"); + } + }); + + // Test destroying the region + commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_REGION); + commandStringBuilder.addOption(CliStrings.DESTROY_REGION__REGION, regionName); + cmdResult = executeCommand(commandStringBuilder.toString()); + getLogWriter().info("#SB" + commandResultToString(cmdResult)); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + // Make sure the region was removed from the shared config + Host.getHost(0).getVM(0).invoke(() -> { + ClusterConfigurationService sharedConfig = + ((InternalLocator) Locator.getLocator()).getSharedConfiguration(); + try { + assertFalse( + sharedConfig.getConfiguration(groupName).getCacheXmlContent().contains(regionName)); + } catch (Exception e) { + fail("Error occurred in cluster configuration service"); + } + }); + + + // Restart the data vm to make sure the region is not existing any more + vm = Host.getHost(0).getVM(1); + vm.invoke(() -> { + Cache cache = getCache(); + assertNotNull(cache); + cache.close(); + assertTrue(cache.isClosed()); + + 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 = getCache(); + assertNotNull(cache); + Region region = cache.getRegion(regionName); + assertNull(region); + + return null; + }); } + + final String PR_STRING = " package com.cadrdunit;" + + " public class TestPartitionResolver implements org.apache.geode.cache.PartitionResolver { " + + " @Override" + " public void close() {" + " }" + " @Override" + + " public Object getRoutingObject(org.apache.geode.cache.EntryOperation opDetails) { " + + " return null; " + " }" + " @Override" + " public String getName() { " + + " return \"TestPartitionResolver\";" + " }" + " }"; + + /** + * Test Description 1. Deploy a JAR with Custom Partition Resolver 2. Create Region with Partition + * Resolver 3. Region should get created with no Errors 4. Verify Region Partition Attributes for + * Partition Resolver + */ + @Test + public void testCreateRegionWithPartitionResolver() throws IOException { + setUpJmxManagerOnVm0ThenConnect(null); + VM vm = Host.getHost(0).getVM(1); + // Create a cache in vm 1 + vm.invoke(() -> { + assertNotNull(getCache()); + }); + + ClassBuilder classBuilder = new ClassBuilder(); + // classBuilder.addToClassPath("."); + final File prJarFile = new File(temporaryFolder.getRoot().getCanonicalPath() + File.separator, + "myPartitionResolver.jar"); + this.filesToBeDeleted.add(prJarFile.getAbsolutePath()); + byte[] jarBytes = + classBuilder.createJarFromClassContent("com/cadrdunit/TestPartitionResolver", PR_STRING); + writeJarBytesToFile(prJarFile, jarBytes); + + CommandResult cmdResult = executeCommand("deploy --jar=" + prJarFile.getAbsolutePath()); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + + // Create a region with an unrecognized compressor + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "regionWithPartitionResolver"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "PARTITION"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__PARTITION_RESOLVER, + "com.cadrdunit.TestPartitionResolver"); + CommandResult cmdResult1 = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.OK, cmdResult1.getStatus()); + + // Assert that our region was not created + vm.invoke(() -> { + Region region = getCache().getRegion("regionWithPartitionResolver"); + assertNotNull(region); + + PartitionedRegion pr = (PartitionedRegion) region; + PartitionAttributes partitionAttributes = pr.getPartitionAttributes(); + assertNotNull(partitionAttributes); + PartitionResolver partitionResolver = partitionAttributes.getPartitionResolver(); + assertNotNull(partitionResolver); + assertEquals("TestPartitionResolver", partitionResolver.getName()); + }); + + vm.invoke(() -> { + getCache().getRegion("regionWithPartitionResolver").destroyRegion(); + }); + } + + @Test + public void testCreateRegionWithInvalidPartitionResolver() { + setUpJmxManagerOnVm0ThenConnect(null); + VM vm = Host.getHost(0).getVM(1); + // Create a cache in vm 1 + vm.invoke(() -> { + assertNotNull(getCache()); + }); + + // Create a region with an unrecognized compressor + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, + "testCreateRegionWithInvalidPartitionResolver"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "PARTITION"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__PARTITION_RESOLVER, "a.b.c.d"); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + // Assert that our region was not created + vm.invoke(() -> { + Region region = getCache().getRegion("testCreateRegionWithInvalidPartitionResolver"); + assertNull(region); + }); + } + + /** + * Test Description Try creating region of type REPLICATED and specify partition resolver Region + * Creation should fail. + */ + @Test + public void testCreateRegionForReplicatedRegionWithParitionResolver() { + setUpJmxManagerOnVm0ThenConnect(null); + VM vm = Host.getHost(0).getVM(1); + // Create a cache in vm 1 + vm.invoke(() -> { + assertNotNull(getCache()); + }); + + // Create a region with an unrecognized compressor + CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, + "testCreateRegionForReplicatedRegionWithParitionResolver"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); + commandStringBuilder.addOption(CliStrings.CREATE_REGION__PARTITION_RESOLVER, "a.b.c.d"); + CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); + assertEquals(Result.Status.ERROR, cmdResult.getStatus()); + + // Assert that our region was not created + vm.invoke(() -> { + Region region = + getCache().getRegion("testCreateRegionForReplicatedRegionWithParitionResolver"); + assertNull(region); + }); + } + + @Override protected final void preTearDownCliCommandTestBase() throws Exception { for (String path : this.filesToBeDeleted) { @@ -273,4 +1369,69 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas } this.filesToBeDeleted.clear(); } + + /** + * Deploys JAR files which contain classes to be instantiated by the "alter region" test. + */ + private void deployJarFilesForRegionAlter() throws IOException { + ClassBuilder classBuilder = new ClassBuilder(); + final File jarFile1 = new File(new File(".").getAbsolutePath(), "testAlterRegion1.jar"); + this.filesToBeDeleted.add(jarFile1.getAbsolutePath()); + final File jarFile2 = new File(new File(".").getAbsolutePath(), "testAlterRegion2.jar"); + this.filesToBeDeleted.add(jarFile2.getAbsolutePath()); + final File jarFile3 = new File(new File(".").getAbsolutePath(), "testAlterRegion3.jar"); + this.filesToBeDeleted.add(jarFile3.getAbsolutePath()); + final File jarFile4 = new File(new File(".").getAbsolutePath(), "testAlterRegion4.jar"); + this.filesToBeDeleted.add(jarFile4.getAbsolutePath()); + final File jarFile5 = new File(new File(".").getAbsolutePath(), "testAlterRegion5.jar"); + this.filesToBeDeleted.add(jarFile5.getAbsolutePath()); + + byte[] jarBytes = + classBuilder.createJarFromClassContent("com/cadrdunit/RegionAlterCacheListenerA", + "package com.cadrdunit;" + "import org.apache.geode.cache.util.CacheListenerAdapter;" + + "public class RegionAlterCacheListenerA extends CacheListenerAdapter {}"); + writeJarBytesToFile(jarFile1, jarBytes); + CommandResult cmdResult = executeCommand("deploy --jar=testAlterRegion1.jar"); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + jarBytes = classBuilder.createJarFromClassContent("com/cadrdunit/RegionAlterCacheListenerB", + "package com.cadrdunit;" + "import org.apache.geode.cache.util.CacheListenerAdapter;" + + "public class RegionAlterCacheListenerB extends CacheListenerAdapter {}"); + writeJarBytesToFile(jarFile2, jarBytes); + cmdResult = executeCommand("deploy --jar=testAlterRegion2.jar"); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + jarBytes = classBuilder.createJarFromClassContent("com/cadrdunit/RegionAlterCacheListenerC", + "package com.cadrdunit;" + "import org.apache.geode.cache.util.CacheListenerAdapter;" + + "public class RegionAlterCacheListenerC extends CacheListenerAdapter {}"); + writeJarBytesToFile(jarFile3, jarBytes); + cmdResult = executeCommand("deploy --jar=testAlterRegion3.jar"); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + jarBytes = classBuilder.createJarFromClassContent("com/cadrdunit/RegionAlterCacheLoader", + "package com.cadrdunit;" + "import org.apache.geode.cache.CacheLoader;" + + "import org.apache.geode.cache.CacheLoaderException;" + + "import org.apache.geode.cache.LoaderHelper;" + + "public class RegionAlterCacheLoader implements CacheLoader {" + + "public void close() {}" + + "public Object load(LoaderHelper helper) throws CacheLoaderException {return null;}}"); + writeJarBytesToFile(jarFile4, jarBytes); + cmdResult = executeCommand("deploy --jar=testAlterRegion4.jar"); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + + jarBytes = classBuilder.createJarFromClassContent("com/cadrdunit/RegionAlterCacheWriter", + "package com.cadrdunit;" + "import org.apache.geode.cache.util.CacheWriterAdapter;" + + "public class RegionAlterCacheWriter extends CacheWriterAdapter {}"); + writeJarBytesToFile(jarFile5, jarBytes); + cmdResult = executeCommand("deploy --jar=testAlterRegion5.jar"); + assertEquals(Result.Status.OK, cmdResult.getStatus()); + } + + private void writeJarBytesToFile(File jarFile, byte[] jarBytes) throws IOException { + final OutputStream outStream = new FileOutputStream(jarFile); + outStream.write(jarBytes); + outStream.flush(); + outStream.close(); + } + }
http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsTest.java new file mode 100644 index 0000000..85b660d --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAlterDestroyRegionCommandsTest.java @@ -0,0 +1,53 @@ +/* + * 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.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.mockito.Mockito; + +import org.apache.geode.internal.cache.InternalCache; +import org.apache.geode.management.DistributedSystemMXBean; +import org.apache.geode.test.dunit.rules.GfshParserRule; +import org.apache.geode.test.junit.categories.IntegrationTest; + +@Category(IntegrationTest.class) +public class CreateAlterDestroyRegionCommandsTest { + + @Rule + public GfshParserRule parser = new GfshParserRule(); + + @Test + public void testCreateRegionWithInvalidPartitionResolver() throws Exception { + InternalCache cache = mock(InternalCache.class); + DistributedSystemMXBean dsMBean = mock(DistributedSystemMXBean.class); + CreateAlterDestroyRegionCommands spy = Mockito.spy(CreateAlterDestroyRegionCommands.class); + + doReturn(cache).when(spy).getCache(); + doReturn(dsMBean).when(spy).getDSMBean(cache); + + String command = "create region --name=region3 --type=PARTITION --partition-resolver=Foo"; + + assertThatThrownBy(() -> parser.executeCommandWithInstance(spy, command)) + .hasMessageContaining("Foo is an invalid Partition Resolver"); + } +} http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandDUnitTest.java deleted file mode 100644 index 04168d5..0000000 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandDUnitTest.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * 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.test.dunit.LogWriterUtils.getLogWriter; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.junit.Test; -import org.junit.experimental.categories.Category; - -import org.apache.geode.cache.PartitionAttributes; -import org.apache.geode.cache.PartitionResolver; -import org.apache.geode.cache.Region; -import org.apache.geode.compression.SnappyCompressor; -import org.apache.geode.internal.ClassBuilder; -import org.apache.geode.internal.cache.PartitionedRegion; -import org.apache.geode.internal.cache.RegionEntryContext; -import org.apache.geode.management.cli.Result; -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.Host; -import org.apache.geode.test.dunit.VM; -import org.apache.geode.test.junit.categories.DistributedTest; -import org.apache.geode.test.junit.categories.FlakyTest; - -@Category(DistributedTest.class) -public class CreateRegionCommandDUnitTest extends CliCommandTestBase { - private final List<String> filesToBeDeleted = new CopyOnWriteArrayList<String>(); - - /** - * Asserts that the "compressor" option for the "create region" command succeeds for a recognized - * compressor. - */ - @Test - public void testCreateRegionWithGoodCompressor() { - setUpJmxManagerOnVm0ThenConnect(null); - VM vm = Host.getHost(0).getVM(1); - - // Create a cache in vm 1 - vm.invoke(() -> { - assertNotNull(getCache()); - }); - - // Run create region command with compression - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "compressedRegion"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__COMPRESSOR, - RegionEntryContext.DEFAULT_COMPRESSION_PROVIDER); - CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - - // Make sure our region exists with compression enabled - vm.invoke(() -> { - Region region = getCache().getRegion("compressedRegion"); - assertNotNull(region); - assertTrue( - SnappyCompressor.getDefaultInstance().equals(region.getAttributes().getCompressor())); - }); - - // cleanup - commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_REGION); - commandStringBuilder.addOption(CliStrings.DESTROY_REGION__REGION, "compressedRegion"); - cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - } - - /** - * Asserts that the "compressor" option for the "create region" command fails for an unrecognized - * compressorc. - */ - @Test - public void testCreateRegionWithBadCompressor() { - setUpJmxManagerOnVm0ThenConnect(null); - - VM vm = Host.getHost(0).getVM(1); - - // Create a cache in vm 1 - vm.invoke(() -> { - assertNotNull(getCache()); - }); - - // Create a region with an unrecognized compressor - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "compressedRegion"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__COMPRESSOR, "BAD_COMPRESSOR"); - CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.ERROR, cmdResult.getStatus()); - - // Assert that our region was not created - vm.invoke(() -> { - Region region = getCache().getRegion("compressedRegion"); - assertNull(region); - }); - } - - /** - * Asserts that a missing "compressor" option for the "create region" command results in a region - * with no compression. - */ - @Test - public void testCreateRegionWithNoCompressor() { - setUpJmxManagerOnVm0ThenConnect(null); - - VM vm = Host.getHost(0).getVM(1); - - // Create a cache in vm 1 - vm.invoke(() -> { - assertNotNull(getCache()); - }); - - // Create a region with no compression - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "testRegion"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); - CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - - // Assert that our newly created region has no compression - vm.invoke(() -> { - Region region = getCache().getRegion("testRegion"); - assertNotNull(region); - assertNull(region.getAttributes().getCompressor()); - }); - - // Cleanup - commandStringBuilder = new CommandStringBuilder(CliStrings.DESTROY_REGION); - commandStringBuilder.addOption(CliStrings.DESTROY_REGION__REGION, "testRegion"); - cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - } - - @Category(FlakyTest.class) // GEODE-973: random ports, BindException, - // java.rmi.server.ExportException: Port already in use - @Test - public void testCreateRegion46391() throws IOException { - setUpJmxManagerOnVm0ThenConnect(null); // GEODE-973: getRandomAvailablePort - String region46391 = "region46391"; - String command = CliStrings.CREATE_REGION + " --" + CliStrings.CREATE_REGION__REGION + "=" - + region46391 + " --" + CliStrings.CREATE_REGION__REGIONSHORTCUT + "=REPLICATE"; - - getLogWriter().info("testCreateRegion46391 create region command=" + command); - - CommandResult cmdResult = executeCommand(command); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - - command = CliStrings.PUT + " --" + CliStrings.PUT__KEY + "=k1" + " --" + CliStrings.PUT__VALUE - + "=k1" + " --" + CliStrings.PUT__REGIONNAME + "=" + region46391; - - getLogWriter().info("testCreateRegion46391 put command=" + command); - - CommandResult cmdResult2 = executeCommand(command); - assertEquals(Result.Status.OK, cmdResult2.getStatus()); - - getLogWriter().info("testCreateRegion46391 cmdResult2=" + commandResultToString(cmdResult2)); - String str1 = "Result : true"; - String str2 = "Key : k1"; - String str3 = "Key Class : java.lang.String"; - String str4 = "Value Class : java.lang.String"; - String str5 = "Old Value : <NULL>"; - - assertTrue( - commandResultToString(cmdResult).contains("Region \"/" + region46391 + "\" created on")); - - assertTrue(commandResultToString(cmdResult2).contains(str1)); - assertTrue(commandResultToString(cmdResult2).contains(str2)); - assertTrue(commandResultToString(cmdResult2).contains(str3)); - assertTrue(commandResultToString(cmdResult2).contains(str4)); - assertTrue(commandResultToString(cmdResult2).contains(str5)); - } - - /** - * Test Description 1. Deploy a JAR with Custom Partition Resolver 2. Create Region with Partition - * Resolver 3. Region should get created with no Errors 4. Verify Region Partition Attributes for - * Partition Resolver - */ - @Test - public void testCreateRegionWithPartitionResolver() throws IOException { - setUpJmxManagerOnVm0ThenConnect(null); - VM vm = Host.getHost(0).getVM(1); - // Create a cache in vm 1 - vm.invoke(() -> { - assertNotNull(getCache()); - }); - - ClassBuilder classBuilder = new ClassBuilder(); - // classBuilder.addToClassPath("."); - final File prJarFile = new File(temporaryFolder.getRoot().getCanonicalPath() + File.separator, - "myPartitionResolver.jar"); - this.filesToBeDeleted.add(prJarFile.getAbsolutePath()); - String PR_STRING = " package com.cadrdunit;" - + " public class TestPartitionResolver implements org.apache.geode.cache.PartitionResolver { " - + " @Override" + " public void close() {" + " }" + " @Override" - + " public Object getRoutingObject(org.apache.geode.cache.EntryOperation opDetails) { " - + " return null; " + " }" + " @Override" + " public String getName() { " - + " return \"TestPartitionResolver\";" + " }" + " }"; - byte[] jarBytes = - classBuilder.createJarFromClassContent("com/cadrdunit/TestPartitionResolver", PR_STRING); - writeJarBytesToFile(prJarFile, jarBytes); - - CommandResult cmdResult = executeCommand("deploy --jar=" + prJarFile.getAbsolutePath()); - assertEquals(Result.Status.OK, cmdResult.getStatus()); - - - // Create a region with an unrecognized compressor - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, "regionWithPartitionResolver"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "PARTITION"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__PARTITION_RESOLVER, - "com.cadrdunit.TestPartitionResolver"); - CommandResult cmdResult1 = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.OK, cmdResult1.getStatus()); - - // Assert that our region was not created - vm.invoke(() -> { - Region region = getCache().getRegion("regionWithPartitionResolver"); - assertNotNull(region); - - PartitionedRegion pr = (PartitionedRegion) region; - PartitionAttributes partitionAttributes = pr.getPartitionAttributes(); - assertNotNull(partitionAttributes); - PartitionResolver partitionResolver = partitionAttributes.getPartitionResolver(); - assertNotNull(partitionResolver); - assertEquals("TestPartitionResolver", partitionResolver.getName()); - }); - - vm.invoke(() -> { - getCache().getRegion("regionWithPartitionResolver").destroyRegion(); - }); - } - - @Test - public void testCreateRegionWithInvalidPartitionResolver() { - setUpJmxManagerOnVm0ThenConnect(null); - VM vm = Host.getHost(0).getVM(1); - // Create a cache in vm 1 - vm.invoke(() -> { - assertNotNull(getCache()); - }); - - // Create a region with an unrecognized compressor - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, - "testCreateRegionWithInvalidPartitionResolver"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "PARTITION"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__PARTITION_RESOLVER, "a.b.c.d"); - CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.ERROR, cmdResult.getStatus()); - - // Assert that our region was not created - vm.invoke(() -> { - Region region = getCache().getRegion("testCreateRegionWithInvalidPartitionResolver"); - assertNull(region); - }); - } - - /** - * Test Description Try creating region of type REPLICATED and specify partition resolver Region - * Creation should fail. - */ - @Test - public void testCreateRegionForReplicatedRegionWithParitionResolver() { - setUpJmxManagerOnVm0ThenConnect(null); - VM vm = Host.getHost(0).getVM(1); - // Create a cache in vm 1 - vm.invoke(() -> { - assertNotNull(getCache()); - }); - - // Create a region with an unrecognized compressor - CommandStringBuilder commandStringBuilder = new CommandStringBuilder(CliStrings.CREATE_REGION); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGION, - "testCreateRegionForReplicatedRegionWithParitionResolver"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, "REPLICATE"); - commandStringBuilder.addOption(CliStrings.CREATE_REGION__PARTITION_RESOLVER, "a.b.c.d"); - CommandResult cmdResult = executeCommand(commandStringBuilder.toString()); - assertEquals(Result.Status.ERROR, cmdResult.getStatus()); - - // Assert that our region was not created - vm.invoke(() -> { - Region region = - getCache().getRegion("testCreateRegionForReplicatedRegionWithParitionResolver"); - assertNull(region); - }); - } - - private void writeJarBytesToFile(File jarFile, byte[] jarBytes) throws IOException { - final OutputStream outStream = new FileOutputStream(jarFile); - outStream.write(jarBytes); - outStream.flush(); - outStream.close(); - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java deleted file mode 100644 index 5011d78..0000000 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommandTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.management.internal.cli.commands.CreateRegionCommand.regionExists; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.mockito.Mockito; - -import org.apache.geode.internal.cache.InternalCache; -import org.apache.geode.management.DistributedSystemMXBean; -import org.apache.geode.test.dunit.rules.GfshParserRule; -import org.apache.geode.test.junit.categories.IntegrationTest; - -@Category(IntegrationTest.class) -public class CreateRegionCommandTest { - @Rule - public GfshParserRule parser = new GfshParserRule(); - - @Test - public void testCreateRegionWithInvalidPartitionResolver() throws Exception { - InternalCache cache = mock(InternalCache.class); - DistributedSystemMXBean dsMBean = mock(DistributedSystemMXBean.class); - CreateRegionCommand spy = Mockito.spy(CreateRegionCommand.class); - - doReturn(cache).when(spy).getCache(); - doReturn(dsMBean).when(spy).getDSMBean(cache); - - String command = "create region --name=region3 --type=PARTITION --partition-resolver=Foo"; - assertThatThrownBy(() -> parser.executeCommandWithInstance(spy, command)) - .hasMessageContaining("Foo is an invalid Partition Resolver"); - } - - @Test - public void testRegionExistsReturnsCorrectValue() throws Exception { - InternalCache cache = mock(InternalCache.class); - assertThat(regionExists(cache, null)).isFalse(); - } -} http://git-wip-us.apache.org/repos/asf/geode/blob/645a32d0/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DeployCommandsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DeployCommandsDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DeployCommandsDUnitTest.java index 76541e2..89148d7 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DeployCommandsDUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DeployCommandsDUnitTest.java @@ -36,7 +36,7 @@ import org.apache.geode.test.junit.categories.DistributedTest; import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder; /** - * Unit tests for DeployCommand, UndeployCommand, ListDeployedCommand + * Unit tests for the DeployCommands class * * @since GemFire 7.0 */