searchengine/cpix/tsrc/cpixunittest/src/negativetests.cpp
changeset 0 671dee74050a
child 2 6c1a2771f4b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searchengine/cpix/tsrc/cpixunittest/src/negativetests.cpp	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,417 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+// INCLUDE FILES
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+// This is a GCCE toolchain workaround needed when compiling with GCCE
+// and using main() entry point
+#ifdef __GCCE__
+#include <staticlibinit_gcce.h>
+#endif
+
+
+#include "itk.h"
+#include "cpixidxdb.h"
+#include "cpixdoc.h"
+#include "cpixsearch.h"
+#include "cpixidxdb.h"
+
+#define TEST_DOCUMENT_QBASEAPPCLASS "@0:root test document"
+#define TEST_SAMPLE_QBASEAPPCLASS "@:root test sample"
+#define TEST_CORRUPTTEST1_QBASEAPPCLASS "@:root test corrupttest1"
+#define TEST_CORRUPTTEST2_QBASEAPPCLASS "@:root test corrupttest2"
+
+#define TEST_DOCUMENT_INDEXDB_PATH "c:\\Data\\indexing\\test\\"
+#define TEST_SAMPLE_INDEXDB_PATH "c:\\Data\\indexing\\sample\\"
+#define TEST_CORRUPTTEST1_INDEXDB_PATH "c:\\Data\\indexing\\corrupttest1\\"
+#define TEST_CORRUPTTEST2_INDEXDB_PATH "c:\\Data\\indexing\\corrupttest2\\"
+
+#define LDOCUID1 L"document1"
+#define LDOCUID2 L"document2"
+
+
+#define FIELD_ALPHA L"Alpha"
+
+
+#define DOC1CONTENT L"mary had a little lamb its fleece was black as coal"
+#define DOC2CONTENT L"mary had a little little little lamb its fleece was as white as snow"
+
+
+// The term that will be present in multiple documents.
+#define SEARCH_TERM L"little"
+
+class NegativeTests : public Itk::ITestContext
+{
+private:
+    
+void CreateAnalyser(Itk::TestMgr  * testMgr,
+                    cpix_Analyzer **analyzer_)
+{
+    
+    cpix_Result result;
+    cpix_InitParams
+                * initParams = cpix_InitParams_create(&result);
+    if (cpix_Failed(&result))
+        {
+        ITK_EXPECT(testMgr,
+                   false,
+                   "Failed to initialize Cpix");        
+        }
+
+    ITK_ASSERT(testMgr,
+               cpix_Succeeded(initParams),
+               "Failed to set max idle sec");    
+
+    cpix_init(&result,
+            initParams);
+
+    *analyzer_ = cpix_CreateSimpleAnalyzer(&result);
+    
+    if ( !*analyzer_ )
+        {
+        ITK_PANIC("Analyzer could not be created");
+        }
+}
+
+void testInit(cpix_IdxDb **iDb_, cpix_IDX_OpenMode_ mode,
+            const char *baseAppClass, const char *path)
+{
+    cpix_Result result;
+    
+    cpix_IdxDb_defineVolume(&result, 
+                baseAppClass, 
+                path);
+    
+    if (cpix_Failed(&result))
+        {
+        ITK_PANIC("Failed to define test index db");
+        }
+
+    *iDb_ = cpix_IdxDb_openDb(&result,
+            baseAppClass,
+            mode);
+    
+    if (cpix_Failed(&result))
+        {
+        ITK_PANIC("Failed to open indexDb");
+        }    
+}
+
+void createDocument(Itk::TestMgr * testMgr, const wchar_t* data,
+                cpix_Analyzer **analyzer_, cpix_IdxDb **iDb_, const wchar_t* content)
+{
+    cpix_Document *doc;
+    cpix_Field field;
+    cpix_Result result;
+    
+    doc = cpix_Document_create(&result,data,NULL,      // app class
+            NULL,      // excerpt
+            NULL);     // mime type
+    
+    ITK_ASSERT(testMgr,
+               cpix_Succeeded(&result),
+               "Creating document %S failed",
+               data);
+
+    cpix_Field_initialize(&field,
+            FIELD_ALPHA,
+            content, 
+            cpix_STORE_YES |cpix_INDEX_TOKENIZED);
+    
+    if (cpix_Failed(&field))
+        {
+        cpix_Document_destroy(doc);        
+        }
+    
+    ITK_ASSERT(testMgr,
+               cpix_Succeeded(&field),
+               "Could not create field");
+    
+    cpix_Document_add(doc,&field);
+    
+    bool
+        succeeded = true;
+    if (cpix_Failed(doc))
+        {
+            cpix_Document_destroy(doc);
+            cpix_Field_release(&field);
+            succeeded = false;
+        }
+
+    ITK_ASSERT(testMgr,
+               succeeded,
+               "Could not add field to document");
+    
+    cpix_IdxDb_add(*iDb_, doc, *analyzer_);
+
+    cpix_Document_destroy(doc);    
+    
+    cpix_IdxDb_flush(*iDb_);    
+}
+
+void cleanUp(cpix_Analyzer ** analyzer_, cpix_IdxDb ** iDb_ )
+{
+    cpix_Analyzer_destroy(*analyzer_);
+    analyzer_ = NULL;
+    
+    cpix_IdxDb_releaseDb(*iDb_);
+    *iDb_ = NULL;
+     
+}
+
+int corruptIndex(const char *path)
+{
+        char tempPath[250];
+        FILE *fp = NULL;
+        
+        strcpy(tempPath,path);
+        strcat(tempPath,"\\_0\\_0.cfs");
+        if(access(tempPath,F_OK)== 0)
+          fp = fopen(tempPath,"wb");
+        
+        if(!fp)
+            {
+               fclose(fp);
+               memset(tempPath,0L,250);
+               strcpy(tempPath,path);
+               strcat(tempPath,"\\_1\\_0.cfs");
+               if(access(tempPath,F_OK)== 0)
+                   fp = fopen(tempPath,"wb");
+               if(!fp)
+                   {
+                     return -1;
+                   }
+            }
+        fseek(fp,0,SEEK_SET);
+        fputs("This is to corrupt the index file.                                       ",fp);
+        fclose(fp);
+        return 0;
+}
+
+int search(cpix_Analyzer ** analyzer_,
+           cpix_IdxDb ** iDb_, const wchar_t *searchTerm  )
+{
+    
+    cpix_QueryParser * queryParser_;
+    cpix_Query * query_;
+    cpix_Hits * hits_;
+    cpix_Result result;
+    int32_t hits_len;
+    
+    queryParser_ = cpix_QueryParser_create(&result,
+                    L"_aggregate",
+                    *analyzer_);
+    
+    if (queryParser_ == NULL)
+        {
+        ITK_PANIC("Could not create query parser");
+        }                
+
+    query_ = cpix_QueryParser_parse(queryParser_, searchTerm);
+
+    if (cpix_Failed(queryParser_))
+        {
+        ITK_PANIC("Could not create query parser");
+        }
+    
+    hits_ = cpix_IdxDb_search(*iDb_, query_);
+    
+    if (cpix_Succeeded(hits_))
+        {
+        hits_len = cpix_Hits_length(hits_); 
+        }
+    
+    cpix_Query_destroy(query_);
+    query_ = NULL;
+    
+    cpix_QueryParser_destroy(queryParser_);
+    queryParser_ = NULL;
+        
+    cpix_Hits_destroy(hits_);
+    hits_ = NULL;
+    
+    return hits_len;    
+}
+
+~NegativeTests()
+{
+}
+public:
+
+NegativeTests()
+{   
+}
+virtual void setup() throw (Itk::PanicExc)
+{
+
+}
+
+virtual void tearDown() throw()
+{
+
+}
+
+void testCreateDb(Itk::TestMgr* /*testMgr */)
+{
+    cpix_IdxDb   *itestDb_ = NULL, *inewDb_ = NULL;                
+    cpix_Result  result;
+    
+    testInit(&itestDb_, cpix_IDX_CREATE,
+            TEST_SAMPLE_QBASEAPPCLASS, TEST_SAMPLE_INDEXDB_PATH);
+    
+    // try to recreate the same database
+    if (itestDb_)
+        {
+           inewDb_ = cpix_IdxDb_openDb(&result,
+                                       TEST_SAMPLE_QBASEAPPCLASS,
+                                       cpix_IDX_CREATE);
+        }
+    if (cpix_Failed(&result))
+        {
+        ITK_PANIC("Failed to open indexDb");
+        }
+     
+     if ( itestDb_ ) 
+         {
+            cpix_IdxDb_releaseDb(itestDb_);
+            itestDb_ = 0; 
+         }
+     
+     if (inewDb_)
+         {
+            cpix_IdxDb_releaseDb(inewDb_);
+            inewDb_ = 0;
+         }
+     cpix_IdxDb_undefineVolume(TEST_SAMPLE_QBASEAPPCLASS);
+}
+
+void testOpenDb(Itk::TestMgr * testMgr)
+{
+        cpix_Result  result;            
+        cpix_IdxDb   *idxDb_ = NULL;
+        
+        //try to open a Db an of undefined volume
+        idxDb_ = cpix_IdxDb_openDb(&result,
+                                       "@0:root test1",
+                                       cpix_IDX_CREATE);
+        if(idxDb_ == NULL )
+            {
+            ITK_MSG(testMgr, "Tried to open a database of undefined volume");             
+            }
+        
+        if (idxDb_) 
+            {
+                cpix_IdxDb_releaseDb(idxDb_);
+                idxDb_ = 0; 
+            }        
+}
+
+void testCorruptedIndex(Itk::TestMgr * testMgr)
+{
+     cpix_Analyzer * analyzer_ = NULL ;       
+     cpix_IdxDb * iCrptDb1_ = NULL, *iCrptDb2_ = NULL;
+     
+     CreateAnalyser(testMgr,
+                    &analyzer_);
+     //creat an index and search for the term
+     testInit(&iCrptDb1_, cpix_IDX_CREATE, TEST_CORRUPTTEST1_QBASEAPPCLASS,
+                     TEST_CORRUPTTEST1_INDEXDB_PATH);    
+     createDocument(testMgr, LDOCUID1,&analyzer_,&iCrptDb1_,DOC1CONTENT);
+     int hit_len1 = search(&analyzer_,&iCrptDb1_, SEARCH_TERM);
+     
+     //creat another index and search for the term
+     testInit(&iCrptDb2_, cpix_IDX_CREATE, TEST_CORRUPTTEST2_QBASEAPPCLASS,
+                     TEST_CORRUPTTEST2_INDEXDB_PATH);
+     createDocument(testMgr, LDOCUID1,&analyzer_,&iCrptDb2_,DOC2CONTENT);
+     int hit_len2 = search(&analyzer_,&iCrptDb2_, SEARCH_TERM);     
+     
+     if(iCrptDb1_)
+          {
+          cpix_IdxDb_releaseDb(iCrptDb1_);
+          iCrptDb1_ = 0;
+          }
+     cpix_IdxDb_undefineVolume(TEST_CORRUPTTEST1_QBASEAPPCLASS);
+     
+      
+     //Release the second Db
+     if(iCrptDb2_)
+         {
+         cpix_IdxDb_releaseDb(iCrptDb2_);
+         iCrptDb2_ = 0;
+         }
+     cpix_IdxDb_undefineVolume(TEST_CORRUPTTEST2_QBASEAPPCLASS);
+     //Corrupt the second index
+     corruptIndex(TEST_CORRUPTTEST2_INDEXDB_PATH);
+     testInit(&iCrptDb1_, cpix_IDX_OPEN, TEST_CORRUPTTEST1_QBASEAPPCLASS,
+                     TEST_CORRUPTTEST1_INDEXDB_PATH);
+     if(iCrptDb1_)
+         int hit_search1 = search(&analyzer_,&iCrptDb1_, SEARCH_TERM);
+     
+     testInit(&iCrptDb2_, cpix_IDX_OPEN, TEST_CORRUPTTEST2_QBASEAPPCLASS,
+                 TEST_CORRUPTTEST2_INDEXDB_PATH);
+     int hit_search2;
+     if(iCrptDb2_)
+         hit_search2= search(&analyzer_,&iCrptDb2_, SEARCH_TERM);
+     else
+         ITK_MSG(testMgr, "Corrupted database, search not possible");              
+     
+     cleanUp(&analyzer_,&iCrptDb1_);
+     
+     if(iCrptDb2_)
+         {
+         cpix_IdxDb_releaseDb(iCrptDb2_);
+         iCrptDb2_ = 0;
+         }
+     
+     cpix_IdxDb_undefineVolume(TEST_CORRUPTTEST1_QBASEAPPCLASS);
+     cpix_IdxDb_undefineVolume(TEST_CORRUPTTEST2_QBASEAPPCLASS);
+ }
+
+};
+
+Itk::TesterBase * CreateNegativeTests()
+{
+    using namespace Itk;
+    
+    NegativeTests
+            *negativeTests = new NegativeTests;
+    ContextTester
+            * contextTester = new ContextTester("Negative Tests",
+                                                negativeTests);    
+#define TEST "CreateDb"
+    contextTester->add(TEST,
+                    negativeTests,
+                    &NegativeTests::testCreateDb);
+#undef TEST    
+
+#define TEST "OpenDbofUndefinedVolume"
+    contextTester->add(TEST,
+                    negativeTests,
+                    &NegativeTests::testOpenDb);
+#undef TEST 
+    
+#define TEST "CorruptedIndex"
+    contextTester->add(TEST,
+                    negativeTests,
+                    &NegativeTests::testCorruptedIndex);
+#undef TEST     
+    
+  return contextTester;
+}