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.Collections;
22  import java.util.List;
23  import java.util.Set;
24  
25  import javax.management.MBeanServer;
26  import javax.management.ObjectInstance;
27  import javax.management.ObjectName;
28  import javax.management.openmbean.CompositeDataSupport;
29  
30  import org.junit.jupiter.api.Test;
31  import org.mockito.MockedStatic;
32  import org.mockito.Mockito;
33  
34  import psiprobe.model.jmx.MemoryPool;
35  import psiprobe.tools.JmxTools;
36  
37  class JvmMemoryInfoAccessorBeanTest {
38  
39    @Test
40    void testGetPoolsReturnsMemoryPools() throws Exception {
41      // Arrange
42      MBeanServer mbeanServer = mock(MBeanServer.class);
43      ObjectName objName = new ObjectName("java.lang:type=MemoryPool,name=TestPool");
44      ObjectInstance objectInstance = mock(ObjectInstance.class);
45      when(objectInstance.getObjectName()).thenReturn(objName);
46  
47      Set<ObjectInstance> objectInstances = Collections.singleton(objectInstance);
48  
49      when(mbeanServer.queryMBeans(any(ObjectName.class), isNull())).thenReturn(objectInstances);
50  
51      // Mock CompositeDataSupport for Usage
52      CompositeDataSupport usage = mock(CompositeDataSupport.class);
53  
54      try (MockedStatic<ManagementFactory> mgmtFactoryMock =
55          Mockito.mockStatic(ManagementFactory.class)) {
56        mgmtFactoryMock.when(ManagementFactory::getPlatformMBeanServer).thenReturn(mbeanServer);
57  
58        try (MockedStatic<JmxTools> jmxToolsMock = Mockito.mockStatic(JmxTools.class)) {
59          jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Name"))
60              .thenReturn("TestPool");
61          jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Type"))
62              .thenReturn("HEAP");
63          jmxToolsMock.when(() -> JmxTools.getAttribute(mbeanServer, objName, "Usage"))
64              .thenReturn(usage);
65  
66          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "max")).thenReturn(100L);
67          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "used")).thenReturn(50L);
68          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "init")).thenReturn(10L);
69          jmxToolsMock.when(() -> JmxTools.getLongAttr(usage, "committed")).thenReturn(80L);
70  
71          JvmMemoryInfoAccessorBean bean = new JvmMemoryInfoAccessorBean();
72  
73          // Act
74          List<MemoryPool> pools = bean.getPools();
75  
76          // Assert
77          assertNotNull(pools);
78          assertEquals(2, pools.size()); // 1 pool + 1 total
79          MemoryPool pool = pools.get(0);
80          assertEquals("TestPool", pool.getName());
81          assertEquals("HEAP", pool.getType());
82          assertEquals(100L, pool.getMax());
83          assertEquals(50L, pool.getUsed());
84          assertEquals(10L, pool.getInit());
85          assertEquals(80L, pool.getCommitted());
86  
87          MemoryPool total = pools.get(1);
88          assertEquals("Total", total.getName());
89          assertEquals("TOTAL", total.getType());
90          assertEquals(100L, total.getMax());
91          assertEquals(50L, total.getUsed());
92          assertEquals(10L, total.getInit());
93          assertEquals(80L, total.getCommitted());
94        }
95      }
96    }
97  
98    @Test
99    void testGetPoolsHandlesNullUsage() throws Exception {
100     MBeanServer mbeanServer = mock(MBeanServer.class);
101     ObjectName objName = new ObjectName("java.lang:type=MemoryPool,name=TestPool");
102     ObjectInstance objectInstance = mock(ObjectInstance.class);
103     when(objectInstance.getObjectName()).thenReturn(objName);
104 
105     Set<ObjectInstance> objectInstances = Collections.singleton(objectInstance);
106 
107     when(mbeanServer.queryMBeans(any(ObjectName.class), isNull())).thenReturn(objectInstances);
108 
109     try (MockedStatic<ManagementFactory> mgmtFactoryMock =
110         Mockito.mockStatic(ManagementFactory.class)) {
111       mgmtFactoryMock.when(ManagementFactory::getPlatformMBeanServer).thenReturn(mbeanServer);
112 
113       try (MockedStatic<JmxTools> jmxToolsMock = Mockito.mockStatic(JmxTools.class)) {
114         jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Name"))
115             .thenReturn("TestPool");
116         jmxToolsMock.when(() -> JmxTools.getStringAttr(mbeanServer, objName, "Type"))
117             .thenReturn("HEAP");
118         jmxToolsMock.when(() -> JmxTools.getAttribute(mbeanServer, objName, "Usage"))
119             .thenReturn(null);
120 
121         JvmMemoryInfoAccessorBean bean = new JvmMemoryInfoAccessorBean();
122 
123         List<MemoryPool> pools = bean.getPools();
124 
125         assertNotNull(pools);
126         assertEquals(2, pools.size()); // 1 pool + 1 total
127         assertEquals(0L, pools.get(0).getMax());
128         assertEquals(0L, pools.get(0).getUsed());
129         assertEquals(0L, pools.get(0).getInit());
130         assertEquals(0L, pools.get(0).getCommitted());
131       }
132     }
133   }
134 }