/*
 * Copyright (c) 2004, 2012, 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 5057532
 * @summary Tests that host names are parsed correctly in URLs
 * @author Eamonn McManus
 * @run clean URLTest
 * @run build URLTest
 * @run main URLTest
 */

import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URI;
import javax.management.remote.JMXServiceURL;

public class URLTest {
    private static final String[] good = {
        "",
        "a",
        "a.b",
        "a.b.c.d.e.f.g",
        "aaa.bbb",
        "a-a.b-b",
        "a-a",
        "a--b",
        "1.2.3.4",
        "1.2.3.x",
        "111.222.222.111",
        "1",
        "23skiddoo",
        "23skiddoo.sfbay",
        "a1.b2",
        "1234.sfbay",
        "[::]",
        "[ffff::ffff]",
    };
    private static final String[] bad = {
        "-a",
        "a-",
        "-",
        "_",
        "a_b",
        "a_b.sfbay",
        ".",
        "..",
        ".a",
        "a.",
        "a..",
        "a..b",
        ".a.b",
        "a.b.",
        "a.b..",
        "1.2",
        "111.222.333.444",
        "a.23skiddoo",
        "[:::]",
        "[:]",
    };

    public static void main(String[] args) throws Exception {
        System.out.println("Testing that JMXServiceURL accepts the same " +
                           "hosts as java.net.URI");
        System.out.println("(Except that it allows empty host names and " +
                           "forbids a trailing \".\")");
        System.out.println();

        int failures = 0;

        for (int pass = 1; pass <= 2; pass++) {
            final boolean accept = (pass == 1);
            System.out.println("  Hosts that should " +
                               (accept ? "" : "not ") + "work");
            String[] hosts = accept ? good : bad;

            for (int i = 0; i < hosts.length; i++) {
                final String host = hosts[i];
                System.out.print("    " + host + ": ");

                boolean jmxAccept = true;
                try {
                    new JMXServiceURL("rmi", hosts[i], 0);
                } catch (MalformedURLException e) {
                    jmxAccept = false;
                }

                boolean uriAccept;
                try {
                    final URI uri = new URI("http://" + host + "/");
                    uriAccept = (uri.getHost() != null);
                } catch (URISyntaxException e) {
                    uriAccept = false;
                }

                final int len = host.length();
                if (accept != uriAccept && len != 0 &&
                    !(len > 1 && host.charAt(len - 1) == '.'
                      && host.charAt(len - 2) != '.')) {
                    // JMXServiceURL allows empty host name; also
                    // java.net.URI allows trailing dot in hostname,
                    // following RFC 2396, but JMXServiceURL doesn't,
                    // following RFC 2609
                    System.out.println("TEST BUG: URI accept=" + uriAccept);
                    failures++;
                } else {
                    if (jmxAccept == accept)
                        System.out.println("OK");
                    else {
                        System.out.println("FAILED");
                        failures++;
                    }
                }
            }

            System.out.println();
        }

        if (failures == 0)
            System.out.println("Test passed");
        else {
            System.out.println("TEST FAILURES: " + failures);
            System.exit(1);
        }
    }
}
