org.esigate.vars.DriverEsiVariablesTest.java Source code

Java tutorial

Introduction

Here is the source code for org.esigate.vars.DriverEsiVariablesTest.java

Source

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

import java.io.IOException;
import java.util.Properties;

import junit.framework.Assert;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.util.EntityUtils;
import org.esigate.Driver;
import org.esigate.DriverFactory;
import org.esigate.HttpErrorPage;
import org.esigate.Parameters;
import org.esigate.esi.EsiRenderer;
import org.esigate.http.IncomingRequest;
import org.esigate.test.TestUtils;
import org.esigate.test.conn.IResponseHandler;
import org.esigate.test.driver.AbstractDriverTestCase;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This test case ensure ESI variables are correctly replaced.
 * 
 * <p>
 * The backend reply a Http Response with &lt:esi:vars&gt; and the result returned by esigate is compared with the
 * expected result.
 * 
 * @author Nicolas Richeton
 * 
 */
public class DriverEsiVariablesTest extends AbstractDriverTestCase {
    private static final Logger LOG = LoggerFactory.getLogger(DriverEsiVariablesTest.class);

    /**
     * 0000246: ESI variables are not available / replaced. http://www.esigate.org/mantisbt/view.php?id=246
     * 
     * @throws IOException
     * @throws HttpErrorPage
     */
    @SuppressWarnings("static-method")
    @Test
    public void testEsiVariablesCase1() throws IOException, HttpErrorPage {
        // Reset Driverfactory (used for default driver with $(PROVIDER))
        Properties factoryProperties = new Properties();
        factoryProperties.put("tested." + Parameters.REMOTE_URL_BASE.getName(), "http://localhost.mydomain.fr/");
        DriverFactory.configure(factoryProperties);

        // Configuration
        Properties properties = new Properties();
        properties.put(Parameters.REMOTE_URL_BASE.getName(), "http://localhost.mydomain.fr/");

        // Test case
        IncomingRequest request = TestUtils
                .createRequest("http://test.mydomain.fr/foobar/?test=esigate&test2=esigate2")
                .addHeader("Referer", "http://www.esigate.org")
                .addHeader("User-Agent",
                        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 "
                                + "(KHTML, like Gecko) Version/6.0.5 Safari/536.30.1")
                .addHeader("Accept-Language", "da, en-gb;q=0.8, en;q=0.7")
                .addCookie(new BasicClientCookie("test-cookie", "test-cookie-value"))
                .addCookie(new BasicClientCookie("test-cookie2", "test-cookie-value2")).build();

        final StringBuilder expected = new StringBuilder();
        addVariable(expected, "HTTP_ACCEPT_LANGUAGE", "da, en-gb;q=0.8, en;q=0.7");
        addVariable(expected, "HTTP_ACCEPT_LANGUAGE{en}", "true");
        addVariable(expected, "HTTP_ACCEPT_LANGUAGE{fr}", "false");
        addVariable(expected, "QUERY_STRING{test}", "esigate");
        addVariable(expected, "QUERY_STRING", "test=esigate&test2=esigate2");
        addVariable(expected, "HTTP_REFERER", "http://www.esigate.org");
        addVariable(expected, "PROVIDER{tested}", "http://localhost.mydomain.fr/");
        addVariable(expected, "PROVIDER{missing}", "");
        addVariable(expected, "PROVIDER", "");
        addVariable(expected, "HTTP_HOST", "test.mydomain.fr");
        addVariable(expected, "HTTP_USER_AGENT",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/536.30.1 (KHTML, like Gecko)"
                        + " Version/6.0.5 Safari/536.30.1");
        addVariable(expected, "HTTP_USER_AGENT{browser}", "MOZILLA");
        addVariable(expected, "HTTP_USER_AGENT{os}", "MAC");
        addVariable(expected, "HTTP_COOKIE{test-cookie}", "test-cookie-value");
        addVariable(expected, "HTTP_COOKIE{'test-cookie'}", "test-cookie-value");
        addVariable(expected, "HTTP_COOKIE{missing}", "");
        addVariable(expected, "QUERY_STRING{missing}", "");
        addVariable(expected, "HTTP_USER_AGENT{version}", "5.0");
        addVariable(expected, "HTTP_HEADER{Accept-Language}", "da, en-gb;q=0.8, en;q=0.7");

        addVariable(expected, "HTTP_COOKIE", "test-cookie=test-cookie-value; test-cookie2=test-cookie-value2");
        addVariable(expected, "QUERY_STRING{missing}|default-value", "default-value");
        addVariable(expected, "QUERY_STRING{missing}|'default value'", "default value");

        // Setup remote server (provider) response.
        IResponseHandler mockExecutor = new IResponseHandler() {
            @Override
            public HttpResponse execute(HttpRequest request) {

                StringBuilder content = new StringBuilder();
                content.append("<esi:vars>");

                String[] expectedArray = StringUtils.splitByWholeSeparator(expected.toString(), "<p>");

                for (String expr : expectedArray) {
                    addVariable(content, expr.substring(0, expr.indexOf(":")));
                }

                content.append("</esi:vars>");

                LOG.info("Backend response:\n" + content.toString());

                return TestUtils.createHttpResponse()
                        .entity(new StringEntity(content.toString(), ContentType.TEXT_HTML)).build();
            }
        };

        // Build driver and request.
        Driver driver = TestUtils.createMockDriver(properties, mockExecutor);

        CloseableHttpResponse response = TestUtils.driverProxy(driver, request, new EsiRenderer());

        String entityContent = EntityUtils.toString(response.getEntity());
        LOG.info("Esigate response: \n" + entityContent);

        String[] expectedArray = StringUtils.splitByWholeSeparator(expected.toString(), "<p>");
        String[] resultArray = StringUtils.splitByWholeSeparator(entityContent, "<p>");

        for (int i = 0; i < expectedArray.length; i++) {
            String varName = expectedArray[i].substring(0, expectedArray[i].indexOf(":"));
            Assert.assertEquals(varName, expectedArray[i], resultArray[i]);
            LOG.info("Success with variable {}", varName);
        }

    }

    /**
     * 0000246: ESI variables are not available / replaced. http://www.esigate.org/mantisbt/view.php?id=246
     * 
     * @throws IOException
     * @throws HttpErrorPage
     */
    @SuppressWarnings("static-method")
    @Test
    public void testEsiVariablesCase2() throws IOException, HttpErrorPage {
        // Configuration
        Properties properties = new Properties();
        properties.put(Parameters.REMOTE_URL_BASE.getName(), "http://localhost.mydomain.fr/");

        // Test case
        IncomingRequest request = TestUtils.createRequest("http://test.mydomain.fr/foobar/")
                .addHeader("User-Agent", "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US)").build();

        final StringBuilder expected = new StringBuilder();
        addVariable(expected, "HTTP_ACCEPT_LANGUAGE{en}", "false");
        addVariable(expected, "HTTP_ACCEPT_LANGUAGE{fr}", "false");
        addVariable(expected, "HTTP_HOST", "test.mydomain.fr");
        addVariable(expected, "HTTP_USER_AGENT", "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US)");
        addVariable(expected, "HTTP_USER_AGENT{browser}", "MSIE");
        addVariable(expected, "HTTP_USER_AGENT{os}", "WIN");
        addVariable(expected, "HTTP_ACCEPT_LANGUAGE", "");
        addVariable(expected, "QUERY_STRING{test}", "");
        addVariable(expected, "QUERY_STRING", "");
        addVariable(expected, "HTTP_REFERER", "");
        addVariable(expected, "HTTP_COOKIE{test-cookie}", "");
        addVariable(expected, "HTTP_COOKIE", "");
        addVariable(expected, "QUERY_STRING{missing}", "");
        addVariable(expected, "HTTP_USER_AGENT{version}", "5.0");

        // Setup remote server (provider) response.
        IResponseHandler mockExecutor = new IResponseHandler() {
            @Override
            public HttpResponse execute(HttpRequest request) {

                StringBuilder content = new StringBuilder();
                content.append("<esi:vars>");

                String[] expectedArray = StringUtils.splitByWholeSeparator(expected.toString(), "<p>");

                for (String expr : expectedArray) {
                    addVariable(content, expr.substring(0, expr.indexOf(": ")));
                }

                content.append("</esi:vars>");
                LOG.info("Backend response:\n" + content.toString());

                return TestUtils.createHttpResponse()
                        .entity(new StringEntity(content.toString(), ContentType.TEXT_HTML)).build();
            }
        };

        // Build driver and request.
        Driver driver = TestUtils.createMockDriver(properties, mockExecutor);

        CloseableHttpResponse response = TestUtils.driverProxy(driver, request, new EsiRenderer());

        String entityContent = EntityUtils.toString(response.getEntity());
        LOG.info("Esigate response: \n" + entityContent);

        String[] expectedArray = StringUtils.splitByWholeSeparator(expected.toString(), "<p>");
        String[] resultArray = StringUtils.splitByWholeSeparator(entityContent, "<p>");

        for (int i = 0; i < expectedArray.length; i++) {
            String varName = expectedArray[i].substring(0, expectedArray[i].indexOf(":"));
            Assert.assertEquals(varName, expectedArray[i], resultArray[i]);
            LOG.info("Success with variable {}", varName);
        }

    }

    static void addVariable(StringBuilder sb, String variable) {
        sb.append("<p>" + variable + ": $(" + variable + ")</p>\n");
        LOG.info("Adding {} for evaluation", variable);
    }

    static void addVariable(StringBuilder sb, String variable, String value) {
        sb.append("<p>" + variable + ": " + value + "</p>\n");
        LOG.info("Adding {} with expected result {}", variable, value);

    }

}