stasis/je-7.5.11/test/com/sleepycat/je/jmx/JEDiagnosticsTest.java

261 lines
8.1 KiB
Java
Raw Permalink Normal View History

2019-06-25 20:12:40 +00:00
/*-
* Copyright (C) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.jmx;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.lang.reflect.Method;
import java.util.logging.Handler;
import java.util.logging.Level;
import javax.management.Attribute;
import javax.management.DynamicMBean;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import org.junit.Test;
import com.sleepycat.je.DbInternal;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.util.TestUtils;
import com.sleepycat.util.test.SharedTestUtils;
import com.sleepycat.util.test.TestBase;
/**
* @excludeDualMode
*
* Instantiate and exercise the JEDiagnostics.
*/
public class JEDiagnosticsTest extends TestBase {
private static final boolean DEBUG = false;
private File envHome;
public JEDiagnosticsTest() {
envHome = SharedTestUtils.getTestDir();
}
/**
* Test JEDiagnostics' attribute getters.
*/
@Test
public void testGetters()
throws Throwable {
Environment env = null;
try {
if (!this.getClass().getName().contains("rep")) {
env = openEnv();
DynamicMBean mbean = createMBean(env);
MBeanTestUtils.validateGetters(mbean, 2, DEBUG);
env.close();
}
env = openEnv();
String environmentDir = env.getHome().getPath();
DynamicMBean mbean = createMBean(env);
MBeanTestUtils.validateGetters(mbean, 2, DEBUG);
env.close();
MBeanTestUtils.checkForNoOpenHandles(environmentDir);
} catch (Throwable t) {
t.printStackTrace();
if (env != null) {
env.close();
}
throw t;
}
}
/* Create a DynamicMBean using a standalone or replicated Environment. */
protected DynamicMBean createMBean(Environment env) {
return new JEDiagnostics(env);
}
/**
* Test JEDiagnostics' attribute setters.
*/
@Test
public void testSetters()
throws Throwable {
Environment env = null;
try {
env = openEnv();
String environmentDir = env.getHome().getPath();
DynamicMBean mbean = createMBean(env);
EnvironmentImpl envImpl = DbInternal.getNonNullEnvImpl(env);
Class envImplClass = envImpl.getClass();
/* Test setting ConsoleHandler's level. */
Method getConsoleHandler =
envImplClass.getMethod("getConsoleHandler", (Class[]) null);
checkAttribute(env,
mbean,
getConsoleHandler,
"consoleHandlerLevel",
"OFF");
/* Test setting FileHandler's level. */
Method getFileHandler =
envImplClass.getMethod("getFileHandler", (Class[]) null);
checkAttribute(env,
mbean,
getFileHandler,
"fileHandlerLevel",
"OFF");
env.close();
MBeanTestUtils.checkForNoOpenHandles(environmentDir);
} catch (Throwable t) {
t.printStackTrace();
if (env != null) {
env.close();
}
throw t;
}
}
/**
* Test JEDiagnostics' operations invocation.
*/
@Test
public void testOperations()
throws Throwable {
Environment env = null;
try {
env = openEnv();
String environmentDir = env.getHome().getPath();
DynamicMBean mbean = createMBean(env);
/*
* RepJEDiagnostics has three operations while JEDiagnostics is
* lack of getRepStats operation.
*/
validateOperations(mbean, env, 1);
env.close();
MBeanTestUtils.checkForNoOpenHandles(environmentDir);
} catch (Throwable t) {
t.printStackTrace();
if (env != null) {
env.close();
}
throw t;
}
}
/* Verify the correction of JEDiagnostics' operations. */
private void validateOperations(DynamicMBean mbean,
Environment env,
int numExpectedOperations)
throws Throwable {
MBeanTestUtils.checkOpNum(mbean, numExpectedOperations, DEBUG);
MBeanInfo info = mbean.getMBeanInfo();
MBeanOperationInfo[] ops = info.getOperations();
EnvironmentImpl envImpl = DbInternal.getNonNullEnvImpl(env);
for (int i = 0; i < ops.length; i++) {
String opName = ops[i].getName();
if (opName.equals("resetLoggerLevel")) {
/*
* If this method is invoked by RepJEDiagnostics, the logger
* name should contain RepImpl, not EnvironmentImpl.
*/
Object[] params = new Object[] {"EnvironmentImpl", "OFF"};
if (this.getClass().getName().contains("rep")) {
params = new Object[] {"RepImpl", "OFF"};
}
Object result = mbean.invoke
(opName, params,
new String[] {"java.lang.String", "java.lang.String"});
assertEquals(envImpl.getLogger().getLevel(), Level.OFF);
assertTrue(result == null);
} else {
/*
* Check the correction of the getRepStats operation that only
* in RepJEDiagnostics.
*/
if (this.getClass().getName().contains("rep")) {
Object result = mbean.invoke(opName, null, null);
assertTrue(result instanceof String);
MBeanTestUtils.checkObjectType
("Operation", opName, ops[i].getReturnType(), result);
}
}
}
}
/* Test this MBean's serialization. */
@Test
public void testSerializable()
throws Throwable {
Environment env = openEnv();
DynamicMBean mbean = createMBean(env);
MBeanTestUtils.doTestSerializable(mbean);
env.close();
}
/* Check this MBean's attributes. */
private void checkAttribute(Environment env,
DynamicMBean mbean,
Method getMethod,
String attributeName,
Object newValue)
throws Exception {
EnvironmentImpl envImpl = DbInternal.getNonNullEnvImpl(env);
Object result = getMethod.invoke(envImpl, (Object[]) null);
assertTrue(!result.toString().equals(newValue.toString()));
mbean.setAttribute(new Attribute(attributeName, newValue));
envImpl = DbInternal.getNonNullEnvImpl(env);
Handler handler = (Handler) getMethod.invoke(envImpl, (Object[]) null);
assertEquals(newValue.toString(), handler.getLevel().toString());
Object mbeanNewValue = mbean.getAttribute(attributeName);
assertEquals(newValue.toString(), mbeanNewValue.toString());
}
/*
* Helper to open an environment.
*/
protected Environment openEnv()
throws Exception {
EnvironmentConfig envConfig = TestUtils.initEnvConfig();
envConfig.setAllowCreate(true);
return new Environment(envHome, envConfig);
}
}