/*
 * 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 CR 4882996:
 * request.getAttribute("jakarta.servlet.error.request_uri") is not working ..
 *
 * The following response body lines must be returned in order for this unit
 * test to succeed:
 *
 *  /web-javax-servlet-error-request-uri-dynamic-resource/junk.jsp
 *  404
 *  /web-javax-servlet-error-request-uri-dynamic-resource/404handler.jsp
 *  http://<host>:<port>/web-javax-servlet-error-request-uri-dynamic-resource/404handler.jsp
 */
public class WebTest {

    private static final String TEST_NAME = "javax-servlet-error-request-uri-dynamic-resource";

    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 4882996");
        WebTest webTest = new WebTest(args);
        try {
            webTest.doTest();
        } catch (Exception ex) {
            System.out.println(TEST_NAME + " test failed");
            stat.addStatus(TEST_NAME, stat.FAIL);
            ex.printStackTrace();
        }
        stat.printSummary();
    }

    public void doTest() throws Exception {

        Socket sock = new Socket(host, new Integer(port).intValue());
        OutputStream os = sock.getOutputStream();
        String get = "GET " + contextRoot + "/junk.jsp HTTP/1.0\n";
        System.out.println(get);
        os.write(get.getBytes());
        os.write("\n".getBytes());

        InputStream is = sock.getInputStream();
        BufferedReader bis = new BufferedReader(new InputStreamReader(is));

        String line = null;
        int i=0;
        while ((line = bis.readLine()) != null) {
            System.out.println(i++ + ": " + line);
            if (line.equals(contextRoot + "/junk.jsp")) {
                break;
            }
        }

        if(line != null){
            String status = bis.readLine();
            System.out.println("status: " + status);
            if(status != null && "404".equals(status)){

                String requestURI = bis.readLine();
                System.out.println("requestURI: " + requestURI);

                if(requestURI != null
                    && requestURI.equals(contextRoot + "/404handler.jsp")){

                    String requestURL = bis.readLine();
                    System.out.println("requestURL: " + requestURL);

                    if(requestURL.equals("http://" + host + ":" + port + contextRoot + "/404handler.jsp")
                        || requestURL.equals("http://" +  InetAddress.getLocalHost().getHostName() +  ":" + port + contextRoot + "/404handler.jsp")){
                        stat.addStatus(TEST_NAME, stat.PASS);
                        return;
                    }
                }
            }
        }
        stat.addStatus(TEST_NAME, stat.FAIL);
    }
}
