/** * */ package org.archive.wayback.resourceindex.cdxserver; import junit.framework.TestCase; import org.apache.commons.lang.StringUtils; import org.archive.cdxserver.auth.AuthToken; import org.archive.cdxserver.filter.CDXFilter; import org.archive.format.cdx.CDXFieldConstants; import org.archive.format.cdx.CDXLine; import org.archive.wayback.core.CaptureSearchResult; import org.archive.wayback.resourceindex.filters.ExclusionFilter; import org.archive.wayback.util.ObjectFilter; import org.easymock.EasyMock; import org.easymock.IAnswer; /** * Test for {@link AccessCheckFilter} */ public class AccessCheckFilterTest extends TestCase { AccessCheckFilter cut; AuthToken authToken; ObjectFilter<CaptureSearchResult> adminFilter; ObjectFilter<CaptureSearchResult> robotsFilter; CDXFilter scopeFilter; boolean ignoreRobots = false; private static class MockExclusionFilter extends ExclusionFilter { ObjectFilter<CaptureSearchResult> mock; public MockExclusionFilter(ObjectFilter<CaptureSearchResult> mock) { this.mock = mock; } @Override public int filterObject(CaptureSearchResult o) { return mock.filterObject(o); } } /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ @SuppressWarnings("unchecked") protected void setUp() throws Exception { super.setUp(); authToken = new AuthToken() { public boolean isIgnoreRobots() { return ignoreRobots; }; }; adminFilter = EasyMock.createMock(ObjectFilter.class); robotsFilter = EasyMock.createMock(ObjectFilter.class); scopeFilter = EasyMock.createMock(CDXFilter.class); cut = new AccessCheckFilter(authToken, new MockExclusionFilter( adminFilter), new MockExclusionFilter(robotsFilter), scopeFilter); } static class CheckCaptureSearchResult implements IAnswer<Integer> { String url; String urlkey; String timestamp; public CheckCaptureSearchResult(String url, String urlkey, String timestamp) { this.url = url; this.urlkey = urlkey; this.timestamp = timestamp; } @Override public Integer answer() throws Throwable { CaptureSearchResult o = (CaptureSearchResult)EasyMock.getCurrentArguments()[0]; assertEquals(url, o.getOriginalUrl()); assertEquals(urlkey, o.getUrlKey()); assertEquals(timestamp, o.getCaptureTimestamp()); return ExclusionFilter.FILTER_INCLUDE; } } public void testIncludeUrl() throws Exception { final String url = "http://example.com/"; final String urlkey = "example.com)/"; EasyMock.expect(adminFilter.filterObject(EasyMock.<CaptureSearchResult>notNull())).andAnswer( new CheckCaptureSearchResult(url, urlkey, null)); EasyMock.expect(robotsFilter.filterObject(EasyMock.<CaptureSearchResult>notNull())).andAnswer( new CheckCaptureSearchResult(url, urlkey, null)); // expects no calls to scopeFilter EasyMock.replay(adminFilter, robotsFilter, scopeFilter); boolean result = cut.includeUrl(urlkey, url); assertTrue(result); EasyMock.verify(adminFilter, robotsFilter, scopeFilter); } public void testIncludeCapture() throws Exception { final String url = "http://example.com/"; final String urlkey = "example.com)/"; final String timestamp = "20100429123456"; final String cdxLine = StringUtils.join(new Object[] { urlkey, timestamp, url, "text/html", 200, "DIGEST", "-", "-", 1024, 966357, "crawl-a/crawl-a-20100429000000.warc.gz" }, " "); final CDXLine input = new CDXLine(cdxLine, CDXFieldConstants.CDX_ALL_NAMES); EasyMock.expect(adminFilter.filterObject(EasyMock.<CaptureSearchResult>notNull())).andAnswer( new CheckCaptureSearchResult(url, urlkey, timestamp)); EasyMock.expect(robotsFilter.filterObject(EasyMock.<CaptureSearchResult>notNull())).andAnswer( new CheckCaptureSearchResult(url, urlkey, timestamp)); EasyMock.expect(scopeFilter.include(EasyMock.<CDXLine>notNull())).andAnswer( new IAnswer<Boolean>() { @Override public Boolean answer() throws Throwable { CDXLine line = (CDXLine)EasyMock.getCurrentArguments()[0]; assertEquals(url, line.getOriginalUrl()); assertEquals(urlkey, line.getUrlKey()); return true; } }); EasyMock.replay(adminFilter, robotsFilter, scopeFilter); boolean result = cut.includeCapture(input); assertTrue(result); EasyMock.verify(adminFilter, robotsFilter, scopeFilter); } }