/*
 * Copyright 2003-2004 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/*
 * @test
 * @bug 4883712 4869006 4894856 5016685
 * @summary Test that DescriptorSupport correctly validates fields
 * @author Eamonn McManus
 * @run clean DescriptorSupportTest
 * @run build DescriptorSupportTest
 * @run main DescriptorSupportTest
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.management.Descriptor;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;

public class DescriptorSupportTest {
    private static final Object[] goodFields = {
        "value", "",
        "severity", "0",
        "severity", "6",
    };

    private static final Object[] badFields = {
        "name", null,
        "name", "",
        "descriptorType", null,
        "descriptorType", "",
        "setMethod", null,
        "getMethod", null,
        "role", null,
        "class", null,
        "visibility", null,
        "visibility", new Integer(0),
        "visibility", "0",
        "visibility", new Integer(5),
        "visibility", "5",
        "severity", null,
        "severity", new Integer(-1),
        "severity", "-1",
        "severity", new Integer(7),
        "severity", "7",
        "persistPolicy", null,
        "persistPolicy", "bogusPersistPolicy",
        "persistPeriod", null,
        "persistPeriod", "not a number",
        "currencyTimeLimit", null,
        "currencyTimeLimit", "not a number",
        "lastUpdatedTimeStamp", null,
        "lastUpdatedTimeStamp", "not a number",
        "lastReturnedTimeStamp", null,
        "lastReturnedTimeStamp", "not a number",
        "log", null,
        "log", "not T or F or true or false",
        "log", new Object[0],
    };


    public static void main(String[] args) throws Exception {
        boolean ok = true;

        System.out.println("Checking that name and descriptorType are " +
                           "mandatory");
        // Try omitting name and/or descriptorType
        for (int i = 0; i < 3; i++) {
            final boolean addName = ((i & 1) != 0);
            final boolean addDescriptorType = ((i & 2) != 0);
            final List fields = new ArrayList();
            if (addName)
                fields.add("name=something");
            if (addDescriptorType)
                fields.add("descriptorType=something-else");
            final String[] fs = (String[]) fields.toArray(new String[0]);
            final String what =
                    "DescriptorSupport with " +
                    (addName ? "" : "no ") + "name and " +
                    (addDescriptorType ? "" : "no ") + "descriptorType";
            DescriptorSupport ds = new DescriptorSupport(fs);
            if (ds.isValid()) {
                System.out.println("INCORRECTLY ACCEPTED: " + what);
                ok = false;
            } else
                System.out.println("OK: rejected " + what);
        }

        for (int pass = 0; pass < 2; pass++) {
            boolean shouldAccept = (pass == 0);
            System.out.println("Trying out " +
                               (shouldAccept ? "correct" : "bogus") +
                               " DescriptorSupport fields");
            Object[] fields = shouldAccept ? goodFields : badFields;
            for (int i = 0; i < fields.length; i += 2) {
                String[] names = {"name", "descriptorType"};
                String[] values = {"some-name", "some-type"};
                DescriptorSupport d = new DescriptorSupport(names, values);
                final String name = (String) fields[i];
                final Object value = fields[i + 1];
                final String valueS =
                    (value instanceof String) ? ("\"" + value + "\"") :
                    (value == null) ? "null" : value.toString();
                final String what =
                    "DescriptorSupport with " + name + " = " + valueS;
                try {
                    d.setField(name, value);
                    if (shouldAccept)
                        System.out.println("OK: accepted " + what);
                    else {
                        System.out.println("INCORRECTLY ACCEPTED: " + what);
                        ok = false;
                    }
                } catch (RuntimeOperationsException e) {
                    if (shouldAccept) {
                        System.out.println("INCORRECTLY REJECTED: " + what +
                                           ": " + e);
                        ok = false;
                    } else {
                        System.out.println("OK: rejected " + what);
                        // OK: this is what should happen
                    }
                } catch (Exception e) {
                    System.out.println("WRONG EXCEPTION: " + what + ": " + e);
                    ok = false;
                }
            }
        }

        // 4894856: ModelMBeanInfoSupport.setDescriptor(d, "mbean") fails
        System.out.println("Checking that setDescriptor(d, \"mbean\") works");
        ModelMBeanInfo mmbi =
            new ModelMBeanInfoSupport("x", "descr", null, null, null, null);
        Descriptor d = mmbi.getDescriptor("x", "mbean");
        try {
            mmbi.setDescriptor(d, "mbean");
        } catch (Exception e) {
            System.out.println("Unexpected exception:");
            e.printStackTrace(System.out);
            ok = false;
        }

        // 5016685: DescriptorSupport forces field names to lower case
        System.out.println("Checking that field name case is ignored " +
                           "but preserved");
        ok &= caseTest(new DescriptorSupport(new String[] {"NAME=blah"}),
                       "DescriptorSupport(String[])");
        ok &= caseTest(new DescriptorSupport(new String[] {"NAME"},
                                             new String[] {"blah"}),
                       "DescriptorSupport(String[], Object[])");
        DescriptorSupport d1 = new DescriptorSupport();
        d1.setField("NAME", "blah");
        ok &= caseTest(d1, "DescriptorSupport.setField");
        d1 = new DescriptorSupport(new String[] {"NAME=blah"});
        ok &= caseTest(new DescriptorSupport(d1),
                       "DescriptorSupport(Descriptor)");
        d1 = new DescriptorSupport(new String[] {"NAME=blah"});
        ok &= caseTest(new DescriptorSupport(d1.toXMLString()),
                       "DescriptorSupport(String)");
        d1 = new DescriptorSupport(new String[] {"NAME=blah"});
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(d1);
        oos.close();
        bos.close();
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        d1 = (DescriptorSupport) ois.readObject();
        ok &= caseTest(d1, "serialized DescriptorSupport");

        if (ok)
            System.out.println("Test passed");
        else {
            System.out.println("TEST FAILED");
            System.exit(1);
        }
    }

    private static boolean caseTest(Descriptor d, String what) {
        boolean ok = true;

        System.out.println("..." + what);

        String[] names = d.getFieldNames();
        if (names.length != 1 || !names[0].equals("NAME")) {
            ok = false;
            System.out.println("...getFieldNames() fails: " +
                               Arrays.asList(names));
        }

        String[] fields = d.getFields();
        if (fields.length != 1 || !fields[0].equals("NAME=blah")) {
            ok = false;
            System.out.println("...getFields() fails: " +
                               Arrays.asList(fields));
        }

        Object value = d.getFieldValue("namE");
        if (!"blah".equals(value)) {
            ok = false;
            System.out.println("...getFieldValue(\"namE\") fails: " + value);
        }

        Object[] values = d.getFieldValues(new String[] {"namE"});
        if (values.length != 1 || !"blah".equals(values[0])) {
            ok = false;
            System.out.println("...getFieldValues({\"namE\"}) fails: " +
                               Arrays.asList(values));
        }

        d.setField("namE", "newblah");
        Object newblah = d.getFieldValue("Name");
        if (!"newblah".equals(newblah)) {
            ok = false;
            System.out.println("...setField value not returned: " + newblah);
        }

        d.setFields(new String[] {"NaMe"}, new Object[] {"newerblah"});
        Object newerblah = d.getFieldValue("naMe");
        if (!"newerblah".equals(newerblah)) {
            ok = false;
            System.out.println("...setFields value not returned: " +
                               newerblah);
        }

        Descriptor d1 = (Descriptor) d.clone();
        newerblah = d1.getFieldValue("NAMe");
        if (!"newerblah".equals(newerblah)) {
            ok = false;
            System.out.println("...clone incorrect: " + newerblah);
        }

        d.removeField("NAme");
        names = d.getFieldNames();
        if (names.length != 0) {
            ok = false;
            System.out.println("...removeField failed: " +
                               Arrays.asList(names));
        }

        if (ok)
            System.out.println("...succeeded");

        return ok;
    }
}
