/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/search/trunk/search-impl/impl/src/test/org/sakaiproject/search/indexer/impl/test/TransactionalIndexWorkerTest.java $
* $Id: TransactionalIndexWorkerTest.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.search.indexer.impl.test;
import java.io.File;
import java.io.IOException;
import java.util.List;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.api.ServerConfigurationService;
import org.sakaiproject.search.api.SearchIndexBuilder;
import org.sakaiproject.search.index.impl.StandardAnalyzerFactory;
import org.sakaiproject.search.indexer.api.IndexWorkerDocumentListener;
import org.sakaiproject.search.indexer.api.IndexWorkerListener;
import org.sakaiproject.search.indexer.debug.DebugIndexWorkerDocumentListener;
import org.sakaiproject.search.indexer.debug.DebugIndexWorkerListener;
import org.sakaiproject.search.indexer.debug.DebugTransactionListener;
import org.sakaiproject.search.indexer.impl.JournalManagerUpdateTransaction;
import org.sakaiproject.search.indexer.impl.JournalStorageUpdateTransactionListener;
import org.sakaiproject.search.indexer.impl.SearchBuilderQueueManager;
import org.sakaiproject.search.indexer.impl.TransactionIndexManagerImpl;
import org.sakaiproject.search.indexer.impl.TransactionalIndexWorker;
import org.sakaiproject.search.journal.impl.DbJournalManager;
import org.sakaiproject.search.journal.impl.JournalSettings;
import org.sakaiproject.search.journal.impl.SharedFilesystemJournalStorage;
import org.sakaiproject.search.mock.MockSearchIndexBuilder;
import org.sakaiproject.search.mock.MockSearchService;
import org.sakaiproject.search.mock.MockServerConfigurationService;
import org.sakaiproject.search.mock.MockThreadLocalManager;
import org.sakaiproject.search.model.SearchBuilderItem;
import org.sakaiproject.search.transaction.impl.TransactionSequenceImpl;
import org.sakaiproject.search.util.FileUtils;
import org.sakaiproject.thread_local.api.ThreadLocalManager;
/**
* @author ieb
*/
public class TransactionalIndexWorkerTest extends TestCase
{
private static final Log log = LogFactory.getLog(TransactionalIndexWorkerTest.class);
private SearchIndexBuilder mockSearchIndexBuilder;
private ServerConfigurationService mockServerConfigurationService;
private TransactionIndexManagerImpl transactionIndexManager;
private TDataSource tds;
private SearchBuilderQueueManager searchBuilderQueueManager;
private File testBase;
private TransactionalIndexWorker tiw;
private JournalManagerUpdateTransaction journalManagerUpdateTransaction;
private SharedFilesystemJournalStorage sharedFilesystemJournalStorage;
private ThreadLocalManager mockThreadLocalManager;
/**
* @param name
*/
public TransactionalIndexWorkerTest(String name)
{
super(name);
}
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception
{
super.setUp();
tds = new TDataSource(5,false);
testBase = new File("target");
testBase = new File(testBase, "TransactionalIndexWorkerTest");
String localIndexBase = new File(testBase,"local").getAbsolutePath();
String sharedJournalBase = new File(testBase,"shared").getAbsolutePath();
JournalSettings journalSettings = new JournalSettings();
journalSettings.setLocalIndexBase(localIndexBase);
journalSettings.setSharedJournalBase(sharedJournalBase);
journalSettings.setMinimumOptimizeSavePoints(5);
journalSettings.setOptimizeMergeSize(5);
journalSettings.setLocalMaxBufferedDocs(50);
journalSettings.setLocalMaxMergeDocs(1000000);
journalSettings.setLocalMaxMergeFactor(10);
journalSettings.setSharedMaxBufferedDocs(50);
journalSettings.setSharedMaxMergeDocs(1000000);
journalSettings.setSharedMaxMergeFactor(10);
journalSettings.setCreateMaxBufferedDocs(50);
journalSettings.setCreateMaxMergeDocs(1000000);
journalSettings.setCreateMaxMergeFactor(10);
journalSettings.setSoakTest(true);
mockSearchIndexBuilder = new MockSearchIndexBuilder();
mockServerConfigurationService = new MockServerConfigurationService();
TransactionSequenceImpl sequence = new TransactionSequenceImpl();
sequence.setDatasource(tds.getDataSource());
sequence.setName("TransactionalIndexWorkerTest");
SharedFilesystemJournalStorage sharedFileSystem = new SharedFilesystemJournalStorage();
sharedFileSystem.setJournalSettings(journalSettings);
MockServerConfigurationService serverConfigurationService = new MockServerConfigurationService();
DbJournalManager journalManager = new DbJournalManager();
journalManager.setDatasource(tds.getDataSource());
journalManager.setServerConfigurationService(serverConfigurationService);
transactionIndexManager = new TransactionIndexManagerImpl();
transactionIndexManager.setAnalyzerFactory(new StandardAnalyzerFactory());
transactionIndexManager.setJournalSettings(journalSettings);
transactionIndexManager.setSequence(sequence);
journalManagerUpdateTransaction = new JournalManagerUpdateTransaction();
journalManagerUpdateTransaction.setJournalManager(journalManager);
JournalStorageUpdateTransactionListener journalStorageUpdateTransactionListener = new JournalStorageUpdateTransactionListener();
journalStorageUpdateTransactionListener.setJournalStorage(sharedFileSystem);
searchBuilderQueueManager = new SearchBuilderQueueManager();
TransactionSequenceImpl lockSequenceImpl = new TransactionSequenceImpl();
lockSequenceImpl.setDatasource(tds.getDataSource());
lockSequenceImpl.setName("queueManagerLock");
lockSequenceImpl.setMinValue(2000);
lockSequenceImpl.setMaxValue(10000000);
lockSequenceImpl.init();
searchBuilderQueueManager.setSequence(lockSequenceImpl);
searchBuilderQueueManager.setDatasource(tds.getDataSource());
searchBuilderQueueManager.setSearchIndexBuilder(mockSearchIndexBuilder);
transactionIndexManager.addTransactionListener(searchBuilderQueueManager);
transactionIndexManager.addTransactionListener(journalStorageUpdateTransactionListener);
transactionIndexManager.addTransactionListener(journalManagerUpdateTransaction);
transactionIndexManager.addTransactionListener(new DebugTransactionListener());
sequence.init();
searchBuilderQueueManager.init();
transactionIndexManager.init();
journalManager.init();
mockThreadLocalManager = new MockThreadLocalManager();
}
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception
{
super.tearDown();
tds.close();
FileUtils.deleteAll(testBase);
}
/**
* Test method for
* {@link org.sakaiproject.search.indexer.impl.TransactionalIndexWorker#init()}.
*/
public final void testInit()
{
log.info("================================== "+this.getClass().getName()+".doInit");
doInit();
log.info("==PASSED========================== "+this.getClass().getName()+".doInit");
}
/**
*
*/
private void doInit()
{
MockSearchService searchService = new MockSearchService();
searchService.setDatasource(tds.getDataSource());
searchService.setServerConfigurationService(new MockServerConfigurationService());
tiw = new TransactionalIndexWorker();
tiw.setSearchIndexBuilder(mockSearchIndexBuilder);
tiw.setServerConfigurationService(mockServerConfigurationService);
tiw.setTransactionIndexManager(transactionIndexManager);
tiw.setThreadLocalManager(mockThreadLocalManager);
tiw.setSearchService(searchService);
tiw.addIndexWorkerDocumentListener(new DebugIndexWorkerDocumentListener());
tiw.addIndexWorkerListener(new DebugIndexWorkerListener());
tiw.init();
}
/**
* Test method for
* {@link org.sakaiproject.search.indexer.impl.TransactionalIndexWorker#process()}.
*
* @throws IOException
*/
public final void testProcessNone() throws IOException
{
log.info("================================== "+this.getClass().getName()+".testProcessNone");
doInit();
assertEquals("Should not have processed any documents ", 0, tiw.process(100));
log.info("==PASSED========================== "+this.getClass().getName()+".testProcessNone");
}
public final void testProcessSome() throws Exception
{
log.info("================================== "+this.getClass().getName()+".testProcessSome");
doInit();
List<SearchBuilderItem> items = tds.populateDocuments(100,"testsome");
int n = 0;
for ( SearchBuilderItem sbi : items) {
if (sbi.getSearchstate().equals(SearchBuilderItem.STATE_PENDING)
&& (sbi.getSearchaction().equals(SearchBuilderItem.ACTION_ADD) ||
sbi.getSearchaction().equals(SearchBuilderItem.ACTION_DELETE)) )
{
n++;
}
}
assertEquals("Should have processed some documents ", n, tiw.process(100));
log.info("==PASSED========================== "+this.getClass().getName()+".testProcessSome");
}
/**
* @throws SQLException
*/
/**
* Test method for
* {@link org.sakaiproject.search.indexer.impl.TransactionalIndexWorker#addIndexWorkerListener(org.sakaiproject.search.indexer.api.IndexWorkerListener)}.
*/
public final void testAddIndexWorkerListener()
{
log.info("================================== "+this.getClass().getName()+".testAddIndexWorkerListener");
doInit();
tiw.addIndexWorkerListener(new DebugIndexWorkerListener());
log.info("==PASSED========================== "+this.getClass().getName()+".testAddIndexWorkerListener");
}
/**
* Test method for
* {@link org.sakaiproject.search.indexer.impl.TransactionalIndexWorker#removeIndexWorkerListener(org.sakaiproject.search.indexer.api.IndexWorkerListener)}.
*/
public final void testRemoveIndexWorkerListener()
{
log.info("================================== "+this.getClass().getName()+".testRemoveIndexWorkerListener");
doInit();
IndexWorkerListener iwdl = new DebugIndexWorkerListener();
tiw.addIndexWorkerListener(iwdl);
tiw.removeIndexWorkerListener(iwdl);
log.info("==PASSED========================== "+this.getClass().getName()+".testRemoveIndexWorkerListener");
}
/**
* Test method for
* {@link org.sakaiproject.search.indexer.impl.TransactionalIndexWorker#addIndexWorkerDocumentListener(org.sakaiproject.search.indexer.api.IndexWorkerDocumentListener)}.
*/
public final void testAddIndexWorkerDocumentListener()
{
log.info("================================== "+this.getClass().getName()+".testAddIndexWorkerDocumentListener");
doInit();
tiw.addIndexWorkerDocumentListener(new DebugIndexWorkerDocumentListener());
log.info("==PASSED========================== "+this.getClass().getName()+".testAddIndexWorkerDocumentListener");
}
/**
* Test method for
* {@link org.sakaiproject.search.indexer.impl.TransactionalIndexWorker#removeIndexWorkerDocumentListener(org.sakaiproject.search.indexer.api.IndexWorkerDocumentListener)}.
*/
public final void testRemoveIndexWorkerDocumentListener()
{
log.info("================================== "+this.getClass().getName()+".testRemoveIndexWorkerDocumentListener");
doInit();
IndexWorkerDocumentListener iwdl = new DebugIndexWorkerDocumentListener();
tiw.addIndexWorkerDocumentListener(iwdl);
tiw.removeIndexWorkerDocumentListener(iwdl);
log.info("==PASSED========================== "+this.getClass().getName()+".testRemoveIndexWorkerDocumentListener");
}
}