From ac90be0eddb4f1724c4aef3e3eade82bda8737ee Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Mon, 14 May 2012 15:17:12 +0100 Subject: sot: add OLE2 unit test reading streams forward and backwards --- sot/qa/cppunit/test_sot.cxx | 73 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/sot/qa/cppunit/test_sot.cxx b/sot/qa/cppunit/test_sot.cxx index 36d0b02ffe6b..5fcbcd672bc5 100644 --- a/sot/qa/cppunit/test_sot.cxx +++ b/sot/qa/cppunit/test_sot.cxx @@ -33,6 +33,7 @@ #include #include #include +#include using namespace ::com::sun::star; @@ -45,6 +46,11 @@ namespace public: SotTest() {} + bool checkStream( const SotStorageRef &xObjStor, + const String &rStreamName, + sal_uLong nSize ); + bool checkStorage( const SotStorageRef &xObjStor ); + virtual bool load(const rtl::OUString &, const rtl::OUString &rURL, const rtl::OUString &); @@ -55,12 +61,77 @@ namespace CPPUNIT_TEST_SUITE_END(); }; + bool SotTest::checkStream( const SotStorageRef &xObjStor, + const String &rStreamName, + sal_uLong nSize ) + { + unsigned char *pData = (unsigned char*)malloc( nSize ); + sal_uLong nReadableSize = 0; + if( !pData ) + return true; + + { // Read the data in one block + SotStorageStreamRef xStream( xObjStor->OpenSotStream( rStreamName ) ); + xStream->Seek(0); + sal_uLong nRemaining = xStream->GetSize() - xStream->Tell(); + + CPPUNIT_ASSERT_MESSAGE( "check size", nRemaining == nSize ); + CPPUNIT_ASSERT_MESSAGE( "check size #2", xStream->remainingSize() == nSize ); + + // Read as much as we can, a corrupted FAT chain can cause real grief here + nReadableSize = xStream->Read( (void *)pData, nSize ); +// fprintf(stderr, "readable size %d vs size %d remaining %d\n", nReadableSize, nSize, nReadableSize); + } + { // Read the data backwards as well + SotStorageStreamRef xStream( xObjStor->OpenSotStream( rStreamName ) ); + for( sal_uLong i = nReadableSize; i > 0; i-- ) + { + CPPUNIT_ASSERT_MESSAGE( "sot reading error", !xStream->GetError() ); + unsigned char c; + xStream->Seek( i - 1 ); + CPPUNIT_ASSERT_MESSAGE( "sot storage reading byte", + xStream->Read( &c, 1 ) == 1); + CPPUNIT_ASSERT_MESSAGE( "mismatching data storage reading byte", + pData[i - 1] == c ); + } + } + + return true; + } + + bool SotTest::checkStorage( const SotStorageRef &xObjStor ) + { + SvStorageInfoList aInfoList; + xObjStor->FillInfoList( &aInfoList ); + + for( SvStorageInfoList::iterator aIt = aInfoList.begin(); + aIt != aInfoList.end(); aIt++ ) + { +// fprintf( stderr, "Stream '%s' size %ld\n", +// rtl::OUStringToOString( aIt->GetName(), RTL_TEXTENCODING_UTF8 ).getStr(), +// (long)aIt->GetSize() ); + if( aIt->IsStorage() ) + { + SotStorageRef xChild( xObjStor->OpenSotStorage( aIt->GetName() ) ); + checkStorage( xChild ); + } + else if( aIt->IsStream() ) + checkStream( xObjStor, aIt->GetName(), aIt->GetSize() ); + } + + return true; + } + bool SotTest::load(const rtl::OUString &, const rtl::OUString &rURL, const rtl::OUString &) { SvFileStream aStream(rURL, STREAM_READ); SotStorageRef xObjStor = new SotStorage(aStream); - return xObjStor.Is() && !xObjStor->GetError(); + if (!xObjStor.Is() && !xObjStor->GetError()) + return false; + + CPPUNIT_ASSERT_MESSAGE("sot storage is not valid", xObjStor->Validate()); + return checkStorage (xObjStor); } void SotTest::test() -- cgit