/* * #%L * P6Spy * %% * Copyright (C) 2013 P6Spy * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package com.p6spy.engine.spy.option; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.sql.SQLException; import javax.management.JMException; import com.p6spy.engine.test.BaseTestCase; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.j256.simplejmx.client.JmxClient; import com.p6spy.engine.common.P6Util; import com.p6spy.engine.spy.P6MBeansRegistry; import com.p6spy.engine.spy.P6SpyOptions; import com.p6spy.engine.test.P6TestFramework; import com.p6spy.engine.spy.P6TestMBean; public class P6TestOptionsReload extends BaseTestCase { private JmxClient jmxClient = null; @Before public void setUp() throws JMException, SQLException, IOException, InterruptedException { // make sure to reinit properly new P6TestFramework("reload") { }; String jmxPortProperty = System.getProperty(P6TestMBean.COM_SUN_MANAGEMENT_JMXREMOTE_PORT); int jmxPort = P6Util.parseInt(jmxPortProperty, P6TestMBean.JMXREMOTE_PORT_DEFAULT); jmxClient = new JmxClient(jmxPort); } @After public void tearDown() { // cleanup to make sure other tests work as expected System.getProperties().remove(SystemProperties.P6SPY_PREFIX + P6SpyOptions.STACKTRACE); } /** * Please note, when modifying this one to check * {@link P6TestOptionsReload#testSetPropertyDiscartedOnExplicitReload()} as well. * * @throws Exception */ @Test public void testJmxSetPropertyDiscartedOnExplicitJmxReload() throws Exception { final String domainName = P6MBeansRegistry.PACKAGE_NAME; final String beanName = P6SpyOptions.class.getName(); final String attributeName = "StackTrace"; // precondition assertFalse((Boolean) jmxClient.getAttribute(domainName, beanName, attributeName)); // jmx value modification jmxClient.setAttribute(domainName, beanName, attributeName, true); assertTrue((Boolean) jmxClient.getAttribute(domainName, beanName, attributeName)); // props reload jmxClient.invokeOperation(domainName, beanName, "reload"); // jmx value modification discarted assertFalse((Boolean) jmxClient.getAttribute(domainName, beanName, attributeName)); } /** * Please note, when modifying this one to check * {@link P6TestOptionsReload#testJmxSetPropertyDiscartedOnExplicitJmxReload()} as well. * * @throws Exception */ @Test public void testSetPropertyDiscartedOnExplicitReload() throws Exception { // precondition assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); // value modification P6SpyOptions.getActiveInstance().setStackTrace(true); assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); // props reload P6SpyOptions.getActiveInstance().reload(); // value modification discarted assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } @Test public void testSetPropertyDiscartedOnAutoReload() throws Exception { // precondition assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); // value modification P6SpyOptions.getActiveInstance().setStackTrace(true); assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); // no explicit props reload, just modify timestamp and wait till autoreload happens FileUtils.touch(new File(System.getProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY))); Thread.sleep(2000); // jmx value modification discarted assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } @Test public void testAutoReloadLifecycle() throws Exception { // precondition assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); // value modification P6SpyOptions.getActiveInstance().setStackTrace(true); assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); // disable auto reload P6SpyOptions.getActiveInstance().setReloadProperties(false); FileUtils.touch(new File(System.getProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY))); Thread.sleep(2000); // reload didn't happen assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); // enable auto reload P6SpyOptions.getActiveInstance().setReloadProperties(true); FileUtils.touch(new File(System.getProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY))); Thread.sleep(2000); // reload did happen assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } @Test public void testOptionSourcesPriorities() throws Exception { // [default] stacktrace=false // # no properties file at all // => false (+ survives across reloads) { System.getProperties().remove(SpyDotProperties.OPTIONS_FILE_PROPERTY); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } // [default] stacktrace=false // [SpyDotProperties] #stacktrace=true // => false (+ survives across reloads) { File p6TestProperties = new File(P6TestFramework.TEST_FILE_PATH, "P6Test_reload.properties"); System .setProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY, p6TestProperties.getAbsolutePath()); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } // [default] stacktrace=false // [SpyDotProperties] stacktrace=true // => true (+ survives across reloads) { File p6TestProperties = new File(P6TestFramework.TEST_FILE_PATH, "P6Test_reload_2.properties"); System .setProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY, p6TestProperties.getAbsolutePath()); P6SpyOptions.getActiveInstance().reload(); assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); P6SpyOptions.getActiveInstance().reload(); assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); } // [default] stacktrace=false // [SpyDotProperties] stacktrace=true // [SystemProperties] stacktrace=false // => false (+ survives across reloads) { System.setProperty(SystemProperties.P6SPY_PREFIX + P6SpyOptions.STACKTRACE, Boolean.toString(false)); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } // [default] stacktrace=false // [SpyDotProperties] stacktrace=true // [SystemProperties] stacktrace=false // [JMXSetProperties] stacktrace=true // => true (+ but jmx doesn't survives across reloads) { File p6TestProperties = new File(P6TestFramework.TEST_FILE_PATH, "P6Test_reload_2.properties"); System .setProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY, p6TestProperties.getAbsolutePath()); final String domainName = P6MBeansRegistry.PACKAGE_NAME; final String beanName = P6SpyOptions.class.getName(); final String attributeName = "StackTrace"; // jmx value modification jmxClient.setAttribute(domainName, beanName, attributeName, true); assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); P6SpyOptions.getActiveInstance().reload(); assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); } } @Test public void testSpyDotPropertiesWithSpaceInPathWorks() throws Exception { // // setup preconditions // final File spyDotPropertiesWithSpaceInPath; // create spy.properties file with the space in path { final File tmpFile = File.createTempFile("whatever", ".tmp"); final File tmpDir = tmpFile.getParentFile(); tmpFile.delete(); final File dirWithSpace = new File(tmpDir.getAbsolutePath() + "/path with space"); dirWithSpace.deleteOnExit(); dirWithSpace.mkdir(); assertTrue(dirWithSpace.exists()); final File source = new File(P6TestFramework.TEST_FILE_PATH, "P6Test_reload_2.properties"); spyDotPropertiesWithSpaceInPath = new File(dirWithSpace, "P6Test_reload_2.properties"); FileUtils.copyFile(source, spyDotPropertiesWithSpaceInPath); } // by default property should not be set assertFalse(P6SpyOptions.getActiveInstance().getStackTrace()); // // full path in system property case // // ensure property loaded from file correctly // [default] stacktrace=false // [SpyDotProperties] stacktrace=true // => true System.setProperty(SpyDotProperties.OPTIONS_FILE_PROPERTY, spyDotPropertiesWithSpaceInPath.getAbsolutePath()); P6SpyOptions.getActiveInstance().reload(); // property correctly loaded assertTrue(P6SpyOptions.getActiveInstance().getStackTrace()); } }