diff -r 000000000000 -r 671dee74050a searchengine/util/tsrc/itk/inc/public/itkimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/searchengine/util/tsrc/itk/inc/public/itkimpl.h Mon Apr 19 14:40:16 2010 +0300 @@ -0,0 +1,173 @@ +/* +* 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: +* +*/ +#ifndef ITK_ITKIMPL_H_ +#define ITK_ITKIMPL_H_ + +#include + +#include "cpixfstools.h" + +namespace Itk +{ + namespace Impl + { + + + /** + * Tells if it could open the file. + */ + bool FileExists(const char * path); + + + /** + * Redirects the standard input, if necessary + */ + class InputRedirector + { + private: + int duplicatedStdInFD_; + int inFileFD_; + + public: + InputRedirector(const std::string & defFilesBasePath); + ~InputRedirector(); + }; + + + + /** + * Redirects the standard output, if necessary + */ + class OutputRedirector + { + private: + int duplicatedStdOutFD_; + int outFileFD_; + bool stdErr_; + TestMgr * testMgr_; + + public: + /** + * Creates an output redirector instance. The same class + * is used for redirecting output and error, but there are + * slight differences in how they work. See parameter + * list. + * + * @param defFilesBasePath the path of the base of the + * test definition files + * + * @param testMgr must NOT be null for stdout redirection + * and must be NULL for redirecting stderr. + */ + OutputRedirector(const std::string & defFilesBasePath, + TestMgr * testMgr); + ~OutputRedirector(); + }; + + + /** + * Evaluates the results of an IO capturing session based on the + * defFileBasePath argument (ctor) and what it can find on the + * filesystem around those paths. + */ + class IOCaptureEvaluator + { + private: + // + // private members + // + const std::string defFileBasePath_; + TestMgr * testMgr_; + const std::string & lenience_; + + + public: + // + // public operators + // + void evaluate(); + + + // + // lifetime mgmt + // + IOCaptureEvaluator(const std::string & defFileBasePath, + TestMgr * testMgr, + const std::string & lenience); + + private: + // + // private methods + // + void copyContent(const char * dstPath, + const char * srcPath); + void compareContent(const char * expPath, + const char * resPath); + void evaluate(bool stdErr); + }; + + + /** + * Only requirement for testFunc is that it should support the + * following syntax: testFunc(testMgr); + **/ + template + void EvaluateIOCapture(const std::string & defFilesBaseName, + TestMgr * testMgr, + TESTFUNC testFunc, + const std::string & lenience) + { + using namespace std; + using namespace Itk::Impl; + + string + defFilesBasePath; + testMgr->ioTestCasesDir(defFilesBasePath); + // OBS defFilesBasePath += defFilesBaseName; + Cpt::pathappend(defFilesBasePath, + defFilesBaseName.c_str()); + + try + { + InputRedirector + stdInRedirector(defFilesBasePath); + OutputRedirector + stdOutRedirector(defFilesBasePath, + testMgr), // std out + stdErrRedirector(defFilesBasePath, + NULL); // std err + + testFunc(testMgr); + } + catch (IOCaptureExc & exc) + { + testMgr->ioCaptureError("(?)", + exc.what()); + } + + IOCaptureEvaluator + evaluator(defFilesBasePath, + testMgr, + lenience); + evaluator.evaluate(); + } + + + } +} + +#endif ITK_ITKIMPL_H_