Package org.apache.hivemind.management.log4j

Source Code of org.apache.hivemind.management.log4j.TestLogManagementMBean

// Copyright 2005 The Apache Software Foundation
//
// 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.

package org.apache.hivemind.management.log4j;

import java.util.ArrayList;
import java.util.List;

import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;

import junit.framework.AssertionFailedError;

import org.apache.hivemind.Registry;
import org.apache.hivemind.management.ObjectNameBuilder;
import org.apache.hivemind.management.impl.ObjectNameBuilderImpl;
import org.apache.hivemind.test.HiveMindTestCase;
import org.apache.log4j.Logger;
import org.apache.log4j.jmx.LoggerDynamicMBean;
import org.easymock.ArgumentsMatcher;
import org.easymock.MockControl;

/**
* Tests {@link org.apache.hivemind.management.log4j.LogManagementMBean}
*
* @author Achim Huegen
* @since 1.1
*/
public class TestLogManagementMBean extends HiveMindTestCase
{
    private boolean isMatcherSet = false;

    /**
     * Checks that loggers defined in the contribution are correctly registered This is verified by
     * mocking the Mbeanserver
     */
    public void testContribution() throws Exception
    {
        // Use unordered Mockcontrol, since ordered has a bug with
        // matchers and multiple method calls of a method with return value
        MockControl serverControl = MockControl.createControl(MBeanServer.class);
        addControl(serverControl);
        MBeanServer server = (MBeanServer) serverControl.getMock();

        List contributions = new ArrayList();

        // Add some loggers
        Logger.getLogger("package1.logger1");
        Logger.getLogger("package1.logger2");
        Logger.getLogger("package1.subpackage1.logger1");
        Logger.getLogger("package1.subpackage2.logger1");
        Logger.getLogger("package2");
        Logger.getLogger("package2.logger1");
        Logger.getLogger("package2.logger2");
        Logger.getLogger("package3.logger1");

        addContribution(contributions, "package1.logger1");
        addContribution(contributions, "package1.sub*");
        addContribution(contributions, "package2.*");

        ObjectNameBuilder objectNameBuilder = new ObjectNameBuilderImpl();

        // Training
        // These are the loggers that are expected to be registered as mbean
        addExpectedRegistration(serverControl, server, "package1.logger1");
        addExpectedRegistration(serverControl, server, "package1.subpackage1.logger1");
        addExpectedRegistration(serverControl, server, "package1.subpackage2.logger1");
        addExpectedRegistration(serverControl, server, "package2.logger1");
        addExpectedRegistration(serverControl, server, "package2.logger2");

        replayControls();

        LogManagementMBean mbean = new LogManagementMBean(objectNameBuilder, contributions);
        mbean.preRegister(server, new ObjectName("hivemind:test=test"));
        mbean.postRegister(Boolean.TRUE);

        verifyControls();
    }

    /**
     * Adds an expected call of registerMBean to the server mock object
     */
    private void addExpectedRegistration(MockControl serverControl, MBeanServer server,
            String loggerName) throws Exception
    {
        // Provide the logger name as first parameter, thats not type compatible
        // but the matcher can handle it
        server.registerMBean(loggerName, null);

        if (!isMatcherSet)
        {
            isMatcherSet = true;
            // Set a matcher that compares the name of the logger
            serverControl.setMatcher(new ArgumentsMatcher()
            {
                public boolean matches(Object[] expected, Object[] value)
                {
                    // Compare name of the logger only
                    String expectedLoggerName = getLoggerNameFromMBean(expected[0]);
                    String actualLoggerName = getLoggerNameFromMBean(value[0]);
                    return expectedLoggerName.equals(actualLoggerName);
                }

                private String getLoggerNameFromMBean(Object mbean) throws AssertionFailedError
                {
                    String loggerName;
                    try
                    {
                        if (mbean instanceof LoggerDynamicMBean)
                        {
                            LoggerDynamicMBean loggerDynamicMBean = (LoggerDynamicMBean) mbean;
                            loggerName = (String) loggerDynamicMBean.getAttribute("name");
                        }
                        else
                            loggerName = (String) mbean;
                    }
                    catch (Exception e)
                    {
                        throw new AssertionFailedError(e.getMessage());
                    }
                    return loggerName;
                }

                public String toString(Object[] value)
                {
                    return getLoggerNameFromMBean(value[0]);
                }

            });
        }
        serverControl.setReturnValue(null);
    }

    private LoggerContribution addContribution(List contributions, String loggerPattern)
    {
        LoggerContribution contribution1 = new LoggerContribution();
        contribution1.setLoggerPattern(loggerPattern);
        contributions.add(contribution1);
        return contribution1;
    }

    public void testContributionToString()
    {
        LoggerContribution contribution1 = new LoggerContribution();
        contribution1.setLoggerPattern("package1.test1");
        assertNotNull(contribution1.toString());
    }

    /**
     * Tests the LogManagementBean via the hivemind registry Configures one logger mbean and checks
     * for its presence in the mbean server
     */
    public void testIntegration() throws Exception
    {
        Logger logger = Logger.getLogger("package1.logger1");

        Registry registry = buildFrameworkRegistry("testLogManagementMBean.xml");

        registry.getService(LogManagement.class);

        MBeanServer mbeanServer = (MBeanServer) registry.getService(MBeanServer.class);
        ObjectNameBuilder objectNameBuilder = (ObjectNameBuilder) registry
                .getService(ObjectNameBuilder.class);
        ObjectName objectName = objectNameBuilder.createObjectName(logger.getName(), "logger");

        ObjectInstance instance = mbeanServer.getObjectInstance(objectName);
        assertNotNull(instance);

        registry.shutdown();
    }
}
TOP

Related Classes of org.apache.hivemind.management.log4j.TestLogManagementMBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.