diff options
author | Mathias Bauer <mba@openoffice.org> | 2009-09-14 19:06:55 +0200 |
---|---|---|
committer | Mathias Bauer <mba@openoffice.org> | 2009-09-14 19:06:55 +0200 |
commit | e6838b9d44a0164bbace63c050b6d75ceb49b30b (patch) | |
tree | 365d2ad342dab18ed171613c676cf1a8ec5095a0 /testshl2 | |
parent | cc3c8b3f096acbeacb14f4c455ed6ed55e479d7d (diff) |
#i103496#: split cppunit in a pure external lib and a lib depending on sal -> testshl2
Diffstat (limited to 'testshl2')
65 files changed, 7110 insertions, 53 deletions
diff --git a/testshl2/inc/testshl/additionalfunc.hxx b/testshl2/inc/testshl/additionalfunc.hxx new file mode 100644 index 000000000000..463d1ae87280 --- /dev/null +++ b/testshl2/inc/testshl/additionalfunc.hxx @@ -0,0 +1,61 @@ +#ifndef ADDITIONALFUNC_HXX +#define ADDITIONALFUNC_HXX + +#include "testshl/autoregister/registertestfunction.h" +#include "sal/types.h" + +extern "C" void SAL_CALL RegisterAdditionalFunctions(FktRegFuncPtr _pFunc); + +#define NOADDITIONAL \ +void RegisterAdditionalFunctions(FktRegFuncPtr){} + +namespace { + +enum T2_OSType { + T2_OS_WNT32 = 1, + T2_OS_UNIX, + T2_OS_OS2 +}; + +inline T2_OSType getOSType() +{ +#if defined WNT + return T2_OS_WNT32; +#elif defined OS2 + return T2_OS_OS2; +#else + return T2_OS_UNIX; +#endif +} + +} + +#define TESTSHL2_UNO_BOOTSTRAP(file) \ +void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc) \ +{ \ + com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory> xMS; \ + com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xComponentContext; \ + try { \ + if (strlen(#file) > 0) { \ + ::rtl::OUString iniFile(rtl::OUString::createFromAscii(#file)); \ + if (getOSType() == T2_OS_WNT32 || getOSType() == T2_OS_OS2) { \ + iniFile += ::rtl::OUString::createFromAscii(".ini"); \ + } else { \ + iniFile += ::rtl::OUString::createFromAscii("rc"); \ + } \ + xComponentContext = cppu::defaultBootstrap_InitialComponentContext(iniFile); \ + } else { \ + xComponentContext = cppu::defaultBootstrap_InitialComponentContext(); \ + } \ + xMS.set(xComponentContext->getServiceManager(), com::sun::star::uno::UNO_QUERY); \ + comphelper::setProcessServiceFactory(xMS); \ + } \ + catch (::com::sun::star::uno::Exception e ) { \ + rtl::OString aError; \ + aError = rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); \ + printf("Error at UNO bootstrap time caught: %s\nMust quit.\n", aError.getStr()); \ + exit(1); \ + } \ +} + +#endif diff --git a/testshl2/inc/testshl/autoregister/callbackstructure.h b/testshl2/inc/testshl/autoregister/callbackstructure.h new file mode 100644 index 000000000000..e71d3d960317 --- /dev/null +++ b/testshl2/inc/testshl/autoregister/callbackstructure.h @@ -0,0 +1,89 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _callbackstructure_h +#define _callbackstructure_h + +#include <sal/types.h> +#include <cppunit/callbackfunc_fktptr.h> +#include <testshl/autoregister/registerfunc.h> +#include <testshl/autoregister/registertestfunction.h> +#include <testshl/cmdlinebits.hxx> + +// this structure will filled by the testshl tool and hand to the testdll + +struct CallbackStructure +{ + // a version number, if we want to change/expand this struct + sal_Int32 nVersion; + sal_Int64 nMagic; + + FktRegFuncPtr aRegisterFunction; + + FktPtr_CallbackDispatch aCallbackDispatch; + + //# FktPtr_TestResult_startTest aStartTest; + //# FktPtr_TestResult_addFailure aAddFailure; + //# FktPtr_TestResult_addError aAddError; + //# FktPtr_TestResult_endTest aEndTest; + //# FktPtr_TestResult_shouldStop aShouldStop; + //# + //# FktPtr_TestResult_addInfo aAddInfo; + //# FktPtr_TestResult_enterNode aEnterNode; + //# FktPtr_TestResult_leaveNode aLeaveNode; + + const char* psForward; + CmdLineBits nBits; + + // void* pJobList; + + sal_Int64 nMagic2; + + CallbackStructure() + :nVersion(1), + nMagic(SAL_CONST_INT64(0x0123456789abcdef)), + aRegisterFunction(NULL), + aCallbackDispatch(NULL), + /* aStartTest(NULL), + aAddFailure(NULL), + aAddError(NULL), + aEndTest(NULL), + aShouldStop(NULL), + aAddInfo(NULL), + aEnterNode(NULL), + aLeaveNode(NULL), */ + psForward(NULL), + nBits(0), + /* pJobList(NULL), */ + nMagic2(0) + {} +}; + +#endif diff --git a/testshl2/inc/testshl/autoregister/htestresult.h b/testshl2/inc/testshl/autoregister/htestresult.h new file mode 100644 index 000000000000..46cfbc8b6808 --- /dev/null +++ b/testshl2/inc/testshl/autoregister/htestresult.h @@ -0,0 +1,6 @@ +#ifndef _htestresult_h +#define _htestresult_h + +typedef void* hTestResult; + +#endif diff --git a/testshl2/inc/testshl/autoregister/registerfunc.h b/testshl2/inc/testshl/autoregister/registerfunc.h new file mode 100644 index 000000000000..9decdfe5c3b7 --- /dev/null +++ b/testshl2/inc/testshl/autoregister/registerfunc.h @@ -0,0 +1,50 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _registerfunc_h +#define _registerfunc_h + +#include <sal/types.h> +#include <testshl/autoregister/htestresult.h> +#include <cppunit/callbackfunc_fktptr.h> +#include <testshl/autoregister/testfunc.h> + +struct CallbackStructure; + +// this function is used to register one function into a Container in the testshl tool. +extern "C" void SAL_CALL registerFunction(FktPtr aFunc, const char* aFuncName); + +// this function is the register function for auto registering + +extern "C" void SAL_CALL registerAllTestFunction(CallbackStructure* ); +typedef void (* FktRegAllPtr)(CallbackStructure*); + + +#endif diff --git a/testshl2/inc/testshl/autoregister/registertestfunction.h b/testshl2/inc/testshl/autoregister/registertestfunction.h new file mode 100644 index 000000000000..b87d6c335f48 --- /dev/null +++ b/testshl2/inc/testshl/autoregister/registertestfunction.h @@ -0,0 +1,54 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _registertestfunction_h +#define _registertestfunction_h + +#include <sal/types.h> +#include <testshl/autoregister/testfunc.h> + +#ifdef __cplusplus +extern "C" { +#endif + +// function ptr, to register a function +typedef void (* FktRegFuncPtr)(FktPtr aFunc, const char* aFuncName); + +// this function is used in the testdll to register the given function +// into the testshl +extern "C" void SAL_CALL RegisterTestFunctions(FktRegFuncPtr aFunc); + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/testshl2/inc/testshl/autoregister/testfunc.h b/testshl2/inc/testshl/autoregister/testfunc.h new file mode 100644 index 000000000000..2e23b7769485 --- /dev/null +++ b/testshl2/inc/testshl/autoregister/testfunc.h @@ -0,0 +1,47 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _testfunc_h +#define _testfunc_h + +#include <testshl/autoregister/htestresult.h> + +#ifdef __cplusplus +extern "C" { +#endif + +// typedef for a testfunction +typedef void (* FktPtr)(hTestResult); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/testshl2/inc/testshl/autoregisterhelper.hxx b/testshl2/inc/testshl/autoregisterhelper.hxx new file mode 100644 index 000000000000..fce509a1e48f --- /dev/null +++ b/testshl2/inc/testshl/autoregisterhelper.hxx @@ -0,0 +1,65 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef AUTOREGISTER_HXX +#define AUTOREGISTER_HXX + +#include <vector> +#include <rtl/ustring.hxx> + +#include <testshl/autoregister/testfunc.h> + +#include "testshl/dynamicregister.hxx" +#include "testshl/getopt.hxx" + +typedef std::vector<FktPtr> FunctionList; + +// ----------------------------------------------------------------------------- +class JobList; +class AutomaticRegisterHelper : public DynamicLibraryHelper +{ + FunctionList m_aFunctionList; + bool m_bLoadLibraryOK; + // GetOpt & m_aOptions; // use getOptions() instead! + +public: + AutomaticRegisterHelper(rtl::OUString const& _sDLLName, GetOpt & _aOptions/* , JobList * _pJobList = NULL */ ); + + // FunctionList getFunctions(){return m_aFunctionList;} + void CallAll(hTestResult _hResult) const; + + /// @return true, if the given DLLName library could load and initialised. + bool isOkToStartTests() const {return m_bLoadLibraryOK;} + + virtual ~AutomaticRegisterHelper(); +}; + +#endif + diff --git a/testshl2/inc/testshl/checkboom.hxx b/testshl2/inc/testshl/checkboom.hxx new file mode 100644 index 000000000000..0ead958f28d8 --- /dev/null +++ b/testshl2/inc/testshl/checkboom.hxx @@ -0,0 +1,40 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CHECKBOOM_HXX +#define CHECKBOOM_HXX + +#include <string> +#include <rtl/ustring.hxx> + +void CheckBoom(bool bCondition, std::string const& msg); +void CheckBoom(bool bCondition, rtl::OUString const& msg); + +#endif diff --git a/testshl2/inc/testshl/cmdlinebits.hxx b/testshl2/inc/testshl/cmdlinebits.hxx new file mode 100644 index 000000000000..92f0e5c1c660 --- /dev/null +++ b/testshl2/inc/testshl/cmdlinebits.hxx @@ -0,0 +1,52 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CMDLINEBITS_HXX +#define CMDLINEBITS_HXX + +#include <sal/types.h> + +typedef sal_uInt32 CmdLineBits; +const char* getForwardString(); + +#include <stdarg.h> + +enum T_Print_Params { + T_INFO = 1, + T_VERBOSE, + T_DEBUG, + T_ERROR +}; + +// void t_print(const char*); +void t_print(const char*, ...); +void t_print(T_Print_Params, const char*, ...); + +#endif diff --git a/testshl2/inc/testshl/dynamicregister.hxx b/testshl2/inc/testshl/dynamicregister.hxx new file mode 100644 index 000000000000..dc263950b430 --- /dev/null +++ b/testshl2/inc/testshl/dynamicregister.hxx @@ -0,0 +1,67 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef DYNAMICREGISTER_HXX +#define DYNAMICREGISTER_HXX + +#include <rtl/ustring.hxx> +#include <osl/module.hxx> + +#include "testshl/getopt.hxx" +#include "testshl/nocopy.hxx" + +// ------------------------------------------------- + +class DynamicLibraryHelper : NOCOPY +{ +protected: + osl::Module* m_pModule; + rtl::OUString m_suDLLName; + GetOpt & m_aOptions; + + GetOpt& getOptions() {return m_aOptions;} + +public: + DynamicLibraryHelper(rtl::OUString const& _sDLLName, GetOpt & _aOptions); + virtual ~DynamicLibraryHelper(); + +private: + void showFilenameIfVerbose(); + void realLoadLibrary(rtl::OUString const& _sLibToLoad); + void loadLibraryFromAbsolutePath(); + void loadLibraryFromLocalPath(); + + rtl::OUString m_suAbsolutePathFile; // file:///D:/foo/bar/library.dll + rtl::OUString m_suAbsolutePath; // file:///D:/foo/bar + rtl::OUString m_suFilename; // library.dll +}; + +#endif + diff --git a/testshl2/inc/testshl/filehelper.hxx b/testshl2/inc/testshl/filehelper.hxx new file mode 100644 index 000000000000..b3a8e61d0ed5 --- /dev/null +++ b/testshl2/inc/testshl/filehelper.hxx @@ -0,0 +1,50 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef FILEHELPER_HXX +#define FILEHELPER_HXX + +#include <string> +#include <rtl/ustring.hxx> +#include <rtl/string.hxx> +#include <testshl/cmdlinebits.hxx> +#include "getopt.hxx" + +namespace FileHelper +{ + + std::string getTempPath(); + rtl::OUString convertPath( rtl::OUString const& _suSysPath ); + rtl::OUString convertPath( rtl::OString const& sysPth ); + CmdLineBits createFlags( GetOpt & _aOptions ); + +} +#endif + diff --git a/testshl2/inc/testshl/getopt.hxx b/testshl2/inc/testshl/getopt.hxx new file mode 100644 index 000000000000..fe77cd8e6755 --- /dev/null +++ b/testshl2/inc/testshl/getopt.hxx @@ -0,0 +1,335 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +/************************************************************************* +#* class GetOpt +#* +#* +#* Implementation getopt.cxx +#* +#* Description: class to reflect the commandline options. In addition +#* it provides functinality to get options from an inifile +#* ( getIniOptions()), evaluate, test and get options +#* ( hasOpt(), getOpt() ) and display an usage screen +#* formated in dependance of the given optionset, as well +#* as display a status about activ options +#* +#* +#* further descriptions: +#* +#* the constructor is called with two parameters: +#* char* argv[] and char* optionSet[], +#* the commandline and the available set of options. +#* Valid optionstrings have to start with a minus '-', otherwise it will +#* be ignored. Optionstrings consist of one or two arguments divided by a +#* comma separator, where the second (optional) argument is a short +#* description of the option, called hint. It will be automatically +#* formated and displayed in the usage screen if available. +#* The first argument of the optionstring can consist of two sections, +#* the name and the optional necessity and format. +#* The name of the option will be the starting minus followed by a string +#* like "-src". +#* One section options will be treated as flag (see '-v' option in example). +#* The second section consist of '=' or ':' which defines the necessity, +#* in combination with a character 's' for string or 'n' for numeric and +#* an optional '@' standing for 'vector of'. +#* '=' means this option needs an argument, ':' means can take an argument +#* followed by 's' is, as mentioned above, a single string paramenter, +#* followed by a 's' in combination with '@' means this argument consists +#* of one string or a vector of strings separated by commas +#* +#* an example for an optionset: +#* +#* static char* optionSet[] = { +#* "-src=s, release or version of sources", +#* "-ini=s, ini file with additional options", +#* "-db=s, path of type description database", +#* "-inPth=s, source path of component descriptions", +#* "-outPth=s, destination path for testcases", +#* "-logPth=s, destination path for logging", +#* "-mdl=s@, name(s) of module(s) to generate", +#* "-v, enable verbose screen messages", +#* "-dbg, enable debug messages", +#* "-h:s, display help or help on option", +#* "-help:s, see -h", +#* NULL +#* }; +#* +#* As seen a GetOpt class object will be created via: +#* GetOpt myOptions( argv, optionSet ); +#* +*************************************************************************/ +#ifndef __QADEV_REGSCAN_GETOPT_HXX__ +#define __QADEV_REGSCAN_GETOPT_HXX__ + +#include <osl/file.hxx> +#include <sal/types.h> +#include <rtl/strbuf.hxx> + + +#include <rtl/string.hxx> + +// #ifndef __QADEV_REGSCAN_UTIL_HXX__ +// #include "inc/util.hxx" +// #endif + + +#ifdef SOLARIS +#include <sys/time.h> +#endif + +#include <iostream> +#include <hash_map> +// #include "rsexception.hxx" + +// using namespace std; + +struct gstr { + sal_Bool operator()( const rtl::OString& oStr1, + const rtl::OString& oStr2 ) const { + return( oStr1 == oStr2 ); + } +}; + +struct ghstr +{ + sal_uInt32 operator()( const rtl::OString& str ) const { + return str.hashCode(); + } +}; + +struct frmt { + sal_uInt32 fCol; + sal_uInt32 sCol; + sal_uInt32 len; +}; + +typedef std::hash_map< rtl::OString, std::vector< rtl::OString >, ghstr, gstr > + optHashMap; + +typedef frmt sFormat; +typedef sal_uInt16 optType; + +#define OT_INVALID 0x0000 +#define OT_BOOL 0x0001 +#define OT_STRING 0x0002 +#define OT_NUMBER 0x0004 +#define OT_SINGLE 0x0010 +#define OT_MULTI 0x0020 +#define OT_OPTIONAL 0x0100 + +//: Option +class OptDsc { + + rtl::OString m_name; + rtl::OString m_hint; + rtl::OString m_legend; + optType m_type; + + /** + * analysis of optionstring and creation of option description class + * @param const rtl::OString& opt = optionstring to analyse + * @return void + */ + void createOptDsc( const rtl::OString& opt ); + + /** + * splitting of an optionstring and creation of a tokenvector + * in dependance of a charset + * + * @param const rtl::OString& opt = optionstring to split + * @param const rtl::OString& cSet = delimiter charset + * @param vector< rtl::OString >& optLine = tokenvector to fill + * + * @return void + */ + void split( const rtl::OString& opt, const rtl::OString& charSet, + std::vector< rtl::OString >& optLine ); + + /** + * private default c'tor, copy c'tor and assignment operator + * to get compiler errors on dumb effords + */ + OptDsc(); + OptDsc( OptDsc& ); + OptDsc& operator = ( OptDsc& ); + +public: + + //> c'tor + OptDsc( const rtl::OString& opt ) + : m_name(), + m_hint(), + m_legend(), + m_type( 0 ) { + + createOptDsc( opt ); + } ///< c'tor + + //> d'tor + ~OptDsc(){} + + /** + * returns the name of this option + * @return rtl::OString& + */ + inline rtl::OString& getName() { return m_name; } + /** + * returns the hint of this option + * @return rtl::OString& + */ + inline rtl::OString& getHint() { return m_hint; } + /** + * returns the legend of this option + * @return rtl::OString& + */ + inline rtl::OString& getLegend() { return m_legend; } + + /** + * returns the type of this option + * @return optType + */ + inline optType getType() { return m_type; } + + + inline sal_Bool isFlag() { + return( ( m_type &~ 0xfffe ) == OT_BOOL ) ? sal_True : sal_False; + } + inline sal_Bool isString() { + return( ( m_type &~ 0xfffd ) == OT_STRING ) ? sal_True : sal_False; + } + inline sal_Bool isNumber() { + return( ( m_type &~ 0xfffb ) == OT_NUMBER ) ? sal_True : sal_False; + } + inline sal_Bool isSingle() { + return( ( m_type &~ 0xffef ) == OT_SINGLE ) ? sal_True : sal_False; + } + inline sal_Bool isMulti() { + return( ( m_type &~ 0xffdf ) == OT_MULTI ) ? sal_True : sal_False; + } + inline sal_Bool isOptional() { + return( ( m_type &~ 0xfeff ) == OT_OPTIONAL ) ? sal_True : sal_False; + } + +}; ///:~ Option + +class Exception +{ + rtl::OString m_sAsciiMessage; +public: + Exception(); + virtual ~Exception(){} + + Exception(char const* sAsciiMessage); + Exception(rtl::OString const& sAsciiMessage); + + virtual rtl::OUString message() const; + virtual char const* what() const; +}; + +class ValueNotFoundException : public Exception +{ +public: + ValueNotFoundException(); + ValueNotFoundException(char const* sExit); +}; + +//: GetOpt +class GetOpt { + + rtl::OString m_prgname; + rtl::OString m_vardelim; + std::vector< rtl::OString > m_cmdline; + std::vector< rtl::OString > m_param; + std::vector< rtl::OString > m_varvec; + std::vector< OptDsc* > m_optionset; + optHashMap m_opthash; + + //> private methods + void initialize( char* cmdLine[], char const * optSet[] ); + void createCmdLineOptions(); + sal_uInt32 getMaxNameLength(); + sal_uInt32 getMaxLegendLength(); + const rtl::OString optDsc2Str( OptDsc* optDsc , sFormat frm ); + void tokenize( const rtl::OString& opt, const rtl::OString& charSet, + std::vector< rtl::OString >& optLine, sal_Bool strip = sal_True ); + ///< private methods + + GetOpt(); + GetOpt( GetOpt& ); + GetOpt& operator = ( GetOpt& ); + +public: + + //> c'tor + GetOpt( char* cmdLine[], char const * optSet[], rtl::OString varDelim = + rtl::OString( "$" ) ) + : m_vardelim( varDelim ) { + + initialize( cmdLine, optSet ); + createCmdLineOptions(); + } ///< c'tor + + //> d'tor + ~GetOpt(); + ///< d'tor + + //> inline methods + inline std::vector< rtl::OString >* getCmdLine() { return &m_cmdline; } + inline optHashMap* getOptions() { return ( &m_opthash ); } + inline rtl::OString& getName() { return m_prgname; } + inline rtl::OString& getFirstParam() { return *(m_param.begin()); } + inline std::vector< rtl::OString >& getParams() { return m_param; } + rtl::OString& getOpt( const rtl::OString& opt ); + void rmvOpt( rtl::OString& opt ) { + m_opthash.erase( opt ); + } + inline std::vector< rtl::OString >& getOptVec( const rtl::OString& opt ) { + return m_opthash[ opt ]; + } + ///< inline methods + + + sal_Bool exist( rtl::OString& opt ); + sal_Bool hasParam( std::vector< rtl::OString >::iterator iter ); + sal_Bool hasVars( void ); + sal_Bool evaluateOpt( std::vector< rtl::OString >::iterator iter ); + OptDsc* getOptDsc( rtl::OString& opt ); + sal_Bool hasOpt( const rtl::OString& opt ) const; + ::osl::FileBase::RC getIniOptions( rtl::OString iniPth ); + void createOpt( rtl::OString& optdsc ); + void str2Opt( rtl::OString iOpts ); + void addOpt( rtl::OString& opt, sal_Bool evaluate = sal_True ); + void replVars( void ); + void showUsage( void ); + void printStatus( void ); + +}; ///:~ GetOpt +#endif diff --git a/testshl2/inc/testshl/joblist.hxx b/testshl2/inc/testshl/joblist.hxx new file mode 100644 index 000000000000..3c2d0c603528 --- /dev/null +++ b/testshl2/inc/testshl/joblist.hxx @@ -0,0 +1,99 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CPPUNIT_JOBLIST_HXX +#define CPPUNIT_JOBLIST_HXX + +#include <vector> +#include <string> +#include <hash_map> +#include "sal/types.h" + +// #include <testshl/nocopy.hxx> + +/* + struct eqstr + { + bool operator()( std::string const & s1, std::string const& s2 ) const + { + return ( s1 == s2 ); + } + }; +*/ + +/* + struct hashstr + { + sal_uInt32 operator()( std::string const & str ) const + { + return str.hashCode(); + } + }; +*/ +typedef std::hash_map< std::string, int > HashMap; + +// typedef std::vector<std::string> StringList; + +#define JOB_UNKNOWN 0 +#define JOB_NOT_FOUND 1 +#define JOB_PASSED 2 +#define JOB_FAILED 3 +#define JOB_ACCESS 4 + +#define JOB_EXCLUDE_LIST 0x1000 +#define JOB_ONLY_LIST 0x1001 + +typedef sal_Int16 JobType; + +class JobList /* : NOCOPY */ +{ + HashMap m_aJobList; + char** ppsJobList; + + // returns true if the given List contains unxlngi or unxsols or wntmsci... + bool isInCurrentEnvironment(std::string const& _sString); + std::string trim(std::string const& _sStringToTrim); + +public: + JobList(); + ~JobList(); + + bool readfile(std::string const& _sFilename, JobType _nJobType); + const char** getList() const {return (const char**)ppsJobList;} + + int getJobListEntry(std::string const& _sIndexName); + void setJobListEntry(std::string const& _sIndexName, int _nValue); + + int size() {return m_aJobList.size();} + HashMap const& getHashMap() {return m_aJobList;} +}; + +#endif + diff --git a/testshl2/inc/testshl/log.hxx b/testshl2/inc/testshl/log.hxx new file mode 100644 index 000000000000..b46ec876c911 --- /dev/null +++ b/testshl2/inc/testshl/log.hxx @@ -0,0 +1,116 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************* + + Source Code Control System - Header + + $Header$ + + Source Code Control System - Update + +*************************************************************************/ +#ifndef __QADEV_REGSCAN_LOG_HXX__ +#define __QADEV_REGSCAN_LOG_HXX__ + +#include <time.h> +#include <rtl/ustring.hxx> +#include <rtl/strbuf.hxx> +#include <sal/types.h> +#include <osl/thread.h> +#include <osl/file.hxx> + +//!io #include <iostream> +#include <vector> + +// using namespace std; + + +/** + * Log derives the interface of the ::osl::File class ( is-a relation ). + * Its members (has-a relation) are the (full qualified)name of the log + * and an OStringBuffer which represents the content of the logfile. + * It provides the functionality of easy-to-use open and write logs + */ +//: Log +class Log { + + ::osl::File* m_logfile; // fileobject + rtl::OUString m_logurl; // url of log + rtl::OStringBuffer m_buf; // content of log + + Log(); + +public: + + //> c'tor + /** + * constructors argument is a full qualified UNC path + * @param OUString logfile ( full qualified UNC path ) + */ + Log( const rtl::OUString& logURL ) + : m_logfile( new ::osl::File( logURL )) + , m_logurl(logURL) + {} ///< c'tor + + //> d'tor + virtual ~Log() { + m_logfile->close(); + delete( m_logfile ); + } ///< d'tor + + //> inline methods + // returns a reference to name instance + inline rtl::OUString getLogURL() { return m_logurl; } + inline rtl::OString getName() { return rtl::OUStringToOString( + m_logurl, RTL_TEXTENCODING_ASCII_US ); } + ///< inline methods + + // open logfile for overwrite (default) or append + ::osl::FileBase::RC open( sal_Bool append = sal_False ); + ::osl::FileBase::RC close() { return m_logfile->close(); } + + + // write methods without (default) or with echo on display + ::osl::FileBase::RC write( const sal_Char* buf, sal_Bool v = sal_False ); + ::osl::FileBase::RC write( const rtl::OString& buf, + sal_Bool v = sal_False ); + // ::osl::FileBase::RC write( rtl::OStringBuffer const& buf, + // sal_Bool v = sal_False ); + ::osl::FileBase::RC write( const rtl::OUString& buf, + rtl_TextEncoding enc = RTL_TEXTENCODING_ASCII_US, + sal_Bool v = sal_False ); + +}; ///:~ Log + +Log &operator <<( Log &_aLog, const sal_Char * _sValue ); +Log &operator <<( Log &_aLog, rtl::OString const& _sValue ); +Log &operator <<( Log &_aLog, rtl::OUString const& _sValue ); +// Log &operator <<( Log &_aLog, rtl::OStringBuffer const& _sValue ); + +#endif diff --git a/testshl2/inc/testshl/nocopy.hxx b/testshl2/inc/testshl/nocopy.hxx new file mode 100644 index 000000000000..660bb1892e46 --- /dev/null +++ b/testshl2/inc/testshl/nocopy.hxx @@ -0,0 +1,13 @@ +#ifndef NOCOPY_HXX +#define NOCOPY_HXX + +// prevent illegal copies +class NOCOPY +{ + NOCOPY(NOCOPY const&); + NOCOPY& operator=(NOCOPY const&); +public: + NOCOPY(){} +}; + +#endif diff --git a/testshl2/inc/testshl/result/SynchronizedObject.h b/testshl2/inc/testshl/result/SynchronizedObject.h new file mode 100644 index 000000000000..6994fdb1692e --- /dev/null +++ b/testshl2/inc/testshl/result/SynchronizedObject.h @@ -0,0 +1,82 @@ +#ifndef CPPUNIT_SYNCHRONIZEDOBJECT_H +#define CPPUNIT_SYNCHRONIZEDOBJECT_H + +#include <cppunit/Portability.h> +#include <testshl/nocopy.hxx> + +namespace CppUnit +{ + +/*! \brief Base class for synchronized object. + * + * Synchronized object are object which members are used concurrently by mutiple + * threads. + * + * This class define the class SynchronizationObject which must be subclassed + * to implement an actual lock. + * + * Each instance of this class holds a pointer on a lock object. + * + * See src/msvc6/MfcSynchronizedObject.h for an example. + */ +class CPPUNIT_API SynchronizedObject +{ +public: + /*! \brief Abstract synchronization object (mutex) + */ + class SynchronizationObject + { + public: + SynchronizationObject() {} + virtual ~SynchronizationObject() {} + + virtual void lock() {} + virtual void unlock() {} + }; + + /*! Constructs a SynchronizedObject object. + */ + SynchronizedObject( SynchronizationObject *syncObject =0 ); + + /// Destructor. + virtual ~SynchronizedObject(); + +protected: + /*! \brief Locks a synchronization object in the current scope. + */ + class ExclusiveZone : NOCOPY + { + SynchronizationObject *m_syncObject; + + public: + ExclusiveZone( SynchronizationObject *syncObject ) + : m_syncObject( syncObject ) + { + m_syncObject->lock(); + } + + ~ExclusiveZone() + { + m_syncObject->unlock (); + } + }; + + virtual void setSynchronizationObject( SynchronizationObject *syncObject ); + +protected: + SynchronizationObject *m_syncObject; + +private: + /// Prevents the use of the copy constructor. + SynchronizedObject( const SynchronizedObject © ); + + /// Prevents the use of the copy operator. + void operator =( const SynchronizedObject © ); +}; + + + +} // namespace CppUnit + + +#endif // CPPUNIT_SYNCHRONIZEDOBJECT_H diff --git a/testshl2/inc/testshl/result/TestListener.h b/testshl2/inc/testshl/result/TestListener.h new file mode 100644 index 000000000000..0814f21b7e2f --- /dev/null +++ b/testshl2/inc/testshl/result/TestListener.h @@ -0,0 +1,62 @@ +#ifndef CPPUNIT_TESTLISTENER_H // -*- C++ -*- +#define CPPUNIT_TESTLISTENER_H + +#include <cppunit/Portability.h> + + +namespace CppUnit { + +class Exception; +class Test; +class TestFailure; + + +/*! \brief Listener for test progress and result. + * \ingroup TrackingTestExecution + * + * Implementing the Observer pattern a TestListener may be registered + * to a TestResult to obtain information on the testing progress. Use + * specialized sub classes of TestListener for text output + * (TextTestProgressListener). Do not use the Listener for the test + * result output, use a subclass of Outputter instead. + * + * The test framework distinguishes between failures and errors. + * A failure is anticipated and checked for with assertions. Errors are + * unanticipated problems signified by exceptions that are not generated + * by the framework. + * + * \see TestResult + */ +class CPPUNIT_API TestListener +{ +public: + virtual ~TestListener() {} + + /// Called when just before a TestCase is run. + virtual void startTest( Test *test ) =0 ; + + /*! Called when a failure occurs while running a test. + * \see TestFailure. + * \warning \a failure is a temporary object that is destroyed after the + * method call. Use TestFailure::clone() to create a duplicate. + */ + virtual void addFailure( const TestFailure &failure ) =0; + + /// Called just after a TestCase was run (even if a failure occured). + virtual void endTest( Test *test ) =0; + + // additional info + virtual void addInfo(Test *test, const char*) =0; + + // info in which node we are + // helper functions to create tree structures + // old: virtual void enterNode( const char* ) =0; + // old: virtual void leaveNode( const char* ) =0; +}; + + +} // namespace CppUnit + +#endif // CPPUNIT_TESTLISTENER_H + + diff --git a/testshl2/inc/testshl/result/TestResult.h b/testshl2/inc/testshl/result/TestResult.h new file mode 100644 index 000000000000..22b5d2346664 --- /dev/null +++ b/testshl2/inc/testshl/result/TestResult.h @@ -0,0 +1,123 @@ +#ifndef CPPUNIT_TESTRESULT_H +#define CPPUNIT_TESTRESULT_H + +#include <cppunit/Portability.h> + +#if CPPUNIT_NEED_DLL_DECL +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4251 ) // X needs to have dll-interface to be used by clients of class Z +#endif +#endif + +#include <testshl/result/SynchronizedObject.h> +#include <vector> +#include <string> +#include <deque> +//!io #include <iostream> + +#include "testshl/result/optionhelper.hxx" +#include "cppunit/TestFailure.h" + +class Outputter; +namespace CppUnit { + +class Exception; +class Test; +// class TestFailure; +class TestListener; + +#if CPPUNIT_NEED_DLL_DECL + template class CPPUNIT_API std::deque<TestListener *>; +#endif + +/*! \brief Manages TestListener. + * \ingroup TrackingTestExecution + * + * A single instance of this class is used when running the test. It is usually + * created by the test runner (TestRunner). + * + * This class shouldn't have to be inherited from. Use a TestListener + * or one of its subclasses to be informed of the ongoing tests. + * Use a Outputter to receive a test summary once it has finished + * + * TestResult supplies a template method 'setSynchronizationObject()' + * so that subclasses can provide mutual exclusion in the face of multiple + * threads. This can be useful when tests execute in one thread and + * they fill a subclass of TestResult which effects change in another + * thread. To have mutual exclusion, override setSynchronizationObject() + * and make sure that you create an instance of ExclusiveZone at the + * beginning of each method. + * + * \see Test, TestListener, TestResultCollector, Outputter. + */ +class CPPUNIT_API TestResult : protected SynchronizedObject +{ +protected: + OptionHelper m_aOptionHelper; + +public: + TestResult( GetOpt & _aOptions, SynchronizationObject *syncObject = 0 ); + virtual ~TestResult(); + + virtual void addListener( TestListener *listener ); + virtual void removeListener( TestListener *listener ); + + virtual void reset(); + virtual void stop(); + + virtual bool shouldStop() const; + + virtual void startTest( Test *test ); + virtual void addError( Test *test, Exception *e, ErrorType::num eType=ErrorType::ET_ERROR); + virtual void addFailure( Test *test, Exception *e ); + virtual void endTest( Test *test ); + + // LLA: additionals + virtual void addInfo(Test *test, const char *sInfo); + + virtual void enterNode(const char* Node); + virtual void leaveNode(const char* Node); + virtual std::string getNodeName(); + + // if true, execution is allowed. + virtual bool isAllowedToExecute(std::string const & sName); + bool isOnlyShowJobs() {return m_aOptionHelper.isOnlyShowJobs();} + bool isOptionWhereAmI(); + + virtual void print(Outputter &); + void setExitValue(int _nValue) {m_nExitValue = _nValue;} + int getExitValue() {return m_nExitValue;} + +protected: + void addFailure( const TestFailure &failure ); + +protected: + typedef std::deque<TestListener *> TestListeners; + TestListeners m_listeners; + bool m_stop; + + // this vector is used to expand the test name with a current node name + std::vector<std::string> m_aCurrentNodeNames; + + //# std::vector<std::string> m_aNodes; + +private: + TestResult( const TestResult &other ); + TestResult &operator =( const TestResult &other ); + int m_nExitValue; +}; + + +} // namespace CppUnit + + +#if CPPUNIT_NEED_DLL_DECL +#ifdef _MSC_VER +#pragma warning( pop ) +#endif +#endif + +#endif // CPPUNIT_TESTRESULT_H + + diff --git a/testshl2/inc/testshl/result/TestResultCollector.h b/testshl2/inc/testshl/result/TestResultCollector.h new file mode 100644 index 000000000000..ddbe517f8935 --- /dev/null +++ b/testshl2/inc/testshl/result/TestResultCollector.h @@ -0,0 +1,165 @@ +#ifndef CPPUNIT_TESTRESULTCOLLECTOR_H +#define CPPUNIT_TESTRESULTCOLLECTOR_H + +#include <cppunit/Portability.h> + +#if CPPUNIT_NEED_DLL_DECL +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4251 ) // X needs to have dll-interface to be used by clients of class Z +#endif +#endif + +#include <testshl/result/TestResult.h> +#include <testshl/result/TestSucessListener.h> +#include <deque> +#include <vector> + +namespace CppUnit +{ + + +#if CPPUNIT_NEED_DLL_DECL + template class CPPUNIT_API std::deque<TestFailure *>; + template class CPPUNIT_API std::deque<Test *>; +#endif + + +/*! \brief Collects test result. + * \ingroup WritingTestResult + * \ingroup BrowsingCollectedTestResult + * + * A TestResultCollector is a TestListener which collects the results of executing + * a test case. It is an instance of the Collecting Parameter pattern. + * + * The test framework distinguishes between failures and errors. + * A failure is anticipated and checked for with assertions. Errors are + * unanticipated problems signified by exceptions that are not generated + * by the framework. + * \see TestListener, TestFailure. + */ + +class OneStringContainer +{ + std::string m_sName; +protected: + OneStringContainer() {} +public: + OneStringContainer(std::string const& _sName) + :m_sName(_sName){} + std::string getString() const {return m_sName;} + virtual ~OneStringContainer(){} +}; + +// ----------------------------------------------------------------------------- +class TestEnvelope : public OneStringContainer +{ + Test* m_pTest; +public: + TestEnvelope():m_pTest(NULL){} + + TestEnvelope(Test* _pTest, std::string const& _sName) + : OneStringContainer(_sName), + m_pTest(_pTest) + {} + + Test* getTest() {return m_pTest;} + virtual ~TestEnvelope(){} + +}; + +// ----------------------------------------------------------------------------- +class TestInfo : public TestEnvelope +{ +public: + TestInfo(Test* _pTest, std::string const& _sName) + :TestEnvelope(_pTest, _sName) + {} +}; + +// ----------------------------------------------------------------------------- +class TestFailureEnvelope : public OneStringContainer +{ + TestFailure* m_pTestFailure; +public: + TestFailureEnvelope():m_pTestFailure(NULL){} + + TestFailureEnvelope(TestFailure* _pTestFailure, std::string const& _sName) + :OneStringContainer(_sName), + m_pTestFailure(_pTestFailure) + {} + + TestFailure* getTestFailure() {return m_pTestFailure;} + virtual ~TestFailureEnvelope(){} + +}; +// ----------------------------------------------------------------------------- + +class CPPUNIT_API TestResultCollector : public TestSucessListener +{ + TestResult* m_pResult; +public: + typedef std::deque<TestFailureEnvelope *> TestFailures; + typedef std::deque<TestEnvelope *> Tests; + typedef std::vector<TestInfo *> TestInfos; + + + /*! Constructs a TestResultCollector object. + */ + TestResultCollector( TestResult *_pResult, SynchronizationObject *syncObject = 0 ); + + /// Destructor. + virtual ~TestResultCollector(); + + void startTest( Test *test ); + void endTest( Test *test ); + + void addFailure( const TestFailure &failure ); + + virtual void reset(); + + virtual int runTests() const; + virtual int testErrors() const; + virtual int testFailures() const; + virtual int testFailuresTotal() const; + + virtual const TestFailures& failures() const; + virtual const Tests &tests() const; + virtual std::string getInfo(Test*); + + virtual void addInfo(Test *test, const char *sInfo); + + // virtual void enterNode(const char* Node); + // virtual void leaveNode(const char* Node); + +protected: + Tests m_tests; + TestFailures m_failures; + TestInfos m_aInfos; + + int m_testErrors; + + // this vector is used to expand the test name with a current node name + // std::vector<std::string> m_aCurrentNodeNames; + // std::string getNodeName(); +private: + /// Prevents the use of the copy constructor. + TestResultCollector( const TestResultCollector © ); + + /// Prevents the use of the copy operator. + void operator =( const TestResultCollector © ); +}; + + + +} // namespace CppUnit + + +#if CPPUNIT_NEED_DLL_DECL +#ifdef _MSC_VER +#pragma warning( pop ) +#endif +#endif + + +#endif // CPPUNIT_TESTRESULTCOLLECTOR_H diff --git a/testshl2/inc/testshl/result/TestSucessListener.h b/testshl2/inc/testshl/result/TestSucessListener.h new file mode 100644 index 000000000000..3eb53b9fc13f --- /dev/null +++ b/testshl2/inc/testshl/result/TestSucessListener.h @@ -0,0 +1,40 @@ +#ifndef CPPUNIT_TESTSUCESSLISTENER_H +#define CPPUNIT_TESTSUCESSLISTENER_H + +#include <testshl/result/SynchronizedObject.h> +#include <testshl/result/TestListener.h> + + +namespace CppUnit +{ + +/*! \brief TestListener that checks if any test case failed. + * \ingroup TrackingTestExecution + */ +class CPPUNIT_API TestSucessListener : public TestListener, + public SynchronizedObject +{ +public: + /*! Constructs a TestSucessListener object. + */ + TestSucessListener( SynchronizationObject *syncObject = 0 ); + + /// Destructor. + virtual ~TestSucessListener(); + + virtual void reset(); + + void addFailure( const TestFailure &failure ); + + /// Returns whether the entire test was successful or not. + virtual bool wasSuccessful() const; + +private: + bool m_sucess; +}; + + +} // namespace CppUnit + + +#endif // CPPUNIT_TESTSUCESSLISTENER_H diff --git a/testshl2/inc/testshl/result/TextTestResult.h b/testshl2/inc/testshl/result/TextTestResult.h new file mode 100644 index 000000000000..e2ba0ffba427 --- /dev/null +++ b/testshl2/inc/testshl/result/TextTestResult.h @@ -0,0 +1,62 @@ +#ifndef CPPUNIT_TEXTTESTRESULT_H +#define CPPUNIT_TEXTTESTRESULT_H + +#include <testshl/result/TestResult.h> +#include <testshl/result/TestResultCollector.h> +#include <ostream> + +class GetOpt; +namespace CppUnit { + +class SourceLine; +class Exception; +class Test; + +/*! \brief Holds printable test result (DEPRECATED). + * \ingroup TrackingTestExecution + * + * deprecated Use class TextTestProgressListener and TextOutputter instead. + */ +class CPPUNIT_API TextTestResult : public TestResult +/* public TestResultCollector*/ +{ + TestResultCollector m_aResulter; +public: + TextTestResult(GetOpt& _aOptions); + + virtual void addFailure( const TestFailure &failure ); + virtual void startTest( Test *test ); + virtual void endTest( Test *test ); + + virtual void print( std::ostream &stream ); +protected: + + virtual void printFailures( std::ostream &stream ); + virtual void printHeader( std::ostream &stream ); + + virtual void printFailure( TestFailure *failure, + int failureNumber, + std::ostream &stream ); + virtual void printFailureListMark( int failureNumber, + std::ostream &stream ); + virtual void printFailureTestName( TestFailure *failure, + std::ostream &stream ); + virtual void printFailureType( TestFailure *failure, + std::ostream &stream ); + virtual void printFailureLocation( SourceLine sourceLine, + std::ostream &stream ); + virtual void printFailureDetail( Exception *thrownException, + std::ostream &stream ); + virtual void printFailureWarning( std::ostream &stream ); + virtual void printStatistics( std::ostream &stream ); +}; + +/** insertion operator for easy output */ +std::ostream &operator <<( std::ostream &stream, + TextTestResult &result ); + +} // namespace CppUnit + +#endif // CPPUNIT_TEXTTESTRESULT_H + + diff --git a/testshl2/inc/testshl/result/callbackfunc.h b/testshl2/inc/testshl/result/callbackfunc.h new file mode 100644 index 000000000000..8ff1c7a957f4 --- /dev/null +++ b/testshl2/inc/testshl/result/callbackfunc.h @@ -0,0 +1,25 @@ +#ifndef _callbackfunc_h +#define _callbackfunc_h + +#ifdef __cplusplus +extern "C" { +#endif + + // this is the entry point from the DLL back to the executable. + sal_Int32 CallbackDispatch(int x, ...); + +//# void TestResult_startTest(hTestResult _pResult, hTest _pTest); +//# void TestResult_addFailure( hTestResult _pResult, hTest _pTest, hException _pException ); +//# void TestResult_addError( hTestResult _pResult, hTest _pTest, hException _pException ); +//# void TestResult_endTest( hTestResult _pResult, hTest _pTest ); +//# bool TestResult_shouldStop(hTestResult _pResult); +//# void TestResult_addInfo( hTestResult _pResult, hTest _pTest, const char* _sInfo ); +//# +//# void TestResult_enterNode( hTestResult _pResult, const char* _sInfo ); +//# void TestResult_leaveNode( hTestResult _pResult, const char* _sInfo ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/testshl2/inc/testshl/result/emacsTestResult.hxx b/testshl2/inc/testshl/result/emacsTestResult.hxx new file mode 100644 index 000000000000..7198ad7ce852 --- /dev/null +++ b/testshl2/inc/testshl/result/emacsTestResult.hxx @@ -0,0 +1,82 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef cppunit_emacstestresult_h +#define cppunit_emacstestresult_h + +#include <testshl/result/TestResult.h> +#include <testshl/result/TestResultCollector.h> +#include <ostream> +#include "testshl/getopt.hxx" + +class Outputter; +namespace CppUnit { + +class SourceLine; +class Exception; +class Test; + +/*! \brief Holds printable test result (DEPRECATED). + * \ingroup TrackingTestExecution + * + * deprecated Use class TextTestProgressListener and TextOutputter instead. + */ + class CPPUNIT_API emacsTestResult : public TestResult + +/* ,public TestResultCollector*/ + { + GetOpt & m_aOptions; + // OptionHelper m_aOptionHelper; + TestResultCollector m_aResulter; + + public: + emacsTestResult(GetOpt & _aOptions); + + // virtual void addFailure( const TestFailure &failure ); + // virtual void startTest( Test *test ); + // virtual void endTest( Test *test ); + + virtual void print( Outputter &stream ); + + protected: + virtual void printHeader( Outputter &stream ); + // virtual void printTestLine( Outputter &stream, Test* pTest, std::string const& _sNodeName, std::string const& _sInfo); + virtual void printFailureLine( Outputter &stream, TestFailure* pFailure, std::string const& _sNodeName ); + }; + +/** insertion operator for easy output */ +// std::ostream &operator <<( std::ostream &stream, +// emacsTestResult &result ); + +} // namespace CppUnit + +#endif // CPPUNIT_testshlTESTRESULT_H + + diff --git a/testshl2/inc/testshl/result/log.hxx b/testshl2/inc/testshl/result/log.hxx new file mode 100644 index 000000000000..fe5816a7cb17 --- /dev/null +++ b/testshl2/inc/testshl/result/log.hxx @@ -0,0 +1,106 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef __QADEV_REGSCAN_LOG_HXX__ +#define __QADEV_REGSCAN_LOG_HXX__ + +#include <time.h> +#include <rtl/ustring.hxx> +#include <rtl/strbuf.hxx> +#include <sal/types.h> +#include <osl/thread.h> +#include <osl/file.hxx> + +#include <testshl/nocopy.hxx> + +//!io #include <iostream> +#include <vector> + +// using namespace std; + + +/** + * Log derives the interface of the ::osl::File class ( is-a relation ). + * Its members (has-a relation) are the (full qualified)name of the log + * and an OStringBuffer which represents the content of the logfile. + * It provides the functionality of easy-to-use open and write logs + */ +//: Log +class Log : NOCOPY { + + ::osl::File* m_logfile; // fileobject + rtl::OUString m_logurl; // url of log + rtl::OStringBuffer m_buf; // content of log + + Log(); + +public: + + //> c'tor + /** + * constructors argument is a full qualified UNC path + * @param OUString logfile ( full qualified UNC path ) + */ + Log( const rtl::OUString& logURL ) + : m_logfile( new ::osl::File( logURL )) + , m_logurl(logURL) + {} ///< c'tor + + //> d'tor + virtual ~Log() + { + m_logfile->close(); + delete( m_logfile ); + } ///< d'tor + + //> inline methods + // returns a reference to name instance + inline rtl::OUString getLogURL() { return m_logurl; } + inline rtl::OString getName() { return rtl::OUStringToOString( + m_logurl, RTL_TEXTENCODING_ASCII_US ); } + ///< inline methods + + // open logfile for overwrite (default) or append + ::osl::FileBase::RC open( sal_Bool append = sal_False ); + ::osl::FileBase::RC close() { return m_logfile->close(); } + + + // write methods without (default) or with echo on display + ::osl::FileBase::RC write( const sal_Char* buf, sal_Bool v = sal_False ); + ::osl::FileBase::RC write( const rtl::OString& buf, + sal_Bool v = sal_False ); + //! ::osl::FileBase::RC write( rtl::OStringBuffer& buf, + //! sal_Bool v = sal_False ); + ::osl::FileBase::RC write( const rtl::OUString& buf, + rtl_TextEncoding enc = RTL_TEXTENCODING_ASCII_US, + sal_Bool v = sal_False ); + +}; ///:~ Log + +#endif diff --git a/testshl2/inc/testshl/result/optionhelper.hxx b/testshl2/inc/testshl/result/optionhelper.hxx new file mode 100644 index 000000000000..a3ae28cc4c81 --- /dev/null +++ b/testshl2/inc/testshl/result/optionhelper.hxx @@ -0,0 +1,98 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef optionhelper_hxx +#define optionhelper_hxx + +#include <string> + +#include <sal/types.h> + +#include "testshl/nocopy.hxx" +#include "testshl/getopt.hxx" +#include "testshl/joblist.hxx" + +// ----------------------------------------------------------------------------- + +typedef std::vector<rtl::OString> OStringList; + +//!? Better: OptionHelper +class OptionHelper : NOCOPY +{ + GetOpt & m_aOption; + JobList m_aJobOnlyList; + JobList m_aJobExcludeList; + OStringList m_aJobFilter; + + std::string m_sProjectId; + std::string m_sBuildId; + + std::string getProjectId() const; + std::string getBuildId() const; + std::string createDateTag(std::string const& _sProjectId, std::string const& _sBuildId); + + void handleJobs(); +public: + OptionHelper(GetOpt & _aOption) + :m_aOption(_aOption) + { + if (m_aOption.hasOpt("-projectid")) + m_sProjectId = m_aOption.getOpt("-projectid"); + + if (m_aOption.hasOpt("-buildid")) + m_sBuildId = m_aOption.getOpt("-buildid"); + + handleJobs(); + } + + static std::string integerToAscii(sal_Int32 nValue); + static std::string twoDigits(std::string const& _sValue); + + std::string createDateTag(); + bool showErrors(); + bool showTests(); + + JobList getJobOnlyList() {return m_aJobOnlyList;} + JobList getJobExcludeList() {return m_aJobExcludeList;} + + bool isAllowedToExecute(std::string const& _sNode, std::string const& _sName); + + bool isOnlyShowJobs() {return m_aOption.hasOpt("-onlyshowjobs") == sal_True ? true : false;} + GetOpt& getOptions() {return m_aOption;} + bool isVerbose() {return m_aOption.hasOpt("-verbose") == sal_True ? true : false;} + bool isOptionWhereAmI() {return m_aOption.hasOpt("-whereami") == sal_True ? true : false;} +}; + +// ----------------------------------------------------------------------------- + + +#endif + + diff --git a/testshl2/inc/testshl/result/outputter.hxx b/testshl2/inc/testshl/result/outputter.hxx new file mode 100644 index 000000000000..9ae49620201e --- /dev/null +++ b/testshl2/inc/testshl/result/outputter.hxx @@ -0,0 +1,85 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// + +#ifndef outputter_hxx +#define outputter_hxx + +#include <string> +#include <ostream> +#include <memory> +#include "testshl/log.hxx" +#include <sal/types.h> +#include "testshl/nocopy.hxx" + +// #include <fstream> + +class Outputter : NOCOPY +{ + std::auto_ptr<Log> m_pLog; + std::ostream* m_pStream; + + void writeToAll(const sal_Char* _pStr); +public: + class endl + { + char c; + public: + endl():c('\0'){} + }; +public: + Outputter(Log * _pLog ) + :m_pLog(_pLog), + m_pStream(NULL) {} + + Outputter(std::ostream& _aStream) + :m_pLog(NULL), + m_pStream(&_aStream) {} + + ~Outputter(); + + void write(const sal_Char*); + void write(std::string const&); + void write(sal_Int32); + // void write(double); +}; + +Outputter& operator <<( Outputter &stream, const sal_Char* ); +Outputter& operator <<( Outputter &stream, std::string const& ); +Outputter& operator <<( Outputter &stream, sal_Int32 ); +// Outputter& operator <<( Outputter &stream, double ); + +Outputter& operator <<( Outputter &stream, Outputter::endl const&); + +// Outputter& operator <<( Outputter &stream, const char* ); + +#endif + diff --git a/testshl2/inc/testshl/result/testshlTestResult.h b/testshl2/inc/testshl/result/testshlTestResult.h new file mode 100644 index 000000000000..22a50a9a841e --- /dev/null +++ b/testshl2/inc/testshl/result/testshlTestResult.h @@ -0,0 +1,72 @@ +#ifndef cppunit_testshltestresult_h +#define cppunit_testshltestresult_h + +#include <map> +#include <testshl/result/TestResult.h> +#include <testshl/result/TestResultCollector.h> +#include <ostream> +#include "testshl/getopt.hxx" + +class Outputter; + +namespace CppUnit { + +class SourceLine; +class Exception; +class Test; + +struct ltstr +{ + bool operator()(const CppUnit::Test* p1, const CppUnit::Test* p2) const + { + return p1 < p2; + } +}; +typedef std::map<CppUnit::Test*, bool, ltstr> TestPtrList; + + +/*! \brief Holds printable test result (DEPRECATED). + * \ingroup TrackingTestExecution + * + * deprecated Use class TextTestProgressListener and TextOutputter instead. + */ + class CPPUNIT_API testshlTestResult : public TestResult + +/* ,public TestResultCollector*/ + { + GetOpt & m_aOptions; + // OptionHelper m_aOptionHelper; + TestResultCollector m_aResulter; + + public: + testshlTestResult(GetOpt & _aOptions); + virtual ~testshlTestResult(); + + // virtual void addFailure( const TestFailure &failure ); + // virtual void startTest( Test *test ); + // virtual void endTest( Test *test ); + + virtual void print( Outputter &stream ); + + protected: + virtual void printHeader( Outputter &stream ); + + void printLines(Outputter &stream, HashMap & _aJobList); + void printFailedTests(Outputter &stream, TestPtrList &aFailedTests); + void printTestLines(Outputter &stream, TestPtrList &aFailedTests); + void printUnknownLines(Outputter &stream, HashMap & _aJobList); + + virtual void printTestLine( Outputter &stream, Test* pTest, std::string const& _sNodeName, std::string const& _sInfo); + virtual void printFailureLine( Outputter &stream, TestFailure* pFailure, std::string const& _sNodeName ); + virtual void printUnknownLine( Outputter &stream, std::string const& _sTestName); + }; + +/** insertion operator for easy output */ + Outputter &operator <<( Outputter &stream, + testshlTestResult &result ); + +} // namespace CppUnit + +#endif // CPPUNIT_testshlTESTRESULT_H + + diff --git a/testshl2/inc/testshl/signaltest.h b/testshl2/inc/testshl/signaltest.h new file mode 100644 index 000000000000..7c501bd846c1 --- /dev/null +++ b/testshl2/inc/testshl/signaltest.h @@ -0,0 +1,65 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SIGNALTEST_H +#define SIGNALTEST_H + +#include <string> +#include "cppunit/Test.h" +#include <testshl/autoregister/htestresult.h> + +namespace CppUnit +{ + +class CPPUNIT_API SignalTest : public Test +{ +public: + + SignalTest( std::string const& Name ); + + ~SignalTest(); + + virtual void run(hTestResult pResult); + virtual int countTestCases() const; + std::string getName() const; + std::string toString() const; + +private: + SignalTest( const SignalTest &other ); + SignalTest &operator=( const SignalTest &other ); + +private: + const std::string m_sName; +}; + +} // namespace CppUnit + + +#endif diff --git a/testshl2/inc/testshl/simpleheader.hxx b/testshl2/inc/testshl/simpleheader.hxx new file mode 100644 index 000000000000..5b378acafd02 --- /dev/null +++ b/testshl2/inc/testshl/simpleheader.hxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CPPUNIT_SIMPLEHEADER_HXX +#define CPPUNIT_SIMPLEHEADER_HXX + +// This file contains only the cppunit header files, for simplification. + +#include <cppunit/TestFixture.h> +#include <cppunit/TestCaller.h> +#include <cppunit/TestSuite.h> +#include <cppunit/TestAssert.h> +#include <testshl/autoregister/registertestfunction.h> +#include <cppunit/extensions/HelperMacros.h> +#include <testshl/additionalfunc.hxx> +#include <testshl/cmdlinebits.hxx> +#include <testshl/checkboom.hxx> + +#endif diff --git a/testshl2/inc/testshl/stringhelper.hxx b/testshl2/inc/testshl/stringhelper.hxx new file mode 100644 index 000000000000..60809e3d3551 --- /dev/null +++ b/testshl2/inc/testshl/stringhelper.hxx @@ -0,0 +1,42 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef STRINGHELPER_HXX +#define STRINGHELPER_HXX + +#include <rtl/ustring.hxx> +#include <rtl/string.hxx> + +inline void operator <<= (rtl::OString& _rAsciiString, const rtl::OUString& _rUnicodeString) +{ + _rAsciiString = rtl::OUStringToOString(_rUnicodeString,RTL_TEXTENCODING_ASCII_US); +} + +#endif diff --git a/testshl2/inc/testshl/taghelper.hxx b/testshl2/inc/testshl/taghelper.hxx new file mode 100644 index 000000000000..0275d0885893 --- /dev/null +++ b/testshl2/inc/testshl/taghelper.hxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef TAGHELPER_HXX +#define TAGHELPER_HXX + +#include <map> +#include <sal/types.h> +#include <testshl/nocopy.hxx> +#include <cppunit/tagvalues.hxx> + +/* Tags are a general mechanism of extensible data arrays for parameter + * specification and property inquiry. In practice, tags are used in arrays, + * or chain of arrays. + * + */ + +typedef sal_IntPtr TagData; + +//# struct TagItem +//# { +//# Tag ti_Tag; /* identifies the type of data */ +//# TagData ti_Data; /* type-specific data */ +//# }; + +/* constants for Tag.ti_Tag, control tag values */ +#define TAG_DONE (Tag(0L)) /* terminates array of TagItems. ti_Data unused */ +#define TAG_END (Tag(0L)) /* synonym for TAG_DONE */ +#define TAG_IGNORE (Tag(1L)) /* ignore this item, not end of array */ +#define TAG_MORE (Tag(2L)) /* ti_Data is pointer to another array of TagItems + * note that this tag terminates the current array + */ +#define TAG_SKIP (Tag(3L)) /* skip this and the next ti_Data items */ + +/* differentiates user tags from control tags */ +#define TAG_USER (Tag(1L<<31)) + +// ----------------------------------------------------------------------------- +class TagHelper /* : NOCOPY */ +{ + typedef std::map<Tag, TagData> TagItems; + TagItems m_aTagItems; + +public: + TagHelper(){} + void insert(Tag _nTag, TagData _nData) + { + m_aTagItems[_nTag] = _nData; + } + // const TagItems& get() const { return m_aTagItems; } + + TagData GetTagData(Tag _aTagValue, TagData _aDefaultValue = 0 /* NULL */) const + { + TagItems::const_iterator it = m_aTagItems.find(_aTagValue); + if (it != m_aTagItems.end()) + return (*it).second; + else + return _aDefaultValue; + } +}; + +#endif + + diff --git a/testshl2/inc/testshl/tresstatewrapper.h b/testshl2/inc/testshl/tresstatewrapper.h new file mode 100644 index 000000000000..5730a2126718 --- /dev/null +++ b/testshl2/inc/testshl/tresstatewrapper.h @@ -0,0 +1,66 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef TESTSTATEWRAPPER_H +#define TESTSTATEWRAPPER_H + +#ifdef _RTL_TRES_H_ +#error "This is old code, please remove the include of rtl/tres.h" +#endif + +#include <sal/types.h> +#include "testshl/autoregister/registertestfunction.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// typedef void* hTestResult; +typedef hTestResult rtlTestResult; + +// ----------------------------------------------------------------------------- +void c_rtl_tres_state_start(hTestResult _aResult, const sal_Char* _pName); +void c_rtl_tres_state_end(hTestResult _aResult, const sal_Char* _pName); + +// ----------------------------------------------------------------------------- +// the old test state function, which here convert all values for using with the +// new testshl tool + +sal_Bool SAL_CALL c_rtl_tres_state( + hTestResult pResult, + sal_Bool bSuccess, + char const * pTestMsg, + char const * pFuncName); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/testshl2/inc/testshl/tresstatewrapper.hxx b/testshl2/inc/testshl/tresstatewrapper.hxx new file mode 100644 index 000000000000..c840c1606140 --- /dev/null +++ b/testshl2/inc/testshl/tresstatewrapper.hxx @@ -0,0 +1,60 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef teststatewrapper_hxx +#define teststatewrapper_hxx + +#include <testshl/nocopy.hxx> +#include <sal/types.h> + +#include <testshl/simpleheader.hxx> +#include <cppunit/callbackfunc_fktptr.h> + +// This is a hack, because it's possible that the testshl directory doesn't exist. +#ifdef LOAD_TRESSTATEWRAPPER_LOCAL +#include "tresstatewrapper.h" +#else +#include <testshl/tresstatewrapper.h> +#endif + +// ----------------------------------------------------------------------------- +// helper class to mark the start off old test code +// the name is need in the test result generator +class rtl_tres_state_start : NOCOPY +{ + const sal_Char* m_pName; + hTestResult m_aResult; +public: + rtl_tres_state_start(hTestResult _aResult, const sal_Char* _pName); + ~rtl_tres_state_start(); +}; + +#endif + diff --git a/testshl2/inc/testshl/versionhelper.hxx b/testshl2/inc/testshl/versionhelper.hxx new file mode 100644 index 000000000000..bfba729397ba --- /dev/null +++ b/testshl2/inc/testshl/versionhelper.hxx @@ -0,0 +1,87 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef AUTOREGISTER_HXX +#define AUTOREGISTER_HXX + +#include <stdio.h> +#include <vector> +#include <ostream> +#include <iostream> + +#include <rtl/ustring.hxx> +#include <rtl/string.hxx> + +#include "dynamicregister.hxx" + +// ----------------------------------------------------------------------------- +// ---------------------------------- Version ---------------------------------- +// ----------------------------------------------------------------------------- +// extern "C" const struct VersionInfo *GetVersionInfo(); + +// this is a Hack, but at the moment, no change to handle this behaviour better. +struct VersionInfo +{ + const char* pTime; + const char* pDate; + const char* pUpd; + const char* pMinor; + const char* pBuild; + const char* pInpath; +}; +typedef const struct VersionInfo* (*FktGetVersionInfoPtr)(); + +// ----------------------------------------------------------------------------- +class VersionHelper : public DynamicLibraryHelper +{ + const VersionInfo *m_pInfo; + +public: + VersionHelper(rtl::OUString const& _sDLLName, GetOpt & _aOptions); +// void print(std::ostream& _aStream); + void printall(FILE*); + + rtl::OString getTime() const; + rtl::OString getDate() const; + rtl::OString getUpd() const; + rtl::OString getMinor() const; + rtl::OString getBuild() const; + rtl::OString getInpath() const; + + bool isOk() const; +}; + +/** insertion operator for easy output */ +// std::ostream &operator <<( std::ostream &stream, +// VersionHelper &version ); + + +#endif + diff --git a/testshl2/inc/testshl/winstuff.hxx b/testshl2/inc/testshl/winstuff.hxx new file mode 100644 index 000000000000..d50a0aa6ce42 --- /dev/null +++ b/testshl2/inc/testshl/winstuff.hxx @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef WINSTUFF_HXX +#define WINSTUFF_HXX + +#include <sal/types.h> + +// Isolated into own compilation unit, to avoid interference with +// windows headers +void WinDebugBreak(); +void WinSleep( sal_uInt32 sec ); +sal_uInt32 WinGetCurrentProcessId(); +void WinTerminateApp( sal_uInt32 dwPID, sal_uInt32 dwTimeout ); + +#endif diff --git a/testshl2/prj/build.lst b/testshl2/prj/build.lst index d7a5c76cc435..d5fed8cbfb91 100644 --- a/testshl2/prj/build.lst +++ b/testshl2/prj/build.lst @@ -1,6 +1,9 @@ -t2 testshl2 : cppunit NULL +t2 testshl2 : cppunit sal NULL t2 testshl2 usr1 - all t2_mkout NULL -t2 testshl2\inc nmake - all t2_inc NULL +t2 testshl2\inc nmake - all t2_inc NULL +t2 testshl2\source\cppunit\win32 nmake - all t2_src_cppunit_win32 t2_inc NULL +t2 testshl2\source\cppunit nmake - all t2_src_cppunit t2_src_cppunit_win32 t2_inc NULL +t2 testshl2\source\cppunit\result nmake - all t2_src_cppunit_rsult t2_inc NULL t2 testshl2\source nmake - all t2_src t2_inc NULL t2 testshl2\util nmake - all t2_util t2_src NULL diff --git a/testshl2/prj/d.lst b/testshl2/prj/d.lst index f97cec8747d6..67cc1ad8e9e7 100644 --- a/testshl2/prj/d.lst +++ b/testshl2/prj/d.lst @@ -1,23 +1,29 @@ -..\%__SRC%\bin\testshl2.exe %_DEST%\bin%_EXT%\testshl2.exe -..\%__SRC%\bin\testshl2_timeout.exe %_DEST%\bin%_EXT%\testshl2_timeout.exe -..\%__SRC%\bin\testshl2 %_DEST%\bin%_EXT%\testshl2 -..\%__SRC%\bin\testshl2_timeout %_DEST%\bin%_EXT%\testshl2_timeout -..\%__SRC%\bin\versioninfo.exe %_DEST%\bin%_EXT%\versioninfo.exe -..\%__SRC%\bin\versioninfo %_DEST%\bin%_EXT%\versioninfo +../%__SRC%/bin/testshl2.exe %_DEST%/bin%_EXT%/testshl2.exe +../%__SRC%/bin/testshl2_timeout.exe %_DEST%/bin%_EXT%/testshl2_timeout.exe +../%__SRC%/bin/testshl2 %_DEST%/bin%_EXT%/testshl2 +../%__SRC%/bin/testshl2_timeout %_DEST%/bin%_EXT%/testshl2_timeout +../%__SRC%/bin/versioninfo.exe %_DEST%/bin%_EXT%/versioninfo.exe +../%__SRC%/bin/versioninfo %_DEST%/bin%_EXT%/versioninfo -..\source\codegen\codegen.pl %_DEST%\bin%_EXT%\codegen_testshl2.pl +../source/codegen/codegen.pl %_DEST%/bin%_EXT%/codegen_testshl2.pl -mkdir: %_DEST%\inc%_EXT%\testshl -..\inc\*.hxx %_DEST%\inc%_EXT%\testshl\*.hxx -..\inc\*.h %_DEST%\inc%_EXT%\testshl\*.h +mkdir: %_DEST%/inc%_EXT%/testshl +mkdir: %_DEST%/inc%_EXT%/testshl/autoregister +mkdir: %_DEST%/inc%_EXT%/testshl/result +../inc/testshl/*.hxx %_DEST%/inc%_EXT%/testshl/*.hxx +../inc/testshl/*.h %_DEST%/inc%_EXT%/testshl/*.h +../inc/testshl/result/*.hxx %_DEST%/inc%_EXT%/testshl/result/*.hxx +../inc/testshl/result/*.h %_DEST%/inc%_EXT%/testshl/result/*.h +../inc/testshl/autoregister/*.h %_DEST%/inc%_EXT%/testshl/autoregister/*.h -..\%__SRC%\lib\cppunit.lib %_DEST%\lib%_EXT%\cppunit.lib -..\%__SRC%\lib\*.a %_DEST%\lib%_EXT%\*.a +../%__SRC%/lib/testshl2.lib %_DEST%/lib%_EXT%/testshl2.lib +../%__SRC%/lib/*.a %_DEST%/lib%_EXT%/*.a +../%__SRC%/lib/c5t_*.lib %_DEST%/lib%_EXT%/c5t_*.lib # The follows is a testshl2 selftest library, which must be delivered for tests. # But per default this library doesn't exists. # For more information see workben/selftest -..\%__SRC%\bin\delivertest.dll %_DEST%\bin%_EXT%\testshl2_deliver_test.dll -..\%__SRC%\lib\libdelivertest.so %_DEST%\lib%_EXT%\libtestshl2_deliver_test.so -..\%__SRC%\lib\libdelivertest.dylib %_DEST%\lib%_EXT%\libtestshl2_deliver_test.dylib +../%__SRC%/bin/delivertest.dll %_DEST%/bin%_EXT%/testshl2_deliver_test.dll +../%__SRC%/lib/libdelivertest.so %_DEST%/lib%_EXT%/libtestshl2_deliver_test.so +../%__SRC%/lib/libdelivertest.dylib %_DEST%/lib%_EXT%/libtestshl2_deliver_test.dylib diff --git a/testshl2/source/autoregisterhelper.cxx b/testshl2/source/autoregisterhelper.cxx index ff36ecac6db6..55dd1103861e 100644 --- a/testshl2/source/autoregisterhelper.cxx +++ b/testshl2/source/autoregisterhelper.cxx @@ -38,10 +38,10 @@ #include <rtl/ustring.hxx> -#include <cppunit/autoregister/registerfunc.h> -#include <cppunit/autoregister/callbackstructure.h> -#include <cppunit/result/callbackfunc.h> -#include <cppunit/autoregister/testfunc.h> +#include <testshl/autoregister/registerfunc.h> +#include <testshl/autoregister/callbackstructure.h> +#include <testshl/result/callbackfunc.h> +#include <testshl/autoregister/testfunc.h> #include "testshl/filehelper.hxx" FunctionList m_Functions; diff --git a/testshl2/source/codegen/codegen.pl b/testshl2/source/codegen/codegen.pl index 6e2120798fac..ab7a68397aeb 100644 --- a/testshl2/source/codegen/codegen.pl +++ b/testshl2/source/codegen/codegen.pl @@ -63,7 +63,7 @@ sub generateNewPackage(*$) open(CPPFILE, ">$sFilename") || die "can't create source file"; print CPPFILE "// autogenerated file with codegen.pl\n"; print CPPFILE "\n"; - print CPPFILE "#include <cppunit/simpleheader.hxx>\n"; + print CPPFILE "#include <testshl/simpleheader.hxx>\n"; print CPPFILE "\n"; print CPPFILE "namespace $sPackageName\n"; print CPPFILE "{\n"; diff --git a/testshl2/source/cppunit/cmdlinebits.cxx b/testshl2/source/cppunit/cmdlinebits.cxx new file mode 100644 index 000000000000..a14096ec4165 --- /dev/null +++ b/testshl2/source/cppunit/cmdlinebits.cxx @@ -0,0 +1,144 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#ifdef WNT +# define UNDER_WINDOWS_DEBUGGING +# include "testshl/winstuff.hxx" +#endif /* WNT */ + +#include <stdio.h> +#include <testshl/cmdlinebits.hxx> +#include "testshl/checkboom.hxx" + +#include <testshl/autoregister/callbackstructure.h> +#include <osl/diagnose.h> +#include <rtl/tres.h> +#include <testshl/stringhelper.hxx> + +extern CallbackStructure aGlobalStructure; + +sal_Bool isBit( CmdLineBits _nBits, CmdLineBits _nFlag ); + +// sal_Bool isBit( CmdLineBits _nBits, CmdLineBits _nFlag ) +// { +// return( ( _nBits & _nFlag ) == _nFlag ); +// } + +void CheckBoom(bool bCondition, std::string const& msg) +{ + (void) msg; // avoid warning + if ( isBit( aGlobalStructure.nBits, rtl_tres_Flag_BOOM ) ) + { + /* force an assertion on false state */ + if ( !bCondition ) { +#ifdef UNDER_WINDOWS_DEBUGGING + WinDebugBreak(); +#else + OSL_ENSURE( false, msg.c_str() ); +#endif + } + } +} + +void CheckBoom(bool bCondition, rtl::OUString const& msg) +{ + if ( isBit( aGlobalStructure.nBits, rtl_tres_Flag_BOOM ) ) + { + /* force an assertion on false state */ + rtl::OString sMessage; + sMessage <<= msg; + if ( !bCondition ) { +#ifdef UNDER_WINDOWS_DEBUGGING + WinDebugBreak(); +#else + OSL_ENSURE( false, sMessage.getStr() ); +#endif + } + } +} + +const char* getForwardString() +{ + return aGlobalStructure.psForward; +} + +// ----------------------------------------------------------------------------- +// ----------------------------- own printf method ----------------------------- +// ----------------------------------------------------------------------------- + +// bool isVerbose() +// { +// if ( isBit( aGlobalStructure.nBits, rtl_tres_Flag_VERBOSE ) ) +// { +// return true; +// } +// return false; +// } +// +// bool isQuiet() +// { +// if ( isBit( aGlobalStructure.nBits, rtl_tres_Flag_QUIET ) ) +// { +// return true; +// } +// return false; +// } +// +// void impl_t_print(const char* _pFormatStr, va_list &args) +// { +// if (! isQuiet()) +// { +// printf("# "); +// vprintf(_pFormatStr, args); +// } +// } +// +// void t_print(const char* _pFormatStr, ...) +// { +// va_list args; +// va_start( args, _pFormatStr ); +// impl_t_print(_pFormatStr, args); +// va_end( args ); +// } +// +// void t_print(T_Print_Params _eType, const char* _pFormatStr, ...) +// { +// if (_eType == T_VERBOSE && isVerbose()) +// { +// // if T_VERBOSE and we should be verbose, print info +// va_list args; +// va_start( args, _pFormatStr ); +// impl_t_print(_pFormatStr, args); +// va_end( args ); +// } +// } diff --git a/testshl2/source/cppunit/joblist.cxx b/testshl2/source/cppunit/joblist.cxx new file mode 100644 index 000000000000..1144f542ab0e --- /dev/null +++ b/testshl2/source/cppunit/joblist.cxx @@ -0,0 +1,224 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdlib.h> +#include <stdio.h> +#include <fstream> +#include <rtl/string.hxx> +#include "testshl/joblist.hxx" + +#define C_SEPARATOR_LIST " \t,;:#" +JobList::JobList() + :ppsJobList(NULL) +{} + +// ----------------------------------------------------------------------------- +bool JobList::isInCurrentEnvironment(std::string const& _sString) +{ + int nSpace = 0; + std::string sSearchString = _sString; + bool bEnd = false; + // run through the hole given string, + std::string sEnv; + + do { + nSpace = sSearchString.find_first_of(C_SEPARATOR_LIST); + if (nSpace < 0) + { + sEnv = sSearchString; + bEnd = true; + } + else + { + sEnv = sSearchString.substr(0, nSpace); + sSearchString = sSearchString.substr(nSpace + 1); + } + if (sEnv.length() > 0) + { + // cout << sEnv << endl; +#ifdef LINUX + int nLinux = sEnv.find("unxlng"); + if (nLinux >= 0) + { + // found unxlng + return true; + } +#endif +#ifdef SOLARIS + int nSolaris = sEnv.find("unxsol"); + if (nSolaris >= 0) + { + // found unxsol + return true; + } +#endif +#ifdef WNT + int nWindows = sEnv.find("wnt"); + if (nWindows >= 0) + { + // found wnt + return true; + } +#endif + } + } while ( !bEnd ); + return false; +} + +std::string JobList::trim(std::string const& _sStringToTrim) +{ + rtl::OString sStr(_sStringToTrim.c_str()); + sStr = sStr.trim(); + return std::string(sStr.getStr()); +} + +// ----------------------------------------------------------------------------- +bool JobList::readfile(std::string const& _sFilename, JobType _nJobType) +{ + // StringList aJobList; + m_aJobList.clear(); + + std::ifstream in(_sFilename.c_str(), std::ios::in); + + if (!in) + { + // fprintf(stderr, "warning: Can't open job file: %s\n", _sFilename.c_str()); + return false; + } + else + { + if (_nJobType == JOB_EXCLUDE_LIST) + { + fprintf(stderr, "warning: There exist a job exclusion list file: %s\n", _sFilename.c_str()); + } + + // std::cout << "Check for signal" << std::endl; + std::string sLine; + while (std::getline(in, sLine)) + { + if (sLine.size() > 0) + { + char ch = sLine[0]; + if (ch != '#' && + isspace(ch) == 0) + { + sLine = trim(sLine); + + // m_aJobList.push_back( sLine ); + int nSpace = sLine.find_first_of(C_SEPARATOR_LIST); + if (nSpace < 0) + { + m_aJobList[sLine] = JOB_UNKNOWN; + } + else + { + // found a separator + std::string sTest = sLine.substr(0, nSpace); + std::string sRest = sLine.substr(nSpace + 1); + if (isInCurrentEnvironment(sRest)) + { + m_aJobList[sTest] = JOB_UNKNOWN; + } + } + } + } + } + + // inclusion list +/* + int nSize = m_aJobList.size(); + + ppsJobList = (char**) malloc((nSize + 1) * sizeof(char*)); + + int nIdx = 0; + StringList::const_iterator aItEnd = m_aJobList.end(); + for(StringList::const_iterator it = m_aJobList.begin(); + it != aItEnd; ++it) + { + std::string sValue = *it; + char* psTestFkt = (char*) malloc(sValue.size() + 1); + strcpy(psTestFkt, sValue.c_str()); + ppsJobList[nIdx] = psTestFkt; + ++nIdx; + } + + ppsJobList[nIdx] = NULL; +*/ + } + return true; +} + +// ----------------------------------------------------------------------------- +int JobList::getJobListEntry(std::string const& _sIndexName) +{ + if (m_aJobList.find(_sIndexName) != m_aJobList.end()) + { + return m_aJobList[_sIndexName]; + } + return JOB_NOT_FOUND; +} + +// ----------------------------------------------------------------------------- +void JobList::setJobListEntry(std::string const& _sIndexName, int _nValue) +{ + // if (m_aJobList.find(_sIndexName) == m_aJobList.end()) + // { + m_aJobList[_sIndexName] = _nValue; + // } + // else + // { + // fprintf(stderr, "error: test function '%s' already exist.\n", _sIndexName); + // } +} + +// ----------------------------------------------------------------------------- +JobList::~JobList() +{ + int nIdx = 0; + if (ppsJobList) + { + while(ppsJobList[nIdx] != NULL) + { + free(ppsJobList[nIdx]); + ++nIdx; + } + free(ppsJobList); + } +} +// ----------------------------------------------------------------------------- +/* + bool JobList::checkFilter(JobList m_aJobFilter, std::string const& _sNodeName, std::string const& _sName) + { + std::string sFilter = m_aJobFilter.m_aJobList.begin(); + } +*/ diff --git a/testshl2/source/cppunit/makefile.mk b/testshl2/source/cppunit/makefile.mk new file mode 100644 index 000000000000..6a6d913f6140 --- /dev/null +++ b/testshl2/source/cppunit/makefile.mk @@ -0,0 +1,103 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile$ +# +# $Revision$ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=testshl2 +TARGET=testshl2 +LIBTARGET=NO +ENABLE_EXCEPTIONS=TRUE +# ENABLE_RTTI=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# --- Files -------------------------------------------------------- + +# CXXFILES = \ +# querytemplate.cxx \ +# stringhelper.cxx + +# ENVCFLAGSCXX+=-DCPPUNIT_BUILD_DLL + +CPPUNIT_TESTSHL_SLOFILES = \ + $(SLO)$/joblist.obj \ + $(SLO)$/t_print.obj \ + $(SLO)$/signaltest.obj + +CPPUNIT_STATIC_SOLFILES = \ + $(SLO)$/cmdlinebits.obj \ + $(SLO)$/tresregister.obj \ + $(SLO)$/tresstatewrapper.obj \ + $(SLO)$/registertestfunction.obj + + +SLOFILES = \ + $(CPPUNIT_TESTSHL_SLOFILES) \ + $(CPPUNIT_STATIC_SOLFILES) +#------------------------------------------------------------------------------- +# This is statically cppunit library +LIB1TARGET= $(LB)$/$(TARGET).lib +LIB1OBJFILES= \ + $(SLOFILES) + +.IF "$(GUI)"=="WNT" +.IF "$(COM)"=="GCC" +LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a +.ENDIF +LIB1FILES=$(LB)$/c5t_winstuff.lib +.ENDIF + +.IF "$(GUI)" == "UNX" +LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a +.ENDIF + +#------------------------------------------------------------------------------- +TARGET2=c5t_no_regallfkt +LIB2TARGET= $(LB)$/$(TARGET2).lib +LIB2OBJFILES= \ + $(CPPUNIT_TESTSHL_SLOFILES) + +.IF "$(GUI)"=="WNT" +.IF "$(COM)"=="GCC" +LIB2ARCHIV=$(LB)$/lib$(TARGET2)$(DLLPOSTFIX).a +.ENDIF +.ENDIF + +.IF "$(GUI)" == "UNX" +LIB2ARCHIV=$(LB)$/lib$(TARGET2)$(DLLPOSTFIX).a +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/testshl2/source/cppunit/registertestfunction.cxx b/testshl2/source/cppunit/registertestfunction.cxx new file mode 100644 index 000000000000..91cf016d2318 --- /dev/null +++ b/testshl2/source/cppunit/registertestfunction.cxx @@ -0,0 +1,60 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdlib.h> +#include <testshl/simpleheader.hxx> +#include <testshl/additionalfunc.hxx> + +extern "C" void SAL_CALL testAllRegisteredFunctions(hTestResult _pResult) +{ + CppUnit::TestFactoryRegistry::testRegistries(_pResult); + // CppUnit::Test* tp = CppUnit::TestFactoryRegistry::getRegistry("rtl_OUString").makeTest(); + // tp->run(pResult); +} + +// ----------------------------------------------------------------------------- +// ---------------------------- RegisterTestFunctions ---------------------------- +// ----------------------------------------------------------------------------- + +extern "C" void SAL_CALL RegisterTestFunctions(FktRegFuncPtr _pFunc) +{ + if (_pFunc) + { + (_pFunc)(&testAllRegisteredFunctions, ""); + } + else + { + // error, FktRegFuncPtr not given + } + RegisterAdditionalFunctions(_pFunc); +} diff --git a/testshl2/source/cppunit/result/SynchronizedObject.cpp b/testshl2/source/cppunit/result/SynchronizedObject.cpp new file mode 100644 index 000000000000..fac37f45c09b --- /dev/null +++ b/testshl2/source/cppunit/result/SynchronizedObject.cpp @@ -0,0 +1,35 @@ +#include <testshl/result/SynchronizedObject.h> + + +namespace CppUnit +{ + + + + +SynchronizedObject::SynchronizedObject( SynchronizationObject *syncObject ) + : m_syncObject( syncObject == 0 ? new SynchronizationObject() : + syncObject ) +{ +} + + +SynchronizedObject::~SynchronizedObject() +{ + delete m_syncObject; +} + + +/** Accept a new synchronization object for protection of this instance + * TestResult assumes ownership of the object + */ +void +SynchronizedObject::setSynchronizationObject( SynchronizationObject *syncObject ) +{ + delete m_syncObject; + m_syncObject = syncObject; +} + + +} // namespace CppUnit + diff --git a/testshl2/source/cppunit/result/TestResult.cpp b/testshl2/source/cppunit/result/TestResult.cpp new file mode 100644 index 000000000000..576dfc862118 --- /dev/null +++ b/testshl2/source/cppunit/result/TestResult.cpp @@ -0,0 +1,261 @@ +#include <cppunit/TestFailure.h> +#include <testshl/result/TestListener.h> +#include "testshl/getopt.hxx" +#include <testshl/result/TestResult.h> +#include <algorithm> +#include "testshl/result/outputter.hxx" +#include <cppunit/Test.h> +#include <testshl/cmdlinebits.hxx> + +namespace CppUnit { + +/// Construct a TestResult +TestResult::TestResult( GetOpt &_pOptions, SynchronizationObject *syncObject ) + : SynchronizedObject( syncObject ), + m_aOptionHelper(_pOptions), + m_nExitValue(0) +{ + reset(); +} + + +/// Destroys a test result +TestResult::~TestResult() +{ +} + + +/** Resets the result for a new run. + * + * Clear the previous run result. + */ +void +TestResult::reset() +{ + ExclusiveZone zone( m_syncObject ); + m_stop = false; +} + + +/** Adds an error to the list of errors. + * The passed in exception + * caused the error + */ +void +TestResult::addError( Test *test, + Exception *e, ErrorType::num _eType ) +{ + TestFailure aTestFailure( test, e, _eType ); + addFailure( aTestFailure ); +} + + +/** Adds a failure to the list of failures. The passed in exception + * caused the failure. + */ +void +TestResult::addFailure( Test *test, Exception *e ) +{ + TestFailure aTestFailure( test, e, ErrorType::ET_FAILURE ); + addFailure( aTestFailure ); +} + + +/** Called to add a failure to the list of failures. + */ +void +TestResult::addFailure( const TestFailure &failure ) +{ + ExclusiveZone zone( m_syncObject ); + + // LLA: + // this set the global returnvalue, due to the fact, there occurs a failure, we have to return a non zero value + // at the moment this seams to be a good place. + setExitValue(1); + + for ( TestListeners::iterator it = m_listeners.begin(); + it != m_listeners.end(); + ++it ) + { + TestListener *pListener = *it; + pListener->addFailure( failure ); + } +} + + +/// Informs the result that a test will be started. +void +TestResult::startTest( Test *test ) +{ + ExclusiveZone zone( m_syncObject ); + if (m_aOptionHelper.isVerbose()) + { + std::string aStr; + if (test) + { + aStr = getNodeName(); + aStr += "."; + aStr += test->getName(); + } + // fprintf(stderr, "Start test: %s\n", aStr.c_str()); + t_print( T_VERBOSE, "Start test: %s\n", aStr.c_str()); + } + + for ( TestListeners::iterator it = m_listeners.begin(); + it != m_listeners.end(); + ++it ) + { + TestListener *pListener = *it; + pListener->startTest( test ); + } +} + + +/// Informs the result that a test was completed. +void +TestResult::endTest( Test *test ) +{ + ExclusiveZone zone( m_syncObject ); + for ( TestListeners::iterator it = m_listeners.begin(); + it != m_listeners.end(); + ++it ) + { + TestListener *pListener = *it; + pListener->endTest( test ); + } +} + + +/// Returns whether testing should be stopped +bool +TestResult::shouldStop() const +{ + ExclusiveZone zone( m_syncObject ); + return m_stop; +} + + +/// Stop testing +void +TestResult::stop() +{ + ExclusiveZone zone( m_syncObject ); + m_stop = true; +} + + +void +TestResult::addListener( TestListener *listener ) +{ + ExclusiveZone zone( m_syncObject ); + m_listeners.push_back( listener ); +} + + +void +TestResult::removeListener ( TestListener *listener ) +{ + ExclusiveZone zone( m_syncObject ); +#if defined(_MSC_VER) && (_MSC_VER >=1400) + m_listeners.erase( remove( m_listeners.begin(), +#else + m_listeners.erase( std::remove( m_listeners.begin(), +#endif + m_listeners.end(), + listener ), + m_listeners.end()); +} + +void +TestResult::addInfo(Test *test, const char* _aStr) +{ + ExclusiveZone zone( m_syncObject ); + for ( TestListeners::iterator it = m_listeners.begin(); + it != m_listeners.end(); + ++it ) + { + TestListener *pListener = *it; + pListener->addInfo( test, _aStr ); + } +} + +// old: void +// old: TestResult::enterNode(const char* _aStr) +// old: { +// old: ExclusiveZone zone( m_syncObject ); +// old: for ( TestListeners::iterator it = m_listeners.begin(); +// old: it != m_listeners.end(); +// old: ++it ) +// old: { +// old: TestListener *pListener = *it; +// old: pListener->enterNode( _aStr ); +// old: } +// old: } +// old: +// old: void +// old: TestResult::leaveNode(const char* _aStr) +// old: { +// old: ExclusiveZone zone( m_syncObject ); +// old: +// old: for ( TestListeners::iterator it = m_listeners.begin(); +// old: it != m_listeners.end(); +// old: ++it ) +// old: { +// old: TestListener *pListener = *it; +// old: pListener->leaveNode( _aStr ); +// old: } +// old: } + +void TestResult::enterNode(const char* _sNode) +{ + ExclusiveZone zone( m_syncObject ); + m_aCurrentNodeNames.push_back(std::string(_sNode)); +} + +void TestResult::leaveNode(const char* /*_sNode*/) +{ + ExclusiveZone zone( m_syncObject ); + std::string sBack = m_aCurrentNodeNames.back(); + m_aCurrentNodeNames.pop_back(); + + // due to a -Wall warning, comment out. + // if (sBack != std::string(_sNode)) + // { + // volatile int dummy = 0; + // // problem?! + // } +} + +std::string TestResult::getNodeName() +{ + std::string sName; + for (std::vector<std::string>::const_iterator it = m_aCurrentNodeNames.begin(); + it != m_aCurrentNodeNames.end(); + ++it) + { + if (sName.size() != 0) + { + sName += "."; + } + sName += *it; + } + return sName; +} + +// ----------------------------------------------------------------------------- +bool TestResult::isAllowedToExecute(std::string const& _sName) +{ + return m_aOptionHelper.isAllowedToExecute(getNodeName(), _sName); +} +// ----------------------------------------------------------------------------- +bool TestResult::isOptionWhereAmI() +{ + return m_aOptionHelper.isOptionWhereAmI(); +} + +// ----------------------------------------------------------------------------- +void TestResult::print(Outputter&) +{ +} + +} // namespace CppUnit diff --git a/testshl2/source/cppunit/result/TestResultCollector.cpp b/testshl2/source/cppunit/result/TestResultCollector.cpp new file mode 100644 index 000000000000..da39f0f121e9 --- /dev/null +++ b/testshl2/source/cppunit/result/TestResultCollector.cpp @@ -0,0 +1,147 @@ +#include <cppunit/TestFailure.h> +#include <testshl/result/TestResultCollector.h> + + +namespace CppUnit +{ + + +TestResultCollector::TestResultCollector( TestResult* _pResult, SynchronizationObject *syncObject ) + : TestSucessListener( syncObject ), + m_pResult(_pResult), + m_testErrors(0) +{ + reset(); +} + + +TestResultCollector::~TestResultCollector() +{ + TestFailures::iterator itFailure = m_failures.begin(); + while ( itFailure != m_failures.end() ) + { + TestFailureEnvelope *pEnvelope = *itFailure++; + TestFailure *pFailure = pEnvelope->getTestFailure(); + delete pFailure; + } +} + + +void +TestResultCollector::reset() +{ + TestSucessListener::reset(); + + ExclusiveZone zone( m_syncObject ); + m_testErrors = 0; + m_tests.clear(); + m_failures.clear(); +} + + +void +TestResultCollector::startTest( Test *test ) +{ + ExclusiveZone zone (m_syncObject); + + m_tests.push_back( new TestEnvelope(test, m_pResult->getNodeName()) ); +} + +void +TestResultCollector::endTest( Test * ) +{ + // ExclusiveZone zone (m_syncObject); + // Nothing! +} + + +void +TestResultCollector::addFailure( const TestFailure &failure ) +{ + TestSucessListener::addFailure( failure ); + + ExclusiveZone zone( m_syncObject ); + if ( failure.isError() ) + ++m_testErrors; + m_failures.push_back( new TestFailureEnvelope(failure.clone(), m_pResult->getNodeName()) ); +} + + +/// Gets the number of run tests. +int +TestResultCollector::runTests() const +{ + ExclusiveZone zone( m_syncObject ); + return m_tests.size(); +} + + +/// Gets the number of detected errors (uncaught exception). +int +TestResultCollector::testErrors() const +{ + ExclusiveZone zone( m_syncObject ); + return m_testErrors; +} + + +/// Gets the number of detected failures (failed assertion). +int +TestResultCollector::testFailures() const +{ + ExclusiveZone zone( m_syncObject ); + return m_failures.size() - m_testErrors; +} + + +/// Gets the total number of detected failures. +int +TestResultCollector::testFailuresTotal() const +{ + ExclusiveZone zone( m_syncObject ); + return m_failures.size(); +} + + +/// Returns a the list failures (random access collection). +const TestResultCollector::TestFailures & +TestResultCollector::failures() const +{ + ExclusiveZone zone( m_syncObject ); + return m_failures; +} + + +const TestResultCollector::Tests & +TestResultCollector::tests() const +{ + ExclusiveZone zone( m_syncObject ); + return m_tests; +} + +void TestResultCollector::addInfo(Test *_pTest, const char* _sInfo) +{ + ExclusiveZone zone( m_syncObject ); + m_aInfos.push_back(new TestInfo(_pTest, _sInfo)); +} + +std::string TestResultCollector::getInfo(Test *_pTest) +{ + for (TestInfos::const_iterator it = m_aInfos.begin(); + it != m_aInfos.end(); + ++it) + { + TestInfo *pInfo = *it; + Test *pTest = pInfo->getTest(); + if (pTest == _pTest) + { + std::string sInfo = pInfo->getString(); + return sInfo; + } + } + return std::string(); +} + + +} // namespace CppUnit + diff --git a/testshl2/source/cppunit/result/TestSucessListener.cpp b/testshl2/source/cppunit/result/TestSucessListener.cpp new file mode 100644 index 000000000000..8efdc0e5c28e --- /dev/null +++ b/testshl2/source/cppunit/result/TestSucessListener.cpp @@ -0,0 +1,46 @@ +#include <testshl/result/TestSucessListener.h> + + + +namespace CppUnit +{ + + +TestSucessListener::TestSucessListener( SynchronizationObject *syncObject ) + : SynchronizedObject( syncObject ) + , m_sucess( true ) +{ +} + + +TestSucessListener::~TestSucessListener() +{ +} + + +void +TestSucessListener::reset() +{ + ExclusiveZone zone( m_syncObject ); + m_sucess = true; +} + + +void +TestSucessListener::addFailure( const TestFailure & ) +{ + ExclusiveZone zone( m_syncObject ); + m_sucess = false; +} + + +bool +TestSucessListener::wasSuccessful() const +{ + ExclusiveZone zone( m_syncObject ); + return m_sucess; +} + + +} // namespace CppUnit + diff --git a/testshl2/source/cppunit/result/TextTestResult.cpp b/testshl2/source/cppunit/result/TextTestResult.cpp new file mode 100644 index 000000000000..eddda846c221 --- /dev/null +++ b/testshl2/source/cppunit/result/TextTestResult.cpp @@ -0,0 +1,191 @@ +#include <cppunit/Exception.h> +#include <cppunit/NotEqualException.h> +#include <cppunit/Test.h> +#include <cppunit/TestFailure.h> +#include <testshl/result/TextTestResult.h> +// #include <TextTestResult.h> +//!io #include <iostream> + +namespace CppUnit { + + +TextTestResult::TextTestResult(GetOpt& _aOptions) + :TestResult(_aOptions), + m_aResulter(this) +{ + addListener( &m_aResulter ); +} + + +void +TextTestResult::addFailure( const TestFailure &failure ) +{ + TestResult::addFailure( failure ); + // std::cerr << ( failure.isError() ? "E" : "F" ); + if (failure.isError()) + fprintf(stderr, "E"); + else + fprintf(stderr, "F"); +} + + +void +TextTestResult::startTest( Test *test ) +{ + TestResult::startTest (test); + // std::cerr << "."; + fprintf(stderr, "."); +} + +void TextTestResult::endTest( Test *test ) +{ + TestResult::endTest (test); +} + + +void +TextTestResult::printFailures( std::ostream &stream ) +{ + TestResultCollector::TestFailures::const_iterator itFailure = m_aResulter.failures().begin(); + int failureNumber = 1; + while ( itFailure != m_aResulter.failures().end() ) + { + stream << std::endl; + TestFailure *pFailure= (*itFailure++)->getTestFailure(); + printFailure( pFailure, failureNumber++, stream ); + } +} + + +void +TextTestResult::printFailure( TestFailure *failure, + int failureNumber, + std::ostream &stream ) +{ + printFailureListMark( failureNumber, stream ); + stream << ' '; + printFailureTestName( failure, stream ); + stream << ' '; + printFailureType( failure, stream ); + stream << ' '; + printFailureLocation( failure->sourceLine(), stream ); + stream << std::endl; + printFailureDetail( failure->thrownException(), stream ); + stream << std::endl; +} + + +void +TextTestResult::printFailureListMark( int failureNumber, + std::ostream &stream ) +{ + stream << failureNumber << ")"; +} + + +void +TextTestResult::printFailureTestName( TestFailure *failure, + std::ostream &stream ) +{ + Test* pTest = failure->failedTest(); + stream << "test: " << pTest->getName(); +} + + +void +TextTestResult::printFailureType( TestFailure *failure, + std::ostream &stream ) +{ + stream << "(" + << (failure->isError() ? "E" : "F") + << ")"; +} + + +void +TextTestResult::printFailureLocation( SourceLine sourceLine, + std::ostream &stream ) +{ + if ( !sourceLine.isValid() ) + return; + + stream << "line: " << sourceLine.lineNumber() + << ' ' << sourceLine.fileName(); +} + + +void +TextTestResult::printFailureDetail( Exception *thrownException, + std::ostream &stream ) +{ + if ( thrownException->isInstanceOf( NotEqualException::type() ) ) + { + NotEqualException *e = (NotEqualException*)thrownException; + stream << "expected: " << e->expectedValue() << std::endl + << "but was: " << e->actualValue(); + if ( !e->additionalMessage().empty() ) + { + stream << std::endl; + stream << "additional message:" << std::endl + << e->additionalMessage(); + } + } + else + { + stream << " \"" << thrownException->what() << "\""; + } +} + + +void +TextTestResult::print( std::ostream& stream ) +{ + printHeader( stream ); + stream << std::endl; + printFailures( stream ); +} + + +void +TextTestResult::printHeader( std::ostream &stream ) +{ + if (m_aResulter.wasSuccessful ()) + stream << std::endl << "OK (" << m_aResulter.runTests () << " tests)" + << std::endl; + else + { + stream << std::endl; + printFailureWarning( stream ); + printStatistics( stream ); + } +} + + +void +TextTestResult::printFailureWarning( std::ostream &stream ) +{ + stream << "!!!FAILURES!!!" << std::endl; +} + + +void +TextTestResult::printStatistics( std::ostream &stream ) +{ + stream << "Test Results:" << std::endl; + + stream << "Run: " << m_aResulter.runTests() + << " Failures: " << m_aResulter.testFailures() + << " Errors: " << m_aResulter.testErrors() + << std::endl; +} + + +std::ostream & +operator <<( std::ostream &stream, + TextTestResult &result ) +{ + result.print (stream); return stream; +} + + +} // namespace CppUnit diff --git a/testshl2/source/cppunit/result/emacsTestResult.cxx b/testshl2/source/cppunit/result/emacsTestResult.cxx new file mode 100644 index 000000000000..70d4c500ce92 --- /dev/null +++ b/testshl2/source/cppunit/result/emacsTestResult.cxx @@ -0,0 +1,193 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdlib.h> + +#include <map> +#include <cppunit/Exception.h> +#include <cppunit/NotEqualException.h> +#include <cppunit/Test.h> +#include <cppunit/TestFailure.h> +#include <testshl/result/emacsTestResult.hxx> +// #include <TextTestResult.h> +//!io #include <iostream> +#include <string> + +#include <rtl/string.hxx> +#include "testshl/result/outputter.hxx" + +namespace CppUnit { + + emacsTestResult::emacsTestResult(GetOpt & _aOptions) + :TestResult(_aOptions), + m_aOptions(_aOptions), + m_aResulter(this) + { + addListener( &m_aResulter ); + } + + //# struct ltstr + //# { + //# bool operator()(const CppUnit::Test* p1, const CppUnit::Test* p2) const + //# { + //# return p1 < p2; + //# } + //# }; + //# typedef std::map<CppUnit::Test*, bool, ltstr> TestPtrList; + + void + emacsTestResult::print( Outputter& stream ) + { + printHeader( stream ); + // stream << std::endl; + // printFailures( stream ); + + // TestPtrList aFailedTests; + + for (TestResultCollector::TestFailures::const_iterator it2 = m_aResulter.failures().begin(); + it2 != m_aResulter.failures().end(); + ++it2) + { + TestFailureEnvelope *pEnvelop = *it2; + TestFailure *pFailure = pEnvelop->getTestFailure(); + std::string sNodeName = pEnvelop->getString(); + + // aFailedTests[ pFailure->failedTest() ] = true; + + printFailureLine(stream, pFailure, sNodeName); + } + + // only errors are from interest here + //# for (TestResultCollector::Tests::const_iterator it = m_aResulter.tests().begin(); + //# it != m_aResulter.tests().end(); + //# ++it) + //# { + //# TestEnvelope *pEnvelop = *it; + //# Test* pTest = pEnvelop->getTest(); + //# std::string sNodeName = pEnvelop->getString(); + //# + //# if (aFailedTests.find(pTest) == aFailedTests.end()) + //# { + //# std::string sInfo = m_aResulter.getInfo(pTest); + //# printTestLine(stream, pTest, sNodeName, sInfo); + //# } + //# } + stream << "Test #PASSED#" << Outputter::endl(); + } + + + void + emacsTestResult::printHeader( Outputter &stream ) + { + std::string sDate(m_aOptionHelper.createDateTag()); + stream << sDate << Outputter::endl(); + } + + void + emacsTestResult::printFailureLine( Outputter &stream, TestFailure *_pFailure, std::string const& _sNodeName) + { + std::string aName; + aName += _sNodeName; + aName += "."; + aName += _pFailure->failedTestName(); + + SourceLine aLine = _pFailure->sourceLine(); + sal_Int32 nLine = -1; + std::string sFilename; + if (aLine.isValid()) + { + nLine = aLine.lineNumber(); + sFilename = aLine.fileName(); + } + + Exception *pExp = _pFailure->thrownException(); + std::string sWhat; + if (pExp) + { + sWhat = pExp->what(); + } + + stream << sFilename; + stream << ":"; + stream << nLine; + stream << ":"; + + stream << aName; + stream << ";#FAILED#"; + // ErrorType::num eErr = _pFailure->getErrorType(); + //# if (isErr) + //# stream << "FAILED#;"; + //# else + //# stream << "ERROR#;"; + + stream << sWhat; + stream << Outputter::endl(); + } + + //# void + //# emacsTestResult::printTestLine( Outputter &stream, Test* _pTest, std::string const& _sNodeName, std::string const& _sInfo) + //# { + //# std::string aName; + //# aName += _sNodeName; + //# aName += "."; + //# aName += _pTest->getName(); + //# + //# stream << aName; + //# stream << ";"; + //# stream << _sInfo << "#"; + //# stream << "OK#"; + //# stream << std::endl; + //# } + + +//# void +//# emacsTestResult::printStatistics( Outputter &stream ) +//# { +//# stream << "Test Results:" << std::endl; +//# +//# stream << "Run: " << runTests() +//# << " Failures: " << testFailures() +//# << " Errors: " << testErrors() +//# << std::endl; +//# } + + + Outputter & + operator <<( Outputter &stream, + emacsTestResult &result ) + { + result.print (stream); return stream; + } + + +} // namespace CppUnit diff --git a/testshl2/source/cppunit/result/log.cxx b/testshl2/source/cppunit/result/log.cxx new file mode 100644 index 000000000000..e15c2bfe23c0 --- /dev/null +++ b/testshl2/source/cppunit/result/log.cxx @@ -0,0 +1,125 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include "testshl/log.hxx" + +// #include <hash_map> +// #include <list> +// #include <set> + +using namespace std; + +::osl::FileBase::RC Log::open( sal_Bool append ) { + + ::osl::FileBase::RC ret; + + if ( ! append ) { + ret = ::osl::File::remove( m_logurl ); + } + + if( m_logfile->open( OpenFlag_Write ) == ::osl::FileBase::E_NOENT ) { + ret = m_logfile->open( OpenFlag_Write | OpenFlag_Create ); + } + else { + ret = m_logfile->setPos( Pos_End, 0 ); + } + return ret; +} + +::osl::FileBase::RC Log::write( const sal_Char* buf, sal_Bool v ) { + sal_uInt64 uBytes=0; + sal_uInt32 len = 0; + const sal_Char* ptr = buf; + + if( ptr ) { + while( *ptr++ ) len++; + } + + if ( v ) { + // cout << buf << flush; + printf("%s", buf); + } + return m_logfile->write( buf, len , uBytes ); +} + +::osl::FileBase::RC Log::write( const rtl::OString& buf, sal_Bool v ) { + sal_uInt64 uBytes=0; + if ( v ) { + // cout << buf.getStr() << flush; + printf("%s", buf.getStr()); + } + return m_logfile->write( buf.getStr(), buf.getLength(), uBytes ); +} +/* +// LLA: due to a problem with sal/OUStingBuffer getLength() which isn't const, this +// is so not compilable. +::osl::FileBase::RC Log::write( rtl::OStringBuffer const& buf, sal_Bool v ) { + sal_uInt64 uBytes=0; + if ( v ) { + cout << buf.getStr() << flush; + } + return m_logfile->write( buf.getStr(), buf.getLength(), uBytes ); +} +*/ +::osl::FileBase::RC Log::write( const rtl::OUString& buf, + rtl_TextEncoding tenc, sal_Bool v ) { + sal_uInt64 uBytes=0; + if ( ! tenc ) { + tenc = RTL_TEXTENCODING_ASCII_US; + } + rtl::OStringBuffer osbuf( + rtl::OUStringToOString( buf, tenc ).getStr() ); + + if ( v ) { + // cout << osbuf.getStr() << flush; + printf("%s", osbuf.getStr()); + } + return m_logfile->write( osbuf.getStr(), osbuf.getLength(), uBytes ); +} + +Log &operator <<( Log &_aLog, const sal_Char * _sValue ) +{ + _aLog.write(_sValue); return _aLog; +} +Log &operator <<( Log &_aLog, rtl::OString const& _sValue ) +{ + _aLog.write(_sValue); return _aLog; +} +Log &operator <<( Log &_aLog, rtl::OUString const& _sValue ) +{ + _aLog.write(_sValue); return _aLog; +} +//! Log &operator <<( Log &_aLog, rtl::OStringBuffer const& _sValue ) +//! { +//! _aLog.write(_sValue); return _aLog; +//! } diff --git a/testshl2/source/cppunit/result/makefile.mk b/testshl2/source/cppunit/result/makefile.mk new file mode 100644 index 000000000000..2866ec614e05 --- /dev/null +++ b/testshl2/source/cppunit/result/makefile.mk @@ -0,0 +1,83 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile$ +# +# $Revision$ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. + +PRJNAME=cppunit +TARGET=c5t_testresult +LIBTARGET=NO +ENABLE_EXCEPTIONS=TRUE +# ENABLE_RTTI=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# --- Files -------------------------------------------------------- + +# CXXFILES = \ +# querytemplate.cxx \ +# stringhelper.cxx + +# ENVCFLAGSCXX+=-DCPPUNIT_BUILD_DLL +SLOFILES = \ + $(SLO)$/SynchronizedObject.obj \ + $(SLO)$/TestResult.obj \ + $(SLO)$/TestResultCollector.obj \ + $(SLO)$/TestSucessListener.obj \ + $(SLO)$/emacsTestResult.obj \ + $(SLO)$/log.obj \ + $(SLO)$/optionhelper.obj \ + $(SLO)$/outputter.obj \ + $(SLO)$/signal.obj \ + $(SLO)$/testshlTestResult.obj \ + $(SLO)$/treswrapper.obj + +# currently unused +# $(SLO)$/TextTestResult.obj + +LIB1TARGET= $(LB)$/$(TARGET).lib +LIB1OBJFILES= $(SLOFILES) + +.IF "$(GUI)"=="WNT" +.IF "$(COM)"=="GCC" +LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a +.ENDIF +.ENDIF + +.IF "$(GUI)" == "UNX" +LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/testshl2/source/cppunit/result/optionhelper.cxx b/testshl2/source/cppunit/result/optionhelper.cxx new file mode 100644 index 000000000000..d3c44055310d --- /dev/null +++ b/testshl2/source/cppunit/result/optionhelper.cxx @@ -0,0 +1,317 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include "testshl/result/optionhelper.hxx" +// #include <sstream> +// #include <string> +#include <osl/time.h> +#include "testshl/cmdlinebits.hxx" + +// ----------------------------------------------------------------------------- + +namespace +{ + void split( const rtl::OString& opt, + const rtl::OString& _sSeparator, + OStringList& optLine ) + { + optLine.clear(); + // const sal_Int32 cSetLen = cSet.getLength(); + sal_Int32 index = 0; + sal_Int32 oldIndex = 0; + + // sal_Int32 i; + // sal_Int32 j = 0; + while ( opt.getLength() > 0) + { + // for ( i = 0; i < cSetLen; i++ ) + // { + index = opt.indexOf( _sSeparator, oldIndex); + if( index != -1 ) + { + optLine.push_back( opt.copy( oldIndex, index - oldIndex ) ); + oldIndex = index + _sSeparator.getLength(); + } + // } + else // if (index == -1) + { + optLine.push_back( opt.copy( oldIndex ) ); + break; + } + } + } ///< split + + bool match(OStringList const& _aFilter, OStringList const& _aName) + { + OStringList::const_iterator aFilterIter = _aFilter.begin(); + OStringList::const_iterator aValueIter = _aName.begin(); + + bool bMatch = false; + + while (aFilterIter != _aFilter.end() && aValueIter != _aName.end()) + { + rtl::OString sFilter = *aFilterIter; + rtl::OString sName = *aValueIter; + + if (sFilter == sName) + { + bMatch = true; + ++aFilterIter; + ++aValueIter; + } + else if (sFilter == "*") + { + bMatch = true; + break; + } + else + { + // Filter does not match + bMatch = false; + break; + } + } + return bMatch; + } +} + +/* static */ +std::string OptionHelper::integerToAscii(sal_Int32 nValue) +{ + sal_Char cBuf[30]; + sal_Char *pBuf = cBuf; + sprintf(pBuf, "%d", static_cast<int>(nValue)); +//# std::ostringstream sBuf; +//# sBuf << nValue; +// rtl::OString sStr; +// sStr = rtl::OString::valueOf(nValue); + return std::string(pBuf); +} + +/* static */ +// if a given String is less then 2 char, add a "0" in front. +std::string OptionHelper::twoDigits(std::string const& _sValue) +{ + std::string sBack; + if (_sValue.length() == 0) + { + sBack = "00"; + } + else if (_sValue.length() == 1) + { + sBack = "0"; + sBack += _sValue; + } + else + { + sBack = _sValue; + } + return sBack; +} + + +std::string OptionHelper::createDateTag(std::string const& _sProjectId, std::string const& _sBuildId) +{ + TimeValue tmv_system; + TimeValue tmv_local; + oslDateTime dt; + osl_getSystemTime( &tmv_system ); + osl_getLocalTimeFromSystemTime(&tmv_system, &tmv_local); + osl_getDateTimeFromTimeValue( &tmv_local, &dt ); + + sal_Int32 nYear = dt.Year; + sal_Int32 nMonth = dt.Month; + sal_Int32 nDay = dt.Day; + + std::string sDate; + sDate = "# Current Time: "; + sDate += std::string(twoDigits(integerToAscii(dt.Hours))); + sDate += ":"; + sDate += std::string(twoDigits(integerToAscii(dt.Minutes))); + sDate += ":"; + sDate += std::string(twoDigits(integerToAscii(dt.Seconds))); + sDate += "\n"; + + sDate += "["; + + // sDate += rtl::OString::valueOf(nYear); + sDate.append(integerToAscii(nYear)); + sDate += "."; + if (nMonth < 10) + sDate += "0"; + // sDate += rtl::OString::valueOf(nMonth); + sDate.append(integerToAscii(nMonth)); + sDate += "."; + if (nDay < 10) + sDate += "0"; + // sDate += rtl::OString::valueOf(nDay); + sDate += std::string(integerToAscii(nDay)); + sDate += "/"; + sDate += _sProjectId; + sDate += "/"; + sDate += _sBuildId; + sDate += "]"; + + return sDate; +} + +//# rtl::OString createDateTag() +//# { +//# TimeValue tmv; +//# oslDateTime dt; +//# osl_getSystemTime( &tmv ); +//# osl_getDateTimeFromTimeValue( &tmv, &dt ); +//# +//# sal_Int32 nYear = dt.Year; +//# sal_Int32 nMonth = dt.Month; +//# sal_Int32 nDay = dt.Day; +//# +//# rtl::OString sDate("["); +//# sDate += rtl::OString::valueOf(nYear); +//# sDate += "."; +//# if (nMonth < 10) +//# sDate += "0"; +//# sDate += rtl::OString::valueOf(nMonth); +//# sDate += "."; +//# if (nDay < 10) +//# sDate += "0"; +//# sDate += rtl::OString::valueOf(nDay); +//# sDate += "//]"; +//# +//# return sDate; +//# } + +std::string OptionHelper::createDateTag() +{ + return createDateTag(m_sProjectId, m_sBuildId); +} + +bool OptionHelper::showErrors() +{ + bool bRetValue = true; // default, show all + if (m_aOption.hasOpt("-noerrors")) + { + bRetValue = false; + } + return bRetValue; +} + +bool OptionHelper::showTests() +{ + bool bRetValue = true; // default, show all + if (m_aOption.hasOpt("-onlyerrors")) + { + bRetValue = false; + } + return bRetValue; +} + +// Check which parameter is given for handle the jobs. +// If no parameter is given, all jobs (tests) will run through +void OptionHelper::handleJobs() +{ + // load job file, the file contains the functions which we only want to test. + if (m_aOption.hasOpt("-jobexclude")) + { + rtl::OString sJobFile = m_aOption.getOpt("-jobexclude"); + m_aJobExcludeList.readfile(sJobFile.getStr(), JOB_EXCLUDE_LIST); + } + + if (m_aOption.hasOpt("-jobonly")) + { + rtl::OString sJobFile = m_aOption.getOpt("-jobonly"); + m_aJobOnlyList.readfile(sJobFile.getStr(), JOB_ONLY_LIST); + } + + // + if (m_aOption.hasOpt("-jobfilter")) + { + rtl::OString sJobFilter = m_aOption.getOpt("-jobfilter"); + split(sJobFilter, ".", m_aJobFilter); + } +} + +// ----------------------------------------------------------------------------- +// Here will be decide, if a job/test will execute or not. +// therefore exist some lists, in which stay all jobs (positive list) or a list (negative list) which jobs should not execute +// or if only specific jobs should execute by a given filter + +bool OptionHelper::isAllowedToExecute(std::string const& _sNodeName, std::string const& _sName) +{ + std::string sJobName = _sNodeName + "." + _sName; + // t_print(T_VERBOSE, "Jobname %s\n", sJobName.c_str()); + if (isOnlyShowJobs()) // true, if parameter -onlyshowjob + { + m_aJobOnlyList.setJobListEntry(sJobName, JOB_ACCESS); + return false; + } + + if (m_aJobOnlyList.size()) // >0 if parameter -jobonly + { + if (m_aJobOnlyList.getJobListEntry(sJobName) != JOB_NOT_FOUND) + { + // job entry found, mark as accessed + m_aJobOnlyList.setJobListEntry(sJobName, JOB_ACCESS); + return true; + } + return false; + } + else if (m_aJobFilter.size() > 0) // >0 if parameter -jobfilter + { + OStringList aSplitName; + split(sJobName.c_str(), ".", aSplitName); + if (! match(m_aJobFilter, aSplitName)) + { + t_print(T_VERBOSE, "job: '%s' filtered by [-jobfilter]\n", sJobName.c_str()); + return false; + } + } + else if (m_aJobExcludeList.size() > 0) // >0 if parameter -jobexclude + { + if (m_aJobExcludeList.getJobListEntry(sJobName) != JOB_NOT_FOUND) + { + // job entry found, this job should not executed, so return false + t_print(T_VERBOSE, "job: '%s' filtered by [-jobexclude]\n", sJobName.c_str()); + return false; + } + // m_aJobOnlyList.setJobListEntry(sJobName, JOB_ACCESS); + return true; + } + else + { + //! not handled yet + } + + return true; +} + diff --git a/testshl2/source/cppunit/result/outputter.cxx b/testshl2/source/cppunit/result/outputter.cxx new file mode 100644 index 000000000000..a6624e52724e --- /dev/null +++ b/testshl2/source/cppunit/result/outputter.cxx @@ -0,0 +1,106 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +// +#include <string> +#include <sal/types.h> +#include "testshl/result/outputter.hxx" + +// ----------------------------------------------------------------------------- + +Outputter::~Outputter() +{ + // delete m_pLog; +} + +void Outputter::writeToAll(const sal_Char* _sCharStr) +{ + // std::cout << _sCharStr; + if (m_pStream) + { + *m_pStream << _sCharStr; + } + if (m_pLog.get()) + { + m_pLog->write(_sCharStr); + } +} + +void Outputter::write(const sal_Char* _sCharStr) +{ + writeToAll(_sCharStr); +} + +void Outputter::write(std::string const& _sStr) +{ + writeToAll(_sStr.c_str()); +} + +void Outputter::write(sal_Int32 _nValue) +{ + sal_Char cBuf[20]; + sal_Char* pBuf = cBuf; + sprintf(pBuf, "%d", SAL_STATIC_CAST(int, _nValue)); + writeToAll(pBuf); +} + +// ----------------------------------------------------------------------------- + +Outputter& operator <<( Outputter &_aStreamWrapper, const sal_Char* _sValue) +{ + _aStreamWrapper.write(_sValue); + return _aStreamWrapper; +} + +Outputter& operator <<( Outputter &_aStreamWrapper, std::string const& _sValue) +{ + _aStreamWrapper.write(_sValue); + return _aStreamWrapper; +} + +Outputter& operator <<( Outputter &_aStreamWrapper, sal_Int32 _nValue) +{ + _aStreamWrapper.write(_nValue); + return _aStreamWrapper; +} + +//# Outputter& operator <<( Outputter &_aStreamWrapper, double ) +//# { +//# return _aStreamWrapper; +//# } + +Outputter& operator <<( Outputter &_aStreamWrapper, Outputter::endl const&) +{ + _aStreamWrapper.write("\n"); + return _aStreamWrapper; +} diff --git a/testshl2/source/cppunit/result/signal.cxx b/testshl2/source/cppunit/result/signal.cxx new file mode 100644 index 000000000000..b0f689c7ca5e --- /dev/null +++ b/testshl2/source/cppunit/result/signal.cxx @@ -0,0 +1,999 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#if (defined UNX) || (defined OS2) +#include <signal.h> +#include <errno.h> +#endif + +#include <fstream> +#include <vector> +#include <hash_map> + +#include <rtl/tres.h> +#include <rtl/string.hxx> + +#include "testshl/autoregisterhelper.hxx" +#include "testshl/getopt.hxx" +#include "signal.hxx" +#include <cppunit/tagvalues.hxx> +#include <testshl/taghelper.hxx> +#include <unistd.h> +#include "testshl/filehelper.hxx" +#include <testshl/result/TestResult.h> +#include "testshl/signaltest.h" +#include "cppunit/Exception.h" + +#ifdef WNT +#include "testshl/winstuff.hxx" +#endif + +// typedef std::vector<std::string> StringList; +// StringList sCurrentNodeName; +CppUnit::TestResult *pTestResult = NULL; +std::string sSignalFile; + +typedef std::hash_map< std::string, int > HashMap; +HashMap m_aSignalHash; +bool bSignalsCached = false; +bool bDoNotTouchSignalFile = false; + +// ----------------------------------------------------------------------------- + +// return 'true' if signalfile doesn't exist. +// else 'false' +bool existsSignalFile(std::string const& _sSignalFilename) +{ + FILE* pFile = fopen(_sSignalFilename.c_str(), "r"); + if (!pFile) + { + return false; + } + fprintf(stderr, "'%s' exists.\n", _sSignalFilename.c_str()); + fclose(pFile); + return true; +} + +// ----------------------------------------------------------------------------- +void createEmptySignalFile(std::string const& _sSignalFilename) +{ + FILE* pFile = fopen(_sSignalFilename.c_str(), "w"); + if (!pFile) + { + fprintf(stderr, "error: Could not create signal helper file %s for signal info.\n", _sSignalFilename.c_str()); + } + else + { + fprintf(pFile, "# This is an auto generated helper file for signal handling.\n"); + fprintf(pFile, "# An entry start by '#' is a comment.\n"); + fprintf(pFile, "# All other are test functions which have abort, before this line is removed.\n"); + fprintf(pFile, "# So you have to check this functions by hand.\n"); + + fclose(pFile); + } +} + +// ----------------------------------------------------------------------------- +/** get Current PID. +*/ +inline ::rtl::OUString getCurrentPID( ) +{ + //~ Get current PID and turn it into OUString; + sal_uInt32 nPID = 0; +#ifdef WNT + nPID = WinGetCurrentProcessId(); +#else + nPID = getpid(); +#endif + return ( ::rtl::OUString::valueOf( static_cast<long>(nPID ) ) ); +} +// ----------------------------------------------------------------------------- +static std::string integerToAscii(sal_uInt32 nValue) +{ + sal_Char cBuf[30]; + sal_Char *pBuf = cBuf; + sprintf(pBuf, "%d", static_cast<unsigned int>(nValue)); + return std::string(pBuf); +} +void my_sleep(int sec); + +// ----------------------------------------------------------------------------- +void setSignalFilename(GetOpt & opt) +{ + if (opt.hasOpt("-dntsf") || opt.hasOpt("-donottouchsignalfile")) + { + // special feature, for debugging, so the signal file will not manipulate. + // but create, if no one exist. + bDoNotTouchSignalFile = true; + } + + if (opt.hasOpt("-sf") || opt.hasOpt("-signalfile")) + { + if (opt.hasOpt("-sf")) + { + sSignalFile = opt.getOpt("-sf"); + } + else if (opt.hasOpt("-signalfile")) + { + sSignalFile = opt.getOpt("-signalfile"); + } + } + else + { + std::string sPath; + // std::string sPath(FileHelper::getTempPath()); + std::string sFilename("signalfile"); + std::string sFilenameExt(".txt"); + bool bCanQuitLoop = true; + do + { + +// #ifdef WNT +// sPath += "\\"; +// #endif +// #ifdef UNX +// sPath += "/"; +// #endif + sPath = sFilename; + // BUG: i72675 + // add "_12345" where 12345 is the current process ID + + TimeValue aTimeValue; + osl_getSystemTime(&aTimeValue); + + sPath += "_"; + sPath += integerToAscii(aTimeValue.Seconds); + // rtl::OUString suPID = getCurrentPID(); + // rtl::OString sPID = rtl::OUStringToOString(suPID, RTL_TEXTENCODING_ASCII_US); + // sPath += sPID.getStr(); + sPath += sFilenameExt; + bCanQuitLoop = true; + if (existsSignalFile(sPath)) + { + // there is already a signal file, wait a second, choose an other one. + my_sleep(1); + bCanQuitLoop = false; + } + } + while (!(bCanQuitLoop)); + + sSignalFile = sPath; + fprintf(stderr, "Use default signal file name '%s'\n", sSignalFile.c_str()); + } + + if (opt.hasOpt("-dnrmsf")) + { + fprintf(stderr, "'Don't remove signal file' (-dnrmsf) is set.\n"); + } + else + { + if (bDoNotTouchSignalFile == true) + { + fprintf(stderr, "warning: 'Don't touch signal file' parameter (-dntsf) is set, will not remove existing signal file.\n"); + } + else + { + // remove signalfile + createEmptySignalFile(sSignalFile); + } + } +} + +// ----------------------------------------------------------------------------- +bool doNotTouchSignalFile() { return bDoNotTouchSignalFile; } + +// ----------------------------------------------------------------------------- +std::string buildTestFunctionName(std::string const& _sName) +{ + std::string sName; + if (pTestResult) + { + sName = pTestResult->getNodeName(); + sName += "."; + } + +/* + for (StringList::const_iterator it = sCurrentNodeName.begin(); + it != sCurrentNodeName.end(); + ++it) + { + sName += *it; + sName += "."; + } +*/ + sName += _sName; + + return sName; +} +// ----------------------------------------------------------------------------- +// old: void executionPushName(std::string const& _sName) +// old: { +// old: sCurrentNodeName.push_back(_sName); +// old: } +// old: void executionPopName() +// old: { +// old: sCurrentNodeName.pop_back(); +// old: } +// old: + +// ----------------------------------------------------------------------------- +// ------------------------------ Signal Handling ------------------------------ +// ----------------------------------------------------------------------------- + +// std::string sLastTestFunctionName; + +std::string getSignalName(sal_Int32 nSignalNo); +// ----------------------------------------------------------------------------- + +std::string getSignalFilename() +{ + return sSignalFile; +} + +// ----------------------------------------------------------------------------- +// void storeNoSignal(std::string const& _sTestName) +// { + // sLastTestFunctionName = buildTestFunctionName(_sTestName); + // std::ofstream out(getSignalFilename().c_str(), std::ios::out); + // out << NO_SIGNAL << std::endl; // no signal! +// } + +void markSignalAsAlreadyDone(sal_Int32 _nSignalNo) +{ + // std::ofstream out(getSignalFilename().c_str(), std::ios::out | std::ios::app); + FILE *out = fopen(getSignalFilename().c_str(), "a"); + if (out != NULL) + { +//# out << "# the previous test function creates signal: " +//# << getSignalName(_nSignalNo) +//# << " (" +//# << _nSignalNo +//# << ")" << std::endl; +//# // out << sLastTestFunctionName << std::endl; // SIGNAL! + + fprintf(out, "# the previous test function creates signal: %s(%d)\n", getSignalName(_nSignalNo).c_str(), SAL_STATIC_CAST(int, _nSignalNo)); + // fprintf(out, "%s\n", sLastTestFunctionName ); + fclose(out); + } + else + { + fprintf(stderr, "error: Can't write signal info to file %s \n", getSignalFilename().c_str()); + } +} + +// ----------------------------------------------------------------------------- + +Signal hasSignaled(std::string const& _sTestName) +{ + // BACK: true: signal + // false: nothing + + if (bSignalsCached == true) + { + + if (m_aSignalHash.find(buildTestFunctionName(_sTestName)) != m_aSignalHash.end()) + { + return HAS_SIGNAL; + } + return NO_SIGNAL; + } + + std::ifstream in(getSignalFilename().c_str(), std::ios::in); + + // std::cout << "Check for signal" << std::endl; + std::string sLine, sLastLine; + while (std::getline(in, sLine)) + { + // std::cout << sTest << std::endl; + char ch = sLine[0]; + if (isspace(ch) == 0 && + sLine.size() > 0) + { + if (ch == '#') + { + if (sLastLine.size() > 0) + { + rtl::OString aStrLine(sLine.c_str()); + sal_Int32 nIdx = aStrLine.indexOf("(") + 1; + sal_Int32 nIdx2 = aStrLine.indexOf(")"); + sal_Int32 nSignalNo = 0; + if (nIdx > 0 && nIdx2 > 0) + { + rtl::OString sSignalNo = aStrLine.copy(nIdx, nIdx2 - nIdx); + nSignalNo = sSignalNo.toInt32(); + m_aSignalHash[sLastLine] = nSignalNo; + } + sLastLine.clear(); + } + } + else + { + // if (sTest == buildTestFunctionName(_sTestName)) + m_aSignalHash[sLine] = 1; + sLastLine = sLine; + // return HAS_SIGNAL; + } + } + } + + bSignalsCached = true; + return hasSignaled(_sTestName); + // return NO_SIGNAL; +} + +#ifdef UNX + +// ----------------------------------------------------------------------------- + +void release_signal_Handling(); + +//# void signalFunction(int value) +//# { +//# std::cout << "Signal caught: (" << value << "), please restart." << std::endl; +//# markSignalAsAlreadyDone(); +//# +//# release_signal_Handling(); +//# std::cout.flush(); +//# abort(); +//# } + +// ----------------------------------------------------------------------------- +extern "C" void SignalHandlerFunction(int _nSignalNo, siginfo_t *, void*) +{ + // std::cout << "Signal caught: " << getSignalName(_nSignalNo) << " (" << _nSignalNo << "), please restart." << std::endl; + fprintf(stderr, "Signal caught %s(%d)\n", getSignalName(_nSignalNo).c_str(), _nSignalNo); + markSignalAsAlreadyDone(_nSignalNo); + + release_signal_Handling(); + // std::cout.flush(); + abort(); +} + +// ----------------------------------------------------------------------------- +// This is a copy of the osl/signal.c code +#define ACT_IGNORE 1 +#define ACT_ABORT 2 +#define ACT_EXIT 3 +#define ACT_SYSTEM 4 +#define ACT_HIDE 5 + +extern "C" { +static struct SignalAction +{ + int Signal; + int Action; + void (*Handler)(int); +} Signals[] = +{ + { SIGHUP, ACT_IGNORE, NULL }, /* hangup */ + { SIGINT, ACT_EXIT, NULL }, /* interrupt (rubout) */ + { SIGQUIT, ACT_ABORT, NULL }, /* quit (ASCII FS) */ + { SIGILL, ACT_SYSTEM, NULL }, /* illegal instruction (not reset when caught) */ +/* changed from ACT_ABOUT to ACT_SYSTEM to try and get collector to run*/ + { SIGTRAP, ACT_ABORT, NULL }, /* trace trap (not reset when caught) */ +#if ( SIGIOT != SIGABRT ) + { SIGIOT, ACT_ABORT, NULL }, /* IOT instruction */ +#endif +// { SIGABRT, ACT_ABORT, NULL }, /* used by abort, replace SIGIOT in the future */ +#ifdef SIGEMT + { SIGEMT, ACT_SYSTEM, NULL }, /* EMT instruction */ +/* changed from ACT_ABORT to ACT_SYSTEM to remove handler*/ +/* SIGEMT may also be used by the profiler - so it is probably not a good + plan to have the new handler use this signal*/ +#endif + { SIGFPE, ACT_ABORT, NULL }, /* floating point exception */ + { SIGKILL, ACT_SYSTEM, NULL }, /* kill (cannot be caught or ignored) */ + { SIGBUS, ACT_ABORT, NULL }, /* bus error */ + { SIGSEGV, ACT_ABORT, NULL }, /* segmentation violation */ +#ifdef SIGSYS + { SIGSYS, ACT_ABORT, NULL }, /* bad argument to system call */ +#endif + { SIGPIPE, ACT_HIDE, NULL }, /* write on a pipe with no one to read it */ + { SIGALRM, ACT_EXIT, NULL }, /* alarm clock */ + { SIGTERM, ACT_EXIT, NULL }, /* software termination signal from kill */ + { SIGUSR1, ACT_SYSTEM, NULL }, /* user defined signal 1 */ + { SIGUSR2, ACT_SYSTEM, NULL }, /* user defined signal 2 */ + { SIGCHLD, ACT_SYSTEM, NULL }, /* child status change */ +#ifdef SIGPWR + { SIGPWR, ACT_IGNORE, NULL }, /* power-fail restart */ +#endif + { SIGWINCH, ACT_IGNORE, NULL }, /* window size change */ + { SIGURG, ACT_EXIT, NULL }, /* urgent socket condition */ +#ifdef SIGPOLL + { SIGPOLL, ACT_EXIT, NULL }, /* pollable event occured */ +#endif + { SIGSTOP, ACT_SYSTEM, NULL }, /* stop (cannot be caught or ignored) */ + { SIGTSTP, ACT_SYSTEM, NULL }, /* user stop requested from tty */ + { SIGCONT, ACT_SYSTEM, NULL }, /* stopped process has been continued */ + { SIGTTIN, ACT_SYSTEM, NULL }, /* background tty read attempted */ + { SIGTTOU, ACT_SYSTEM, NULL }, /* background tty write attempted */ + { SIGVTALRM, ACT_EXIT, NULL }, /* virtual timer expired */ + { SIGPROF, ACT_SYSTEM, NULL }, /* profiling timer expired */ +/*Change from ACT_EXIT to ACT_SYSTEM for SIGPROF is so that profiling signals do + not get taken by the new handler - the new handler does not pass on context + information which causes 'collect' to crash. This is a way of avoiding + what looks like a bug in the new handler*/ + { SIGXCPU, ACT_ABORT, NULL }, /* exceeded cpu limit */ + { SIGXFSZ, ACT_ABORT, NULL } /* exceeded file size limit */ +}; +} + +const int NoSignals = sizeof(Signals) / sizeof(struct SignalAction); + +#endif /* UNX */ + +// ----------------------------------------------------------------------------- +void init_signal_Handling(CppUnit::TestResult *_pResult) +{ + pTestResult = _pResult; +#ifdef UNX + +// signal(SIGSEGV, signalFunction); + // signal(SIGSEGV, signalFunction); + // signal(SIGFPE, signalFunction); + +// signal(1, signalFunction); + // struct sigaction action, oldaction; + // action.sa_sigaction = signalFunction2; + // action.sa_flags = SA_ONESHOT /* | SA_SIGINFO */; + + struct sigaction act; + struct sigaction oact; + + // act.sa_handler = SignalHandlerFunction; + act.sa_flags = SA_RESTART; + // act.sa_flags = SA_ONESHOT /* | SA_SIGINFO */; + act.sa_sigaction = SignalHandlerFunction; + + sigfillset(&(act.sa_mask)); + + /* Initialize the rest of the signals */ + for (int i = 0; i < NoSignals; i++) + { + if (Signals[i].Action != ACT_SYSTEM) + { + if (Signals[i].Action == ACT_HIDE) + { + struct sigaction ign; + + ign.sa_handler = SIG_IGN; + ign.sa_flags = 0; + sigemptyset(&ign.sa_mask); + + if (sigaction(Signals[i].Signal, &ign, &oact) == 0) + Signals[i].Handler = oact.sa_handler; + else + Signals[i].Handler = SIG_DFL; + } + else + if (sigaction(Signals[i].Signal, &act, &oact) == 0) + Signals[i].Handler = oact.sa_handler; + else + Signals[i].Handler = SIG_DFL; + } + } +#endif + + // ------------ signal helper file must exist ----------------- + FILE* pFile = fopen(getSignalFilename().c_str(), "r"); + if (!pFile) + { + createEmptySignalFile( getSignalFilename() ); + } + else + { + fclose(pFile); + } +} + +// ----------------------------------------------------------------------------- +void release_signal_Handling() +{ + // frees all signals +#ifdef UNX + int i; + struct sigaction act; + + act.sa_flags = 0; + sigemptyset(&(act.sa_mask)); + + /* Initialize the rest of the signals */ + for (i = NoSignals - 1; i >= 0; i--) + { + if (Signals[i].Action != ACT_SYSTEM) + { + act.sa_handler = Signals[i].Handler; + + sigaction(Signals[i].Signal, &act, NULL); + } + } +#endif +} + +// ----------------------------------------------------------------------------- +Signal signalCheck(CppUnit::TestResult* _pResult, std::string const& _sTestName) +{ + // BACK: HAS_SIGNAL: the test has already done and signaled + if (hasSignaled(_sTestName) == HAS_SIGNAL) + { + // std::cout << "The Test '" << buildTestFunctionName(_sTestName) << "' is marked as signaled." << std::endl; + std::string sTestFunctionName = buildTestFunctionName(_sTestName); + fprintf(stderr, "The Test '%s' is marked as signaled.\n", sTestFunctionName.c_str()); + if (_pResult) + { + CppUnit::SignalTest *pTest = new CppUnit::SignalTest(_sTestName); + + std::string sErrorText = "Function is marked as signaled: "; + sal_Int32 nSignalNo = m_aSignalHash[sTestFunctionName]; + sErrorText += getSignalName(nSignalNo); + sErrorText += " ("; + sErrorText += OptionHelper::integerToAscii(nSignalNo); + sErrorText += ")"; + + _pResult->addError(pTest, new CppUnit::SignalException(sErrorText), ErrorType::ET_SIGNAL); + } + return HAS_SIGNAL; + } + + // storeNoSignal(_sTestName); + return NO_SIGNAL; +} + +// ----------------------------------------------------------------------------- +bool copyFile(std::string const& _sFrom, std::string const& _sTo) +{ + bool bRetValue = false; + const int MAXBUFSIZE = 1024; + char buff[MAXBUFSIZE]; + FILE *in = fopen(_sFrom.c_str(), "r"); + if (in == NULL) + { + fprintf(stderr, "error: Can't open file %s for read to copy.\n", _sFrom.c_str()); + bRetValue = false; + } + else + { + FILE *out = fopen(_sTo.c_str(), "w"); + if (out == NULL) + { + fclose(in); + fprintf(stderr, "error: Can't open file %s for write to copy.\n", _sTo.c_str()); + bRetValue = false; + } + else + { + int nRealGot = 0; + while(!feof(in)) + { + nRealGot = fread(buff, sizeof(char), MAXBUFSIZE, in); + if (nRealGot > 0) + { + fwrite(buff, sizeof(char), nRealGot, out); + } + } + bRetValue = true; + fclose(out); + fclose(in); + } + } + return bRetValue; +} + +// ----------------------------------------------------------------------------- +void signalStartTest(std::string const& _sName) +{ + if (doNotTouchSignalFile()) return; + + // fprintf(stderr, "### signalStartTest!\n"); + // due to the fact, that functions are vicious, we write the name first. + // if it isn't vivious, than we removed it. + std::string sNewName = getSignalFilename(); + sNewName += ".bak"; + if (copyFile(getSignalFilename(), sNewName)) + { + // std::ofstream out(getSignalFilename().c_str(), std::ios::out | std::ios::app); + FILE *out = fopen(getSignalFilename().c_str(), "a"); + if (out != NULL) + { + // out << buildTestFunctionName(_sName) << std::endl; + fprintf(out, "%s\n", buildTestFunctionName(_sName).c_str()); + fclose(out); + } + else + { + fprintf(stderr, "error: Can't open file %s for append.\n", getSignalFilename().c_str()); + } + } + else + { + fprintf(stderr, "error: Can't copy signal helper from file %s to file %s, %d\n", getSignalFilename().c_str(), sNewName.c_str(), errno); + } +} + +// ----------------------------------------------------------------------------- +void signalEndTest() +{ + if (doNotTouchSignalFile()) return; + + // fprintf(stderr, "### signalEndTest!\n"); + if (0 != remove(getSignalFilename().c_str())) + { + fprintf(stderr, "error: Can't delete file %s\n", getSignalFilename().c_str()); + } + else + { + std::string sNewName = getSignalFilename(); + sNewName += ".bak"; + if (0 != rename(sNewName.c_str(), getSignalFilename().c_str())) + { + fprintf(stderr, "error: Can't rename file %s to file %s errno: %d\n", sNewName.c_str(), getSignalFilename().c_str(), errno); + } + } +} + +// ----------------------------------------------------------------------------- +void removeSignalFile(GetOpt & opt) +{ + // fprintf(stderr, "### remove signal file: '%s'\n", sSignalFile.c_str()); + if (opt.hasOpt("-dnrmsf")) + { + return; + } + if (bDoNotTouchSignalFile == true) + { + return; + } + remove(getSignalFilename().c_str()); +} + +// ----------------------------------------------------------------------------- + +sal_Int32 SignalHandlerA( TagHelper const& _aTagItems ) +{ + sal_Int32 nRetValue = 0; + TagData nTagType = _aTagItems.GetTagData(TAG_TYPE, 0); +// LLA: unused +// hTestResult hResult = (hTestResult) _aTagItems.GetTagData(TAG_RESULT_PTR, 0 /* NULL */ ); +// CppUnit::TestResult* pResult = (CppUnit::TestResult*)hResult; + + try + { + switch(nTagType) + { + // old: case SIGNAL_PUSH_NAME: + // old: { + // old: const char* sName = (const char*) _aTagItems.GetTagData(TAG_NODENAME); + // old: if (sName != NULL) + // old: signalPushName(sName); + // old: break; + // old: } + // old: + // old: case SIGNAL_POP_NAME: + // old: signalPopName(); + // old: break; + + // old: case SIGNAL_CHECK: + // old: { + // old: const char* sName = (const char*) _aTagItems.GetTagData(TAG_NODENAME); + // old: if (sName != NULL) + // old: { + // old: nRetValue = signalCheck(sName); + // old: } + // old: break; + // old: } + + // old: case INIT_SIGNAL_HANDLING: + // old: init_signal_Handling(); + // old: break; + // old: + // old: case RELEASE_SIGNAL_HANDLING: + // old: release_signal_Handling(); + // old: break; + + case SIGNAL_START_TEST: + { + // fprintf(stderr, "### SIGNAL_START_TEST!\n"); + const char* sName = (const char*) _aTagItems.GetTagData(TAG_NODENAME); + if (sName != NULL) + { + signalStartTest(sName); + } + break; + } + + case SIGNAL_END_TEST: + { + // fprintf(stderr, "### SIGNAL_END_TEST!\n"); + const char* sName = (const char*) _aTagItems.GetTagData(TAG_NODENAME); + if (sName != NULL) + { + signalEndTest(); + } + break; + } + + default: + fprintf(stderr, "error: SignalHandlerA: Can't handle the tag type %d\n", SAL_STATIC_CAST(int, nTagType)); + fflush(stderr); + // throw std::exception(/*std::string("Unknown TYPE_TAG Exception.")*/); + } + } + catch (std::exception &e) + { + fprintf(stderr, "error: SignalHandlerA: Exception caught: %s\n", e.what()); + fflush(stderr); + // throw e; + } + + return nRetValue; +} +// ----------------------------------------------------------------------------- +// This a little bit more abstract code, could be easier to modify or expand. + +sal_Int32 CheckExecution(CppUnit::TestResult* _pResult, std::string const& _sName) +{ + // more checks in the corresponding job lists + if (_pResult) + { + if (! _pResult->isAllowedToExecute(_sName)) + { + return DO_NOT_EXECUTE; + } + } + + // Check if the given test should be executed. + if (signalCheck(_pResult, _sName) == HAS_SIGNAL) + { + return DO_NOT_EXECUTE; + } + + return GO_EXECUTE; +} + +// ----------------------------------------------------------------------------- +sal_Int32 ExecutionA( TagHelper const& _aTagItems ) +{ + sal_Int32 nRetValue = 0; + TagData nTagType = _aTagItems.GetTagData(TAG_TYPE, 0); + hTestResult hResult = (hTestResult) _aTagItems.GetTagData(TAG_RESULT_PTR, 0 /* NULL */ ); + CppUnit::TestResult* pResult = (CppUnit::TestResult*)hResult; + + try + { + switch(nTagType) + { + case EXECUTION_CHECK: + { + const char* sName = (const char*) _aTagItems.GetTagData(TAG_NODENAME); + if (sName) + { + nRetValue = CheckExecution(pResult, sName); + if (nRetValue == GO_EXECUTE) + { + if (pResult && pResult->isOptionWhereAmI()) + { + printf("# This is: %s\n", buildTestFunctionName(sName).c_str()); + } + } + } + + break; + } + + // old: case EXECUTION_PUSH_NAME: + // old: { + // old: const char* sName = (const char*) _aTagItems.GetTagData(TAG_NODENAME); + // old: if (sName != NULL) + // old: executionPushName(sName); + // old: break; + // old: } + // old: + // old: case EXECUTION_POP_NAME: + // old: executionPopName(); + // old: break; + + case INIT_TEST: + init_signal_Handling(pResult); + break; + + case RELEASE_TEST: + release_signal_Handling(); + break; + + default: + fprintf(stderr, "ExceptionA: Can't handle the tag type %d\n", SAL_STATIC_CAST(int, nTagType)); + break; + } + } + catch (std::exception &e) + { + fprintf(stderr, "ExecutionA: exception caught: %s\n", e.what()); + fflush(stderr); + // throw e; + } + return nRetValue; +} + +// ----------------------------------------------------------------------------- +std::string getSignalName(sal_Int32 nSignalNo) +{ + std::string sValue; +#ifdef UNX + switch(nSignalNo) + { + case SIGHUP: + sValue = "SIGHUP"; + break; + + case SIGINT: + sValue = "SIGINT"; + break; + + case SIGQUIT: + sValue = "SIGQUIT"; + break; + + case SIGILL: + sValue = "SIGILL"; + break; + + case SIGTRAP: + sValue = "SIGTRAP"; + break; + +#if ( SIGIOT != SIGABRT ) + case SIGIOT: + sValue = "SIGIOT"; + break; +#endif +// case SIGABRT: +#ifdef SIGEMT + case SIGEMT: + sValue = "SIGEMT"; + break; +#endif + case SIGFPE: + sValue = "SIGFPE"; + break; + + case SIGKILL: + sValue = "SIGKILL"; + break; + + case SIGBUS: + sValue = "SIGBUS"; + break; + + case SIGSEGV: + sValue = "SIGSEGV"; + break; + +#ifdef SIGSYS + case SIGSYS: + sValue = "SIGSYS"; + break; +#endif + case SIGPIPE: + sValue = "SIGPIPE"; + break; + + case SIGALRM: + sValue = "SIGALRM"; + break; + + case SIGTERM: + sValue = "SIGTERM"; + break; + + case SIGUSR1: + sValue = "SIGUSR1"; + break; + + case SIGUSR2: + sValue = "SIGUSR2"; + break; + + case SIGCHLD: + sValue = "SIGCHLD"; + break; + +#ifdef SIGPWR + case SIGPWR: + sValue = "SIGPWR"; + break; +#endif + case SIGWINCH: + sValue = "SIGWINCH"; + break; + + case SIGURG: + sValue = "SIGURG"; + break; + +#ifdef SIGPOLL + case SIGPOLL: + sValue = "SIGPOLL"; + break; +#endif + case SIGSTOP: + sValue = "SIGSTOP"; + break; + + case SIGTSTP: + sValue = "SIGTSTP"; + break; + + case SIGCONT: + sValue = "SIGCONT"; + break; + + case SIGTTIN: + sValue = "SIGTTIN"; + break; + + case SIGTTOU: + sValue = "SIGTTOU"; + break; + + case SIGVTALRM: + sValue = "SIGVTALRM"; + break; + + case SIGPROF: + sValue = "SIGPROF"; + break; + + case SIGXCPU: + sValue = "SIGXCPU"; + break; + + case SIGXFSZ: + sValue = "SIGXFSZ"; + break; + + default: + sValue = "Unhandled Signal."; + } +#else + (void) nSignalNo; // unused +#endif + return sValue; +} + +// The following sets variables for GNU EMACS +// Local Variables: +// tab-width:4 +// End: diff --git a/testshl2/source/cppunit/result/signal.hxx b/testshl2/source/cppunit/result/signal.hxx new file mode 100644 index 000000000000..d95569f8bf8b --- /dev/null +++ b/testshl2/source/cppunit/result/signal.hxx @@ -0,0 +1,42 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SIGNAL_HXX +#define SIGNAL_HXX + +#include <sal/types.h> + +#define HAS_SIGNAL 1 +#define NO_SIGNAL 0 + +typedef sal_Int32 Signal; + +#endif + diff --git a/testshl2/source/cppunit/result/testshlTestResult.cxx b/testshl2/source/cppunit/result/testshlTestResult.cxx new file mode 100644 index 000000000000..0d42460eca3a --- /dev/null +++ b/testshl2/source/cppunit/result/testshlTestResult.cxx @@ -0,0 +1,428 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdlib.h> + +#include <map> +#include <cppunit/Exception.h> +#include <cppunit/NotEqualException.h> +#include <cppunit/Test.h> +#include <cppunit/TestFailure.h> +#include <testshl/result/testshlTestResult.h> +// #include <TextTestResult.h> +//!io #include <iostream> +#include <string> + +#include <rtl/string.hxx> +#include "testshl/result/outputter.hxx" + +namespace CppUnit { + + testshlTestResult::testshlTestResult(GetOpt & _aOptions) + :TestResult(_aOptions), + m_aOptions(_aOptions), + // m_aOptionHelper(_aOptions), + m_aResulter(this) + { + addListener( &m_aResulter ); + } + + testshlTestResult::~testshlTestResult() + { + } + +//# void +//# testshlTestResult::addFailure( const TestFailure &failure ) +//# { +//# // TestResultCollector::addFailure( failure ); +//# // std::cerr << ( failure.isError() ? "E" : "F" ); +//# m_aResulter.addFailure(failure); +//# } +//# +//# +//# void +//# testshlTestResult::startTest( Test *test ) +//# { +//# // TestResultCollector::startTest (test); +//# m_aResulter.startTest(test); +//# // std::cerr << "."; +//# } +//# +//# void testshlTestResult::endTest( Test *test ) +//# { +//# } + +// ----------------------------------------------------------------------------- + +//# void +//# testshlTestResult::printFailures( Outputter &stream ) +//# { +//# TestFailures::const_iterator itFailure = failures().begin(); +//# int failureNumber = 1; +//# while ( itFailure != failures().end() ) +//# { +//# stream << std::endl; +//# printFailure( *itFailure++, failureNumber++, stream ); +//# } +//# } +//# +//# +//# void +//# testshlTestResult::printFailure( TestFailure *failure, +//# int failureNumber, +//# std::ostream &stream ) +//# { +//# printFailureListMark( failureNumber, stream ); +//# stream << ' '; +//# printFailureTestName( failure, stream ); +//# stream << ' '; +//# printFailureType( failure, stream ); +//# stream << ' '; +//# printFailureLocation( failure->sourceLine(), stream ); +//# stream << std::endl; +//# printFailureDetail( failure->thrownException(), stream ); +//# stream << std::endl; +//# } +//# +//# +//# void +//# testshlTestResult::printFailureListMark( int failureNumber, +//# std::ostream &stream ) +//# { +//# stream << failureNumber << ")"; +//# } +//# +//# +//# void +//# testshlTestResult::printFailureTestName( TestFailure *failure, +//# std::ostream &stream ) +//# { +//# Test* pTest = failure->failedTest(); +//# stream << "test: " << pTest->getName(); +//# } +//# +//# +//# void +//# testshlTestResult::printFailureType( TestFailure *failure, +//# std::ostream &stream ) +//# { +//# stream << "(" +//# << (failure->isError() ? "E" : "F") +//# << ")"; +//# } +//# +//# +//# void +//# testshlTestResult::printFailureLocation( SourceLine sourceLine, +//# std::ostream &stream ) +//# { +//# if ( !sourceLine.isValid() ) +//# return; +//# +//# stream << "line: " << sourceLine.lineNumber() +//# << ' ' << sourceLine.fileName(); +//# } +//# +//# +//# void +//# testshlTestResult::printFailureDetail( Exception *thrownException, +//# std::ostream &stream ) +//# { +//# if ( thrownException->isInstanceOf( NotEqualException::type() ) ) +//# { +//# NotEqualException *e = (NotEqualException*)thrownException; +//# stream << "expected: " << e->expectedValue() << std::endl +//# << "but was: " << e->actualValue(); +//# if ( !e->additionalMessage().empty() ) +//# { +//# stream << std::endl; +//# stream << "additional message:" << std::endl +//# << e->additionalMessage(); +//# } +//# } +//# else +//# { +//# stream << " \"" << thrownException->what() << "\""; +//# } +//# } + + +// LLA: output format: +// Header +// # -- BEGIN +// Error lines +// No error lines +// unknown lines +// # -- END +// Text 'Test #PASSED#' or 'Errors only' + +void +testshlTestResult::print( Outputter& stream ) +{ + printHeader( stream ); + // stream << std::endl; + // printFailures( stream ); + + bool bPassed = false; + if (isOnlyShowJobs()) + { + JobList jl(m_aOptionHelper.getJobOnlyList()); + HashMap aJobList = jl.getHashMap(); + printLines(stream, aJobList); + } + else + { + stream << "# -- BEGIN:" << Outputter::endl(); + + TestPtrList aFailedTests; + + // List of failures + printFailedTests(stream, aFailedTests); + + if (! m_aOptionHelper.getOptions().hasOpt("-onlyerrors")) + { + // List of well done tests + printTestLines(stream, aFailedTests); + + // List of unknown Tests + JobList jl(m_aOptionHelper.getJobOnlyList()); + HashMap aJobList = jl.getHashMap(); + printUnknownLines(stream, aJobList); + + bPassed = true; + } + stream << "# -- END:" << Outputter::endl(); + + if (bPassed) + { + stream << "Test #PASSED#" << Outputter::endl(); + } + + if (m_aOptionHelper.getOptions().hasOpt("-onlyerrors")) + { + stream << "Errors only." << Outputter::endl(); + } + } +} + +// ----------------------------------------------------------------------------- +void +testshlTestResult::printLines(Outputter &stream, HashMap & _aJobList) +{ + int nCount = _aJobList.size(); + if (nCount != 0) + { + for (HashMap::const_iterator it = _aJobList.begin(); + it != _aJobList.end(); + ++it) + { + std::string aKey = (*it).first; + if (_aJobList[aKey] == JOB_ACCESS) + { + stream << aKey; + stream << Outputter::endl(); + } + } + } +} + +void +testshlTestResult::printFailedTests(Outputter &stream, TestPtrList &aFailedTests) +{ + for (TestResultCollector::TestFailures::const_iterator it2 = m_aResulter.failures().begin(); + it2 != m_aResulter.failures().end(); + ++it2) + { + TestFailureEnvelope *pEnvelop = *it2; + TestFailure *pFailure = pEnvelop->getTestFailure(); + std::string sNodeName = pEnvelop->getString(); + + aFailedTests[ pFailure->failedTest() ] = true; + + printFailureLine(stream, pFailure, sNodeName); + } +} + +void +testshlTestResult::printTestLines(Outputter &stream, TestPtrList &aFailedTests) +{ + for (TestResultCollector::Tests::const_iterator it = m_aResulter.tests().begin(); + it != m_aResulter.tests().end(); + ++it) + { + TestEnvelope *pEnvelop = *it; + Test* pTest = pEnvelop->getTest(); + std::string sNodeName = pEnvelop->getString(); + + if (aFailedTests.find(pTest) == aFailedTests.end()) + { + std::string sInfo = m_aResulter.getInfo(pTest); + printTestLine(stream, pTest, sNodeName, sInfo); + } + } +} + +void +testshlTestResult::printUnknownLines(Outputter &stream, HashMap & _aJobList) +{ + int nCount = _aJobList.size(); + if (nCount != 0) + { + for (HashMap::const_iterator it = _aJobList.begin(); + it != _aJobList.end(); + ++it) + { + std::string aKey = (*it).first; + if (_aJobList[aKey] == JOB_UNKNOWN) + { + printUnknownLine(stream, aKey); + } + } + } +} + +void +testshlTestResult::printHeader( Outputter &stream ) +{ + std::string sDate(m_aOptionHelper.createDateTag()); + if (isOnlyShowJobs()) + { + stream << "# This is an automatically generated job file." << Outputter::endl(); + stream << "# "; + } + else + { + stream << sDate << Outputter::endl(); + } +} + +void +testshlTestResult::printFailureLine( Outputter &stream, TestFailure *_pFailure, std::string const& _sNodeName) +{ + std::string aName; + aName += _sNodeName; + aName += "."; + aName += _pFailure->failedTestName(); + + SourceLine aLine = _pFailure->sourceLine(); + sal_Int32 nLine = -1; + std::string sFilename; + if (aLine.isValid()) + { + nLine = aLine.lineNumber(); + sFilename = aLine.fileName(); + } + + Exception *pExp = _pFailure->thrownException(); + std::string sWhat; + if (pExp) + { + sWhat = pExp->what(); + } + + ErrorType::num eErr = _pFailure->getErrorType(); + + stream << aName; + stream << ";"; + + if (eErr == ErrorType::ET_FAILURE) + stream << "FAILED"; + + else if (eErr == ErrorType::ET_ERROR) + stream << "ERROR"; + + else if (eErr == ErrorType::ET_SIGNAL) + stream << "SIGNAL"; + + else + stream << "UNKNOWN"; + + stream << "#FAILED#"; + + stream << sWhat; + stream << Outputter::endl(); +} + +void +testshlTestResult::printTestLine( Outputter &stream, Test* _pTest, std::string const& _sNodeName, std::string const& _sInfo) +{ + std::string aName; + aName += _sNodeName; + aName += "."; + aName += _pTest->getName(); + + stream << aName; + stream << ";"; + stream << _sInfo << "#"; + if (_sInfo == "PASSED") + { + stream << "OK#"; + } + else + { + stream << "FAILED#"; + } + stream << Outputter::endl(); +} + +void +testshlTestResult::printUnknownLine( Outputter &stream, std::string const& _sTestName) +{ + stream << _sTestName; + stream << ";"; + stream << "UNKNOWN#"; + stream << "FAILED#"; + stream << Outputter::endl(); +} + +//# void +//# testshlTestResult::printStatistics( Outputter &stream ) +//# { +//# stream << "Test Results:" << std::endl; +//# +//# stream << "Run: " << runTests() +//# << " Failures: " << testFailures() +//# << " Errors: " << testErrors() +//# << std::endl; +//# } + + +Outputter & +operator <<( Outputter &stream, + testshlTestResult &result ) +{ + result.print (stream); return stream; +} + + +} // namespace CppUnit diff --git a/testshl2/source/cppunit/result/treswrapper.cxx b/testshl2/source/cppunit/result/treswrapper.cxx new file mode 100644 index 000000000000..dc28cc82494a --- /dev/null +++ b/testshl2/source/cppunit/result/treswrapper.cxx @@ -0,0 +1,262 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <cstdarg> +#include <stdlib.h> +#include <stdio.h> + +#include <sal/types.h> +#include <cppunit/Test.h> +#include "testshl/autoregister/htestresult.h" +#include "cppunit/callbackfunc_fktptr.h" +#include "testshl/result/callbackfunc.h" +#include "testshl/result/TestResult.h" +#include <testshl/taghelper.hxx> + +#include <cppunit/tagvalues.hxx> + +namespace +{ + void TestResult_startTest(hTestResult _pResult, hTest _pTest) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + + std::string sName = pTest->getName(); + CallbackDispatch(0 /* NULL */, TAG_TYPE, SIGNAL_START_TEST, TAG_RESULT_PTR, _pResult, TAG_NODENAME, sName.c_str(), TAG_DONE); + + pResult->startTest(pTest); + } + + void TestResult_endTest( hTestResult _pResult, hTest _pTest ) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + pResult->endTest(pTest); + + std::string sName = pTest->getName(); + CallbackDispatch(0 /* NULL */, TAG_TYPE, SIGNAL_END_TEST, TAG_RESULT_PTR, _pResult, TAG_NODENAME, sName.c_str(), TAG_DONE); + } + +// ----------------------------------------------------------------------------- + + void TestResult_addFailure( hTestResult _pResult, hTest _pTest, hException _pException ) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + CppUnit::Exception* pException = (CppUnit::Exception*)_pException; + pResult->addFailure(pTest, pException); + } + + void TestResult_addError( hTestResult _pResult, hTest _pTest, hException _pException ) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + CppUnit::Exception* pException = (CppUnit::Exception*)_pException; + pResult->addError(pTest, pException); + } + + sal_Int32 TestResult_shouldStop(hTestResult _pResult) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + return pResult->shouldStop() == true ? 1 : 0; + } + +// ----------------------------------------------------------------------------- + void TestResult_addInfo( hTestResult _pResult, hTest _pTest, const char* _sInfo ) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + // CppUnit::Exception* pException = (CppUnit::Exception*)_pException; + pResult->addInfo(pTest, _sInfo); + } +// ----------------------------------------------------------------------------- + void TestResult_enterNode( hTestResult _pResult, const char* _sNode ) + { + // signalPushName(getName()); + // CallbackDispatch(NULL, TAG_TYPE, EXECUTION_PUSH_NAME, TAG_RESULT_PTR, _pResult, TAG_NODENAME, _sNode, TAG_DONE); + + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + // CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + // CppUnit::Exception* pException = (CppUnit::Exception*)_pException; + pResult->enterNode(_sNode); + } + void TestResult_leaveNode( hTestResult _pResult, const char* _sNode ) + { + CppUnit::TestResult* pResult = (CppUnit::TestResult*)_pResult; + // CppUnit::Test* pTest = (CppUnit::Test*)_pTest; + // CppUnit::Exception* pException = (CppUnit::Exception*)_pException; + pResult->leaveNode(_sNode); + + // CallbackDispatch(NULL, TAG_TYPE, EXECUTION_POP_NAME, TAG_RESULT_PTR, _pResult, TAG_DONE); + } + +// ----------------------------------------------------------------------------- + sal_Int32 TestResult_StarterA(TagHelper const& _aTagItems) + { + sal_Int32 nRetValue = 0; + TagData nTagType = _aTagItems.GetTagData(TAG_TYPE, 0); + hTestResult pResult = (hTestResult) _aTagItems.GetTagData(TAG_RESULT_PTR, 0 /* NULL */); + CppUnit::Test* pTest = (CppUnit::Test*) _aTagItems.GetTagData(TAG_TEST_PTR, 0 /* NULL */); + + try + { + switch(nTagType) + { + case RESULT_START: + TestResult_startTest(pResult, pTest); + break; + + case RESULT_END: + TestResult_endTest(pResult, pTest); + break; + + case RESULT_ADD_FAILURE: + { + hException pException = (hException) _aTagItems.GetTagData(TAG_EXCEPTION, 0); + TestResult_addFailure(pResult, pTest, pException); + break; + } + + case RESULT_ADD_ERROR: + { + hException pException = (hException) _aTagItems.GetTagData(TAG_EXCEPTION, 0); + TestResult_addError(pResult, pTest, pException); + break; + } + + case RESULT_ADD_INFO: + { + const char* pInfo = (const char* ) _aTagItems.GetTagData(TAG_INFO, 0); + TestResult_addInfo(pResult, pTest, pInfo); + break; + } + + case RESULT_ENTER_NODE: + { + const char* pNode = (const char* )_aTagItems.GetTagData(TAG_NODENAME, 0); + TestResult_enterNode(pResult, pNode); + break; + } + + case RESULT_LEAVE_NODE: + { + const char* pNode = (const char* ) _aTagItems.GetTagData(TAG_NODENAME, 0); + TestResult_leaveNode(pResult, pNode); + break; + } + + case RESULT_SHOULD_STOP: + nRetValue = TestResult_shouldStop(pResult); + break; + + default: + fprintf(stderr, "TestResult_StarterA: Can't handle the tag type %8x\n", SAL_STATIC_CAST(int, nTagType)); + fflush(stderr); + // throw std::exception(/*std::string("Unknown TYPE_TAG Exception.")*/); + } + } + catch (std::exception &e) + { + fprintf(stderr, "TestResult_StarterA: Exception caught: %s\n", e.what()); + // throw e; + } + + return nRetValue; + } +} // namespace anonymous + +// --------------------------------- Prototypes --------------------------------- + +sal_Int32 SignalHandlerA( TagHelper const& _aTagItems ); +sal_Int32 ExecutionA( TagHelper const& _aTagItems ); + +// ----------------------------------------------------------------------------- +sal_Int32 CallbackDispatch(int x, ...) +{ + (void) x; // avoid warning + + // The idea behind TagItems are from the Amiga OS. + // Due to the fact that the following code does not find my ok + // I decide to wrote a simple helper + // + // struct TagItem *tags = (struct TagItem *)&x + 1; + + TagHelper aTagItems; + + // the following code could also be in a #define, so other functions could + // use this, but at the moment this function a the only one. + + // FILL_TAGS(aTagItems, x); + std::va_list args; + va_start( args, x ); + Tag nTag; + do + { + nTag = va_arg(args, Tag); + if (nTag != TAG_DONE) + { + TagData nValue = va_arg(args, TagData); + // printf("Tag: %8x Value:%8x\n", nTag, nValue); + aTagItems.insert(nTag, nValue); + } + } while (nTag != TAG_DONE); + + va_end ( args ); + + // FILL_TAGS:END + + // printf(".\n"); + + sal_Int32 nRetValue = 0; + Tag nPreTag = aTagItems.GetTagData(TAG_TYPE); + if ( (nPreTag & TAG_RESULT) == TAG_RESULT) + { + nRetValue = TestResult_StarterA( aTagItems ); + } + else if ((nPreTag & TAG_SIGNAL) == TAG_SIGNAL) + { + nRetValue = SignalHandlerA(aTagItems); + } + else if (( nPreTag & TAG_EXECUTION) == TAG_EXECUTION) + { + nRetValue = ExecutionA(aTagItems); + } + else + { + fprintf(stderr, "CallbackDispatch: First tag is unknown %8x\n", SAL_STATIC_CAST(int, nPreTag)); + // unknown TAG_TYPE + } + return nRetValue; +} + diff --git a/testshl2/source/cppunit/signaltest.cxx b/testshl2/source/cppunit/signaltest.cxx new file mode 100644 index 000000000000..66bc4c1fb713 --- /dev/null +++ b/testshl2/source/cppunit/signaltest.cxx @@ -0,0 +1,92 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <typeinfo> + +#include "testshl/signaltest.h" + +namespace CppUnit +{ + +/** Constructs a test case for a suite. + * This TestCase is intended for use by the TestCaller and should not + * be used by a test case for which run() is called. + **/ +SignalTest::SignalTest(std::string const& _sName) + : m_sName( _sName ) +{ +} + + +/// Destructs a test case +SignalTest::~SignalTest() +{ +} + + +/// Returns a count of all the tests executed +int +SignalTest::countTestCases() const +{ + return 1; +} + +/// We never need to start this +void SignalTest::run(hTestResult) {} + + +/// Returns the name of the test case +std::string +SignalTest::getName() const +{ + return m_sName; +} + + +/// Returns the name of the test case instance +std::string +SignalTest::toString() const +{ + std::string className; + +#if CPPUNIT_USE_TYPEINFO_NAME + const std::type_info& thisClass = typeid( *this ); + className = thisClass.name(); +#else + className = "SignalTest"; +#endif + + return className + "." + getName(); +} + +} // namespace CppUnit diff --git a/testshl2/source/cppunit/t_print.cxx b/testshl2/source/cppunit/t_print.cxx new file mode 100644 index 000000000000..f6619c6fe693 --- /dev/null +++ b/testshl2/source/cppunit/t_print.cxx @@ -0,0 +1,98 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdio.h> +#include <testshl/cmdlinebits.hxx> +#include <rtl/tres.h> +#include <osl/mutex.hxx> + +extern CmdLineBits st_nBits; + +sal_Bool isBit( CmdLineBits _nBits, CmdLineBits _nFlag ) +{ + return( ( _nBits & _nFlag ) == _nFlag ); +} + +// ----------------------------------------------------------------------------- +// ----------------------------- own printf method ----------------------------- +// ----------------------------------------------------------------------------- + +bool isVerbose() +{ + if ( isBit( st_nBits, rtl_tres_Flag_VERBOSE ) ) + { + return true; + } + return false; +} + +bool isQuiet() +{ + if ( isBit( st_nBits, rtl_tres_Flag_QUIET ) ) + { + return true; + } + return false; +} + +// ::osl::Mutex m_aTPrintMutex; + +void impl_t_print(const char* _pFormatStr, va_list &args) +{ + if (! isQuiet()) + { + // ::osl::MutexGuard g(m_aTPrintMutex); + printf("# "); + vprintf(_pFormatStr, args); + } +} + +void t_print(const char* _pFormatStr, ...) +{ + va_list args; + va_start( args, _pFormatStr ); + impl_t_print(_pFormatStr, args); + va_end( args ); +} + +void t_print(T_Print_Params _eType, const char* _pFormatStr, ...) +{ + if (_eType == T_VERBOSE && isVerbose()) + { + // if T_VERBOSE and we should be verbose, print info + va_list args; + va_start( args, _pFormatStr ); + impl_t_print(_pFormatStr, args); + va_end( args ); + } +} diff --git a/testshl2/source/cppunit/tresregister.cxx b/testshl2/source/cppunit/tresregister.cxx new file mode 100644 index 000000000000..983c58f7ab90 --- /dev/null +++ b/testshl2/source/cppunit/tresregister.cxx @@ -0,0 +1,69 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#include <stdio.h> +#include <sal/types.h> +#include <testshl/autoregister/registerfunc.h> +#include <testshl/autoregister/callbackstructure.h> +#include <testshl/cmdlinebits.hxx> + +//! is this global CallbackStructure need? +CallbackStructure aGlobalStructure; +CmdLineBits st_nBits; + +FktPtr_CallbackDispatch pCallbackFunc = NULL; + +// This function is called from the TestShl tool. +extern "C" void SAL_CALL registerAllTestFunction(CallbackStructure* _pCallback) +{ + aGlobalStructure = *_pCallback; + + st_nBits = aGlobalStructure.nBits; + + pCallbackFunc = _pCallback->aCallbackDispatch; + FktRegFuncPtr pFunc = _pCallback->aRegisterFunction; + if (pFunc) + { + RegisterTestFunctions(pFunc); + } + else + { + // error, should be echoed + fprintf(stderr, "error: Callback Structure doesn't contain a test function ptr.\n"); + } + + // all is done, copy the magic value + // this is only a simple internal invariant check, + // if the called registerAllTestFunctions Function do, what we want. + _pCallback->nMagic2 = _pCallback->nMagic; +} diff --git a/testshl2/source/cppunit/tresstatewrapper.cxx b/testshl2/source/cppunit/tresstatewrapper.cxx new file mode 100644 index 000000000000..d1ff4bc87032 --- /dev/null +++ b/testshl2/source/cppunit/tresstatewrapper.cxx @@ -0,0 +1,169 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +// this functions build the wrapper, to handle old function calls to rtl_tres_state +// IMPORTANT: Due to the fact that rtl_tres_state is in the sal.lib +// you have to rename rtl_tres_state to c_rtl_tres_state +// +// return c_rtl_tres_state +// ( +// hRtlTestResult, +// pData->length == 0 && +// ! *pData->buffer, +// "New OString containing no characters", +// "ctor_001" +// ) + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "cppunit/Test.h" +#include "testshl/autoregister/htestresult.h" +#include "cppunit/callbackfunc_fktptr.h" +#include "cppunit/TestAssert.h" +#include "testshl/checkboom.hxx" + +#define LOAD_TRESSTATEWRAPPER_LOCAL +#include "testshl/tresstatewrapper.hxx" +#undef LOAD_TRESSTATEWRAPPER_LOCAL + +#include "cppunit/tagvalues.hxx" +#include "cppunit/externcallbackfunc.hxx" + +// ----------------------------------------------------------------------------- +// Wrapper class for the CppUnit::Test, because the new TestResult +// expect a CppUnit::Test interface + +class WrappedTest : public CppUnit::Test +{ + std::string m_sName; +public: + WrappedTest(std::string const& _sName) + :m_sName(_sName){} + + virtual ~WrappedTest () {} + virtual void run (hTestResult /*pResult*/){} + virtual int countTestCases () const {return 1;} + virtual std::string getName () const {return m_sName;} + virtual std::string toString () const {return "WrappedTest";} +}; + +// ----------------------------------------------------------------------------- +rtl_tres_state_start::rtl_tres_state_start(hTestResult _aResult, const sal_Char* _pName) + :m_pName(_pName), + m_aResult(_aResult) +{ + // (pTestResult_EnterNode)(m_aResult, m_pName); + (pCallbackFunc)( 0 /* NULL */, TAG_TYPE, RESULT_ENTER_NODE, TAG_RESULT_PTR, m_aResult, TAG_NODENAME, m_pName, TAG_DONE); +} +rtl_tres_state_start::~rtl_tres_state_start() +{ + // (pTestResult_LeaveNode)(m_aResult, m_pName); + (pCallbackFunc)(0 /* NULL */, TAG_TYPE, RESULT_LEAVE_NODE, TAG_RESULT_PTR, m_aResult, TAG_NODENAME, m_pName, TAG_DONE); +} + +// --------------------------------- C-Wrapper --------------------------------- +typedef std::vector<rtl_tres_state_start*> rtl_tres_states; +rtl_tres_states m_StateStack; + +extern "C" void c_rtl_tres_state_start(hTestResult _aResult, const sal_Char* _pName) +{ + rtl_tres_state_start* pState = new rtl_tres_state_start(_aResult, _pName); + m_StateStack.push_back(pState); +} + +extern "C" void c_rtl_tres_state_end(hTestResult, const sal_Char*) +{ + rtl_tres_state_start* pState = m_StateStack.back(); + + delete pState; + m_StateStack.pop_back(); +} +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// ------------------------- Wrapper for rtl_tres_state ------------------------- +// ----------------------------------------------------------------------------- + +sal_Bool SAL_CALL c_rtl_tres_state( + hTestResult pResult, + sal_Bool bSuccess, + char const * pTestMsg, + char const * pFuncName) +{ + CppUnit::Test* pTest = new WrappedTest(pFuncName); + + sal_Int32 nValue = (pCallbackFunc)(0 /* NULL */, TAG_TYPE, EXECUTION_CHECK, TAG_RESULT_PTR, pResult, TAG_NODENAME, pTest->getName().c_str(), TAG_DONE); + if (nValue == DO_NOT_EXECUTE) + { + return false; + } + + // This code is copied from CppUnit::TestCase and less adapted, to work with the + // old test code. + // (pTestResult_StartTest)(pResult, pTest); + (pCallbackFunc)(0 /* NULL */, TAG_TYPE, RESULT_START, TAG_RESULT_PTR, pResult, TAG_TEST_PTR, pTest, TAG_DONE); + + try + { + CPPUNIT_ASSERT_MESSAGE( pTestMsg, bSuccess ? true : false ); + // (pTestResult_AddInfo)(pResult, pTest, "#PASSED#"); + (pCallbackFunc)(0 /* NULL */, TAG_TYPE, RESULT_ADD_INFO, TAG_RESULT_PTR, pResult, TAG_TEST_PTR, pTest, TAG_INFO, "PASSED", TAG_DONE); + } + catch ( CppUnit::Exception &e ) + { + CppUnit::Exception *copy = e.clone(); + // (pTestResult_AddFailure)( pResult, pTest, copy ); + (pCallbackFunc)( 0 /* NULL */, TAG_TYPE, RESULT_ADD_FAILURE, TAG_RESULT_PTR, pResult, TAG_TEST_PTR, pTest, TAG_EXCEPTION, copy, TAG_DONE ); + } + catch ( std::exception &e ) + { + //(pTestResult_AddError)( pResult, pTest, new CppUnit::Exception( e.what() ) ); + (pCallbackFunc)( 0 /* NULL */, TAG_TYPE, RESULT_ADD_ERROR, TAG_RESULT_PTR, pResult, TAG_TEST_PTR, pTest, TAG_EXCEPTION, new CppUnit::Exception( e.what() ), TAG_DONE ); + } + catch (...) + { + CppUnit::Exception *e = new CppUnit::Exception( "caught unknown exception" ); + // (pTestResult_AddError)( pResult, pTest, e ); + (pCallbackFunc)( 0 /* NULL */, TAG_TYPE, RESULT_ADD_ERROR, TAG_RESULT_PTR, pResult, TAG_TEST_PTR, pTest, TAG_EXCEPTION, e, TAG_DONE ); + } + + + // (pTestResult_EndTest)( pResult, pTest ); + (pCallbackFunc)( 0 /* NULL */, TAG_TYPE, RESULT_END, TAG_RESULT_PTR, pResult, TAG_TEST_PTR, pTest, TAG_DONE ); + + return bSuccess; +} + diff --git a/testshl2/source/cppunit/win32/makefile.mk b/testshl2/source/cppunit/win32/makefile.mk new file mode 100644 index 000000000000..8ed6d465f232 --- /dev/null +++ b/testshl2/source/cppunit/win32/makefile.mk @@ -0,0 +1,64 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile$ +# +# $Revision$ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/..$/.. + +PRJNAME=cppunit +TARGET=c5t_winstuff +LIBTARGET=NO +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- +.INCLUDE : settings.mk + +# ------------------------------------------------------------------ + +SLOFILES = \ + $(SLO)$/winstuff.obj + +#------------------------------------------------------------------------------- +# This is a static lib +LIB1TARGET= $(LB)$/$(TARGET).lib +LIB1OBJFILES= \ + $(SLOFILES) + +.IF "$(GUI)"=="WNT" +.IF "$(COM)"=="GCC" +LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a +.ENDIF +.ENDIF + +.IF "$(GUI)" == "UNX" +LIB1ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a +.ENDIF + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/testshl2/source/cppunit/win32/winstuff.cxx b/testshl2/source/cppunit/win32/winstuff.cxx new file mode 100644 index 000000000000..06973df8196e --- /dev/null +++ b/testshl2/source/cppunit/win32/winstuff.cxx @@ -0,0 +1,143 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +// #include "precompiled_cppunit.hxx" + +#ifdef WIN32 +#include "testshl/winstuff.hxx" + +#if defined _MSC_VER +#pragma warning(push, 1) +#endif +#include <windows.h> +#if defined _MSC_VER +#pragma warning(pop) +#endif +#include <MAPIWin.h> + +void WinDebugBreak() +{ + // forward to WinAPI. Note that the whole story is simply to + // disentangle OOo headers from Windows headers (which are largely + // incompatible, due to name clashes and macro mess-ups) + DebugBreak(); +} + +void WinSleep( sal_uInt32 sec ) +{ + Sleep(sec * 1000); +} + +sal_uInt32 WinGetCurrentProcessId() +{ + return GetCurrentProcessId(); +} + +#define TA_FAILED 0 +#define TA_SUCCESS_CLEAN 1 +#define TA_SUCCESS_KILL 2 +#define TA_SUCCESS_16 3 + + // Declare Callback Enum Functions. +bool CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ); + +/*---------------------------------------------------------------- + DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout ) + + Purpose: + Shut down a 32-Bit Process (or 16-bit process under Windows 95) + + Parameters: + dwPID + Process ID of the process to shut down. + + dwTimeout + Wait time in milliseconds before shutting down the process. + + Return Value: + TA_FAILED - If the shutdown failed. + TA_SUCCESS_CLEAN - If the process was shutdown using WM_CLOSE. + TA_SUCCESS_KILL - if the process was shut down with + TerminateProcess(). + NOTE: See header for these defines. + ----------------------------------------------------------------*/ +void WinTerminateApp( sal_uInt32 dwPID, sal_uInt32 dwTimeout ) +{ + HANDLE hProc; + DWORD dwRet; + + // If we can't open the process with PROCESS_TERMINATE rights, + // then we give up immediately. + hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, false, + dwPID); + + if(hProc == NULL) + return; + + // TerminateAppEnum() posts WM_CLOSE to all windows whose PID + // matches your process's. + EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID); + + // Wait on the handle. If it signals, great. If it times out, + // then you kill it. + if (WaitForSingleObject(hProc, dwTimeout) != WAIT_OBJECT_0) + dwRet= (TerminateProcess(hProc,0) ? TA_SUCCESS_KILL : TA_FAILED); + else + dwRet = TA_SUCCESS_CLEAN; + + CloseHandle(hProc); +} + +bool CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) +{ + DWORD dwID; + + GetWindowThreadProcessId(hwnd, &dwID); + + if(dwID == (DWORD)lParam) + { + PostMessage(hwnd, WM_CLOSE, 0, 0); + } + + return true; +} +#else + +// this file is only need within Windows. +// due to the fact that empty files don't create libraries +// we store one function in it. +int WinStuffDummy_this_function_will_never_need() +{ + return 42; // we need some code +} + +#endif /* WIN32 */ + diff --git a/testshl2/source/makefile.mk b/testshl2/source/makefile.mk index f411f7d7948f..0ed2299c26c0 100644 --- a/testshl2/source/makefile.mk +++ b/testshl2/source/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -47,15 +47,15 @@ ENABLE_EXCEPTIONS=TRUE COMMON_OBJFILES=\ $(OBJ)$/getopt.obj \ $(OBJ)$/filehelper.obj \ - $(OBJ)$/dynamicregister.obj + $(OBJ)$/dynamicregister.obj TESTSHL_OBJFILES=\ $(OBJ)$/autoregisterhelper.obj \ - $(OBJ)$/testshl.obj + $(OBJ)$/testshl.obj VERSIONINFO_OBJFILES=\ $(OBJ)$/versionhelper.obj \ - $(OBJ)$/versioner.obj + $(OBJ)$/versioner.obj BMSMA_OBJFILES=\ $(OBJ)$/bmsma.obj @@ -68,37 +68,37 @@ APP1TARGET= $(TARGET) APP1OBJS= $(COMMON_OBJFILES) $(TESTSHL_OBJFILES) APP1RPATH=NONE -APP1STDLIBS=$(SALLIB) - -# the c5t*.lib files are out of the cppunit module -# APP1DEPN= \ -# $(SOLARLIBDIR)$/c5t_no_regallfkt.lib \ -# $(SOLARLIBDIR)$/c5t_testresult.lib +APP1STDLIBS=$(SALLIB) \ + $(CPPUNITLIB) .IF "$(GUI)" == "WNT" .IF "$(COM)" == "GCC" APP1STDLIBS+= \ - $(SOLARLIBDIR)$/libc5t_testresult$(DLLPOSTFIX).a \ - $(SOLARLIBDIR)$/libc5t_no_regallfkt$(DLLPOSTFIX).a \ - $(SOLARLIBDIR)$/libc5t_winstuff$(DLLPOSTFIX).a + $(LB)$/testshl2$(DLLPOSTFIX).a \ + $(LB)$/libc5t_testresult$(DLLPOSTFIX).a \ + $(LB)$/libc5t_no_regallfkt$(DLLPOSTFIX).a \ + $(LB)$/libc5t_winstuff$(DLLPOSTFIX).a .ELSE APP1LIBS= \ - $(SOLARLIBDIR)$/c5t_no_regallfkt.lib \ - $(SOLARLIBDIR)$/c5t_testresult.lib -APP1LIBS += $(SOLARLIBDIR)$/c5t_winstuff.lib + $(LB)$/testshl2.lib \ + $(LB)$/c5t_testresult.lib \ + $(LB)$/c5t_no_regallfkt.lib \ + $(LB)$/c5t_winstuff.lib .ENDIF .ENDIF .IF "$(GUI)" == "OS2" APP1LIBS= \ - $(SOLARLIBDIR)$/c5t_no_regallfkt.lib \ - $(SOLARLIBDIR)$/c5t_testresult.lib + $(LB)$/testshl2.lib \ + $(LB)$/c5t_no_regallfkt.lib \ + $(LB)$/c5t_testresult.lib .ENDIF .IF "$(GUI)" == "UNX" APP1STDLIBS+= \ - $(SOLARLIBDIR)$/libc5t_testresult$(DLLPOSTFIX).a \ - $(SOLARLIBDIR)$/libc5t_no_regallfkt$(DLLPOSTFIX).a + $(LB)$/testshl2$(DLLPOSTFIX).a \ + $(LB)$/libc5t_testresult$(DLLPOSTFIX).a \ + $(LB)$/libc5t_no_regallfkt$(DLLPOSTFIX).a .ENDIF # @@ -108,24 +108,24 @@ APP2OBJS= $(COMMON_OBJFILES) $(VERSIONINFO_OBJFILES) APP2STDLIBS=$(SALLIB) -APP2DEPN= -APP2LIBS= +APP2DEPN= +APP2LIBS= # ------------------------------------------------------------------ APP3TARGET= $(TARGET)_timeout -APP3OBJS= $(OBJ)$/getopt.obj $(OBJ)$/filehelper.obj $(OBJ)$/terminate.obj +APP3OBJS= $(OBJ)$/getopt.obj $(OBJ)$/filehelper.obj $(OBJ)$/terminate.obj APP3STDLIBS=$(SALLIB) -APP3DEPN= -APP3LIBS= +APP3DEPN= +APP3LIBS= .IF "$(GUI)" == "WNT" .IF "$(COM)" == "GCC" APP3STDLIBS+= \ - $(SOLARLIBDIR)$/libc5t_winstuff$(DLLPOSTFIX).a + $(LB)$/libc5t_winstuff$(DLLPOSTFIX).a .ELSE -APP3LIBS += $(SOLARLIBDIR)$/c5t_winstuff.lib +APP3LIBS += $(LB)$/c5t_winstuff.lib .ENDIF .ENDIF diff --git a/testshl2/source/testshl.cxx b/testshl2/source/testshl.cxx index bf44b3c4572f..eaeb1f9e5fbe 100644 --- a/testshl2/source/testshl.cxx +++ b/testshl2/source/testshl.cxx @@ -55,15 +55,15 @@ #include "testshl/log.hxx" #include "testshl/filehelper.hxx" #include "testshl/getopt.hxx" -#include "cppunit/result/outputter.hxx" -#include "cppunit/joblist.hxx" +#include "testshl/result/outputter.hxx" +#include "testshl/joblist.hxx" // #include <osl/time.h> using namespace std; -#include "cppunit/result/testshlTestResult.h" -#include "cppunit/result/emacsTestResult.hxx" +#include "testshl/result/testshlTestResult.h" +#include "testshl/result/emacsTestResult.hxx" // Prototype for signal handling void setSignalFilename(GetOpt & opt); |