276 lines
8.5 KiB
Java
276 lines
8.5 KiB
Java
|
/*-
|
|||
|
* 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 static org.junit.Assert.fail;
|
|||
|
|
|||
|
import java.io.File;
|
|||
|
import java.lang.reflect.Method;
|
|||
|
|
|||
|
import javax.management.Attribute;
|
|||
|
import javax.management.DynamicMBean;
|
|||
|
import javax.management.MBeanException;
|
|||
|
|
|||
|
import org.junit.Test;
|
|||
|
|
|||
|
import com.sleepycat.bind.tuple.IntegerBinding;
|
|||
|
import com.sleepycat.je.Database;
|
|||
|
import com.sleepycat.je.DatabaseConfig;
|
|||
|
import com.sleepycat.je.DatabaseEntry;
|
|||
|
import com.sleepycat.je.Environment;
|
|||
|
import com.sleepycat.je.EnvironmentConfig;
|
|||
|
import com.sleepycat.util.test.SharedTestUtils;
|
|||
|
import com.sleepycat.util.test.TestBase;
|
|||
|
|
|||
|
/**
|
|||
|
* @excludeDualMode
|
|||
|
*
|
|||
|
* Instantiate and exercise the JEMonitor.
|
|||
|
*/
|
|||
|
public class JEMonitorTest extends TestBase {
|
|||
|
|
|||
|
private static final boolean DEBUG = false;
|
|||
|
private File envHome;
|
|||
|
|
|||
|
public JEMonitorTest() {
|
|||
|
envHome = SharedTestUtils.getTestDir();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Test JEMonitor's attributes getters.
|
|||
|
*/
|
|||
|
@Test
|
|||
|
public void testGetters()
|
|||
|
throws Throwable {
|
|||
|
|
|||
|
Environment env = null;
|
|||
|
try {
|
|||
|
env = openEnv(true);
|
|||
|
String environmentDir = env.getHome().getPath();
|
|||
|
DynamicMBean mbean = createMBean(env);
|
|||
|
MBeanTestUtils.validateGetters(mbean, 8, DEBUG); // see the change.
|
|||
|
env.close();
|
|||
|
|
|||
|
/*
|
|||
|
* Replicated Environment must be transactional, so RepJEMonitor
|
|||
|
* can't open an Environment with non-transactional.
|
|||
|
*/
|
|||
|
if (!this.getClass().getName().contains("rep")) {
|
|||
|
env = openEnv(false);
|
|||
|
mbean = createMBean(env);
|
|||
|
MBeanTestUtils.validateGetters(mbean, 6, DEBUG);
|
|||
|
env.close();
|
|||
|
}
|
|||
|
|
|||
|
MBeanTestUtils.checkForNoOpenHandles(environmentDir);
|
|||
|
} catch (Throwable t) {
|
|||
|
t.printStackTrace();
|
|||
|
if (env != null) {
|
|||
|
env.close();
|
|||
|
}
|
|||
|
|
|||
|
throw t;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Create a DynamicMBean with the assigned standalone or replicated
|
|||
|
* Environment.
|
|||
|
*/
|
|||
|
protected DynamicMBean createMBean(Environment env) {
|
|||
|
return new JEMonitor(env);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Test JEMonitor's attributes setters.
|
|||
|
*/
|
|||
|
@Test
|
|||
|
public void testSetters()
|
|||
|
throws Throwable {
|
|||
|
|
|||
|
Environment env = null;
|
|||
|
try {
|
|||
|
/* Mimic an application by opening an environment. */
|
|||
|
env = openEnv(true);
|
|||
|
String environmentDir = env.getHome().getPath();
|
|||
|
|
|||
|
/* Open an Mbean and set the Environment home. */
|
|||
|
DynamicMBean mbean = createMBean(env);
|
|||
|
|
|||
|
/*
|
|||
|
* Try setting different attributes. Check against the
|
|||
|
* initial value, and the value after setting.
|
|||
|
*/
|
|||
|
EnvironmentConfig config = env.getConfig();
|
|||
|
Class configClass = config.getClass();
|
|||
|
|
|||
|
Method getCacheSize =
|
|||
|
configClass.getMethod("getCacheSize", (Class[]) null);
|
|||
|
checkAttribute(env,
|
|||
|
mbean,
|
|||
|
getCacheSize,
|
|||
|
JEMBeanHelper.ATT_CACHE_SIZE,
|
|||
|
new Long(100000)); // new value
|
|||
|
|
|||
|
Method getCachePercent =
|
|||
|
configClass.getMethod("getCachePercent", (Class[]) null);
|
|||
|
checkAttribute(env,
|
|||
|
mbean,
|
|||
|
getCachePercent,
|
|||
|
JEMBeanHelper.ATT_CACHE_PERCENT,
|
|||
|
new Integer(10));
|
|||
|
env.close();
|
|||
|
|
|||
|
MBeanTestUtils.checkForNoOpenHandles(environmentDir);
|
|||
|
} catch (Throwable t) {
|
|||
|
t.printStackTrace();
|
|||
|
|
|||
|
if (env != null) {
|
|||
|
env.close();
|
|||
|
}
|
|||
|
|
|||
|
throw t;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Test correction of JEMonitor's operations invocation.
|
|||
|
*/
|
|||
|
@Test
|
|||
|
public void testOperations()
|
|||
|
throws Throwable {
|
|||
|
|
|||
|
Environment env = null;
|
|||
|
try {
|
|||
|
env = openEnv(true);
|
|||
|
String environmentDir = env.getHome().getPath();
|
|||
|
DynamicMBean mbean = createMBean(env);
|
|||
|
int opNum = 0;
|
|||
|
if (!this.getClass().getName().contains("rep")) {
|
|||
|
opNum = 8;
|
|||
|
} else {
|
|||
|
opNum = 10;
|
|||
|
}
|
|||
|
MBeanTestUtils.validateMBeanOperations
|
|||
|
(mbean, opNum, true, null, null, DEBUG);
|
|||
|
|
|||
|
/*
|
|||
|
* Getting database stats against a non-existing db ought to
|
|||
|
* throw an exception.
|
|||
|
*/
|
|||
|
try {
|
|||
|
MBeanTestUtils.validateMBeanOperations
|
|||
|
(mbean, opNum, true, "bozo", null, DEBUG);
|
|||
|
fail("Should not have run stats on a non-existent db");
|
|||
|
} catch (MBeanException expected) {
|
|||
|
// ignore
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Make sure the vanilla db open within the helper can open
|
|||
|
* a db created with a non-default configuration.
|
|||
|
*/
|
|||
|
DatabaseConfig dbConfig = new DatabaseConfig();
|
|||
|
dbConfig.setAllowCreate(true);
|
|||
|
dbConfig.setTransactional(true);
|
|||
|
Database db = env.openDatabase(null, "bozo", dbConfig);
|
|||
|
|
|||
|
/* insert a record. */
|
|||
|
DatabaseEntry entry = new DatabaseEntry();
|
|||
|
IntegerBinding.intToEntry(1, entry);
|
|||
|
db.put(null, entry, entry);
|
|||
|
|
|||
|
MBeanTestUtils.validateMBeanOperations
|
|||
|
(mbean, opNum, true, "bozo", new String[] {"bozo"}, DEBUG);
|
|||
|
db.close();
|
|||
|
env.close();
|
|||
|
|
|||
|
/*
|
|||
|
* Replicated Environment must be transactional, so can't test
|
|||
|
* RepJEMonitor with opening a non-transactional Environment.
|
|||
|
*/
|
|||
|
if (!this.getClass().getName().contains("rep")) {
|
|||
|
env = openEnv(false);
|
|||
|
mbean = createMBean(env);
|
|||
|
MBeanTestUtils.validateMBeanOperations
|
|||
|
(mbean, 7, true, null, null, DEBUG);
|
|||
|
env.close();
|
|||
|
}
|
|||
|
|
|||
|
MBeanTestUtils.checkForNoOpenHandles(environmentDir);
|
|||
|
} catch (Throwable t) {
|
|||
|
t.printStackTrace();
|
|||
|
if (env != null) {
|
|||
|
env.close();
|
|||
|
}
|
|||
|
throw t;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* Check the correction of JEMonitor's attributes. */
|
|||
|
private void checkAttribute(Environment env,
|
|||
|
DynamicMBean mbean,
|
|||
|
Method configMethod,
|
|||
|
String attributeName,
|
|||
|
Object newValue)
|
|||
|
throws Exception {
|
|||
|
|
|||
|
/* Check starting value. */
|
|||
|
EnvironmentConfig config = env.getConfig();
|
|||
|
Object result = configMethod.invoke(config, (Object[]) null);
|
|||
|
assertTrue(!result.toString().equals(newValue.toString()));
|
|||
|
|
|||
|
/* set through mbean */
|
|||
|
mbean.setAttribute(new Attribute(attributeName, newValue));
|
|||
|
|
|||
|
/* check present environment config. */
|
|||
|
config = env.getConfig();
|
|||
|
assertEquals(newValue.toString(),
|
|||
|
configMethod.invoke(config, (Object[]) null).toString());
|
|||
|
|
|||
|
/* check through mbean. */
|
|||
|
Object mbeanNewValue = mbean.getAttribute(attributeName);
|
|||
|
assertEquals(newValue.toString(), mbeanNewValue.toString());
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks that all parameters and return values are Serializable to
|
|||
|
* support JMX over RMI.
|
|||
|
*/
|
|||
|
@Test
|
|||
|
public void testSerializable()
|
|||
|
throws Exception {
|
|||
|
|
|||
|
/* Create and close the environment. */
|
|||
|
Environment env = openEnv(true);
|
|||
|
|
|||
|
/* Test without an open environment. */
|
|||
|
DynamicMBean mbean = createMBean(env);
|
|||
|
MBeanTestUtils.doTestSerializable(mbean);
|
|||
|
|
|||
|
env.close();
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Helper to open an environment.
|
|||
|
*/
|
|||
|
protected Environment openEnv(boolean openTransactionally)
|
|||
|
throws Exception {
|
|||
|
|
|||
|
return MBeanTestUtils.openTxnalEnv(openTransactionally, envHome);
|
|||
|
}
|
|||
|
}
|