[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - filter/CppunitTest_filter_xslt.mk filter/Module_filter.mk filter/qa filter/source

Michael Stahl mstahl at redhat.com
Wed Mar 5 02:18:39 PST 2014


 filter/CppunitTest_filter_xslt.mk               |   46 +++++
 filter/Module_filter.mk                         |    4 
 filter/qa/cppunit/data/xslt/copy.xslt           |    9 +
 filter/qa/cppunit/xslt-test.cxx                 |  193 ++++++++++++++++++++++++
 filter/source/xsltfilter/LibXSLTTransformer.cxx |    5 
 5 files changed, 256 insertions(+), 1 deletion(-)

New commits:
commit f856667ee6ae786575aa8e82f71ff2dabf16a659
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Mar 4 17:59:45 2014 +0100

    filter: make LibXSLTTransformer init backward compatible
    
    As reported by Fernand Vanrie, initializing the XSLT service can fail
    because the LibXSLTTransformer::initialize was changed to require
    the parameters as a nested Sequence; accept previous parameter
    convention as a fall-back.
    
    (regression from ca0ea73a4ab104031a16b5bac7a9bb6e57c77ba0)
    
    (cherry picked from commit 6967da019b69767a15116de101d33a16b95c8a44)
    
    filter: and we learn that BootstrapFixture requires boost headers
    (cherry picked from commit bfdd18eb35f5c8bf7f713910ec35b853c7456969)
    
    filter: don't wait forever if the xslt test fails
    (cherry picked from commit 8af7a8953248dd184cd620b934ee6abc147f4076)
    
    I imagine this should have a SAL_CALL decoration
    (cherry picked from commit 62d6252d2cde33f6ef0e627c3192a63d43ba2a87)
    
    filter: sigh... fix the xslt test to run on WNT too
    (cherry picked from commit 4fcd5534348adcb61ab85b93478c272b8d9e8f8c)
    
    Change-Id: I136e6e6338f11ffecf9f856f0736d1d0e6b17c3f
    Reviewed-on: https://gerrit.libreoffice.org/8456
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/filter/CppunitTest_filter_xslt.mk b/filter/CppunitTest_filter_xslt.mk
new file mode 100644
index 0000000..90af9b0
--- /dev/null
+++ b/filter/CppunitTest_filter_xslt.mk
@@ -0,0 +1,46 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,filter_xslt))
+
+$(eval $(call gb_CppunitTest_use_api,filter_xslt,\
+	offapi \
+	udkapi \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,filter_xslt))
+
+$(eval $(call gb_CppunitTest_use_configuration,filter_xslt))
+
+$(eval $(call gb_CppunitTest_use_external,filter_xslt,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_libraries,filter_xslt, \
+	comphelper \
+	test \
+	unotest \
+	cppuhelper \
+	cppu \
+	sal \
+	$(gb_UWINAPI) \
+))
+
+$(eval $(call gb_CppunitTest_use_components,filter_xslt,\
+	configmgr/source/configmgr \
+	fileaccess/source/fileacc \
+	filter/source/xsltfilter/xsltfilter \
+	i18npool/util/i18npool \
+	ucb/source/core/ucb1 \
+	ucb/source/ucp/file/ucpfile1 \
+))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,filter_xslt, \
+	filter/qa/cppunit/xslt-test \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/filter/Module_filter.mk b/filter/Module_filter.mk
index 559fb65..85480f7 100644
--- a/filter/Module_filter.mk
+++ b/filter/Module_filter.mk
@@ -75,6 +75,10 @@ $(eval $(call gb_Module_add_targets,filter,\
 ))
 endif
 
+$(eval $(call gb_Module_add_check_targets,filter,\
+    CppunitTest_filter_xslt \
+))
+
 ifneq ($(DISABLE_CVE_TESTS),TRUE)
 $(eval $(call gb_Module_add_check_targets,filter,\
     CppunitTest_filter_pict_test \
diff --git a/filter/qa/cppunit/data/xslt/copy.xslt b/filter/qa/cppunit/data/xslt/copy.xslt
new file mode 100644
index 0000000..d46172a
--- /dev/null
+++ b/filter/qa/cppunit/data/xslt/copy.xslt
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<xsl:template match="/">
+   <xsl:copy-of select="/"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/filter/qa/cppunit/xslt-test.cxx b/filter/qa/cppunit/xslt-test.cxx
new file mode 100644
index 0000000..509d37c
--- /dev/null
+++ b/filter/qa/cppunit/xslt-test.cxx
@@ -0,0 +1,193 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <limits>
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <sal/types.h>
+
+#include <rtl/ref.hxx>
+
+#include <osl/file.hxx>
+#include <osl/thread.h>
+
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/io/XStreamListener.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/ucb/SimpleFileAccess.hpp>
+#include <com/sun/star/xml/xslt/XSLTTransformer.hpp>
+
+#include <cppuhelper/implbase1.hxx>
+
+#include <test/bootstrapfixture.hxx>
+
+
+using namespace std;
+using namespace ::com::sun::star;
+
+
+namespace {
+
+class XsltFilterTest
+    : public test::BootstrapFixture
+{
+public:
+    void testXsltCopyOld();
+    void testXsltCopyNew();
+
+    CPPUNIT_TEST_SUITE(XsltFilterTest);
+    CPPUNIT_TEST(testXsltCopyOld);
+    CPPUNIT_TEST(testXsltCopyNew);
+    CPPUNIT_TEST_SUITE_END();
+};
+
+struct Listener : public ::cppu::WeakImplHelper1<io::XStreamListener>
+{
+    bool m_bDone;
+
+    Listener() : m_bDone(false) {}
+
+    virtual void SAL_CALL disposing(const lang::EventObject&) throw() SAL_OVERRIDE {}
+    virtual void SAL_CALL started() throw() SAL_OVERRIDE { m_bDone = false; }
+    virtual void SAL_CALL closed() throw() SAL_OVERRIDE { m_bDone = true; }
+    virtual void SAL_CALL terminated() throw() SAL_OVERRIDE { m_bDone = true; }
+    virtual void SAL_CALL error(const uno::Any& e) throw() SAL_OVERRIDE
+    {
+        (void)e;
+        m_bDone = true; // set on error too, otherwise main thread waits forever
+        CPPUNIT_FAIL("exception while in XSLT");
+    }
+};
+
+void XsltFilterTest::testXsltCopyNew()
+{
+    OUString tempDirURL;
+    osl_getTempDirURL(&tempDirURL.pData);
+    oslFileHandle tempFile;
+    OUString tempURL;
+    osl::File::RC rc = osl::File::createTempFile(0, &tempFile, &tempURL);
+    CPPUNIT_ASSERT(osl::FileBase::E_None == rc);
+    osl_closeFile(tempFile); // close it so xSFA can open it on WNT
+
+    OUString source(
+            getURLFromSrc("/filter/source/xsltfilter/xsltfilter.component"));
+    uno::Sequence<uno::Any> args(7);
+    args[0] <<= beans::NamedValue("StylesheetURL",
+        uno::makeAny(getURLFromSrc("/filter/qa/cppunit/data/xslt/copy.xslt")));
+    args[1] <<= beans::NamedValue("SourceURL", uno::makeAny(source));
+    args[2] <<= beans::NamedValue("TargetURL", uno::makeAny(tempURL));
+    args[3] <<= beans::NamedValue("SourceBaseURL",
+        uno::makeAny(getURLFromSrc("/filter/source/xsltfilter/")));
+    args[4] <<= beans::NamedValue("TargetBaseURL", uno::makeAny(tempDirURL));
+    args[5] <<= beans::NamedValue("SystemType", uno::makeAny(OUString()));
+    args[6] <<= beans::NamedValue("PublicType", uno::makeAny(OUString()));
+
+    uno::Reference<ucb::XSimpleFileAccess3> xSFA =
+        ucb::SimpleFileAccess::create(getComponentContext());
+
+    uno::Reference<io::XInputStream> xIn = xSFA->openFileRead(source);
+    uno::Reference<io::XOutputStream> xOut = xSFA->openFileWrite(tempURL);
+
+    rtl::Reference<Listener> xListener = new Listener();
+
+    uno::Reference<xml::xslt::XXSLTTransformer> xXslt(
+            xml::xslt::XSLTTransformer::create(getComponentContext(), args));
+
+    xXslt->addListener(uno::Reference<io::XStreamListener>(xListener.get()));
+    xXslt->setInputStream(xIn);
+    xXslt->setOutputStream(xOut);
+
+    xXslt->start();
+
+    TimeValue delay;
+    delay.Seconds = 0;
+    delay.Nanosec = 1000000;
+    while (!xListener->m_bDone) { osl_waitThread(&delay); }
+
+    xIn->closeInput();
+    xOut->closeOutput();
+
+    osl::File foo(tempURL); // apparently it's necessary to open it again?
+    foo.open(osl_File_OpenFlag_Read);
+    sal_uInt64 size(0);
+    foo.getSize(size);
+    CPPUNIT_ASSERT(size > 1000); // check that something happened
+}
+
+void XsltFilterTest::testXsltCopyOld()
+{
+    OUString tempDirURL;
+    osl_getTempDirURL(&tempDirURL.pData);
+    oslFileHandle tempFile;
+    OUString tempURL;
+    osl::File::RC rc = osl::File::createTempFile(0, &tempFile, &tempURL);
+    CPPUNIT_ASSERT(osl::FileBase::E_None == rc);
+    osl_closeFile(tempFile); // close it so xSFA can open it on WNT
+
+    OUString source(
+            getURLFromSrc("/filter/source/xsltfilter/xsltfilter.component"));
+    uno::Sequence<uno::Any> args(7);
+    args[0] <<= beans::NamedValue("StylesheetURL",
+        uno::makeAny(getURLFromSrc("/filter/qa/cppunit/data/xslt/copy.xslt")));
+    args[1] <<= beans::NamedValue("SourceURL", uno::makeAny(source));
+    args[2] <<= beans::NamedValue("TargetURL", uno::makeAny(tempURL));
+    args[3] <<= beans::NamedValue("SourceBaseURL",
+        uno::makeAny(getURLFromSrc("/filter/source/xsltfilter/")));
+    args[4] <<= beans::NamedValue("TargetBaseURL", uno::makeAny(tempDirURL));
+    args[5] <<= beans::NamedValue("SystemType", uno::makeAny(OUString()));
+    args[6] <<= beans::NamedValue("PublicType", uno::makeAny(OUString()));
+
+
+    uno::Reference<ucb::XSimpleFileAccess3> xSFA =
+        ucb::SimpleFileAccess::create(getComponentContext());
+
+    uno::Reference<io::XInputStream> xIn = xSFA->openFileRead(source);
+    uno::Reference<io::XOutputStream> xOut = xSFA->openFileWrite(tempURL);
+
+    rtl::Reference<Listener> xListener = new Listener();
+
+    uno::Reference<xml::xslt::XXSLTTransformer> xXslt(
+        getMultiServiceFactory()->createInstance(
+            "com.sun.star.comp.documentconversion.LibXSLTTransformer"),
+        uno::UNO_QUERY_THROW);
+
+    uno::Reference<lang::XInitialization> xInit(xXslt, uno::UNO_QUERY_THROW);
+    xInit->initialize(args);
+    xXslt->addListener(uno::Reference<io::XStreamListener>(xListener.get()));
+    xXslt->setInputStream(xIn);
+    xXslt->setOutputStream(xOut);
+
+    xXslt->start();
+
+    TimeValue delay;
+    delay.Seconds = 0;
+    delay.Nanosec = 1000000;
+    while (!xListener->m_bDone) { osl_waitThread(&delay); }
+
+    xIn->closeInput();
+    xOut->closeOutput();
+
+    osl::File foo(tempURL); // apparently it's necessary to open it again?
+    foo.open(osl_File_OpenFlag_Read);
+    sal_uInt64 size(0);
+    foo.getSize(size);
+    CPPUNIT_ASSERT(size > 1000); // check that something happened
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(XsltFilterTest);
+
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx
index b98d71c..ff747a5 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.cxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx
@@ -475,7 +475,10 @@ namespace XSLT
             throw (RuntimeException)
     {
         Sequence<Any> params;
-        args[0] >>= params;
+        if (!(args[0] >>= params))
+        {   // backward compatibility for old clients using createInstance
+            params = args;
+        }
         xmlSubstituteEntitiesDefault(0);
         m_parameters.clear();
         for (int i = 0; i < params.getLength(); i++)


More information about the Libreoffice-commits mailing list