You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by dh...@apache.org on 2019/07/22 22:09:25 UTC

[geode] 12/18: Fix partitioned region test to assert total entry count

This is an automated email from the ASF dual-hosted git repository.

dhemery pushed a commit to branch GEODE-7001-region-entry-count
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 63d33eb2427402957ad330dab71fd471656658d6
Author: Dale Emery <de...@pivotal.io>
AuthorDate: Thu Jul 18 15:29:35 2019 -0700

    Fix partitioned region test to assert total entry count
    
    In each test:
    - Parse the function result to extract the number of entries on each
    server.
    
    For the partitioned region test:
    - Sum the number of entries on each server.
    - Assert that the total is as expected.
    
    For the replicate region test:
    - Assert that *each* server has the expected number of entries.
    
    Co-Authored-By: Mark Hanson <mh...@pivotal.io>
---
 .../geode/metrics/RegionEntriesGaugeTest.java      | 60 ++++++++++++++++------
 1 file changed, 43 insertions(+), 17 deletions(-)

diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/RegionEntriesGaugeTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/RegionEntriesGaugeTest.java
index c66065f..3f2ca8d 100644
--- a/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/RegionEntriesGaugeTest.java
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/metrics/RegionEntriesGaugeTest.java
@@ -16,15 +16,20 @@
 package org.apache.geode.metrics;
 
 import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.toList;
 import static org.apache.geode.cache.RegionShortcut.PARTITION;
 import static org.apache.geode.cache.RegionShortcut.REPLICATE;
 import static org.apache.geode.cache.client.ClientRegionShortcut.PROXY;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.StringReader;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
 
 import io.micrometer.core.instrument.Gauge;
 import org.junit.After;
@@ -43,6 +48,7 @@ import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.metrics.rules.MetricsPublishingServiceJarRule;
 import org.apache.geode.metrics.rules.SingleFunctionJarRule;
 import org.apache.geode.test.junit.categories.MetricsTest;
+import org.apache.geode.test.junit.rules.gfsh.GfshExecution;
 import org.apache.geode.test.junit.rules.gfsh.GfshRule;
 
 @Category(MetricsTest.class)
@@ -158,18 +164,21 @@ public class RegionEntriesGaugeTest {
         "--id=" + GetMemberRegionEntriesGaugeFunction.ID,
         "--arguments=" + regionName);
 
-    await().atMost(1, TimeUnit.MINUTES).untilAsserted(() -> {
-      String output =
-          gfshRule.execute(connectToLocatorCommand, executeFunctionCommand).getOutputText();
+    await().untilAsserted(() -> {
+      GfshExecution execution = gfshRule.execute(connectToLocatorCommand, executeFunctionCommand);
+      List<Integer> entryCounts = linesOf(execution.getOutputText())
+          .filter(s -> s.startsWith("server"))
+          .map(RegionEntriesGaugeTest::extractEntryCount)
+          .collect(toList());
 
-      assertThat(output.trim())
-          .as("Returned gauge of region entries.")
-          .endsWith("[" + expectedNumberOfEntries + ".0]");
+      assertThat(entryCounts)
+          .as("Number of entries reported by each server")
+          .allMatch(i -> i == expectedNumberOfEntries, "equals " + expectedNumberOfEntries);
     });
   }
 
   @Test
-  public void regionEntriesGaugeShowsCountOfPartitionedRegionValuesInServer() {
+  public void regionEntriesGaugeShowsCountOfPartitionedRegionValuesInEachServer() {
     String regionName = "partitionedRegion";
 
     Region<String, String> region = createRegion(PARTITION.name(), regionName);
@@ -183,22 +192,39 @@ public class RegionEntriesGaugeTest {
 
     int expectedNumberOfEntries = keys.size() - 1;
 
-    assertThat(region.sizeOnServer()).isEqualTo(expectedNumberOfEntries);
-
     String connectToLocatorCommand = "connect --locator=" + locatorString;
     String executeFunctionCommand = String.join(SPACE,
         "execute function",
         "--id=" + GetMemberRegionEntriesGaugeFunction.ID,
         "--arguments=" + regionName);
 
-    // await().untilAsserted(() -> {
-    String output =
-        gfshRule.execute(connectToLocatorCommand, executeFunctionCommand).getOutputText();
+    await().untilAsserted(() -> {
+      GfshExecution execution = gfshRule.execute(connectToLocatorCommand, executeFunctionCommand);
+      int sum = linesOf(execution.getOutputText())
+          .filter(s -> s.startsWith("server"))
+          .mapToInt(RegionEntriesGaugeTest::extractEntryCount)
+          .sum();
+
+      assertThat(sum)
+          .as("total number of entries on all servers")
+          .isEqualTo(expectedNumberOfEntries);
+    });
+  }
+
+  private static int extractEntryCount(String serverEntryCountLine) {
+    String entryCountExtractor = ".*\\[(\\d+).*].*";
+    Pattern entryCountPattern = Pattern.compile(entryCountExtractor);
+    Matcher matcher = entryCountPattern.matcher(serverEntryCountLine);
+    assertThat(matcher.matches())
+        .as(serverEntryCountLine)
+        .withFailMessage("does not match " + entryCountExtractor)
+        .isTrue();
+    String matchedGroup = matcher.group(1);
+    return Integer.valueOf(matchedGroup);
+  }
 
-    assertThat(output.trim())
-        .as("Returned gauge of region entries.")
-        .endsWith("[" + expectedNumberOfEntries + ".0]");
-    // });
+  private static Stream<String> linesOf(String text) {
+    return new BufferedReader(new StringReader(text)).lines();
   }
 
   private Region<String, String> createRegion(String regionType, String regionName) {