/*
* ====================================================================
* Copyright (c) 2005-2012 sventon project. All rights reserved.
*
* This software is licensed as described in the file LICENSE, which
* you should have received as part of this distribution. The terms
* are also available at http://www.sventon.org.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.sventon.cache.logmessagecache;
import org.apache.commons.lang.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.sventon.TestUtils;
import org.sventon.model.ChangeType;
import org.sventon.model.ChangedPath;
import org.sventon.model.LogEntry;
import org.sventon.model.LogMessageSearchItem;
import java.io.File;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class CompassLogMessageCacheTest {
private CompassLogMessageCache cache = null;
@Before
public void setUp() throws Exception {
cache = new CompassLogMessageCache(new File("test"));
cache.init();
}
@After
public void tearDown() throws Exception {
cache.shutdown();
}
@Test
public void testAddAndFindWithStartDir() throws Exception {
List<LogMessageSearchItem> logEntries;
cache.add(new LogMessageSearchItem(create(123, "First message XYZ-123.",
createAndAddToMap(new ChangedPath("/file1.java", null, 1, ChangeType.MODIFIED)))));
logEntries = cache.find("XYZ-123", "/");
assertEquals(1, logEntries.size());
assertEquals("First message <span class=\"searchhit\">XYZ-123</span>.", logEntries.get(0).getMessage());
cache.add(new LogMessageSearchItem(create(456, "First message XYZ-456.",
createAndAddToMap(new ChangedPath("/test/file1.java", null, -1, ChangeType.MODIFIED)))));
logEntries = cache.find("XYZ-456", "/");
assertEquals(1, logEntries.size());
assertEquals("First message <span class=\"searchhit\">XYZ-456</span>.", logEntries.get(0).getMessage());
final ChangedPath path1 = new ChangedPath("/test/again/file1.java", null, -1, ChangeType.MODIFIED);
final ChangedPath path2 = new ChangedPath("/test/again/test2.java", null, -1, ChangeType.ADDED);
final ChangedPath path3 = new ChangedPath("/trunk/added/", null, -1, ChangeType.ADDED);
cache.add(new LogMessageSearchItem(create(457, "First message XYZ-457.", createAndAddToMap(path1, path2, path3))));
logEntries = cache.find("XYZ*", "/");
assertEquals(3, logEntries.size());
logEntries = cache.find("XYZ*", "/test/");
assertEquals(2, logEntries.size());
logEntries = cache.find("XYZ*", "/trunk/");
assertEquals(1, logEntries.size());
logEntries = cache.find("XYZ*", "/test/again/");
assertEquals(1, logEntries.size());
logEntries = cache.find("shouldnotfound", "/");
assertEquals(0, logEntries.size());
}
@Test
public void testAddAndFind() throws Exception {
cache.add(new LogMessageSearchItem(create(123, "First message XYZ-123.")));
List<LogMessageSearchItem> logEntries = cache.find("XYZ-123");
assertEquals(1, logEntries.size());
assertEquals("First message <span class=\"searchhit\">XYZ-123</span>.", logEntries.get(0).getMessage());
logEntries = cache.find("XYZ*");
assertEquals("First message <span class=\"searchhit\">XYZ-123</span>.", logEntries.get(0).getMessage());
logEntries = cache.find("XYZ-*");
assertEquals("First message <span class=\"searchhit\">XYZ-123</span>.", logEntries.get(0).getMessage());
logEntries = cache.find("XYZ-???");
assertEquals("First message <span class=\"searchhit\">XYZ-123</span>.", logEntries.get(0).getMessage());
cache.add(new LogMessageSearchItem(create(124, "This is a log message for revision 124.")));
assertEquals(2, cache.getSize());
logEntries = cache.find("message");
assertEquals(2, logEntries.size());
cache.add(new LogMessageSearchItem(create(125, "This is a log message for revision 125.")));
assertEquals(3, cache.getSize());
cache.add(new LogMessageSearchItem(create(126, "This is a log message for revision 126......."))); // punctuation will be trimmed
assertEquals(4, cache.getSize());
logEntries = cache.find("126");
assertEquals("This is a log message for revision <span class=\"searchhit\">126</span>.......", logEntries.get(0).getMessage());
cache.add(new LogMessageSearchItem(create(127, "Testing brackets (must work)")));
assertEquals(5, cache.getSize());
logEntries = cache.find("brackets");
assertEquals(1, logEntries.size());
assertEquals("Testing <span class=\"searchhit\">brackets</span> (must work)", logEntries.get(0).getMessage());
cache.add(new LogMessageSearchItem(create(128, "Testing brackets (must work)")));
assertEquals(6, cache.getSize());
logEntries = cache.find("work");
assertEquals(2, logEntries.size());
assertEquals("Testing brackets (must <span class=\"searchhit\">work</span>)", logEntries.get(1).getMessage());
cache.add(new LogMessageSearchItem(create(129, "Lite svenska tecken, \u00E5 \u00E4 \u00F6!")));
assertEquals(7, cache.getSize());
logEntries = cache.find("svenska");
assertEquals(1, logEntries.size());
assertEquals("Lite <span class=\"searchhit\">svenska</span> tecken, å ä ö!", logEntries.get(0).getMessage());
logEntries = cache.find("message");
assertEquals(4, logEntries.size());
cache.add(new LogMessageSearchItem(create(130, "<This is a <code>log</code> message for & revision 130.......")));
assertEquals(8, cache.getSize());
logEntries = cache.find("*autho*");
assertEquals(8, logEntries.size());
assertTrue(StringUtils.isNotBlank(logEntries.get(0).getMessage()));
logEntries = cache.find("theauthor");
assertEquals(8, logEntries.size());
logEntries = cache.find("log");
assertEquals(4, logEntries.size());
assertEquals("<This is a <code><span class=\"searchhit\">log</span></code> message for & revision 130.......", logEntries.get(3).getMessage());
cache.add(new LogMessageSearchItem(create(131, "Lorem Ipsum is simply dummy text of the printing and typesetting industry. " +
"Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took " +
"a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, " +
"but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the " +
"1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop " +
"publishing software like Aldus PageMaker including versions of Lorem Ipsum.")));
assertEquals(9, cache.getSize());
logEntries = cache.find("dummy");
assertEquals("Lorem Ipsum is simply <span class=\"searchhit\">dummy</span> text of the printing and typesetting industry. " +
"Lorem Ipsum has been the industry's standard <span class=\"searchhit\">dummy</span> text ever since the 1500s, when an unknown printer took " +
"a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, " +
"but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the " +
"1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop " +
"publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
logEntries.get(0).getMessage());
}
@Test
public void testAddEmptyAndNull() throws Exception {
cache.add(new LogMessageSearchItem(create(123, "")));
assertEquals(1, cache.getSize());
cache.add(new LogMessageSearchItem(create(124, null)));
assertEquals(2, cache.getSize());
cache.add(new LogMessageSearchItem(TestUtils.createLogEntry(125, null, new Date(), "abc")));
assertEquals(3, cache.getSize());
final LogMessageSearchItem logEntry = cache.find("abc").get(0);
assertEquals("<span class=\"searchhit\">abc</span>", logEntry.getMessage());
assertEquals(null, logEntry.getAuthor());
}
@Test
public void testUsingAndLogic() throws Exception {
cache.add(new LogMessageSearchItem(create(234, "one two three")));
assertEquals(1, cache.getSize());
final LogMessageSearchItem logEntry = cache.find("one AND two").get(0);
assertEquals("<span class=\"searchhit\">one</span> <span class=\"searchhit\">two</span> three", logEntry.getMessage());
}
private LogEntry create(final long revision, final String message) {
return TestUtils.createLogEntry(revision, "theauthor", new Date(), message);
}
private LogEntry create(final long revision, final String message, final SortedSet<ChangedPath> paths) {
return TestUtils.createLogEntry(revision, "theauthor", new Date(), message, paths);
}
private SortedSet<ChangedPath> createAndAddToMap(ChangedPath... changedPath) {
final SortedSet<ChangedPath> changedPaths = new TreeSet<ChangedPath>();
changedPaths.addAll(Arrays.asList(changedPath));
return changedPaths;
}
}