package com.limegroup.gnutella.filters;
import java.util.List;
import java.util.Vector;
import junit.framework.Test;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.limewire.util.BaseTestCase;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.limegroup.gnutella.LimeTestUtils;
import com.limegroup.gnutella.Response;
import com.limegroup.gnutella.ResponseFactory;
import com.limegroup.gnutella.helpers.UrnHelper;
import com.limegroup.gnutella.messages.BadPacketException;
import com.limegroup.gnutella.messages.PingRequest;
import com.limegroup.gnutella.messages.QueryReply;
import com.limegroup.gnutella.messages.QueryRequest;
import com.limegroup.gnutella.xml.LimeXMLDocument;
/**
* Unit tests for KeywordFilter
*/
public class KeywordFilterTest extends BaseTestCase {
KeywordFilter filter=new KeywordFilter();
QueryRequest queryRequestMock=null;
QueryReply queryReplyMock = null;
PingRequest pingRequestMock = null;
Mockery context;
private ResponseFactory responseFactory;
public KeywordFilterTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(KeywordFilterTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
@Override
protected void setUp() throws Exception {
Injector injector = LimeTestUtils.createInjector(new AbstractModule() {
@Override
protected void configure() {
// bind(ResponseVerifier.class).to(StubVerifier.class);
// bind(SearchResultHandler.class).to(SearchResultHandlerImpl.class);
}
});
context = new Mockery();
queryRequestMock = context.mock(QueryRequest.class);
queryReplyMock = context.mock(QueryReply.class);
pingRequestMock = context.mock(PingRequest.class);
responseFactory = injector.getInstance(ResponseFactory.class);
}
private void keywordContextValue(QueryRequest query, String keyword){
final QueryRequest localQuery = query;
final String localKeyword = keyword;
context.checking(new Expectations() {{
one(localQuery).getQuery();
will(returnValue(localKeyword));
}});
}
public void testAllowKeyword(){
keywordContextValue(queryRequestMock, "pie with rhubarb");
assertTrue(filter.allow(queryRequestMock));
filter.disallow("britney spears");
filter.disallow("rhuBarb");
keywordContextValue(queryRequestMock, "rhubar");
assertTrue(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "pie with rhubarb");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "rhubarb.txt");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "Rhubarb*");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "Rhubarb#");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "Rhubarb***");
assertFalse(filter.allow(queryRequestMock));
context.assertIsSatisfied();
}
public void testAllowFileExt(){
keywordContextValue(queryRequestMock, "test.vbs");
assertTrue(filter.allow(queryRequestMock));
filter.disallowVbs();
keywordContextValue(queryRequestMock, "test.vbs");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "test.htm");
assertTrue(filter.allow(queryRequestMock));
filter.disallowHtml();
keywordContextValue(queryRequestMock, "test.htm");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "test.wmv");
assertTrue(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "test.asf");
assertTrue(filter.allow(queryRequestMock));
filter.disallowWMVASF();
keywordContextValue(queryRequestMock, "test.wmv");
assertFalse(filter.allow(queryRequestMock));
keywordContextValue(queryRequestMock, "test.asf");
assertFalse(filter.allow(queryRequestMock));
context.assertIsSatisfied();
}
public void testDisallowAdult() throws Exception {
KeywordFilter filter = new KeywordFilter();
createResponseList(queryReplyMock, "adult");
assertTrue(filter.allow(queryReplyMock));
createResponseList(queryReplyMock, "Sex");
assertTrue(filter.allow(queryReplyMock));
/*
* turn filter on
*/
filter.disallowAdult();
createResponseList(queryReplyMock, "adult");
assertFalse(filter.allow(queryReplyMock));
createResponseList(queryReplyMock, "Sex");
assertFalse(filter.allow(queryReplyMock));
createResponseList(queryReplyMock, "innocent");
assertTrue(filter.allow(queryReplyMock));
context.assertIsSatisfied();
}
public void queryReply(QueryRequest query, String keyword){
final QueryRequest localQuery = query;
final String localKeyword = keyword;
context.checking(new Expectations() {{
one(localQuery).getQuery();
will(returnValue(localKeyword));
}});
}
public void testOtherMessagesAreIgnored() throws Exception{
context.checking(new Expectations()
{{ never(pingRequestMock);
}});
assertTrue(filter.allow(pingRequestMock));
context.assertIsSatisfied();
}
protected void createResponseList (QueryReply qr, String response)throws BadPacketException{
final QueryReply localqr = qr;
final List<Response> responseList = new Vector<Response>();
//create Response
final Response qrResponse;
long index = 0;
long size = 0;
LimeXMLDocument emptyDoc = null;
qrResponse = responseFactory.createResponse(index, size, response, emptyDoc, UrnHelper.SHA1);
/*
* add Response to Response List
*/
responseList.add(qrResponse);
context.checking(new Expectations() {{
one(localqr).getResultsAsList();
will(returnValue(responseList));
}});
}
}