View Javadoc
1   /*
2    * Licensed under the GPL License. You may not use this file except in compliance with the License.
3    * You may obtain a copy of the License at
4    *
5    *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6    *
7    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8    * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9    * PURPOSE.
10   */
11  package psiprobe.beans;
12  
13  import static org.junit.jupiter.api.Assertions.assertEquals;
14  import static org.junit.jupiter.api.Assertions.assertNotNull;
15  import static org.mockito.ArgumentMatchers.isNull;
16  import static org.mockito.Mockito.any;
17  import static org.mockito.Mockito.mock;
18  import static org.mockito.Mockito.when;
19  
20  import java.lang.management.ManagementFactory;
21  import java.util.List;
22  import java.util.Set;
23  
24  import javax.management.MBeanServer;
25  import javax.management.ObjectInstance;
26  import javax.management.ObjectName;
27  import javax.management.openmbean.CompositeDataSupport;
28  
29  import org.junit.jupiter.api.Test;
30  import org.mockito.MockedStatic;
31  import org.mockito.Mockito;
32  
33  import psiprobe.model.jmx.MemoryPool;
34  import psiprobe.tools.JmxTools;
35  
36  class JvmMemoryInfoAccessorBeanTest {
37  
38    @Test
39    void testGetPoolsReturnsMemoryPools() throws Exception {
40      // Arrange
41      MBeanServer mbeanServer = mock(MBeanServer.class);
42      ObjectName objName = new ObjectName("java.lang:type=MemoryPool,name=TestPool");
43      ObjectInstance objectInstance = mock(ObjectInstance.class);
44      when(objectInstance.getObjectName()).thenReturn(objName);
45  
46      Set<ObjectInstance> objectInstances = Set.of(objectInstance);
47  
48      when(mbeanServer.queryMBeans(any(ObjectName.class), isNull())).thenReturn(objectInstances);
49  
50      // Mock CompositeDataSupport for Usage
51      CompositeDataSupport usage = mock(CompositeDataSupport.class);
52  
53      try (MockedStatic<ManagementFactory> mgmtFactoryMock =
54          Mockito.mockStatic(ManagementFactory.class)) {
55        mgmtFactoryMock.when(ManagementFactory::getPlatformMBeanServer).thenReturn(mbeanServer);
56  
57        try (MockedStatic<JmxTools> jmxToolsMock = Mockito.mockStatic(JmxTools.class)) {
58          jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Name"))
59              .thenReturn("TestPool");
60          jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Type"))
61              .thenReturn("HEAP");
62          jmxToolsMock.when(() -> JmxTools.getAttribute(mbeanServer, objName, "Usage"))
63              .thenReturn(usage);
64  
65          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "max")).thenReturn(100L);
66          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "used")).thenReturn(50L);
67          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "init")).thenReturn(10L);
68          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "committed")).thenReturn(80L);
69  
70          JvmMemoryInfoAccessorBean bean = new JvmMemoryInfoAccessorBean();
71  
72          // Act
73          List<MemoryPool> pools = bean.getPools();
74  
75          // Assert
76          assertNotNull(pools);
77          assertEquals(2, pools.size()); // 1 pool + 1 total
78          MemoryPool pool = pools.get(0);
79          assertEquals("TestPool", pool.getName());
80          assertEquals("HEAP", pool.getType());
81          assertEquals(100L, pool.getMax());
82          assertEquals(50L, pool.getUsed());
83          assertEquals(10L, pool.getInit());
84          assertEquals(80L, pool.getCommitted());
85  
86          MemoryPool total = pools.get(1);
87          assertEquals("Total", total.getName());
88          assertEquals("TOTAL", total.getType());
89          assertEquals(100L, total.getMax());
90          assertEquals(50L, total.getUsed());
91          assertEquals(10L, total.getInit());
92          assertEquals(80L, total.getCommitted());
93        }
94      }
95    }
96  
97    @Test
98    void testGetPoolsHandlesNullUsage() throws Exception {
99      MBeanServer mbeanServer = mock(MBeanServer.class);
100     ObjectName objName = new ObjectName("java.lang:type=MemoryPool,name=TestPool");
101     ObjectInstance objectInstance = mock(ObjectInstance.class);
102     when(objectInstance.getObjectName()).thenReturn(objName);
103 
104     Set<ObjectInstance> objectInstances = Set.of(objectInstance);
105 
106     when(mbeanServer.queryMBeans(any(ObjectName.class), isNull())).thenReturn(objectInstances);
107 
108     try (MockedStatic<ManagementFactory> mgmtFactoryMock =
109         Mockito.mockStatic(ManagementFactory.class)) {
110       mgmtFactoryMock.when(ManagementFactory::getPlatformMBeanServer).thenReturn(mbeanServer);
111 
112       try (MockedStatic<JmxTools> jmxToolsMock = Mockito.mockStatic(JmxTools.class)) {
113         jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Name"))
114             .thenReturn("TestPool");
115         jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Type"))
116             .thenReturn("HEAP");
117         jmxToolsMock.when(() -> JmxTools.getAttribute(mbeanServer, objName, "Usage"))
118             .thenReturn(null);
119 
120         JvmMemoryInfoAccessorBean bean = new JvmMemoryInfoAccessorBean();
121 
122         List<MemoryPool> pools = bean.getPools();
123 
124         assertNotNull(pools);
125         assertEquals(2, pools.size()); // 1 pool + 1 total
126         assertEquals(0L, pools.get(0).getMax());
127         assertEquals(0L, pools.get(0).getUsed());
128         assertEquals(0L, pools.get(0).getInit());
129         assertEquals(0L, pools.get(0).getCommitted());
130       }
131     }
132   }
133 }