diff --git a/package/CppunitTest_package2_test.mk b/package/CppunitTest_package2_test.mk index 546da10deda6..206d8c7e1fb8 100644 --- a/package/CppunitTest_package2_test.mk +++ b/package/CppunitTest_package2_test.mk @@ -13,6 +13,7 @@ $(eval $(call gb_CppunitTest_CppunitTest,package2_test)) $(eval $(call gb_CppunitTest_add_exception_objects,package2_test, \ package/qa/cppunit/test_package \ + package/qa/cppunit/test_zippackage \ )) $(eval $(call gb_CppunitTest_use_libraries,package2_test, \ @@ -28,7 +29,9 @@ $(eval $(call gb_CppunitTest_use_sdk_api,package2_test)) $(eval $(call gb_CppunitTest_use_components,package2_test,\ configmgr/source/configmgr \ + package/source/xstor/xstor \ package/util/package2 \ + sax/source/expatwrap/expwrap \ ucb/source/core/ucb1 \ ucb/source/ucp/file/ucpfile1 \ )) diff --git a/package/qa/cppunit/data/casing.docx b/package/qa/cppunit/data/casing.docx new file mode 100644 index 000000000000..d8d0dffc71a6 Binary files /dev/null and b/package/qa/cppunit/data/casing.docx differ diff --git a/package/qa/cppunit/data/dd-deflated.docx b/package/qa/cppunit/data/dd-deflated.docx new file mode 100644 index 000000000000..a4638147ce91 Binary files /dev/null and b/package/qa/cppunit/data/dd-deflated.docx differ diff --git a/package/qa/cppunit/data/dd-stored.docx b/package/qa/cppunit/data/dd-stored.docx new file mode 100644 index 000000000000..41c19338821d Binary files /dev/null and b/package/qa/cppunit/data/dd-stored.docx differ diff --git a/package/qa/cppunit/data/dot-slash.docx b/package/qa/cppunit/data/dot-slash.docx new file mode 100644 index 000000000000..d50cabcbdee2 Binary files /dev/null and b/package/qa/cppunit/data/dot-slash.docx differ diff --git a/package/qa/cppunit/data/duplicate-files.odt b/package/qa/cppunit/data/duplicate-files.odt new file mode 100644 index 000000000000..cc24f7024ad1 Binary files /dev/null and b/package/qa/cppunit/data/duplicate-files.odt differ diff --git a/package/qa/cppunit/data/inner-gap.docx b/package/qa/cppunit/data/inner-gap.docx new file mode 100644 index 000000000000..d8e9a232465c Binary files /dev/null and b/package/qa/cppunit/data/inner-gap.docx differ diff --git a/package/qa/cppunit/data/overlap.docx b/package/qa/cppunit/data/overlap.docx new file mode 100644 index 000000000000..2d5d115ed800 Binary files /dev/null and b/package/qa/cppunit/data/overlap.docx differ diff --git a/package/qa/cppunit/data/slash.odt b/package/qa/cppunit/data/slash.odt new file mode 100644 index 000000000000..22c6443499af Binary files /dev/null and b/package/qa/cppunit/data/slash.odt differ diff --git a/package/qa/cppunit/data/two-zips.docx b/package/qa/cppunit/data/two-zips.docx new file mode 100644 index 000000000000..720189b20ed9 Binary files /dev/null and b/package/qa/cppunit/data/two-zips.docx differ diff --git a/package/qa/cppunit/data/two-zips.odt b/package/qa/cppunit/data/two-zips.odt new file mode 100644 index 000000000000..36d90cb9d4d9 Binary files /dev/null and b/package/qa/cppunit/data/two-zips.odt differ diff --git a/package/qa/cppunit/data/unicode-path.docx b/package/qa/cppunit/data/unicode-path.docx new file mode 100644 index 000000000000..1855aa1e7408 Binary files /dev/null and b/package/qa/cppunit/data/unicode-path.docx differ diff --git a/package/qa/cppunit/data/unicode-path.odt b/package/qa/cppunit/data/unicode-path.odt new file mode 100644 index 000000000000..9edaaeb68809 Binary files /dev/null and b/package/qa/cppunit/data/unicode-path.odt differ diff --git a/package/qa/cppunit/data/zip64-eocd.docx b/package/qa/cppunit/data/zip64-eocd.docx new file mode 100644 index 000000000000..1a4dbd0d16b1 Binary files /dev/null and b/package/qa/cppunit/data/zip64-eocd.docx differ diff --git a/package/qa/cppunit/test_zippackage.cxx b/package/qa/cppunit/test_zippackage.cxx new file mode 100644 index 000000000000..624457ab7bcf --- /dev/null +++ b/package/qa/cppunit/test_zippackage.cxx @@ -0,0 +1,390 @@ +/* -*- 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 + +#include +#include +#include + +using namespace ::com::sun::star; + +class ZipPackageTest : public test::BootstrapFixtureBase +{ +}; + +auto const ZipPackage(u"com.sun.star.packages.comp.ZipPackage"_ustr); + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDuplicate) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/duplicate-files.odt")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testUnicodeODT) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/unicode-path.odt")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testUnicodeDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/unicode-path.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testAbsolutePathODT) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/slash.odt")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDotPathDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/dot-slash.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testConcatODT) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/two-zips.odt")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testConcatDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/two-zips.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testCaseInsensitiveDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/casing.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::OFOPXML))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testOverlapDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/overlap.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testInnerGapDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/inner-gap.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDataDescriptorDeflatedDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/dd-deflated.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testDataDescriptorStoredDOCX) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/dd-stored.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::OFOPXML))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::OFOPXML))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +CPPUNIT_TEST_FIXTURE(ZipPackageTest, testZip64End) +{ + auto const url(m_directories.getURLFromSrc(u"/package/qa/cppunit/data/zip64-eocd.docx")); + uno::Sequence const args{ + uno::Any(url), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + + // don't load corrupted zip file + CPPUNIT_ASSERT_THROW(m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext( + ZipPackage, args, m_xContext), + css::packages::zip::ZipIOException); + + try + { + uno::Sequence const args2{ + uno::Any(url), uno::Any(beans::NamedValue(u"RepairPackage"_ustr, uno::Any(true))), + uno::Any(beans::NamedValue("StorageFormat", uno::Any(embed::StorageFormats::ZIP))) + }; + m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(ZipPackage, args2, + m_xContext); + } + catch (css::packages::zip::ZipIOException const&) + { + // check that this doesn't crash, it doesn't matter if it succeeds or not + } +} + +//CPPUNIT_TEST_SUITE_REGISTRATION(...); +//CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */