searchengine/cpix/tsrc/cpixunittest/src/heartbeattests.cpp
changeset 0 671dee74050a
child 3 ae3f1779f6da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searchengine/cpix/tsrc/cpixunittest/src/heartbeattests.cpp	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,440 @@
+/*
+* 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 <wchar.h>
+#include <stddef.h>
+#include <unistd.h>
+
+#include <memory>
+#include <iostream>
+#include <list>
+#include <map>
+#include <vector>
+
+#include "cpixfstools.h"
+
+#include "itk.h"
+
+#include "cpixidxdb.h"
+#include "cpixsearch.h"
+#include "idxdbmgr.h" // from private folder: whitebox testing
+
+#include "config.h"
+#include "suggestion.h"
+#include "testutils.h"
+#include "testcorpus.h"
+#include "setupsentry.h"
+
+//
+// these constants are set so that a cpix_XXX entity should be
+// eligible for internal (transparent) release between the 2nd and 3rd
+// period (sleep)
+//
+const unsigned int SleepSec   = 2;
+const char         LastAccessedPattern[] = "(last accessed: ";
+
+
+class HeartbeatContext : public Itk::ITestContext
+{
+    cpix_Analyzer            * analyzer_;
+    cpix_QueryParser         * queryParser_;
+    cpix_Query               * query_;
+
+    LineTestCorpusRef          corpus_;
+    SmsIdxUtil               * smsIdxUtil_;
+    FileIdxUtil              * fileIdxUtil_;
+    cpix_IdxSearcher         * searcher_;
+
+    cpix_LogLevel              oldLogLevel_;
+
+
+public:
+    virtual void setup() throw (Itk::PanicExc)
+    {
+        SetupSentry
+            ss(*this);
+
+        cpix_Result
+            result;
+
+        oldLogLevel_ = cpix_setLogLevel(CPIX_LL_TRACE);
+
+        cpix_IdxDb_dbgScrapAll(&result);
+
+        if (cpix_Failed(&result))
+            {
+                ITK_PANIC("Could not dbg scrapp all indexes");
+            }
+
+        analyzer_ = cpix_CreateSimpleAnalyzer(&result);
+
+        if (analyzer_ == NULL)
+            {
+                ITK_PANIC("Could not create analyzer");
+            }
+
+        queryParser_ = cpix_QueryParser_create(&result,
+                                               LBODY_FIELD,
+                                               analyzer_);
+        if (queryParser_ == NULL)
+            {
+                ITK_PANIC("Could not create query parser");
+            }
+
+        query_ = cpix_QueryParser_parse(queryParser_,
+                                        L"happy");
+        if (cpix_Failed(queryParser_)
+            || query_ == NULL)
+            {
+                ITK_PANIC("Could not parse query string");
+            }
+
+        ss.setupComplete();
+    }
+
+    virtual void tearDown() throw()
+    {
+        cleanup();
+    }
+
+
+    virtual ~HeartbeatContext()
+    {
+        cleanup();
+    }
+
+
+    //
+    // public operations
+    //
+    HeartbeatContext()
+        : analyzer_(NULL),
+          queryParser_(NULL),
+          query_(NULL),
+          corpus_(DEFAULT_TEST_CORPUS_PATH),
+          smsIdxUtil_(NULL),
+          fileIdxUtil_(NULL),
+          searcher_(NULL)
+          
+    {
+        ;
+    }
+
+
+    //
+    // public (test) operations
+    //
+    void testCreateFileIdxDb(Itk::TestMgr * testMgr)
+    {
+        using namespace std;
+
+        doCommonJobs(testMgr,
+                     false);
+
+        auto_ptr<FileIdxUtil>
+            fiu(new FileIdxUtil);
+        fiu->init(true);
+
+        fileIdxUtil_ = fiu.release();
+    }
+
+
+    void testCreateSmsIdxDb(Itk::TestMgr * testMgr)
+    {
+        using namespace std;
+
+        doCommonJobs(testMgr);
+
+        auto_ptr<SmsIdxUtil>
+            siu(new SmsIdxUtil);
+        siu->init(true);
+        
+        smsIdxUtil_ = siu.release();
+    }
+    
+
+    void testAddSomeSms(Itk::TestMgr * testMgr)
+    {
+        using namespace std;
+
+        doCommonJobs(testMgr);
+
+        for (size_t i = 0; i < 5; ++i)
+            {
+                std::wstring
+                    body = corpus_.item(i);
+                smsIdxUtil_->indexSms(i,
+                                      body.c_str(),
+                                      analyzer_,
+                                      testMgr);
+                if ((i % 5) == 0)
+                    {
+                        ITK_DBGMSG(testMgr,
+                                   ".");
+                    }
+            }
+    }
+
+
+    void testIdle(Itk::TestMgr * testMgr)
+    {
+        doCommonJobs(testMgr);
+    }
+
+
+    void testUseMultiSearcher(Itk::TestMgr * testMgr)
+    {
+        doCommonJobs(testMgr);
+
+        if (searcher_ == NULL)
+            {
+                cpix_Result
+                    result;
+
+                searcher_ = cpix_IdxSearcher_openDb(&result,
+                                                    "root");
+                                     
+                if (searcher_ == NULL)
+                    {
+                        ITK_ASSERT(testMgr,
+                                   false,
+                                   "Could not create multi searcher");
+                    }
+            }
+
+        cpix_Hits
+            * hits = cpix_IdxSearcher_search(searcher_,
+                                             query_);
+        ITK_EXPECT(testMgr,
+                   cpix_Succeeded(query_),
+                   "Could not search with multisearcher");
+        if (hits != NULL)
+            {
+                PrintHits(hits,
+                          testMgr);
+
+                cpix_Hits_destroy(hits);
+            }
+    }
+
+    
+    void testAddSomeFile(Itk::TestMgr * testMgr)
+    {
+        doCommonJobs(testMgr);
+
+        fileIdxUtil_->indexFile(FILE_TEST_CORPUS_PATH "\\en\\1.txt",
+                                analyzer_,
+                                testMgr);
+    }
+
+    
+    void testReleaseAll(Itk::TestMgr * testMgr)
+    {
+        doCommonJobs(testMgr);
+
+        delete fileIdxUtil_;
+        fileIdxUtil_ = NULL;
+
+        delete smsIdxUtil_;
+        smsIdxUtil_ = NULL;
+
+        cpix_IdxSearcher_releaseDb(searcher_);
+        searcher_ = NULL;
+    }
+    
+
+private:
+    //
+    // private methods
+    //
+    void cleanup()
+    {
+        delete smsIdxUtil_;
+        smsIdxUtil_ = NULL;
+
+        delete fileIdxUtil_;
+        fileIdxUtil_ = NULL;
+
+        cpix_IdxSearcher_releaseDb(searcher_);
+        searcher_ = NULL;
+
+        cpix_Analyzer_destroy(analyzer_);
+        analyzer_ = NULL;
+
+        cpix_Query_destroy(query_);
+        query_ = NULL;
+
+        cpix_QueryParser_destroy(queryParser_);
+        queryParser_ = NULL;
+        
+
+        cpix_setLogLevel(oldLogLevel_);
+    }
+    
+
+    void doCommonJobs(Itk::TestMgr * testMgr,
+                      bool           doSleep = true)
+    {
+        if (doSleep)
+            {
+                printf("Sleeping %d seconds...\n",
+                       SleepSec);
+                ITK_EXPECT(testMgr,
+                           sleep(SleepSec) == 0,
+                           "Could not sleep");
+                printf("... slept.\n");
+            }
+
+        cpix_doHousekeeping();
+
+        printf("Housekept.\n");
+
+        // TODO
+        // measure memory consumption (not tested by I/O)
+
+        cpix_dbgDumpState();
+    }
+
+};
+
+
+Itk::TesterBase * CreateHeartbeatTests()
+{
+    using namespace Itk;
+
+    HeartbeatContext
+        * heartbeatContext = new HeartbeatContext();
+    ContextTester
+        * contextTester = new ContextTester("heartbeat",
+                                            heartbeatContext);
+#define TEST "00_createFileIdxDb"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testCreateFileIdxDb,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "01_createSmsIdxDb"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testCreateSmsIdxDb,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "02_addSomeSms"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testAddSomeSms,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "03_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "04_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "05_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "06_useMultiSearcher"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testUseMultiSearcher,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "07_addSomeFile"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testAddSomeFile,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "08_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "09_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "10_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "11_useMultiSearcher"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testUseMultiSearcher,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+#define TEST "12_releaseAll"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testReleaseAll,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+
+#define TEST "13_idle"
+    contextTester->add(TEST,
+                       heartbeatContext,
+                       &HeartbeatContext::testIdle,
+                       TEST,
+                       LastAccessedPattern);
+#undef TEST
+
+    // ... add more
+
+    return contextTester;
+}