/*
 * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

import java.io.*;
import java.net.*;
import com.sun.ejte.ccl.reporter.*;

/*
 * Test case for 4944160 ("InvokerServlet must be disabled in
 * default-web.xml"). This test case makes sure that Tomcat's InvokerServlet,
 * which is declared in the appserver domain's default-web.xml, has been
 * disabled.
 *
 * This client attempts to connect to this URL:
 *
 *   http://<host>:<port>/web-invoker-servlet-disabled/servlet/TestServlet
 *
 * which must result in a 404, because the test servlet is mapped to this
 * url-pattern in web.xml: /TestServlet, instead of /servlet/TestServlet.
 *
 * The client will be able to connect successfully to the above URL only if the
 * InvokerServlet has been enabled.
 */
public class WebTest {

    private static SimpleReporterAdapter stat
        = new SimpleReporterAdapter("appserv-tests");

    private String host;
    private String port;
    private String contextRoot;
    private boolean fail;

    public WebTest(String[] args) {
        host = args[0];
        port = args[1];
        contextRoot = args[2];
    }

    public static void main(String[] args) {
        stat.addDescription("Unit test for Bugtraq 4944160");
        WebTest webTest = new WebTest(args);
        webTest.doTest();
        stat.printSummary("invoker-servlet-disabled");
    }

    public void doTest() {

        URL url = null;
        HttpURLConnection conn = null;
        int responseCode;
        boolean fail = false;

        try {
            /*
             * Connect to the wrong mapping.
             *
             * This will work only if the InvokerServlet in default-web.xml
             * has been enabled, and therefore must fail (with a 404 response
             * code) since the InvokerServlet should not have been enabled.
             */
            url = new URL("http://" + host  + ":" + port + contextRoot
                    + "/servlet/TestServlet");
            System.out.println("Connecting to: " + url.toString());
            conn = (HttpURLConnection) url.openConnection();
            conn.connect();
            responseCode = conn.getResponseCode();
            System.out.println("Response code: " + responseCode);
            if (responseCode != 404){
                fail = true;
            }

            /*
             * Connect to the correct mapping, as specified in the deployment
             * descriptor. This must work.
             */
            url = new URL("http://" + host  + ":" + port + contextRoot
                    + "/TestServlet");
            System.out.println("Connecting to: " + url.toString());
            conn = (HttpURLConnection) url.openConnection();
            conn.connect();
            responseCode = conn.getResponseCode();
            System.out.println("Response code: " + responseCode);
            if (responseCode == 404){
                fail = true;
            }

            if (fail) {
                stat.addStatus("invoker-servlet-disabled", stat.FAIL);
            } else {
                stat.addStatus("invoker-servlet-disabled", stat.PASS);
            }

        } catch (Exception ex) {
            System.out.println("invoker-servlet-disabled test failed.");
            stat.addStatus("invoker-servlet-disabled", stat.FAIL);
            ex.printStackTrace();
        }
    }
}
