package org.jivesoftware.openfire.plugin;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.XPPReader;
import org.jdom.filter.ContentFilter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.xmlpull.v1.XmlPullParserException;
import org.xmpp.packet.Message;
import org.xmpp.packet.Presence;
import java.io.IOException;
import java.io.StringReader;
import java.util.regex.PatternSyntaxException;
import static org.junit.Assert.*;
/**
* Basic unit tests for ContentFilter.
*
* @author chayes
*/
public class ContentFilterTest {
private ContentFilter filter;
public static void main(String[] args) {
junit.textui.TestRunner.run(ContentFilterTest.class);
}
@Before
protected void setUp() throws Exception {
filter = new ContentFilter();
}
@After
protected void tearDown() throws Exception {
filter.clearMask();
filter.clearPatterns();
filter = null;
}
@Test
public void testSetInvalidPatterns() {
try {
filter.setPatterns("$*[");
fail("expected PatternSyntaxException");
} catch (PatternSyntaxException e) {
}
}
@Test
public void testSetContentMask() {
assertFalse(filter.isMaskingContent());
filter.setMask("dummy");
assertTrue(filter.isMaskingContent());
filter.clearMask();
assertFalse(filter.isMaskingContent());
}
@Test
public void testFilterWithEmptyMessage() {
Message message = new Message();
boolean matched = filter.filter(message);
// no matches should be found
assertFalse(matched);
// message should not have changed
assertEquals(new Message().toXML(), message.toXML());
}
@Test
public void testFilterMessageSubject() {
// filter on the word fox
filter.setPatterns("fox");
// test message
Message message = new Message();
message.setSubject("the quick brown fox jumped over the lazy dog");
boolean matched = filter.filter(message);
// matches should be found
assertTrue(matched);
// content has not changed as there is no content mask
assertEquals("the quick brown fox jumped over the lazy dog", message
.getSubject());
assertNull(message.getBody());
}
@Test
public void testFilterMessageSubjectWithMask() {
// filter on the word fox
filter.setPatterns("fox");
// set a content mask
filter.setMask("**");
// test message
Message message = new Message();
message.setSubject("the quick brown fox jumped over the lazy dog");
boolean matched = filter.filter(message);
// matches should be found
assertTrue(matched);
// content has changed
assertEquals("the quick brown ** jumped over the lazy dog", message
.getSubject());
assertNull(message.getBody());
}
@Test
public void testFilterMessageBody() {
// filter on the word fox
filter.setPatterns("fox");
// test message
Message message = new Message();
message.setBody("the quick brown fox jumped over the lazy dog");
boolean matched = filter.filter(message);
// matches should be found
assertTrue(matched);
// content has not changed as there is no content mask
assertEquals("the quick brown fox jumped over the lazy dog", message
.getBody());
assertNull(message.getSubject());
}
@Test
public void testFilterMessageBodyWithMask() {
// filter on the word "fox" and "dog"
filter.setPatterns("fox,dog");
filter.setMask("**");
// test message
Message message = new Message();
message.setBody("the quick brown fox jumped over the lazy dog");
boolean matched = filter.filter(message);
// matches should not be found
assertTrue(matched);
// content has changed
assertEquals("the quick brown ** jumped over the lazy **", message
.getBody());
assertNull(message.getSubject());
}
@Test
public void testFilterWholeWords() {
filter.setPatterns("at"); //match every instance of "at" in string
filter.setMask("**");
Message message = new Message();
message.setBody("At noon the fat cats ate lunch at Rizzos");
boolean matched = filter.filter(message);
assertTrue(matched);
assertEquals("At noon the f** c**s **e lunch ** Rizzos", message.getBody());
filter.setPatterns("(?i)\\bat\\b"); //match only whole word instances of "at" ignoring case
message.setBody("At noon the fat cats ate lunch at Rizzos");
matched = filter.filter(message);
assertTrue(matched);
assertEquals("** noon the fat cats ate lunch ** Rizzos", message.getBody());
}
@Test
public void testFilterChatMessage() throws DocumentException, IOException, XmlPullParserException {
String chatXML =
"<message to=\"doe@127.0.0.1/Adium\" type=\"chat\" id=\"iChat_E8B5ED64\" from=\"bob@127.0.0.1/frodo\">" +
"<body>fox</body>" +
"<html xmlns=\"http://jabber.org/protocol/xhtml-im\">" +
"<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"background-color:#E8A630;color:#000000\">fox</body>" +
"</html>" +
"<x xmlns=\"jabber:x:event\">" +
"<composing/>" +
"</x>" +
"</message>";
XPPReader packetReader = new XPPReader();
Document doc = packetReader.read(new StringReader(chatXML));
Message m = new Message(doc.getRootElement());
// filter on the word "fox" and "dog"
filter.setPatterns("fox,dog,message");
filter.setMask("**");
String expectedXML = chatXML.replaceAll("fox", filter.getMask());
// do filter
boolean matched = filter.filter(m);
assertTrue(matched);
assertEquals(expectedXML, expectedXML, m.toXML());
}
@Test
public void testFilterAvailablePresence() throws Exception {
// setup available presence
Presence presence = new Presence();
presence.setStatus("fox is now online!");
System.out.println(presence.toXML());
// filter on the word "fox" and "dog"
filter.setPatterns("fox,dog");
filter.setMask("**");
boolean matched = filter.filter(presence);
// matches should not be found
assertTrue(matched);
// content has changed
assertEquals("** is now online!", presence.getStatus());
}
@Test
public void testFilterPresenceXML() throws Exception {
String presenceXML =
"<presence from=\"bob@127.0.0.1/frodo\">" +
"<show>away</show>" +
"<status>fox</status>" +
"<priority>0</priority>" +
"<x xmlns=\"vcard-temp:x:update\">" +
"<photo>f9a514f112c0bcb988d5aa12bc1a9a6f22de5262</photo>" +
"</x>" +
"<c xmlns=\"http://jabber.org/protocol/caps\" node=\"apple:ichat:caps\" ver=\"392\" ext=\"avavail maudio mvideo avcap audio\"/>" +
"<x xmlns=\"http://jabber.org/protocol/tune\"/>" +
"</presence>";
XPPReader packetReader = new XPPReader();
Document doc = packetReader.read(new StringReader(presenceXML));
Presence p = new Presence(doc.getRootElement());
// filter on the word "fox" and "dog"
filter.setPatterns("fox,dog,message");
filter.setMask("**");
String expectedXML = presenceXML.replaceAll("fox", filter.getMask());
// do filter
boolean matched = filter.filter(p);
assertTrue(matched);
assertEquals(expectedXML, expectedXML, p.toXML());
}
}