GEODE-6255: Make ManagementListener testable and interruptible
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java b/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java
index 06314bf..a82a7fb 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java
@@ -17,6 +17,7 @@
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import org.apache.geode.CancelCriterion;
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.DiskStore;
 import org.apache.geode.cache.Region;
@@ -41,6 +42,8 @@
 
   private final InternalDistributedSystem system;
 
+  private final CancelCriterion cancelCriterion;
+
   /**
    * Adapter to co-ordinate between GemFire and Federation framework
    */
@@ -52,12 +55,15 @@
   private final ReadWriteLock readWriteLock;
 
   public ManagementListener(InternalDistributedSystem system) {
-    this(system, new ManagementAdapter(), new ReentrantReadWriteLock());
+    this(system.getCancelCriterion(), system, new ManagementAdapter(),
+        new ReentrantReadWriteLock());
   }
 
   @VisibleForTesting
-  ManagementListener(InternalDistributedSystem system, ManagementAdapter adapter,
+  ManagementListener(CancelCriterion cancelCriterion, InternalDistributedSystem system,
+      ManagementAdapter adapter,
       ReadWriteLock readWriteLock) {
+    this.cancelCriterion = cancelCriterion;
     this.system = system;
     this.adapter = adapter;
     this.readWriteLock = readWriteLock;
@@ -105,10 +111,16 @@
     }
     try {
       if (event == ResourceEvent.CACHE_CREATE || event == ResourceEvent.CACHE_REMOVE) {
-        readWriteLock.writeLock().lock();
+        readWriteLock.writeLock().lockInterruptibly();
       } else if (event != ResourceEvent.SYSTEM_ALERT) {
-        readWriteLock.readLock().lock();
+        readWriteLock.readLock().lockInterruptibly();
       }
+    } catch (InterruptedException e) {
+      // prefer CancelException if shutting down
+      cancelCriterion.checkCancelInProgress(e);
+      throw new RuntimeException(e);
+    }
+    try {
       switch (event) {
         case CACHE_CREATE:
           InternalCache createdCache = (InternalCache) resource;
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java
index 9542e12..585d2a1 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java
@@ -34,6 +34,7 @@
 import org.junit.experimental.categories.Category;
 import org.mockito.InOrder;
 
+import org.apache.geode.CancelCriterion;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ResourceEvent;
 import org.apache.geode.internal.cache.InternalCache;
@@ -71,7 +72,8 @@
     readLockInOrder = inOrder(readLock, readLock);
     writeLockInOrder = inOrder(writeLock, writeLock);
 
-    managementListener = new ManagementListener(system, managementAdapter, readWriteLock);
+    managementListener = new ManagementListener(mock(CancelCriterion.class), system,
+        managementAdapter, readWriteLock);
   }
 
   @Test
@@ -109,18 +111,18 @@
   }
 
   @Test
-  public void handleEventUsesWriteLockForCacheCreateEvent() {
+  public void handleEventUsesWriteLockForCacheCreateEvent() throws InterruptedException {
     managementListener.handleEvent(CACHE_CREATE, null);
 
-    writeLockInOrder.verify(writeLock).lock();
+    writeLockInOrder.verify(writeLock).lockInterruptibly();
     writeLockInOrder.verify(writeLock).unlock();
   }
 
   @Test
-  public void handleEventUsesWriteLockForCacheRemoveEvent() {
+  public void handleEventUsesWriteLockForCacheRemoveEvent() throws InterruptedException {
     managementListener.handleEvent(CACHE_REMOVE, null);
 
-    writeLockInOrder.verify(writeLock).lock();
+    writeLockInOrder.verify(writeLock).lockInterruptibly();
     writeLockInOrder.verify(writeLock).unlock();
   }
 
@@ -134,13 +136,13 @@
   }
 
   @Test
-  public void handleEventUsesReadLockForOtherEvents() {
+  public void handleEventUsesReadLockForOtherEvents() throws InterruptedException {
     for (ResourceEvent resourceEvent : ResourceEvent.values()) {
       if (resourceEvent != CACHE_CREATE && resourceEvent != CACHE_REMOVE
           && resourceEvent != SYSTEM_ALERT) {
         managementListener.handleEvent(resourceEvent, null);
 
-        readLockInOrder.verify(readLock).lock();
+        readLockInOrder.verify(readLock).lockInterruptibly();
         readLockInOrder.verify(readLock).unlock();
       }
     }