/* * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * and the EPL 1.0 (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.unit; import java.lang.management.ManagementFactory; import java.sql.Connection; import java.sql.Statement; import java.util.HashMap; import java.util.Set; import javax.management.Attribute; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanOperationInfo; import javax.management.MBeanServer; import javax.management.ObjectName; import org.h2.test.TestBase; import org.h2.util.New; /** * Tests the JMX feature. */ public class TestJmx extends TestBase { /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } @Override public void test() throws Exception { HashMap<String, MBeanAttributeInfo> attrMap; HashMap<String, MBeanOperationInfo> opMap; String result; MBeanInfo info; ObjectName name; Connection conn; Statement stat; MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); conn = getConnection("mem:jmx;jmx=true"); stat = conn.createStatement(); name = new ObjectName("org.h2:name=JMX,path=mem_jmx"); info = mbeanServer.getMBeanInfo(name); assertEquals("0", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); // cache size is ignored for in-memory databases mbeanServer.setAttribute(name, new Attribute("CacheSizeMax", 1)); assertEquals("0", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); assertEquals("0", mbeanServer. getAttribute(name, "CacheSize").toString()); assertEquals("false", mbeanServer. getAttribute(name, "Exclusive").toString()); assertEquals("0", mbeanServer. getAttribute(name, "FileSize").toString()); assertEquals("0", mbeanServer. getAttribute(name, "FileReadCount").toString()); assertEquals("0", mbeanServer. getAttribute(name, "FileWriteCount").toString()); assertEquals("0", mbeanServer. getAttribute(name, "FileWriteCountTotal").toString()); if (config.mvStore) { assertEquals("1", mbeanServer. getAttribute(name, "LogMode").toString()); mbeanServer.setAttribute(name, new Attribute("LogMode", 2)); assertEquals("2", mbeanServer. getAttribute(name, "LogMode").toString()); } assertEquals("REGULAR", mbeanServer. getAttribute(name, "Mode").toString()); if (config.multiThreaded) { assertEquals("true", mbeanServer. getAttribute(name, "MultiThreaded").toString()); } else { assertEquals("false", mbeanServer. getAttribute(name, "MultiThreaded").toString()); } if (config.mvStore) { assertEquals("true", mbeanServer. getAttribute(name, "Mvcc").toString()); } else { assertEquals("false", mbeanServer. getAttribute(name, "Mvcc").toString()); } assertEquals("false", mbeanServer. getAttribute(name, "ReadOnly").toString()); assertEquals("1", mbeanServer. getAttribute(name, "TraceLevel").toString()); mbeanServer.setAttribute(name, new Attribute("TraceLevel", 0)); assertEquals("0", mbeanServer. getAttribute(name, "TraceLevel").toString()); assertTrue(mbeanServer. getAttribute(name, "Version").toString().startsWith("1.")); assertEquals(14, info.getAttributes().length); result = mbeanServer.invoke(name, "listSettings", null, null).toString(); assertContains(result, "ANALYZE_AUTO"); conn.setAutoCommit(false); stat.execute("create table test(id int)"); stat.execute("insert into test values(1)"); result = mbeanServer.invoke(name, "listSessions", null, null).toString(); assertContains(result, "session id"); if (config.mvcc || config.mvStore) { assertContains(result, "read lock"); } else { assertContains(result, "write lock"); } assertEquals(2, info.getOperations().length); assertContains(info.getDescription(), "database"); attrMap = New.hashMap(); for (MBeanAttributeInfo a : info.getAttributes()) { attrMap.put(a.getName(), a); } assertContains(attrMap.get("CacheSize").getDescription(), "KB"); opMap = New.hashMap(); for (MBeanOperationInfo o : info.getOperations()) { opMap.put(o.getName(), o); } assertContains(opMap.get("listSessions").getDescription(), "lock"); assertEquals(MBeanOperationInfo.INFO, opMap.get("listSessions").getImpact()); conn.close(); conn = getConnection("jmx;jmx=true"); conn.close(); conn = getConnection("jmx;jmx=true"); name = new ObjectName("org.h2:name=JMX,*"); @SuppressWarnings("rawtypes") Set set = mbeanServer.queryNames(name, null); name = (ObjectName) set.iterator().next(); if (config.memory) { assertEquals("0", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); } else { assertEquals("16384", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); } mbeanServer.setAttribute(name, new Attribute("CacheSizeMax", 1)); if (config.memory) { assertEquals("0", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); } else if (config.mvStore) { assertEquals("1024", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); assertEquals("0", mbeanServer. getAttribute(name, "CacheSize").toString()); assertTrue(0 < (Long) mbeanServer. getAttribute(name, "FileReadCount")); assertTrue(0 < (Long) mbeanServer. getAttribute(name, "FileWriteCount")); assertEquals("0", mbeanServer. getAttribute(name, "FileWriteCountTotal").toString()); } else { assertEquals("1", mbeanServer. getAttribute(name, "CacheSizeMax").toString()); assertTrue(0 < (Integer) mbeanServer. getAttribute(name, "CacheSize")); assertTrue(0 < (Long) mbeanServer. getAttribute(name, "FileSize")); assertTrue(0 < (Long) mbeanServer. getAttribute(name, "FileReadCount")); assertTrue(0 < (Long) mbeanServer. getAttribute(name, "FileWriteCount")); assertTrue(0 < (Long) mbeanServer. getAttribute(name, "FileWriteCountTotal")); } mbeanServer.setAttribute(name, new Attribute("LogMode", 0)); assertEquals("0", mbeanServer. getAttribute(name, "LogMode").toString()); conn.close(); } }