blob: e5c9c9adc12202d97cafedb5cd7cc531a9550974 [file]
/*------------------------------------------------------------------------------
* Copyright (C) 2010 Borivoj Kostka and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#include "test.h"
#include <string>
#include <iostream>
#include "CLucene.h"
#include "CLucene/_clucene-config.h"
#include "CLucene/analysis/Analyzers.h"
#include "CLucene/document/Document.h"
#include "CLucene/document/Field.h"
#include "CLucene/index/IndexReader.h"
#include "CLucene/index/IndexWriter.h"
#include "CLucene/search/IndexSearcher.h"
#include "CLucene/store/Directory.h"
#include "CLucene/store/FSDirectory.h"
#include "CLucene/store/RAMDirectory.h"
#include "MockRAMDirectory.h"
/**
* JUnit testcase to test RAMDirectory. RAMDirectory itself is used in many testcases,
* but not one of them uses an different constructor other than the default constructor.
*
* @author Bernhard Messer
*
* @version $Id: RAMDirectory.java 150537 2004-09-28 22:45:26 +0200 (Di, 28 Sep 2004) cutting $
*/
static int docsToAdd = 500;
static char indexDir[CL_MAX_PATH] = "";
struct ThreadData
{
MockRAMDirectory * dir;
IndexWriter * writer;
int num;
CuTest * tc;
};
// setup the index
void testRAMDirectorySetUp (CuTest *tc) {
if (strlen(cl_tempDir) + 13 > CL_MAX_PATH)
CuFail(tc, _T("Not enough space in indexDir buffer"));
sprintf(indexDir, "%s/RAMDirIndex", cl_tempDir);
WhitespaceAnalyzer<TCHAR> analyzer;
IndexWriter * writer = new IndexWriter(indexDir, &analyzer, true);
// add some documents
TCHAR * text;
for (int i = 0; i < docsToAdd; i++) {
Document doc;
text = English::IntToEnglish(i);
doc.add(* new Field(_T("content"), text, Field::STORE_YES | Field::INDEX_UNTOKENIZED));
writer->addDocument(&doc);
_CLDELETE_ARRAY(text);
}
CuAssertEquals(tc, docsToAdd, writer->docCount(), _T("document count"));
writer->close();
_CLDELETE( writer );
}
// BK> all test functions are the same except RAMDirectory constructor, so shared code moved here
void checkDir(CuTest *tc, MockRAMDirectory * ramDir) {
// Check size
CuAssertTrue(tc, ramDir->sizeInBytes == ramDir->getRecomputedSizeInBytes(), _T("RAMDir size"));
// open reader to test document count
IndexReader * reader = IndexReader::open(ramDir);
CuAssertEquals(tc, docsToAdd, reader->numDocs(), _T("document count"));
// open search to check if all doc's are there
IndexSearcher * searcher = _CLNEW IndexSearcher(reader);
// search for all documents
Document doc;
for (int i = 0; i < docsToAdd; i++) {
searcher->doc(i, doc);
CuAssertTrue(tc, doc.getField(_T("content")) != NULL, _T("content is NULL"));
}
// cleanup
reader->close();
searcher->close();
_CLLDELETE(reader);
_CLLDELETE(searcher);
}
void testRAMDirectory (CuTest *tc) {
Directory * dir = FSDirectory::getDirectory(indexDir);
MockRAMDirectory * ramDir = _CLNEW MockRAMDirectory(dir);
// close the underlaying directory
dir->close();
_CLDELETE( dir );
checkDir(tc, ramDir);
ramDir->close();
_CLLDELETE(ramDir);
}
void testRAMDirectoryString (CuTest *tc) {
MockRAMDirectory * ramDir = _CLNEW MockRAMDirectory(indexDir);
checkDir(tc, ramDir);
ramDir->close();
_CLLDELETE(ramDir);
}
static int numThreads = 50;
static int docsPerThread = 40;
_LUCENE_THREAD_FUNC(indexDocs, _data) {
ThreadData * data = (ThreadData *)_data;
int cnt = 0;
TCHAR * text;
for (int j=1; j<docsPerThread; j++) {
Document doc;
text = English::IntToEnglish(data->num*docsPerThread+j);
doc.add(*new Field(_T("sizeContent"), text, Field::STORE_YES | Field::INDEX_UNTOKENIZED));
data->writer->addDocument(&doc);
_CLDELETE_ARRAY(text);
{
SCOPED_LOCK_MUTEX(data->dir->THIS_LOCK);
CuAssertTrue(data->tc, data->dir->sizeInBytes == data->dir->getRecomputedSizeInBytes());
}
}
_LUCENE_THREAD_FUNC_RETURN( 0 );
}
void testRAMDirectorySize(CuTest * tc) {
MockRAMDirectory * ramDir = _CLNEW MockRAMDirectory(indexDir);
WhitespaceAnalyzer<TCHAR> analyzer;
IndexWriter * writer = _CLNEW IndexWriter(ramDir, &analyzer, false);
writer->optimize();
CuAssertTrue(tc, ramDir->sizeInBytes == ramDir->getRecomputedSizeInBytes(), _T("RAMDir size"));
_LUCENE_THREADID_TYPE* threads = _CL_NEWARRAY(_LUCENE_THREADID_TYPE, numThreads);
ThreadData * tdata = _CL_NEWARRAY(ThreadData, numThreads);
for (int i=0; i<numThreads; i++) {
tdata[i].num = i;
tdata[i].dir = ramDir;
tdata[i].tc = tc;
tdata[i].writer = writer;
threads[i] = _LUCENE_THREAD_CREATE(&indexDocs, &tdata[i]);
}
for (int i=0; i<numThreads; i++){
_LUCENE_THREAD_JOIN(threads[i]);
}
_CLDELETE_ARRAY(threads);
_CLDELETE_ARRAY(tdata);
writer->optimize();
CuAssertTrue(tc, ramDir->sizeInBytes == ramDir->getRecomputedSizeInBytes(), _T("RAMDir size"));
CuAssertEquals(tc, docsToAdd + (numThreads * (docsPerThread-1)), writer->docCount(), _T("document count"));
writer->close();
_CLLDELETE(writer);
ramDir->close();
_CLLDELETE(ramDir);
}
#if 0
public void testSerializable() throws IOException {
Directory dir = new RAMDirectory();
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
assertEquals("initially empty", 0, bos.size());
ObjectOutput out = new ObjectOutputStream(bos);
int headerSize = bos.size();
out.writeObject(dir);
out.close();
assertTrue("contains more then just header", headerSize < bos.size());
}
#endif
void testRAMDirectoryTearDown(CuTest * tc) {
// cleanup
if (*indexDir) {
// delete index dir + all files in it (portable way!)
}
}
CuSuite *testRAMDirectory(void)
{
CuSuite *suite = CuSuiteNew(_T("CLucene RAMDirectory Test"));
SUITE_ADD_TEST(suite, testRAMDirectorySetUp);
SUITE_ADD_TEST(suite, testRAMDirectory);
SUITE_ADD_TEST(suite, testRAMDirectoryString);
SUITE_ADD_TEST(suite, testRAMDirectorySize);
SUITE_ADD_TEST(suite, testRAMDirectoryTearDown);
return suite;
}