/*
 * 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 handling of EL expressions #{...} in tag attributes
 * This includes bugs 6372687, 6377689, 6380354
 *
 * Make sure that is treated as a literal when jspversion of the tld is
 * 2.0 or less.
 */
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 tests for pound syntax as literal");
        WebTest webTest = new WebTest(args);
        webTest.doTest1("/testjsp12.jsp",
                        "jsp12-pound-compatibility-test");
        webTest.doTest2("/testjsp21x.jsp",
                        "pound-in-literal-test");
        webTest.doTest2("/testjsp21y.jsp",
                        "pound-in-exprval-test");
        webTest.doTest3("/testjsp21w.jsp",
                        "pound-default-test");
        webTest.doTest4("/testjsp21z.jsp",
                        "pound-syntax-allowed-as-literal-true-test");

	stat.printSummary();
    }

    private boolean checkValue(BufferedReader input,
                               String key, String expectedValue) 
            throws Exception {
        String line = input.readLine();
        while (line.equals(""))
            line = input.readLine();
        if (line == null)
            return true;
        if (!line.equals(key))
            return true;
        line = input.readLine();
        if (line == null)
            return true;
        if (!line.equals(expectedValue)) {
            System.err.println("Wrong response. Expected value for attribute "
                + key + ": " + expectedValue + ", received: " + line);
            return true;
        }
        return false; 
    }

    public void doTest1(String path, String testName) {

        InputStream is = null;
        BufferedReader input = null;
        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));
                boolean error = false;
                if (checkValue(input, "val1", "#{abc}"))
                    error = true;
                if (checkValue(input, "val2", "#{xyz}"))
                    error = true;
                if (checkValue(input, "val1", "\\#{abc}"))
                    error = true;
                if (checkValue(input, "val2", "\\#{xyz}"))
                    error = true;
                if (checkValue(input, "val1", "\\abc"))
                    error = true;
                if (checkValue(input, "val2", "\\xyz"))
                    error = true;
                if (error) {
                    stat.addStatus(testName, stat.FAIL);
                } else {
                    stat.addStatus(testName, stat.PASS);
                }
            }
        } 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) {}
        }
    }


    public void doTest2(String path, String testName) {
     
        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: 500"
                                   + ", received: " + responseCode);
                stat.addStatus(testName, stat.FAIL);
            } else {
                stat.addStatus(testName, stat.PASS);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            stat.addStatus(testName, stat.FAIL);
        }
    }

    public void doTest3(String path, String testName) {

        InputStream is = null;
        BufferedReader input = null;
        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));
                boolean error = false;
                if (checkValue(input, "val1", "#{abc}"))
                    error = true;
                if (checkValue(input, "val2", "#{xyz}"))
                    error = true;
                if (checkValue(input, "expr", "FooValue"))
                    error = true;
                if (checkValue(input, "val1", "#{abc}"))
                    error = true;
                if (checkValue(input, "val2", "#{xyz}"))
                    error = true;
                if (checkValue(input, "expr", "#{foo}"))
                    error = true;
                if (checkValue(input, "exprString", "#map"))
                    error = true;
                if (error) {
                    stat.addStatus(testName, stat.FAIL);
                } else {
                    stat.addStatus(testName, stat.PASS);
                }
            }
        } 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) {}
        }
    }

    public void doTest4(String path, String testName) {

        InputStream is = null;
        BufferedReader input = null;
        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));
                boolean error = false;
                if (checkValue(input, "val1", "\\#{abc}"))
                    error = true;
                if (checkValue(input, "val2", "\\#{xyz}"))
                    error = true;
                if (checkValue(input, "expr", "\\#{foo}"))
                    error = true;
                if (checkValue(input, "val1", "#{abc}"))
                    error = true;
                if (checkValue(input, "val2", "#{xyz}"))
                    error = true;
                if (checkValue(input, "expr", "#{foo}"))
                    error = true;
                if (error) {
                    stat.addStatus(testName, stat.FAIL);
                } else {
                    stat.addStatus(testName, stat.PASS);
                }
            }
        } 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) {}
        }
    }

}
