/*
 * 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 for page directive trimDirectiveWhitespaces
 */
public class WebTest {

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

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

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

    public static void main(String[] args) {
        stat.addDescription("Unit test for jsp-descriptor in weblogic.xml");
        WebTest webTest = new WebTest(args);
        webTest.doTest("/test.jsp");
        stat.printSummary();
    }

    public void doTest(String path) {

        InputStream is = null;
        BufferedReader input = null;
        String testName = "wl-jsp-descriptor";
        try {
            URL url = new URL("http://" + host  + ':' + port + '/' + contextRoot + path);
            System.out.println("Connecting to: " + url.toString());
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.connect();
            int responseCode = conn.getResponseCode();
            if (responseCode != 200) {
                System.err.println("Wrong response code. Expected: 200"
                                   + ", received: " + responseCode);
                stat.addStatus(testName, stat.FAIL);
            } else {
                is = conn.getInputStream();
                input = new BufferedReader(new InputStreamReader(is));

                // Test 1.  Check if the scratch dir exists
                testName = "wl jsp desc: working-dir";
                File scratch = new File("/tmp/wl");
                if (scratch.exists()) {
                    stat.addStatus(testName, stat.PASS);
                } else {
                    stat.addStatus(testName, stat.FAIL);
                }

                // Test 2.  Check if the java file is generated
                testName = "wl jsp desc: keepgenerated";
                File javaFile = new File("/tmp/wl/org/apache/jsp/test_jsp.java");
                if (javaFile.exists()) {
                    stat.addStatus(testName, stat.PASS);
                } else {
                    stat.addStatus(testName, stat.FAIL);
                }

                // Test 3.  Make sure that spaces are trimmed.
                testName = "wl jsp desc: compress-html-template";
                String line = input.readLine();

                if (line.equals("pass!")) {
                    stat.addStatus(testName, stat.PASS);
                } else {
                    stat.addStatus(testName, stat.FAIL);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            stat.addStatus(testName, stat.FAIL);
        } finally {
            try {
                if (is != null) is.close();
            } catch (IOException ex) {}
            try {
                if (input != null) input.close();
            } catch (IOException ex) {}
        }
    }

}
