/*
 * 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.*;

/*
 * Unit test to ensure that servlet that was generated from JSP is reloaded
 * when its class file is updated (without the JSP getting recompiled).
 *
 * This unit test accesses a JSP, which causes the JSP to be compiled to a
 * servlet, and the servlet class to be loaded. The unit test checks the
 * servlet response and makes sure it matches the expected output ("This is
 * my output").
 *
 * The test then updates the servlet class file (without recompiling the
 * JSP!). The updated servlet class file generates a different output ("This
 * is my UPDATED output") than the original class file. The unit test checks
 * that the servlet is reloaded (by comparing its output against the expected
 * modified output) the next time the JSP is accessed.
 */
public class WebTest {

    private static String TEST_NAME;

    private static final String TEST_ROOT_NAME = "jsp-reload-generated-servlet-if-updated";

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

    private String host;
    private String port;
    private String contextRoot;
    private String run;

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

    public static void main(String[] args) {

        stat.addDescription(
                "Unit test to ensure that servlet that " + "was generated from JSP is reloaded when its " + "class file is updated");
        WebTest webTest = new WebTest(args);

        if ("first".equals(webTest.run)) {
            TEST_NAME = TEST_ROOT_NAME + "-first";
        } else {
            TEST_NAME = TEST_ROOT_NAME + "-second";
        }

        try {
            webTest.doTest();
        } catch (Exception ex) {
            ex.printStackTrace();
            stat.addStatus(TEST_NAME, stat.FAIL);
        }

        stat.printSummary();
    }

    public void doTest() throws Exception {

        InputStream is = null;
        BufferedReader input = null;
        try {
            String expectedResponse = null;
            if ("first".equals(run)) {
                expectedResponse = "This is my output";
            } else {
                expectedResponse = "This is my UPDATED output";
            }

            URL url = new URL("http://" + host + ":" + port + contextRoot + "/jsp/test.jsp");
            System.out.println("Connecting to: " + url.toString());
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.connect();
            int responseCode = conn.getResponseCode();

            if (responseCode != 200) {
                System.err.println("Unexpected return code: " + responseCode);
                stat.addStatus(TEST_NAME, stat.FAIL);
            } else {
                is = conn.getInputStream();
                input = new BufferedReader(new InputStreamReader(is));
                String line = input.readLine();
                if (expectedResponse.equals(line)) {
                    stat.addStatus(TEST_NAME, stat.PASS);
                } else {
                    System.err.println("Wrong response. Expected: " + expectedResponse + ", received: " + line);
                    stat.addStatus(TEST_NAME, stat.FAIL);
                }
            }
        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException ex) {
            }
            try {
                if (input != null)
                    input.close();
            } catch (IOException ex) {
            }
        }
    }
}
