[Libreoffice-commits] .: sot/qa

Michael Meeks michael at kemper.freedesktop.org
Mon May 14 07:15:12 PDT 2012


 sot/qa/cppunit/test_sot.cxx |   73 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 72 insertions(+), 1 deletion(-)

New commits:
commit ac90be0eddb4f1724c4aef3e3eade82bda8737ee
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Mon May 14 15:17:12 2012 +0100

    sot: add OLE2 unit test reading streams forward and backwards

diff --git a/sot/qa/cppunit/test_sot.cxx b/sot/qa/cppunit/test_sot.cxx
index 36d0b02..5fcbcd6 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()


More information about the Libreoffice-commits mailing list