package org.archive.wayback.memento; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletResponse; import junit.framework.TestCase; import org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter; import org.archive.wayback.core.CaptureSearchResult; import org.archive.wayback.core.CaptureSearchResults; import org.archive.wayback.core.FastCaptureSearchResult; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.webapp.AccessPoint; import org.easymock.EasyMock; public class MementoUtilsTest extends TestCase { Properties configs; AccessPoint accessPoint; protected void setUp() throws Exception { final String[][] properties = { //MementoConstants.AGGREGATION_PREFIX_CONFIG, "", //MementoConstants.PAGE_MAXRECORDS_CONFIG, "0", }; configs = new Properties(); if (properties.length > 0) { for (String[] kv : properties) { configs.setProperty(kv[0], kv[1]); } } accessPoint = new AccessPoint(); accessPoint.setConfigs(configs); accessPoint.setReplayPrefix("/web/"); accessPoint.setQueryPrefix("/web/"); ArchivalUrlResultURIConverter uriConverter = new ArchivalUrlResultURIConverter(); uriConverter.setReplayURIPrefix("/web/"); accessPoint.setUriConverter(uriConverter); } protected final HttpServletResponse createResponseMock() { HttpServletResponse response = EasyMock.createMock(HttpServletResponse.class); return response; } protected final CaptureSearchResult createCapture(String timestamp) { FastCaptureSearchResult cap = new FastCaptureSearchResult(); cap.setCaptureTimestamp(timestamp); return cap; } public void testAddDoNotNegotiateHeader() { HttpServletResponse response = createResponseMock(); response.setHeader("Link", "<http://mementoweb.org/terms/donotnegotiate>; rel=\"type\""); EasyMock.replay(response); MementoUtils.addDoNotNegotiateHeader(response); EasyMock.verify(response); } public void testAddOrigHeader() { final String url = "http://example.com/"; HttpServletResponse response = createResponseMock(); response.setHeader("Link", String.format("<%s>; rel=\"original\"", url)); EasyMock.replay(response); MementoUtils.addOrigHeader(response, url); EasyMock.verify(response); } public void testAddVaryHeader() { // TODO } public void testGetTimemapUrl() { final String url = "http://example.com/"; String result = MementoUtils.getTimemapUrl(accessPoint, "cdx", url); assertEquals(String.format("/web/timemap/cdx/%s", url), result); } public void testGetTimegateUrl() { final String url = "http://example.com/"; String result = MementoUtils.getTimegateUrl(accessPoint, url); assertEquals(String.format("/web/%s", url), result); } final static Pattern LINK_ELEMENT_PATTERN = Pattern.compile("(<.*?>(?:;\\s*[a-z]+=\"(.*?)\")+)(,\\s*)?"); public void testGenerateMementoLinkHeaders() { final CaptureSearchResults results = new CaptureSearchResults(); results.addSearchResult(createCapture("20140101000000")); results.addSearchResult(createCapture("20140125000000")); results.setClosest(results.getResults().getLast()); final WaybackRequest wbr = new WaybackRequest(); wbr.setAccessPoint(accessPoint); wbr.setRequestUrl("http://example.com/"); String result = MementoUtils.generateMementoLinkHeaders(results, wbr, true, true); List<String> elements = new ArrayList<String>(); Matcher m = LINK_ELEMENT_PATTERN.matcher(result); while (m.regionStart() < result.length() && m.lookingAt()) { elements.add(m.group(1)); m.region(m.end(), result.length()); } assertEquals(result.length(), m.regionStart()); // TODO: order doesn't really matter assertEquals("<http://example.com/>; rel=\"original\"", elements.get(0)); assertEquals("</web/timemap/link/http://example.com/>; rel=\"timemap\"; type=\"application/link-format\"", elements.get(1)); assertEquals("</web/http://example.com/>; rel=\"timegate\"", elements.get(2)); assertEquals("</web/20140125000000/http://example.com/>; rel=\"last memento\"; datetime=\"Sat, 25 Jan 2014 00:00:00 GMT\"", elements.get(3)); assertEquals("</web/20140101000000/http://example.com/>; rel=\"prev first memento\"; datetime=\"Wed, 01 Jan 2014 00:00:00 GMT\"", elements.get(4)); } }