[ 
https://issues.apache.org/jira/browse/GEODE-3955?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16271202#comment-16271202
 ] 

ASF GitHub Bot commented on GEODE-3955:
---------------------------------------

jinmeiliao commented on a change in pull request #1099: GEODE-3955: Add AEQ and 
Gateway Sender information to 'describe region' output.
URL: https://github.com/apache/geode/pull/1099#discussion_r153861365
 
 

 ##########
 File path: 
geode-core/src/test/java/org/apache/geode/management/internal/cli/domain/RegionDescriptionJUnitTest.java
 ##########
 @@ -0,0 +1,312 @@
+/*
+ * 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.domain;
+
+import static org.apache.geode.cache.DataPolicy.NORMAL;
+import static org.apache.geode.cache.Scope.DISTRIBUTED_ACK;
+import static org.apache.geode.cache.Scope.LOCAL;
+import static 
org.apache.geode.management.internal.cli.domain.RegionDescription.findCommon;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.json.JSONObject;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.management.cli.Result.Status;
+import org.apache.geode.management.internal.cli.commands.DescribeRegionCommand;
+import org.apache.geode.management.internal.cli.result.CommandResult;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+public class RegionDescriptionJUnitTest {
+  private static final String evictionKeyShared = "sharedEvictionKey";
+  private static final String partKeyShared = "sharedPartitionKey";
+  private static final String regKeyShared = "sharedRegionKey";
+  private static final String evictionValueShared = "sharedEvictionValue";
+  private static final String partValueShared = "sharedPartitionValue";
+  private static final String regValueShared = "sharedRegionValue";
+
+  private static final String evictionKeyA = "uniqueEvictionKey_A";
+  private static final String partKeyA = "uniquePartitionKey_A";
+  private static final String regKeyA = "uniqueRegionKey_A";
+  private static final String evictionValueA = "uniqueEvictionValue_A";
+  private static final String partValueA = "uniquePartitionValue_A";
+  private static final String regValueA = "uniqueRegionValue_A";
+
+  private static final String evictionKeyB = "uniqueEvictionKey_B";
+  private static final String partKeyB = "uniquePartitionKey_B";
+  private static final String regKeyB = "uniqueRegionKey_B";
+  private static final String evictionValueB = "uniqueEvictionValue_B";
+  private static final String partValueB = "uniquePartitionValue_B";
+  private static final String regValueB = "uniqueRegionValue_B";
+
+  public static final String regionName = "mockRegion1";
+
+  private static final DescribeRegionCommand command = 
spy(DescribeRegionCommand.class);
+
+  @Test
+  public void findCommonRemovesUnsharedKeys() {
+    Map<String, String> commonMap = new HashMap<>();
+    commonMap.put(evictionKeyShared, evictionValueShared);
+    commonMap.put(partKeyShared, partValueShared);
+    commonMap.put(regKeyShared, regValueShared);
+    commonMap.put(evictionKeyA, evictionValueA);
+    commonMap.put(partKeyA, partValueA);
+
+    Map<String, String> comparisonMap = new HashMap<>();
+    comparisonMap.put(evictionKeyShared, evictionValueShared);
+    comparisonMap.put(partKeyShared, partValueShared);
+    comparisonMap.put(regKeyShared, regValueShared);
+    commonMap.put(evictionKeyB, evictionValueB);
+    commonMap.put(regKeyA, regValueB);
+
+    findCommon(commonMap, comparisonMap);
+
+    assertThat(commonMap).containsOnlyKeys(evictionKeyShared, partKeyShared, 
regKeyShared);
+  }
+
+  @Test
+  public void findCommonRemovesDisagreeingKeys() {
+    Map<String, String> commonMap = new HashMap<>();
+    commonMap.put(evictionKeyShared, evictionValueShared);
+    commonMap.put(partKeyShared, partValueA);
+    commonMap.put(regKeyShared, regValueA);
+
+    Map<String, String> comparisonMap = new HashMap<>();
+    comparisonMap.put(evictionKeyShared, evictionValueShared);
+    comparisonMap.put(partKeyShared, partValueB);
+    comparisonMap.put(regKeyShared, regValueB);
+
+    findCommon(commonMap, comparisonMap);
+
+    assertThat(commonMap).containsOnlyKeys(evictionKeyShared);
+  }
+
+  @Test
+  public void findCommonRemovesDisagreeingKeysInvolvingNull() {
+    Map<String, String> commonMap = new HashMap<>();
+    commonMap.put(evictionKeyShared, evictionValueShared);
+    commonMap.put(partKeyShared, partValueA);
+    commonMap.put(regKeyShared, null);
+
+    Map<String, String> comparisonMap = new HashMap<>();
+    comparisonMap.put(evictionKeyShared, evictionValueShared);
+    comparisonMap.put(partKeyShared, null);
+    comparisonMap.put(regKeyShared, regValueB);
+
+    findCommon(commonMap, comparisonMap);
+
+    assertThat(commonMap).containsOnlyKeys(evictionKeyShared);
+  }
+
+
+  @Test
+  public void singleAddDefinesDescription() {
+    RegionDescriptionPerMember mockA = getMockRegionDescriptionPerMember_A();
+    RegionDescription description = new RegionDescription();
+    description.add(mockA);
+
+    assertThat(description.getCndEvictionAttributes())
+        .isEqualTo(mockA.getNonDefaultEvictionAttributes());
+    assertThat(description.getCndPartitionAttributes())
+        .isEqualTo(mockA.getNonDefaultPartitionAttributes());
+    assertThat(description.getCndRegionAttributes())
+        .isEqualTo(mockA.getNonDefaultRegionAttributes());
+  }
+
+  @Test
+  public void multipleAddsMergeAsExpected() {
+    RegionDescriptionPerMember mockA = getMockRegionDescriptionPerMember_A();
+    RegionDescriptionPerMember mockB = getMockRegionDescriptionPerMember_B();
+    RegionDescription description = new RegionDescription();
+    description.add(mockA);
+    description.add(mockB);
+
+    Map<String, String> sharedEviction = new HashMap<>();
+    sharedEviction.put(evictionKeyShared, evictionValueShared);
+    Map<String, String> sharedRegion = new HashMap<>();
+    sharedRegion.put(regKeyShared, regValueShared);
+    Map<String, String> sharedPartition = new HashMap<>();
+    sharedPartition.put(partKeyShared, partValueShared);
+
+    
assertThat(description.getCndEvictionAttributes()).isEqualTo(sharedEviction);
+    
assertThat(description.getCndPartitionAttributes()).isEqualTo(sharedPartition);
+    assertThat(description.getCndRegionAttributes()).isEqualTo(sharedRegion);
+
+    assertThat(description.getRegionDescriptionPerMemberMap())
+        .containsOnlyKeys(mockA.getHostingMember(), mockB.getHostingMember())
+        .containsEntry(mockA.getHostingMember(), mockA)
+        .containsEntry(mockB.getHostingMember(), mockB);
+  }
+
+  @Test
+  public void outOfScopeAddGetsIgnored() {
+    RegionDescriptionPerMember mockA = getMockRegionDescriptionPerMember_A();
+    RegionDescriptionPerMember mockB = 
getMockRegionDescriptionPerMember_OutOfScope();
+    RegionDescription description = new RegionDescription();
+    description.add(mockA);
+    description.add(mockB);
+
+    assertThat(description.getCndEvictionAttributes())
+        .isEqualTo(mockA.getNonDefaultEvictionAttributes());
+    assertThat(description.getCndPartitionAttributes())
+        .isEqualTo(mockA.getNonDefaultPartitionAttributes());
+    assertThat(description.getCndRegionAttributes())
+        .isEqualTo(mockA.getNonDefaultRegionAttributes());
+  }
+
+  @Test
+  public void simpleDescribeRegionCommandConsumesRegionDescriptionAsExpected() 
{
+    RegionDescriptionPerMember mockDescPerMember = 
getMockRegionDescriptionPerMember_A();
+    RegionDescription regionDescription = new RegionDescription();
+    regionDescription.add(mockDescPerMember);
+    CommandResult commandResult =
+        (CommandResult) command.buildDescriptionResult(regionName, 
regionDescription);
+    assertThat(commandResult.getStatus()).isEqualTo(Status.OK);
+    // We can't assert that the "Non-Default Attributes Specific To The 
Hosting Members" header is
+    // missing because Gfsh currently obfuscates portions of the underlying 
json that have empty
+    // "content" fields. We'll have to dig into the JSON to verify.
+    JSONObject shared = getSharedAttributedJson(commandResult);
+    JSONObject unique = getMemberSpecificAttributeJson(commandResult);
+    assertThat(shared.toString()).contains(evictionKeyShared, partKeyShared, 
regKeyShared,
+        evictionValueShared, partValueShared, regValueShared, evictionKeyA, 
partKeyA, regKeyA,
+        evictionValueA, partValueA, regValueA);
+    assertThat(unique.toString()).isEqualTo("{}");
+  }
+
+  @Test
+  public void 
compoundDescribeRegionCommandConsumesRegionDescriptionAsExpected() {
+    RegionDescriptionPerMember mockDescPerMemberA = 
getMockRegionDescriptionPerMember_A();
+    RegionDescriptionPerMember mockDescPerMemberB = 
getMockRegionDescriptionPerMember_B();
+    RegionDescription regionDescription = new RegionDescription();
+    regionDescription.add(mockDescPerMemberA);
+    regionDescription.add(mockDescPerMemberB);
+    CommandResult commandResult =
+        (CommandResult) command.buildDescriptionResult(regionName, 
regionDescription);
+    assertThat(commandResult.getStatus()).isEqualTo(Status.OK);
+    // We can't assert that the "Non-Default Attributes Specific To The 
Hosting Members" header is
+    // missing because Gfsh currently obfuscates portions of the underlying 
json that have empty
+    // "content" fields. We'll have to dig into the JSON to verify.
+    JSONObject shared = getSharedAttributedJson(commandResult);
+    JSONObject unique = getMemberSpecificAttributeJson(commandResult);
+    assertThat(shared.toString()).contains(evictionKeyShared, partKeyShared, 
regKeyShared,
+        evictionValueShared, partValueShared, regValueShared);
+    assertThat(unique.toString()).contains(evictionKeyA, evictionValueA, 
partKeyA, partValueA,
+        regKeyA, regValueA, evictionKeyB, evictionValueB, partKeyB, 
partValueB, regKeyB, regValueB);
+  }
+
+  private JSONObject getSharedAttributedJson(CommandResult commandResult) {
+    return 
commandResult.getContent().getInternalJsonObject().getJSONObject("__sections__-0")
 
 Review comment:
   use commandResult.getTableContent instead of this private method.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> The gfsh 'describe region' command doesn't include asyncEventQueueIds or 
> gatewaySenderIds
> -----------------------------------------------------------------------------------------
>
>                 Key: GEODE-3955
>                 URL: https://issues.apache.org/jira/browse/GEODE-3955
>             Project: Geode
>          Issue Type: Improvement
>          Components: management
>            Reporter: Barry Oglesby
>            Priority: Minor
>             Fix For: 1.4.0
>
>         Attachments: geode-3955.diff
>
>
> The {{constructor}} and {{getNonDefaultAttributes}} methods in 
> {{org.apache.geode.management.internal.cli.domain.RegionAttributesInfo}} 
> class would have to be modified to include the {{asyncEventQueueIds}} and 
> {{gatewaySenderIds}}. 
> I did a quick modification of this class (attached).
> With these changes, 'describe region' looks like:
> {noformat}
> gfsh>describe region --name=/data
> ..........................................................
> Name            : data
> Data Policy     : partition
> Hosting Members : ln-1
> Non-Default Attributes Shared By Hosting Members  
>   Type    |         Name          | Value
> --------- | --------------------- | ---------
> Region    | data-policy           | PARTITION
>           | async-event-queue-ids | db
>           | size                  | 0
>           | gateway-sender-ids    | ny
> Partition | redundant-copies      | 1
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to