/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.catalina.manager;

import java.io.File;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;

import org.junit.Assert;
import org.junit.Test;

import static org.apache.catalina.startup.SimpleHttpClient.CRLF;
import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.SimpleHttpClient;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.tomcat.util.json.JSONParser;
import org.w3c.dom.Document;
import org.w3c.dom.ls.DOMImplementationLS;
import org.xml.sax.InputSource;

public class TestStatusTransformer extends TomcatBaseTest {

    enum Mode {
        HTML,
        XML,
        JSON
    }

    @Test
    public void testJSON() throws Exception {
        testStatusServlet(Mode.JSON);
    }

    @Test
    public void testXML() throws Exception {
        testStatusServlet(Mode.XML);
    }

    @Test
    public void testHTML() throws Exception {
        testStatusServlet(Mode.HTML);
    }

    protected void testStatusServlet(Mode mode) throws Exception {
        Tomcat tomcat = getTomcatInstance();

        // Add default servlet to make some requests
        File appDir = new File("test/webapp");
        Context ctxt = tomcat.addContext("", appDir.getAbsolutePath());
        ctxt.setPrivileged(true);
        Wrapper defaultServlet = Tomcat.addServlet(ctxt, "default", "org.apache.catalina.servlets.DefaultServlet");
        defaultServlet.addInitParameter("fileEncoding", "ISO-8859-1");
        ctxt.addServletMappingDecoded("/", "default");
        Tomcat.addServlet(ctxt, "status", "org.apache.catalina.manager.StatusManagerServlet");
        ctxt.addServletMappingDecoded("/status/*", "status");
        ctxt.addMimeMapping("html", "text/html");
        Context ctxt2 = tomcat.addContext("/test", null);
        Tomcat.addServlet(ctxt2, "status", "org.apache.catalina.manager.StatusManagerServlet");
        ctxt.addServletMappingDecoded("/somepath/*", "status");
        tomcat.start();

        SimpleHttpClient client = new SimpleHttpClient() {
            @Override
            public boolean isResponseBodyOK() {
                return true;
            }
        };
        client.setPort(getPort());
        // @formatter:off
        client.setRequest(new String[] {
                "GET /index.html HTTP/1.1" + CRLF +
                    "Host: localhost" + CRLF +
                    "Connection: Close" + CRLF +
                    CRLF
                });
        // @formatter:on
        client.connect();
        client.processRequest(true);

        String requestline = null;
        switch (mode) {
            case XML -> requestline = "GET /status/all?XML=true HTTP/1.1";
            case JSON -> requestline = "GET /status/all?JSON=true HTTP/1.1";
            default -> requestline = "GET /status/all HTTP/1.1";
        }
        // @formatter:off
        client.setRequest(new String[] {
                requestline + CRLF +
                    "Host: localhost" + CRLF +
                    "Connection: Close" + CRLF +
                    CRLF
                });
        // @formatter:on
        client.connect();
        client.processRequest(true);
        String body = client.getResponseBody();
        if (mode.equals(Mode.JSON)) {
            JSONParser parser = new JSONParser(body);
            String result = parser.parse().toString();
            Assert.assertTrue(result.contains("name=localhost/"));
        } else if (mode.equals(Mode.XML)) {
            try (StringReader reader = new StringReader(body)) {
                Document xmlDocument =
                        DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(reader));
                String serialized = ((DOMImplementationLS) xmlDocument.getImplementation()).createLSSerializer()
                        .writeToString(xmlDocument);
                // Verify that a request is being processed
                Assert.assertTrue(serialized.contains("stage=\"S\""));
            }
        } else {
            // Verify that a request is being processed
            Assert.assertTrue(body.contains("<strong>S</strong>"));
        }
    }

}
