com.p6spy.engine.spy.option.P6TestOptionsReload.java Source code

Java tutorial

Introduction

Here is the source code for com.p6spy.engine.spy.option.P6TestOptionsReload.java

Source

/*
 * #%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());
    }

}