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
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 }