GEODE-7297: Handle more exceptions in FederatingManager (#4208)

Handle or prevent CancelException and NullPointerException in
removeMemberArtifacts.
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
index 7377b62..a885e30 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
@@ -326,12 +326,16 @@
         // ignored
       }
       try {
-        monitoringRegion.localDestroyRegion();
+        if (monitoringRegion != null) {
+          monitoringRegion.localDestroyRegion();
+        }
       } catch (CancelException | RegionDestroyedException ignore) {
         // ignored
       }
       try {
-        notificationRegion.localDestroyRegion();
+        if (notificationRegion != null) {
+          notificationRegion.localDestroyRegion();
+        }
       } catch (CancelException | RegionDestroyedException ignore) {
         // ignored
       }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
index 2ed7d43..9b02541 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/FederatingManagerTest.java
@@ -15,6 +15,7 @@
 package org.apache.geode.management.internal;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doThrow;
@@ -250,8 +251,6 @@
         .removeAllProxies(member, monitoringRegion);
   }
 
-  // ----------
-
   @Test
   public void removeMemberArtifactsProxyFactoryDoesNotThrowIfCacheClosed() {
     InternalDistributedMember member = member();
@@ -316,8 +315,6 @@
         .localDestroyRegion();
   }
 
-  // ----------
-
   @Test
   public void removeMemberArtifactsProxyFactoryDoesNotThrowIfSystemDisconnected() {
     InternalDistributedMember member = member();
@@ -382,6 +379,42 @@
         .localDestroyRegion();
   }
 
+  @Test
+  public void removeMemberArtifactsDoesNotThrowIfNotificationRegionIsNull() {
+    InternalDistributedMember member = member();
+    when(repo.getEntryFromMonitoringRegionMap(eq(member)))
+        .thenReturn(mock(Region.class));
+    when(repo.getEntryFromNotifRegionMap(eq(member)))
+        .thenReturn(null);
+    when(system.getDistributedMember())
+        .thenReturn(member);
+    FederatingManager federatingManager = new FederatingManager(repo, system, service, cache,
+        statisticsFactory, statisticsClock, proxyFactory, messenger, executorService);
+
+    Throwable thrown = catchThrowable(() -> federatingManager.removeMemberArtifacts(member, false));
+
+    assertThat(thrown)
+        .isNull();
+  }
+
+  @Test
+  public void removeMemberArtifactsDoesNotThrowIfMonitoringRegionIsNull() {
+    InternalDistributedMember member = member();
+    when(repo.getEntryFromMonitoringRegionMap(eq(member)))
+        .thenReturn(null);
+    when(repo.getEntryFromNotifRegionMap(eq(member)))
+        .thenReturn(mock(Region.class));
+    when(system.getDistributedMember())
+        .thenReturn(member);
+    FederatingManager federatingManager = new FederatingManager(repo, system, service, cache,
+        statisticsFactory, statisticsClock, proxyFactory, messenger, executorService);
+
+    Throwable thrown = catchThrowable(() -> federatingManager.removeMemberArtifacts(member, false));
+
+    assertThat(thrown)
+        .isNull();
+  }
+
   private InternalDistributedMember member() {
     return member(1, 1);
   }