diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-10-12 15:19:21 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-10-15 12:18:44 +0100 |
commit | db5a5ffa82f835c81cf9a411d24f4cb0b1bb8fa5 (patch) | |
tree | 0e320d48ea2ce24a87f33095d2959919333c0b5c /unotest | |
parent | 528a225ddb1d429eeb048626d5e9e045118bad2e (diff) |
split bootstrapfixture and move test-filters class for sot test
sot is below vcl, but is a filters test, we can split bootstrapfixture
into a vcl needing bit and and non-vcl bit and filters test api
can be standalone and combined with whichever bit in order to form
pre and post vcl filters test
Diffstat (limited to 'unotest')
-rw-r--r-- | unotest/inc/unotest/bootstrapfixturebase.hxx | 88 | ||||
-rw-r--r-- | unotest/inc/unotest/filters-test.hxx | 75 | ||||
-rw-r--r-- | unotest/prj/build.lst | 2 | ||||
-rw-r--r-- | unotest/prj/d.lst | 2 | ||||
-rw-r--r-- | unotest/source/cpp/bootstrapfixturebase.cxx | 98 | ||||
-rw-r--r-- | unotest/source/cpp/filters-test.cxx | 148 | ||||
-rw-r--r-- | unotest/source/cpp/makefile.mk | 3 |
7 files changed, 415 insertions, 1 deletions
diff --git a/unotest/inc/unotest/bootstrapfixturebase.hxx b/unotest/inc/unotest/bootstrapfixturebase.hxx new file mode 100644 index 000000000000..6edd3f5b5643 --- /dev/null +++ b/unotest/inc/unotest/bootstrapfixturebase.hxx @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2011 Michael Meeks <michael.meeks@suse.com> + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#ifndef INCLUDED_UNOUNOTEST_BOOTSTRAPFIXTUREBASE_HXX +#define INCLUDED_UNOUNOTEST_BOOTSTRAPFIXTUREBASE_HXX + +#include <sal/config.h> + +#include <rtl/string.hxx> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XMultiComponentFactory.hpp> + +#include "sal/precppunit.hxx" +#include "cppunit/TestAssert.h" +#include "cppunit/TestFixture.h" +#include "cppunit/extensions/HelperMacros.h" +#include "cppunit/plugin/TestPlugIn.h" +#include "unotest/detail/unotestdllapi.hxx" + +namespace test { + +// Class to do lots of heavy-lifting UNO & environment +// bootstrapping for unit tests, such that we can use +// almost an entire LibreOffice during compile - so +// that we can get pieces of code alone to beat them up. + +// NB. this class is instantiated multiple times during a +// run of unit tests ... +class OOO_DLLPUBLIC_UNOTEST BootstrapFixtureBase : public CppUnit::TestFixture +{ +protected: + ::rtl::OUString m_aSrcRootURL; + ::rtl::OUString m_aSrcRootPath; + + com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> m_xContext; + com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> m_xSFactory; + com::sun::star::uno::Reference<com::sun::star::lang::XMultiComponentFactory> m_xFactory; + +public: + BootstrapFixtureBase(); + virtual ~BootstrapFixtureBase(); + + com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> + getComponentContext() { return m_xContext; } + com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> + getMultiServiceFactory() { return m_xSFactory; } + + ::rtl::OUString getSrcRootURL() { return m_aSrcRootURL; } + ::rtl::OUString getSrcRootPath() { return m_aSrcRootPath; } + + // return a URL to a given c-str path from the source directory + ::rtl::OUString getURLFromSrc( const char *pPath ); + + virtual void setUp(); + virtual void tearDown(); + +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotest/inc/unotest/filters-test.hxx b/unotest/inc/unotest/filters-test.hxx new file mode 100644 index 000000000000..974c1fa34ecc --- /dev/null +++ b/unotest/inc/unotest/filters-test.hxx @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Caolán McNamara <caolanm@redhat.com> + * Portions created by the Initial Developer are Copyright (C) 2011 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Caolán McNamara <caolanm@redhat.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include <rtl/ustring.hxx> +#include "unotest/detail/unotestdllapi.hxx" + +namespace test { + +enum filterStatus +{ + fail = 0, + pass = 1, + indeterminate = 2 +}; + +/* + * NOTE, any files beginning with CVE- will be assumed to be encrypted using + * arcfour with key 0x435645, this is to silence panicky virus/malware-checkers + * + * e.g. m[de]crypt --bare -a arcfour -o hex -k 435645 -s 3 + */ +/* Implementation of Filters test */ +class OOO_DLLPUBLIC_UNOTEST FiltersTest +{ +public: + void testDir( + //filter name + const rtl::OUString &rFilter, + //root dir of test files, must contain pass, fail, indeterminate + const rtl::OUString &rURL, + //additional filter data for SfxFilter + const rtl::OUString &rUserData); + + virtual bool load( + const rtl::OUString &rFilter, + const rtl::OUString &rURL, + const rtl::OUString &rUserData) = 0; + +protected: + void recursiveScan( + const rtl::OUString &rFilter, + const rtl::OUString &rURL, + const rtl::OUString &rUserData, + filterStatus nExpected); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotest/prj/build.lst b/unotest/prj/build.lst index d3be738a1cae..1cbe6e324327 100644 --- a/unotest/prj/build.lst +++ b/unotest/prj/build.lst @@ -1,4 +1,4 @@ -unote unotest : BOOST:boost cppu cppuhelper CPPUNIT:cppunit javaunohelper offapi ridljar sal solenv stlport unoil qadevOOo NULL +unote unotest : BOOST:boost cppu cppuhelper comphelper CPPUNIT:cppunit javaunohelper offapi ridljar sal solenv unoil qadevOOo NULL unote unotest\source\cpp nmake - all source_cpp NULL unote unotest\source\cpp\unoexceptionprotector nmake - all source_cpp_unoexceptionprotector NULL unote unotest\source\java\org\openoffice\test nmake - all source_java NULL diff --git a/unotest/prj/d.lst b/unotest/prj/d.lst index af2c362474c3..a173c2f042ab 100644 --- a/unotest/prj/d.lst +++ b/unotest/prj/d.lst @@ -9,6 +9,8 @@ mkdir: %_DEST%\inc\unotest\detail ..\%__SRC%\lib\unoexceptionprotector.dylib %_DEST%\lib\unoexceptionprotector.dylib ..\%__SRC%\lib\unoexceptionprotector.so %_DEST%\lib\unoexceptionprotector.so ..\inc\unotest\detail\unotestdllapi.hxx %_DEST%\inc\unotest\detail\unotestdllapi.hxx +..\inc\unotest\bootstrapfixturebase.hxx %_DEST%\inc\unotest\bootstrapfixturebase.hxx +..\inc\unotest\filters-test.hxx %_DEST%\inc\unotest\filters-test.hxx ..\inc\unotest\gettestargument.hxx %_DEST%\inc\unotest\gettestargument.hxx ..\inc\unotest\officeconnection.hxx %_DEST%\inc\unotest\officeconnection.hxx ..\inc\unotest\oustringostreaminserter.hxx %_DEST%\inc\unotest\oustringostreaminserter.hxx diff --git a/unotest/source/cpp/bootstrapfixturebase.cxx b/unotest/source/cpp/bootstrapfixturebase.cxx new file mode 100644 index 000000000000..5748e338737b --- /dev/null +++ b/unotest/source/cpp/bootstrapfixturebase.cxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2011 Michael Meeks <michael.meeks@suse.com> + * Caolán McNamara <caolanm@redhat.com> + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#include <unotest/bootstrapfixturebase.hxx> +#include <tools/errinf.hxx> +#include <rtl/strbuf.hxx> +#include <rtl/bootstrap.hxx> +#include <cppuhelper/bootstrap.hxx> +#include <ucbhelper/contentbroker.hxx> +#include <comphelper/processfactory.hxx> +#include <i18npool/mslangid.hxx> + +#include <com/sun/star/lang/Locale.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> + +#include <vcl/svapp.hxx> +#include <tools/resmgr.hxx> +#include <unotools/syslocaleoptions.hxx> + +using namespace ::com::sun::star; + +// NB. this constructor is called before any tests are run, once for each +// test function in a rather non-intuitive way. This is why all the 'real' +// heavy lifting is deferred until setUp. setUp and tearDown are interleaved +// between the tests as you might expect. +test::BootstrapFixtureBase::BootstrapFixtureBase() + : m_aSrcRootURL(RTL_CONSTASCII_USTRINGPARAM("file://")) +{ + const char* pSrcRoot = getenv( "SRC_ROOT" ); + CPPUNIT_ASSERT_MESSAGE("SRC_ROOT env variable not set", pSrcRoot != NULL && pSrcRoot[0] != 0); + +#ifdef WNT + if (pSrcRoot[1] == ':') + m_aSrcRootURL += rtl::OUString::createFromAscii( "/" ); +#endif + m_aSrcRootPath = rtl::OUString::createFromAscii( pSrcRoot ); + m_aSrcRootURL += m_aSrcRootPath; +} + +test::BootstrapFixtureBase::~BootstrapFixtureBase() +{ +} + +::rtl::OUString test::BootstrapFixtureBase::getURLFromSrc( const char *pPath ) +{ + return m_aSrcRootURL + rtl::OUString::createFromAscii( pPath ); +} + +void test::BootstrapFixtureBase::setUp() +{ + // set UserInstallation to user profile dir in test/user-template + rtl::Bootstrap aDefaultVars; + aDefaultVars.set( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UserInstallation") ), + getURLFromSrc("/test/user-template")); + + m_xContext = cppu::defaultBootstrap_InitialComponentContext(); + m_xFactory = m_xContext->getServiceManager(); + m_xSFactory = uno::Reference<lang::XMultiServiceFactory> (m_xFactory, uno::UNO_QUERY_THROW); + + // Without this we're crashing because callees are using + // getProcessServiceFactory. In general those should be removed in favour + // of retaining references to the root ServiceFactory as its passed around + comphelper::setProcessServiceFactory(m_xSFactory); +} + +void test::BootstrapFixtureBase::tearDown() +{ + // uno::Reference< lang::XComponent >(m_xContext, uno::UNO_QUERY_THROW)->dispose(); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotest/source/cpp/filters-test.cxx b/unotest/source/cpp/filters-test.cxx new file mode 100644 index 000000000000..f3801da712dc --- /dev/null +++ b/unotest/source/cpp/filters-test.cxx @@ -0,0 +1,148 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Caolán McNamara <caolanm@redhat.com> + * Portions created by the Initial Developer are Copyright (C) 2011 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Caolán McNamara <caolanm@redhat.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include <unotest/filters-test.hxx> +#include <osl/file.hxx> +#include <osl/thread.h> +#include <rtl/cipher.h> + +#include "sal/precppunit.hxx" +#include "cppunit/TestAssert.h" + +namespace test { + +void decode(const rtl::OUString& rIn, const rtl::OUString &rOut) +{ + rtlCipher cipher = rtl_cipher_create(rtl_Cipher_AlgorithmARCFOUR, rtl_Cipher_ModeStream); + CPPUNIT_ASSERT_MESSAGE("cipher creation failed", cipher != 0); + + //mcrypt --bare -a arcfour -o hex -k 435645 -s 3 + const sal_uInt8 aKey[3] = {'C', 'V', 'E'}; + + rtlCipherError result = rtl_cipher_init(cipher, rtl_Cipher_DirectionDecode, aKey, SAL_N_ELEMENTS(aKey), 0, 0); + + CPPUNIT_ASSERT_MESSAGE("cipher init failed", result == rtl_Cipher_E_None); + + osl::File aIn(rIn); + CPPUNIT_ASSERT(osl::FileBase::E_None == aIn.open(osl_File_OpenFlag_Read)); + + osl::File aOut(rOut); + CPPUNIT_ASSERT(osl::FileBase::E_None == aOut.open(osl_File_OpenFlag_Write)); + + sal_uInt8 in[8192]; + sal_uInt8 out[8192]; + sal_uInt64 nBytesRead, nBytesWritten; + while(1) + { + CPPUNIT_ASSERT(osl::FileBase::E_None == aIn.read(in, sizeof(in), nBytesRead)); + if (!nBytesRead) + break; + CPPUNIT_ASSERT(rtl_Cipher_E_None == rtl_cipher_decode(cipher, in, nBytesRead, out, sizeof(out))); + CPPUNIT_ASSERT(osl::FileBase::E_None == aOut.write(out, nBytesRead, nBytesWritten)); + CPPUNIT_ASSERT(nBytesRead == nBytesWritten); + } + + rtl_cipher_destroy(cipher); +} + +void FiltersTest::recursiveScan(const rtl::OUString &rFilter, const rtl::OUString &rURL, const rtl::OUString &rUserData, + filterStatus nExpected) +{ + osl::Directory aDir(rURL); + + CPPUNIT_ASSERT(osl::FileBase::E_None == aDir.open()); + osl::DirectoryItem aItem; + osl::FileStatus aFileStatus(osl_FileStatus_Mask_FileURL|osl_FileStatus_Mask_Type); + while (aDir.getNextItem(aItem) == osl::FileBase::E_None) + { + aItem.getFileStatus(aFileStatus); + rtl::OUString sURL = aFileStatus.getFileURL(); + if (aFileStatus.getFileType() == osl::FileStatus::Directory) + recursiveScan(rFilter, sURL, rUserData, nExpected); + else + { + rtl::OUString sTmpFile; + bool bCVE = false; + + sal_Int32 nLastSlash = sURL.lastIndexOf('/'); + + if ((nLastSlash != -1) && (nLastSlash+1 < sURL.getLength())) + { + //ignore .files + if (sURL.getStr()[nLastSlash+1] == '.') + continue; + + if (sURL.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("CVE"), nLastSlash+1)) + bCVE = true; + } + + rtl::OString aRes(rtl::OUStringToOString(sURL, + osl_getThreadTextEncoding())); + + if (bCVE) + { + CPPUNIT_ASSERT(osl::FileBase::E_None == osl::FileBase::createTempFile(NULL, NULL, &sTmpFile)); + decode(sURL, sTmpFile); + sURL = sTmpFile; + } + + //output name early, so in the case of a hang, the name of + //the hanging input file is visible + fprintf(stderr, "%s,", aRes.getStr()); + sal_uInt32 nStartTime = osl_getGlobalTimer(); + bool bRes = load(rFilter, sURL, rUserData); + sal_uInt32 nEndTime = osl_getGlobalTimer(); + + if (bCVE) + CPPUNIT_ASSERT(osl::FileBase::E_None == osl::File::remove(sTmpFile)); + + fprintf(stderr, "%s,%"SAL_PRIuUINT32"\n", + bRes?"Pass":"Fail",nEndTime-nStartTime); + if (nExpected == test::indeterminate) + continue; + CPPUNIT_ASSERT_MESSAGE(aRes.getStr(), bRes == (nExpected == test::pass)); + } + } + CPPUNIT_ASSERT(osl::FileBase::E_None == aDir.close()); +} + +void FiltersTest::testDir(const rtl::OUString &rFilter, const rtl::OUString &rURL, const rtl::OUString &rUserData) +{ + fprintf(stderr, "File tested,Test Result,Execution Time (ms)\n"); + recursiveScan(rFilter, rURL + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("pass")), + rUserData, test::pass); + recursiveScan(rFilter, rURL + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("fail")), + rUserData, test::fail); + recursiveScan(rFilter, rURL + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("indeterminate")), + rUserData, test::indeterminate); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotest/source/cpp/makefile.mk b/unotest/source/cpp/makefile.mk index b28b1edb2b22..928a8b230681 100644 --- a/unotest/source/cpp/makefile.mk +++ b/unotest/source/cpp/makefile.mk @@ -38,6 +38,8 @@ CDEFS += -DOOO_DLLIMPLEMENTATION_UNOTEST CFLAGSCXX += $(CPPUNIT_CFLAGS) SLOFILES = \ + $(SLO)/bootstrapfixturebase.obj \ + $(SLO)/filters-test.obj \ $(SLO)/getargument.obj \ $(SLO)/gettestargument.obj \ $(SLO)/officeconnection.obj \ @@ -52,6 +54,7 @@ SHL1IMPLIB = i$(SHL1TARGET) SHL1OBJS = $(SLOFILES) SHL1RPATH = NONE SHL1STDLIBS = \ + $(COMPHELPERLIB) \ $(CPPUHELPERLIB) \ $(CPPULIB) \ $(CPPUNITLIB) \ |