View Javadoc
1   package com.atlassian.cache.memory.jmx;
2   
3   import com.atlassian.cache.CacheManager;
4   import org.junit.Before;
5   import org.junit.Test;
6   import org.junit.runner.RunWith;
7   import org.mockito.ArgumentCaptor;
8   import org.mockito.Mock;
9   import org.mockito.junit.MockitoJUnitRunner;
10  
11  import javax.management.MBeanServer;
12  import javax.management.ObjectName;
13  
14  import java.util.HashSet;
15  import java.util.Set;
16  
17  import static org.hamcrest.Matchers.is;
18  import static org.junit.Assert.assertThat;
19  import static org.mockito.ArgumentMatchers.any;
20  import static org.mockito.Mockito.doThrow;
21  import static org.mockito.Mockito.never;
22  import static org.mockito.Mockito.times;
23  import static org.mockito.Mockito.verify;
24  import static org.mockito.Mockito.when;
25  
26  /**
27   * Test cases for {@link MemoryCacheMXBeanRegistrar}
28   */
29  @RunWith(MockitoJUnitRunner.Silent.class)
30  public class MemoryCacheMXBeanRegistrarTest
31  {
32      private static final String MBEAN_NAME_PATTERN = "com.google.common.cache:CacheManager=JIRA Cache Manager,name=%s,type=CacheStatistics";
33      private static final String CACHE_NAME = "TestCache";
34      private static final String EXPECTED_MBEAN_NAME = String.format(MBEAN_NAME_PATTERN, CACHE_NAME);
35  
36      private MemoryCacheMXBeanRegistrar mbeansRegistrar;
37  
38      @Mock
39      private MBeanServer mBeanServer;
40  
41      @Mock
42      private CacheManager cacheManager;
43  
44      @Before
45      public void setUp()
46      {
47          mbeansRegistrar = new MemoryCacheMXBeanRegistrar();
48      }
49  
50      @Test
51      public void testRegistration() throws Exception
52      {
53          when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(false);
54          mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, cacheManager);
55  
56          mbeansRegistrar.registerMBean(CACHE_NAME);
57  
58          ArgumentCaptor<ObjectName> objectNameArg = ArgumentCaptor.forClass(ObjectName.class);
59          verify(mBeanServer).registerMBean(any(Object.class), objectNameArg.capture());
60          assertThat(objectNameArg.getValue().getCanonicalName(), is(EXPECTED_MBEAN_NAME));
61      }
62  
63      @Test
64      public void testRegistrationForExistingName() throws Exception
65      {
66          when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(true);
67          mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, cacheManager);
68          mbeansRegistrar.registerMBean(CACHE_NAME);
69  
70          mbeansRegistrar.registerMBean(CACHE_NAME);
71  
72          verify(mBeanServer, times(1)).registerMBean(any(Object.class), any(ObjectName.class));
73      }
74  
75      @Test
76      public void testRegistrationForDisabledMetrics() throws Exception
77      {
78          when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(false);
79  
80          mbeansRegistrar.registerMBean(CACHE_NAME);
81  
82          verify(mBeanServer, never()).registerMBean(any(Object.class), any(ObjectName.class));
83      }
84  
85      @Test
86      public void testRegistrationWithException() throws Exception
87      {
88          when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(false);
89          when(mBeanServer.registerMBean(any(Object.class), any(ObjectName.class))).thenThrow(new NullPointerException("Test message"));
90          mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, cacheManager);
91  
92          mbeansRegistrar.registerMBean(CACHE_NAME);
93  
94          verify(mBeanServer, times(1)).registerMBean(any(Object.class), any(ObjectName.class));
95      }
96  
97      @Test
98      public void testUnregistration() throws Exception
99      {
100         when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(true);
101         mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, cacheManager);
102         mbeansRegistrar.registerMBean(CACHE_NAME);
103 
104         mbeansRegistrar.unregisterMBeans();
105 
106         ArgumentCaptor<ObjectName> objectNameArg = ArgumentCaptor.forClass(ObjectName.class);
107         verify(mBeanServer).unregisterMBean(objectNameArg.capture());
108         assertThat(objectNameArg.getValue().getCanonicalName(), is(EXPECTED_MBEAN_NAME));
109     }
110 
111     @Test
112     public void testUnregisteringNonExistingMBean() throws Exception
113     {
114         when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(false);
115         Set<String> cacheNames = new HashSet<>();
116         cacheNames.add(CACHE_NAME);
117         mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, cacheManager);
118 
119         mbeansRegistrar.unregisterMBeans();
120 
121         ArgumentCaptor<ObjectName> objectNameArg = ArgumentCaptor.forClass(ObjectName.class);
122         verify(mBeanServer, never()).unregisterMBean(any(ObjectName.class));
123     }
124 
125     @Test
126     public void testUnregisteringForDisabledMetrics() throws Exception
127     {
128         when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(true);
129         Set<String> cachesNames = new HashSet<>();
130         cachesNames.add(CACHE_NAME);
131 
132         mbeansRegistrar.unregisterMBeans();
133 
134         verify(mBeanServer, never()).unregisterMBean(any(ObjectName.class));
135     }
136 
137     @Test
138     public void testUnregisteringWithException() throws Exception
139     {
140         when(mBeanServer.isRegistered(any(ObjectName.class))).thenReturn(true);
141         doThrow(new NullPointerException("Test message")).when(mBeanServer).unregisterMBean(any(ObjectName.class));
142         mbeansRegistrar.enableCollectingJMXMetrics(mBeanServer, cacheManager);
143         mbeansRegistrar.registerMBean(CACHE_NAME);
144 
145         mbeansRegistrar.unregisterMBeans();
146 
147         verify(mBeanServer, times(1)).unregisterMBean(any(ObjectName.class));
148     }
149 
150 }