/*
 * Copyright (c) 2005, 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 6335337
 * @summary Test correctness of mxbean flag in descriptor.
 * @author Luis-Miguel Alventosa
 * @run clean MXBeanFlagTest
 * @run build MXBeanFlagTest
 * @run main MXBeanFlagTest
 */

import javax.management.*;

public class MXBeanFlagTest {

    public interface Compliant1MXBean {}
    public static class Compliant1 implements Compliant1MXBean {}

    public interface Compliant2MXBean {}
    public static class Compliant2 implements Compliant2MXBean {}

    public interface Compliant3MBean {}
    public static class Compliant3 implements Compliant3MBean {}

    public interface Compliant4MBean {}
    public static class Compliant4 implements Compliant4MBean {}

    public static void main(String[] args) throws Exception {
        MBeanServer mbs = MBeanServerFactory.newMBeanServer();
        ObjectName on1 = new ObjectName(":type=Compliant1");
        ObjectName on2 = new ObjectName(":type=Compliant2");
        ObjectName on3 = new ObjectName(":type=Compliant3");
        ObjectName on4 = new ObjectName(":type=Compliant4");
        Compliant1 compliant1 = new Compliant1();
        StandardMBean compliant2 =
            new StandardMBean(new Compliant2(), Compliant2MXBean.class, true);
        Compliant3 compliant3 = new Compliant3();
        StandardMBean compliant4 =
            new StandardMBean(new Compliant4(), Compliant4MBean.class, false);
        mbs.registerMBean(compliant1, on1);
        mbs.registerMBean(compliant2, on2);
        mbs.registerMBean(compliant3, on3);
        mbs.registerMBean(compliant4, on4);
        String flag1 = (String)
            mbs.getMBeanInfo(on1).getDescriptor().getFieldValue("mxbean");
        String flag2 = (String)
            mbs.getMBeanInfo(on2).getDescriptor().getFieldValue("mxbean");
        String flag3 = (String)
            mbs.getMBeanInfo(on3).getDescriptor().getFieldValue("mxbean");
        String flag4 = (String)
            mbs.getMBeanInfo(on4).getDescriptor().getFieldValue("mxbean");
        System.out.println("MXBean compliant1:\n" +
            "\t[Expected: mxbean=true]  [Got: mxbean=" + flag1 + "]");
        System.out.println("MXBean compliant2:\n" +
            "\t[Expected: mxbean=true]  [Got: mxbean=" + flag2 + "]");
        System.out.println("Standard MBean compliant3:\n" +
            "\t[Expected: mxbean=false] [Got: mxbean=" + flag3 + "]");
        System.out.println("Standard MBean compliant4:\n" +
            "\t[Expected: mxbean=false] [Got: mxbean=" + flag4 + "]");
        if (flag1 != null && flag1.equals("true") &&
            flag2 != null && flag2.equals("true") &&
            flag3 != null && flag3.equals("false") &&
            flag4 != null && flag4.equals("false"))
            System.out.println("Test PASSED");
        else {
            System.out.println("Test FAILED");
            throw new Exception("invalid flags");
        }
    }
}
