summaryrefslogtreecommitdiff
path: root/sot
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2012-05-14 15:17:12 +0100
committerMichael Meeks <michael.meeks@suse.com>2012-05-14 15:17:39 +0100
commitac90be0eddb4f1724c4aef3e3eade82bda8737ee (patch)
tree7b7d546482aa4984d0d7c06f86bad737237ca25e /sot
parenteda52d5e73d8918f354036cf7db3acfab43b36d7 (diff)
sot: add OLE2 unit test reading streams forward and backwards
Diffstat (limited to 'sot')
-rw-r--r--sot/qa/cppunit/test_sot.cxx73
1 files changed, 72 insertions, 1 deletions
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 <osl/file.hxx>
#include <osl/process.h>
#include <sot/storage.hxx>
+#include <sot/storinfo.hxx>
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()