org.apache.shindig.gadgets.rewrite.HTMLContentRewriterTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.shindig.gadgets.rewrite.HTMLContentRewriterTest.java

Source

/**
 * 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.shindig.gadgets.rewrite;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;

/**
 *
 */
public class HTMLContentRewriterTest extends BaseRewriterTestCase {
    private HTMLContentRewriter rewriter;
    private HTMLContentRewriter rewriterNoOverrideExpires;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        ContentRewriterFeature overrideFeatureNoOverrideExpires = rewriterFeatureFactory
                .get(createSpecWithRewrite(".*", ".*exclude.*", null, HTMLContentRewriter.TAGS));
        ContentRewriterFeatureFactory factoryNoOverrideExpires = mockContentRewriterFeatureFactory(
                overrideFeatureNoOverrideExpires);

        rewriterNoOverrideExpires = new HTMLContentRewriter(factoryNoOverrideExpires,
                new CssRequestRewriter(factoryNoOverrideExpires, new CajaCssLexerParser(),
                        new DefaultProxyingLinkRewriterFactory(rewriterUris)),
                new DefaultConcatLinkRewriterFactory(rewriterUris),
                new DefaultProxyingLinkRewriterFactory(rewriterUris));

        ContentRewriterFeature overrideFeature = rewriterFeatureFactory
                .get(createSpecWithRewrite(".*", ".*exclude.*", "3600", HTMLContentRewriter.TAGS));
        ContentRewriterFeatureFactory factory = mockContentRewriterFeatureFactory(overrideFeature);

        rewriter = new HTMLContentRewriter(factory,
                new CssRequestRewriter(factory, new CajaCssLexerParser(),
                        new DefaultProxyingLinkRewriterFactory(rewriterUris)),
                new DefaultConcatLinkRewriterFactory(rewriterUris),
                new DefaultProxyingLinkRewriterFactory(rewriterUris));
    }

    @Test
    public void testScriptsBasic() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
        Document doc = rewriteContent(rewriter, content, null).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Head should contain 1 script tag
        assertEquals("headScript1", wrapper.getValue("/html/head/script"));
        assertEquals(1, wrapper.getNodeList("/html/head/script").getLength());

        // Body should contain 11 script tags after rewrite
        assertEquals(11, wrapper.getNodeList("/html/body/script").getLength());

        assertEquals("bodyScript1", wrapper.getValue("/html/body/script[1]"));

        // Second script should contain two concatenated urls
        assertEquals(wrapper.getValue("/html/body/script[2]/@src"),
                "http://www.test.com/dir/concat?"
                        + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                        + "&fp=1150739864&refresh=3600" + "&1=http%3A%2F%2Fwww.example.org%2F1.js"
                        + "&2=http%3A%2F%2Fwww.example.org%2F2.js");

        assertEquals("bodyScript2", wrapper.getValue("/html/body/script[3]"));

        // Fourth script should contain one concatenated url
        assertEquals(wrapper.getValue("/html/body/script[4]/@src"),
                "http://www.test.com/dir/concat?" + "rewriteMime=text/javascript"
                        + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml" + "&fp=1150739864&refresh=3600"
                        + "&1=http%3A%2F%2Fwww.example.org%2F3.js");

        // Fifth script should contain a retained comment
        assertEquals("<!-- retain-comment -->", wrapper.getValue("/html/body/script[5]"));

        // An excluded URL between contiguous tags prevents them being concatentated
        assertEquals(wrapper.getValue("/html/body/script[6]/@src"),
                "http://www.test.com/dir/concat?"
                        + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                        + "&fp=1150739864&refresh=3600" + "&1=http%3A%2F%2Fwww.example.org%2F4.js");

        // Excluded URL is untouched
        assertEquals("http://www.example.org/excluded/5.js", wrapper.getValue("/html/body/script[7]/@src"));

        assertEquals(wrapper.getValue("/html/body/script[8]/@src"), "http://www.test.com/dir/concat?"
                + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                + "&fp=1150739864&refresh=3600" + "&1=http%3A%2F%2Fwww.example.org%2F6.js"
                + "&2=http%3A%2F%2Fwww.example.org%2F10.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&3=http%3A%2F%2Fwww.example.org%2F11.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&4=http%3A%2F%2Fwww.example.org%2F12.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&5=http%3A%2F%2Fwww.example.org%2F13.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&6=http%3A%2F%2Fwww.example.org%2F14.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&7=http%3A%2F%2Fwww.example.org%2F15.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&8=http%3A%2F%2Fwww.example.org%2F16.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&9=http%3A%2F%2Fwww.example.org%2F17.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&10=http%3A%2F%2Fwww.example.org%2F18.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&11=http%3A%2F%2Fwww.example.org%2F19.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");

        // Did it split the request
        assertEquals(wrapper.getValue("/html/body/script[9]/@src"), "http://www.test.com/dir/concat?"
                + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                + "&fp=1150739864&refresh=3600"
                + "&1=http%3A%2F%2Fwww.example.org%2F20.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&2=http%3A%2F%2Fwww.example.org%2F21.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&3=http%3A%2F%2Fwww.example.org%2F22.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&4=http%3A%2F%2Fwww.example.org%2F23.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");

        // Handle long requests
        assertEquals(wrapper.getValue("/html/body/script[10]/@src"),
                "http://www.example.org/23-long.js&0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");

        // Resume concating
        assertEquals(wrapper.getValue("/html/body/script[11]/@src"), "http://www.test.com/dir/concat?"
                + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                + "&fp=1150739864&refresh=3600"
                + "&1=http%3A%2F%2Fwww.example.org%2F24.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&2=http%3A%2F%2Fwww.example.org%2F25.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
    }

    @Test
    public void testScriptsBasicNoCache() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
        Document doc = rewriteContent(rewriter, content, null, false, true).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Second script should contain two concatenated urls with nocache
        assertEquals(wrapper.getValue("/html/body/script[2]/@src"),
                "http://www.test.com/dir/concat?"
                        + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                        + "&fp=1150739864&nocache=1&refresh=3600" + "&1=http%3A%2F%2Fwww.example.org%2F1.js"
                        + "&2=http%3A%2F%2Fwww.example.org%2F2.js");

        // And check the last script
        assertEquals(wrapper.getValue("/html/body/script[11]/@src"), "http://www.test.com/dir/concat?"
                + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                + "&fp=1150739864&nocache=1&refresh=3600"
                + "&1=http%3A%2F%2Fwww.example.org%2F24.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&2=http%3A%2F%2Fwww.example.org%2F25.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
    }

    @Test
    public void testScriptsBasicNoCacheAndDebug() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
        Document doc = rewriteContent(rewriter, content, null, true, true).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Second script should contain two concatenated urls with nocache and debug
        assertEquals(wrapper.getValue("/html/body/script[2]/@src"),
                "http://www.test.com/dir/concat?"
                        + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                        + "&fp=1150739864&debug=1&nocache=1&refresh=3600" + "&1=http%3A%2F%2Fwww.example.org%2F1.js"
                        + "&2=http%3A%2F%2Fwww.example.org%2F2.js");

        // and check the last script
        assertEquals(wrapper.getValue("/html/body/script[11]/@src"), "http://www.test.com/dir/concat?"
                + "rewriteMime=text/javascript&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml"
                + "&fp=1150739864&debug=1&nocache=1&refresh=3600"
                + "&1=http%3A%2F%2Fwww.example.org%2F24.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
                + "&2=http%3A%2F%2Fwww.example.org%2F25.js%260123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
    }

    @Test
    public void testScriptsForContainer() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritescriptbasic.html"));
        String text = rewriteContent(rewriter, content, MOCK_CONTAINER).getContent();
        // Verify that the correct concat base was used
        assertFalse(text.contains(DEFAULT_CONCAT_BASE));
        assertTrue(text.contains(MOCK_CONCAT_BASE));
    }

    @Test
    public void testLinksBasic() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
        Document doc = rewriteContent(rewriter, content, null).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Image is rewritten to proxy, relative path is resolved
        assertEquals(wrapper.getValue("//img[1]/@src"),
                "http://www.test.com/dir/proxy?" + "url=http%3A%2F%2Fwww.example.org%2Fimg.gif"
                        + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=3600");

        // Excluded image is untouched
        assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));

        // Embed target is rewritten to proxy
        assertEquals(wrapper.getValue("//embed[1]/@src"),
                "http://www.test.com/dir/proxy?" + "url=http%3A%2F%2Fwww.example.org%2Fsome.swf"
                        + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=3600");

        // Excluded embed is untouched
        assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
    }

    @Test
    public void testLinksBasicNoOverrideExpires() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
        Document doc = rewriteContent(rewriterNoOverrideExpires, content, null).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Image is rewritten to proxy, relative path is resolved
        assertEquals(wrapper.getValue("//img[1]/@src"),
                "http://www.test.com/dir/proxy?" + "url=http%3A%2F%2Fwww.example.org%2Fimg.gif"
                        + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=86400");

        // Excluded image is untouched
        assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));

        // Embed target is rewritten to proxy
        assertEquals(wrapper.getValue("//embed[1]/@src"),
                "http://www.test.com/dir/proxy?" + "url=http%3A%2F%2Fwww.example.org%2Fsome.swf"
                        + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=86400");

        // Excluded embed is untouched
        assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
    }

    @Test
    public void testLinksBasicNoCache() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
        Document doc = rewriteContent(rewriter, content, null, false, true).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Image is rewritten to proxy, relative path is resolved
        assertEquals(wrapper.getValue("//img[1]/@src"), "http://www.test.com/dir/proxy?"
                + "url=http%3A%2F%2Fwww.example.org%2Fimg.gif"
                + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&nocache=1&refresh=3600");

        // Excluded image is untouched
        assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));

        // Embed target is rewritten to proxy
        assertEquals(wrapper.getValue("//embed[1]/@src"), "http://www.test.com/dir/proxy?"
                + "url=http%3A%2F%2Fwww.example.org%2Fsome.swf"
                + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&nocache=1&refresh=3600");

        // Excluded embed is untouched
        assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
    }

    @Test
    public void testLinksBasicNoCacheAndDebug() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
        Document doc = rewriteContent(rewriter, content, null, true, true).getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // Image is rewritten to proxy, relative path is resolved
        assertEquals(wrapper.getValue("//img[1]/@src"), "http://www.test.com/dir/proxy?"
                + "url=http%3A%2F%2Fwww.example.org%2Fimg.gif"
                + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&debug=1&nocache=1&refresh=3600");

        // Excluded image is untouched
        assertEquals("http://www.example.org/excluded/img.gif", wrapper.getValue("//img[2]/@src"));

        // Embed target is rewritten to proxy
        assertEquals(wrapper.getValue("//embed[1]/@src"), "http://www.test.com/dir/proxy?"
                + "url=http%3A%2F%2Fwww.example.org%2Fsome.swf"
                + "&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&debug=1&nocache=1&refresh=3600");

        // Excluded embed is untouched
        assertEquals("http://www.example.org/excluded/some.swf", wrapper.getValue("//embed[2]/@src"));
    }

    @Test
    public void testLinksForContainer() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritelinksbasic.html"));
        String text = rewriteContent(rewriter, content, MOCK_CONTAINER).getContent();
        // Verify that the correct proxy base was used
        assertFalse(text.contains(DEFAULT_PROXY_BASE));
        assertTrue(text.contains(MOCK_PROXY_BASE));
    }

    @Test
    public void testStyleBasic() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylebasic.html"));
        MutableContent mc = rewriteContent(rewriter, content, null);
        Document doc = mc.getDocument();

        XPathWrapper wrapper = new XPathWrapper(doc);

        // ALL style links and @import targets are rewritten to concat
        // Note that relative URLs are fully resolved
        assertEquals(wrapper.getValue("//link[1]/@href"), "http://www.test.com/dir/concat?"
                + "rewriteMime=text/css&gadget=http%3A%2F%2Fwww.example.org%2Fdir%2Fg.xml&fp=1150739864&refresh=3600"
                + "&1=http%3A%2F%2Fwww.example.org%2Flinkedstyle1.css"
                + "&2=http%3A%2F%2Fwww.example.org%2Flinkedstyle3.css"
                + "&3=http%3A%2F%2Fwww.example.org%2Fimportedstyle1.css"
                + "&4=http%3A%2F%2Fwww.example.org%2Fimportedstyle3.css"
                + "&5=http%3A%2F%2Fwww.example.org%2Fimportedstyle4.css");

        // Untouched link target
        assertEquals("http://www.example.org/excluded/linkedstyle2.css", wrapper.getValue("//link[2]/@href"));

        // Untouched @import taget converted to a link
        assertEquals("/excluded/importedstyle2.css", wrapper.getValue("//link[3]/@href"));

        // Body should contain 1 style element
        assertEquals(1, wrapper.getNodeList("//style").getLength());

        // All @imports are stripped
        assertEquals("div { color : black; }", wrapper.getValue("//style[1]").trim());
    }

    @Test
    public void testStyleBasic2() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestyle2.html"));
        String expected = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestyle2-expected.html"));
        MutableContent mc = rewriteContent(rewriter, content, null);
        assertEquals(StringUtils.deleteWhitespace(mc.getContent()), StringUtils.deleteWhitespace(expected));
    }

    @Test
    public void testStyleForContainer() throws Exception {
        String content = IOUtils.toString(this.getClass().getClassLoader()
                .getResourceAsStream("org/apache/shindig/gadgets/rewrite/rewritestylebasic.html"));
        String text = rewriteContent(rewriter, content, MOCK_CONTAINER).getContent();
        // Verify that the correct concat base was used
        assertFalse(text.contains(DEFAULT_CONCAT_BASE));
        assertTrue(text.contains(MOCK_CONCAT_BASE));
    }

    @Test
    public void testNoRewriteUnknownMimeType() {
        MutableContent mc = control.createMock(MutableContent.class);
        HttpRequest req = control.createMock(HttpRequest.class);
        EasyMock.expect(req.getRewriteMimeType()).andReturn("unknown");
        control.replay();
        assertFalse(rewriter.rewrite(req, fakeResponse, mc));
        control.verify();
    }
}