/*
 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug     5007165
 *
 * @summary Basic Test for LoggingMXBean via MBeanServer
 * @author  Ron Mann
 * @modules java.logging
 *          java.management
 * @build LoggingMXBeanTest
 * @run main LoggingMXBeanTest
 */

import javax.management.*;
import java.util.logging.*;


public class LoggingMXBeanTest
{

    LoggingMXBean mBean;
    ObjectName objectName = null;
    static String LOGGER_NAME_1 = "com.sun.management.Logger1";
    static String LOGGER_NAME_2 = "com.sun.management.Logger2";
    static Logger logger1;
    static Logger logger2;

    public LoggingMXBeanTest() throws Exception {

        /*
         * Create the MBeanServeri, register the LoggingMXBean
         */
        System.out.println( "***************************************************" );
        System.out.println( "********** LoggingMXBean Unit Test **********" );
        System.out.println( "***************************************************" );
        System.out.println( "" );
        System.out.println( "*******************************" );
        System.out.println( "*********** Phase 1 ***********" );
        System.out.println( "*******************************" );
        System.out.println( "    Creating MBeanServer " );
        System.out.print( "    Register LoggingMXBean: " );
        MBeanServer mbs = MBeanServerFactory.createMBeanServer();
        String[] list = new String[0];

        try {
            objectName = new ObjectName(LogManager.LOGGING_MXBEAN_NAME);
            mBean = LogManager.getLoggingMXBean();
            mbs.registerMBean( mBean, objectName );
        }
        catch ( Exception e ) {
            System.out.println( "FAILED" );
            throw e;
        }
        System.out.println( "PASSED" );
        System.out.println("");

        /*
         * Access our MBean to get the current list of Loggers
         */
        System.out.println( "*******************************" );
        System.out.println( "*********** Phase 2 ***********" );
        System.out.println( "*******************************" );
        System.out.println( "   Test Logger Name retrieval (getLoggerNames) " );
        // check that Level object are returned properly
        try {
            list = (String[]) mbs.getAttribute( objectName,  "LoggerNames" );
        }
        catch ( Exception e ) {
            System.out.println("    : FAILED" );
            throw e;
        }

        /*
         * Dump the list of Loggers already present, if any
         */
        Object[] params =  new Object[1];
        String[] signature =  new String[1];
        Level l;

        if ( list == null ) {
            System.out.println("    : PASSED.  No Standard Loggers Present" );
            System.out.println("");
        }
        else {
            System.out.println("    : PASSED. There are " + list.length + " Loggers Present" );
            System.out.println("");
            System.out.println( "*******************************" );
            System.out.println( "*********** Phase 2B **********" );
            System.out.println( "*******************************" );
            System.out.println( " Examine Existing Loggers" );
            for ( int i = 0; i < list.length; i++ ) {
                try {
                    params[0] = list[i];
                    signature[0] = "java.lang.String";
                    String levelName = (String) mbs.invoke(  objectName, "getLoggerLevel", params, signature );
                    System.out.println("    : Logger #" + i + " = " + list[i] );
                    System.out.println("    : Level = " + levelName );
                }
                catch ( Exception e ) {
                    System.out.println("    : FAILED" );
                    throw e;
                }
            }
            System.out.println("    : PASSED" );
        }

        /*
         * Create two new loggers to the list of Loggers already present
         */
        System.out.println("");
        System.out.println( "*******************************" );
        System.out.println( "*********** Phase 3 ***********" );
        System.out.println( "*******************************" );
        System.out.println( " Create and test new Loggers" );
        logger1 = Logger.getLogger( LOGGER_NAME_1 );
        logger2 = Logger.getLogger( LOGGER_NAME_2 );

        // check that Level object are returned properly
        try {
            list = (String[]) mbs.getAttribute( objectName,  "LoggerNames" );
        }
        catch ( Exception e ) {
            System.out.println("    : FAILED" );
            throw e;
        }

        /*
         *  Check for the existence of our new Loggers
         */
        boolean log1 = false, log2 = false;

        if ( list == null || list.length < 2 ) {
            System.out.println("    : FAILED.  Could not Detect the presense of the new Loggers" );
            throw new RuntimeException(
                "Could not Detect the presense of the new Loggers");
        }
        else {
            for ( int i = 0; i < list.length; i++ ) {
                if ( list[i].equals( LOGGER_NAME_1 ) ) {
                    log1 = true;
                    System.out.println( "    : Found new Logger : " + list[i] );
                }
                if ( list[i].equals( LOGGER_NAME_2 ) ) {
                    log2 = true;
                    System.out.println( "    : Found new Logger : " + list[i] );
                }
            }
            if ( log1 && log2 )
                System.out.println( "    : PASSED." );
            else {
                System.out.println( "    : FAILED.  Could not Detect the new Loggers." );
                throw new RuntimeException(
                    "Could not Detect the presense of the new Loggers");
            }
        }

        /*
         *  Set a new Logging levels and check that it succeeded
         */
        System.out.println("");
        System.out.println( "*******************************" );
        System.out.println( "*********** Phase 4 ***********" );
        System.out.println( "*******************************" );
        System.out.println( " Set and Check the Logger Level" );
        log1 = false;
        log2 = false;
        try {
            // Set the level of logger1 to ALL
            params = new Object[2];
            signature =  new String[2];
            params[0] = LOGGER_NAME_1;
            params[1] = Level.ALL.getName();
            signature[0] = "java.lang.String";
            signature[1] = "java.lang.String";
            mbs.invoke(  objectName, "setLoggerLevel", params, signature );

            // Set the level of logger2 to FINER
            params[0] = LOGGER_NAME_2;
            params[1] = Level.FINER.getName();
            mbs.invoke(  objectName, "setLoggerLevel", params, signature );

            // Okay read back the Level from Logger1. Should be ALL
            params =  new Object[1];
            signature =  new String[1];
            params[0] = LOGGER_NAME_1;
            signature[0] = "java.lang.String";
            String levelName = (String) mbs.invoke(  objectName, "getLoggerLevel", params, signature );
            l = Level.parse(levelName);
            System.out.print("    Logger1: " );
            if ( l.equals( Level.ALL ) ) {
                System.out.println("Level Set to ALL: PASSED" );
                log1 = true;
            }
            else {
                System.out.println("Level Set to ALL: FAILED" );
                throw new RuntimeException(
                    "Level Set to ALL but returned " + l.toString());
            }

            // Okay read back the Level from Logger2. Should be FINER
            params =  new Object[1];
            signature =  new String[1];
            params[0] = LOGGER_NAME_2;
            signature[0] = "java.lang.String";
            levelName = (String) mbs.invoke(  objectName, "getLoggerLevel", params, signature );
            l = Level.parse(levelName);
            System.out.print("    Logger2: " );
            if ( l.equals( Level.FINER ) ) {
                System.out.println("Level Set to FINER: PASSED" );
                log2 = true;
            }
            else {
                System.out.println("Level Set to FINER: FAILED" );
                throw new RuntimeException(
                    "Level Set to FINER but returned " + l.toString());
            }
        }
        catch ( Exception e ) {
            throw e;
        }

        System.out.println( "" );
        System.out.println( "***************************************************" );
        System.out.println( "***************** All Tests Passed ****************" );
        System.out.println( "***************************************************" );
    }

    public static void main(String[] argv) throws Exception {
        new LoggingMXBeanTest();
    }
}
