/** * */ package org.archive.wayback.archivalurl; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import junit.framework.Assert; import junit.framework.TestCase; import org.archive.io.warc.TestWARCReader; import org.archive.io.warc.TestWARCRecordInfo; import org.archive.io.warc.WARCRecord; import org.archive.io.warc.WARCRecordInfo; import org.archive.wayback.ResultURIConverter; import org.archive.wayback.core.CaptureSearchResult; import org.archive.wayback.core.Resource; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.replay.RedirectRewritingHttpHeaderProcessor; import org.archive.wayback.replay.TextReplayRenderer; import org.archive.wayback.replay.TransparentReplayRendererTest.TestServletOutputStream; import org.archive.wayback.resourcestore.resourcefile.WarcResource; import org.easymock.EasyMock; /** * unit test for {@link ArchivalCSSReplayRenderer}. * <p>Uses a mock for {@link ResultURIConverter}. ResultURIConverter * must be test separately. ArchivalCSSReplayRenderer does not use * BlockCSSStringTransformer, but relies on TextDocument for extracting * URLs in CSS. So this unit test does not verify those * <code>StringTransformer</code>s are working correctly.</p> * <p>ArchivalCSSReplayRenderer is still a primary ReplayRenderer * for CSS resources (vs. CSS embedded in HTML) for both archival-URL * and proxy mode.</p> * * @author kenji * */ public class ArchivalUrlCSSReplayRendererTest extends TestCase { ResultURIConverter uriConverter; HttpServletResponse response; WaybackRequest wbRequest; CaptureSearchResult result; TestServletOutputStream servletOutput = new TestServletOutputStream(); ArchivalUrlCSSReplayRenderer cut; /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); RedirectRewritingHttpHeaderProcessor httpHeaderProcessor = new RedirectRewritingHttpHeaderProcessor(); httpHeaderProcessor.setPrefix("X-Archive-Orig-"); cut = new ArchivalUrlCSSReplayRenderer(httpHeaderProcessor); uriConverter = EasyMock.createMock(ResultURIConverter.class); response = EasyMock.createMock(HttpServletResponse.class); EasyMock.expect(response.getOutputStream()).andReturn(servletOutput); wbRequest = new WaybackRequest(); wbRequest.setFrameWrapperContext(false); result = new CaptureSearchResult(); result.setOriginalUrl("http://www.example.com/"); result.setCaptureTimestamp("20100101123456"); } public static Resource createTestHtmlResource(byte[] payloadBytes) throws IOException { WARCRecordInfo recinfo = TestWARCRecordInfo.createCompressedHttpResponse("text/html", payloadBytes); TestWARCReader ar = new TestWARCReader(recinfo); WARCRecord rec = ar.get(0); WarcResource resource = new WarcResource(rec, ar); resource.parseHeaders(); return resource; } /** * test basic behavior with simple input. * expectations: * <ul> * <li>reads <em>decoded (uncompressed)</em> contents from archive record.</li> * <li>calls HttpServletResponse.setHeader() for Content-Type, Content-Length and * {@link TextReplayRenderer#getGuessedCharsetHeader()}.</li> * <li>calls HttpServletResponse.setCharsetEncoding() with value "utf-8"</li> * </ul> * @throws Exception */ public void testBasicBehavior() throws Exception { final String payload = "@import \"style1.css\";\n" + "@import 'style2.css';\n" + "@import 'http://archive.org/common.css';\n" + "BODY {\n" + " color: #fff;\n" + " background: transparent url(bg.gif);\n" + "}\n"; final byte[] payloadBytes = payload.getBytes("UTF-8"); Resource payloadResource = createTestHtmlResource(payloadBytes); response.setStatus(200); response.setCharacterEncoding("UTF-8"); response.setHeader(EasyMock.eq("Content-Length"), EasyMock.<String>notNull()); response.setHeader(cut.getGuessedCharsetHeader(), "UTF-8"); response.setHeader("Content-Type", "text/html"); response.setHeader(EasyMock.matches("X-Archive-Orig-.*"), EasyMock.<String>notNull()); EasyMock.expectLastCall().anyTimes(); final String ts = result.getCaptureTimestamp(); final String url1 = result.getOriginalUrl() + "style1.css"; EasyMock.expect(uriConverter.makeReplayURI(ts, url1)).andReturn( "/web/" + ts + "/" + url1); final String url2 = result.getOriginalUrl() + "style2.css"; EasyMock.expect(uriConverter.makeReplayURI(ts, url2)).andReturn( "/web/" + ts + "/" + url2); final String url3 = result.getOriginalUrl() + "bg.gif"; EasyMock.expect(uriConverter.makeReplayURI(ts, url3)).andReturn( "/web/" + ts + "/" + url3); EasyMock.expect(uriConverter.makeReplayURI(ts, "http://archive.org/common.css")).andReturn( "http://archive.org/common.css"); EasyMock.replay(response, uriConverter); cut.renderResource(null, response, wbRequest, result, payloadResource, payloadResource, uriConverter, null); EasyMock.verify(response, uriConverter); final String expected = "@import \"/web/20100101123456/http://www.example.com/style1.css\";\n" + "@import '/web/20100101123456/http://www.example.com/style2.css';\n" + "@import 'http://archive.org/common.css';\n" + "BODY {\n" + " color: #fff;\n" + " background: transparent url(/web/20100101123456/http://www.example.com/bg.gif);\n" + "}\n"; String out = servletOutput.getString(); Assert.assertTrue( out.startsWith( expected ) ); } // TODO: more tests // - jspInserts }