package org.radargun.service;
import org.testng.annotations.Test;
import javax.management.MBeanServerConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.mockito.Mockito.*;
import static org.radargun.traits.TopologyHistory.Event.EventType;
import static org.radargun.util.ReflectionUtils.setClassProperty;
import static org.testng.Assert.*;
/**
* @author Matej Cimbora
*/
@Test
public class Infinispan60ServerTopologyHistoryTest {
public void testCacheStatus() throws NoSuchFieldException, IllegalAccessException {
InfinispanServerService service = mock(InfinispanServerService.class);
setClassProperty(InfinispanServerService.class, service, "connection", mock(MBeanServerConnection.class));
setClassProperty(InfinispanServerService.class, service, "lifecycle", mock(InfinispanServerLifecycle.class));
Infinispan60ServerTopologyHistory history = spy(new Infinispan60ServerTopologyHistory(service));
Map<String, Object> rehashJmxQueryResult = new HashMap<>(2);
rehashJmxQueryResult.put("cache1", false);
rehashJmxQueryResult.put("cache2", true);
Map<String, Object> topologyJmxQueryResult = new HashMap<>(2);
topologyJmxQueryResult.put("cache1", "pending_view_1");
topologyJmxQueryResult.put("cache2", "null");
Map<String, Object> cacheStatusJmxQueryResult = new HashMap<>(2);
cacheStatusJmxQueryResult.put("cache1", "AVAILABLE");
cacheStatusJmxQueryResult.put("cache2", "DEGRADED_MODE");
doReturn(rehashJmxQueryResult).doReturn(topologyJmxQueryResult).doReturn(cacheStatusJmxQueryResult).when(history).retrieveJMXAttributeValues(any(MBeanServerConnection.class), anyString(), anyString());
Map<String, Infinispan60ServerTopologyHistory.CacheStatus> statusMap = history.cacheStatus();
assertEquals(statusMap.size(), 3);
Infinispan60ServerTopologyHistory.CacheStatus cacheStatus1 = statusMap.get("cache1");
assertEquals(cacheStatus1.rehashInProgress, false);
assertEquals(cacheStatus1.topologyChangeInProgress, true);
assertEquals(cacheStatus1.prevCacheAvailability, Infinispan60ServerTopologyHistory.CacheAvailability.AVAILABLE);
Infinispan60ServerTopologyHistory.CacheStatus cacheStatus2 = statusMap.get("cache2");
assertEquals(cacheStatus2.rehashInProgress, true);
assertEquals(cacheStatus2.topologyChangeInProgress, false);
assertEquals(cacheStatus2.prevCacheAvailability, Infinispan60ServerTopologyHistory.CacheAvailability.DEGRADED_MODE);
Infinispan60ServerTopologyHistory.CacheStatus cacheStatus3 = statusMap.get(Infinispan60ServerTopologyHistory.ALL_CACHES);
assertEquals(cacheStatus3.rehashInProgress, true);
assertEquals(cacheStatus3.topologyChangeInProgress, true);
assertEquals(cacheStatus3.prevCacheAvailability, null);
Map<String, Infinispan60ServerTopologyHistory.CacheStatus> cacheChangesOngoing = history.cacheChangesOngoing;
assertEquals(cacheChangesOngoing.size(), 0);
doReturn(statusMap).when(history).cacheStatus();
history.processCacheStatus();
assertEquals(cacheChangesOngoing.size(), 3);
// check rehash events
Map<String, List<AbstractTopologyHistory.Event>> events = history.hashChanges;
// cache2, ALL_CACHES
assertEquals(events.size(), 2);
List<AbstractTopologyHistory.Event> eventList = events.get("cache2");
assertEquals(eventList.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.START);
List<AbstractTopologyHistory.Event> eventList2 = events.get(Infinispan60ServerTopologyHistory.ALL_CACHES);
assertEquals(eventList2.size(), 1);
assertEquals(eventList2.get(0).getType(), EventType.START);
// check topology events
events = history.topologyChanges;
// cache1, ALL_CACHES
assertEquals(events.size(), 2);
eventList = events.get("cache1");
assertEquals(eventList.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.START);
eventList2 = events.get(Infinispan60ServerTopologyHistory.ALL_CACHES);
assertEquals(eventList2.size(), 1);
assertEquals(eventList2.get(0).getType(), EventType.START);
// check cache status changes
events = history.cacheStatusChanges;
// no changes
assertEquals(events.size(), 0);
// second round of event processing
rehashJmxQueryResult = new HashMap<>(2);
rehashJmxQueryResult.put("cache1", true);
rehashJmxQueryResult.put("cache2", false);
topologyJmxQueryResult = new HashMap<>(2);
topologyJmxQueryResult.put("cache1", "null");
topologyJmxQueryResult.put("cache2", "pending_view_2");
cacheStatusJmxQueryResult = new HashMap<>(2);
cacheStatusJmxQueryResult.put("cache1", "DEGRADED_MODE");
cacheStatusJmxQueryResult.put("cache2", "AVAILABLE");
doReturn(rehashJmxQueryResult).doReturn(topologyJmxQueryResult).doReturn(cacheStatusJmxQueryResult).when(history).retrieveJMXAttributeValues(any(MBeanServerConnection.class), anyString(), anyString());
when(history.cacheStatus()).thenCallRealMethod();
statusMap = history.cacheStatus();
doReturn(statusMap).when(history).cacheStatus();
history.processCacheStatus();
assertEquals(cacheChangesOngoing.size(), 3);
// check rehash events
events = history.hashChanges;
// cache1, cache2, ALL_CACHES
assertEquals(events.size(), 3);
eventList = events.get("cache1");
assertEquals(eventList.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.START);
eventList = events.get("cache2");
assertEquals(eventList.size(), 2);
assertEquals(eventList.get(0).getType(), EventType.START);
assertEquals(eventList.get(1).getType(), EventType.END);
eventList2 = events.get(Infinispan60ServerTopologyHistory.ALL_CACHES);
assertEquals(eventList2.size(), 1);
assertEquals(eventList2.get(0).getType(), EventType.START);
// check topology events
events = history.topologyChanges;
// cache1, cache2, ALL_CACHES
assertEquals(events.size(), 3);
eventList = events.get("cache1");
assertEquals(eventList.size(), 2);
assertEquals(eventList.get(0).getType(), EventType.START);
assertEquals(eventList.get(1).getType(), EventType.END);
eventList = events.get("cache2");
assertEquals(eventList.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.START);
eventList2 = events.get(Infinispan60ServerTopologyHistory.ALL_CACHES);
assertEquals(eventList2.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.START);
// check cache status changes
events = history.cacheStatusChanges;
// cache1, cache2, ALL_CACHES
assertEquals(events.size(), 3);
eventList = events.get("cache1");
assertEquals(eventList.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.SINGLE);
eventList = events.get("cache2");
assertEquals(eventList.size(), 1);
assertEquals(eventList.get(0).getType(), EventType.SINGLE);
eventList2 = events.get(Infinispan60ServerTopologyHistory.ALL_CACHES);
assertEquals(eventList2.size(), 1);
assertEquals(eventList2.get(0).getType(), EventType.SINGLE);
}
}