xref: /AOO41X/main/io/test/stm/datatest.cxx (revision 3716f815df2d68347af345f8524e39097ef453f6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_io.hxx"
26 
27 #include <stdio.h>
28 
29 #include <com/sun/star/test/XSimpleTest.hpp>
30 #include <com/sun/star/io/XActiveDataSink.hpp>
31 #include <com/sun/star/io/XActiveDataSource.hpp>
32 #include <com/sun/star/io/XObjectInputStream.hpp>
33 #include <com/sun/star/io/XObjectOutputStream.hpp>
34 #include <com/sun/star/io/XMarkableStream.hpp>
35 #include <com/sun/star/io/XConnectable.hpp>
36 #include <com/sun/star/beans/XPropertySet.hpp>
37 #include <com/sun/star/lang/WrappedTargetException.hpp>
38 
39 #include <com/sun/star/lang/IllegalArgumentException.hpp>
40 
41 #include <com/sun/star/lang/XServiceInfo.hpp>
42 
43 #include <cppuhelper/factory.hxx>
44 
45 #include <cppuhelper/implbase1.hxx>
46 #include <cppuhelper/implbase2.hxx>
47 
48 #include <osl/conditn.hxx>
49 #include <osl/mutex.hxx>
50 
51 #include <string.h>
52 
53 using namespace ::rtl;
54 using namespace ::osl;
55 using namespace ::cppu;
56 //using namespace ::vos;
57 using namespace ::com::sun::star::uno;
58 using namespace ::com::sun::star::io;
59 using namespace ::com::sun::star::lang;
60 using namespace ::com::sun::star::test;
61 using namespace ::com::sun::star::beans;
62 // streams
63 
64 #include "testfactreg.hxx"
65 
66 #define DATASTREAM_TEST_MAX_HANDLE 1
67 
68 /****
69 * The following test class tests XDataInputStream and XDataOutputStream at equal terms,
70 * so when errors occur, it may be in either one implementation.
71 * The class also  uses stardiv.uno.io.pipe. If problems occur, make sure to run also the
72 * pipe test routines ( test.com.sun.star.io.pipe ).
73 *
74 *
75 *****/
76 
77 class ODataStreamTest :
78         public WeakImplHelper1< XSimpleTest >
79 {
80 public:
ODataStreamTest(const Reference<XMultiServiceFactory> & rFactory)81     ODataStreamTest( const Reference < XMultiServiceFactory > & rFactory ) :
82         m_rFactory( rFactory )
83         {}
84 
85 public:
86     virtual void SAL_CALL testInvariant(const OUString& TestName, const Reference < XInterface >& TestObject)
87         throw ( IllegalArgumentException,
88                     RuntimeException);
89 
90     virtual sal_Int32 SAL_CALL test(    const OUString& TestName,
91                                         const Reference < XInterface >& TestObject,
92                                         sal_Int32 hTestHandle)
93         throw ( IllegalArgumentException,
94                 RuntimeException);
95 
96     virtual sal_Bool SAL_CALL testPassed(void)                              throw ( RuntimeException);
97     virtual Sequence< OUString > SAL_CALL getErrors(void)               throw (RuntimeException);
98     virtual Sequence< Any > SAL_CALL getErrorExceptions(void)       throw (RuntimeException);
99     virtual Sequence< OUString > SAL_CALL getWarnings(void)                 throw (RuntimeException);
100 
101 private:
102     void testSimple( const Reference < XDataInputStream > & , const Reference < XDataOutputStream > &);
103 
104 protected:
105     Sequence<Any>  m_seqExceptions;
106     Sequence<OUString> m_seqErrors;
107     Sequence<OUString> m_seqWarnings;
108 
109     Reference < XMultiServiceFactory > m_rFactory;
110 };
111 
112 
113 
114 
testInvariant(const OUString & TestName,const Reference<XInterface> & TestObject)115 void ODataStreamTest::testInvariant(
116     const OUString& TestName,
117     const Reference < XInterface >& TestObject )
118     throw ( IllegalArgumentException,
119             RuntimeException)
120 {
121     if( OUString::createFromAscii("com.sun.star.io.DataInputStream") == TestName ) {
122         Reference < XConnectable > connect( TestObject , UNO_QUERY );
123         Reference < XActiveDataSink > active( TestObject , UNO_QUERY );
124         Reference < XInputStream >  input( TestObject , UNO_QUERY );
125         Reference < XDataInputStream > dataInput( TestObject , UNO_QUERY );
126 
127         WARNING_ASSERT( connect.is(), "XConnectable cannot be queried" );
128         WARNING_ASSERT( active.is() , "XActiveDataSink cannot be queried" );
129         ERROR_ASSERT( input.is() , "XInputStream cannot be queried" );
130         ERROR_ASSERT( dataInput.is() , "XDataInputStream cannot be queried" );
131 
132 
133     }
134     else if( OUString::createFromAscii("com.sun.star.io.DataInputStream") == TestName ) {
135         Reference < XConnectable >  connect( TestObject , UNO_QUERY );
136         Reference < XActiveDataSource > active( TestObject , UNO_QUERY );
137         Reference < XOutputStream > output( TestObject , UNO_QUERY );
138         Reference < XDataOutputStream > dataOutput( TestObject , UNO_QUERY );
139 
140         WARNING_ASSERT( connect.is(),       "XConnectable cannot be queried" );
141         WARNING_ASSERT( active.is() ,   "XActiveDataSink cannot be queried" );
142         ERROR_ASSERT(   output.is() ,   "XInputStream cannot be queried" );
143         ERROR_ASSERT(   dataOutput.is(),    "XDataInputStream cannot be queried" );
144 
145     }
146 
147     Reference < XServiceInfo >  info( TestObject, UNO_QUERY );
148     ERROR_ASSERT( info.is() , "XServiceInfo not supported !" );
149     if( info.is() )
150     {
151         ERROR_ASSERT( info->supportsService( TestName ), "XServiceInfo test failed" );
152         ERROR_ASSERT( ! info->supportsService( OUString::createFromAscii("bla bluzb") ) , "XServiceInfo test failed" );
153     }
154 
155 }
156 
157 
test(const OUString & TestName,const Reference<XInterface> & TestObject,sal_Int32 hTestHandle)158 sal_Int32 ODataStreamTest::test(
159     const OUString& TestName,
160     const Reference < XInterface >& TestObject,
161     sal_Int32 hTestHandle)
162     throw ( IllegalArgumentException,
163             RuntimeException)
164 {
165     if( OUString::createFromAscii("com.sun.star.io.DataInputStream") == TestName ||
166         OUString::createFromAscii("com.sun.star.io.DataOutputStream") == TestName )  {
167 
168         try
169         {
170             if( 0 == hTestHandle ) {
171                 testInvariant( TestName , TestObject );
172             }
173             else {
174                 Reference <XActiveDataSink > rSink( TestObject, UNO_QUERY );
175                 Reference <XActiveDataSource > rSource( TestObject , UNO_QUERY );
176 
177                 Reference < XDataInputStream > rInput( TestObject , UNO_QUERY );
178                 Reference < XDataOutputStream > rOutput( TestObject , UNO_QUERY );
179 
180 
181                 Reference < XInterface > x = m_rFactory->createInstance(
182                     OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.Pipe" )));
183 
184                 Reference < XInputStream >   rPipeInput( x , UNO_QUERY );
185                 Reference < XOutputStream >  rPipeOutput( x , UNO_QUERY );
186 
187                 if( ! rSink.is() ) {
188                     x = m_rFactory->createInstance(
189                         OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.DataInputStream")) );
190                     rInput = Reference < XDataInputStream > ( x , UNO_QUERY);
191                     rSink = Reference<  XActiveDataSink > ( x , UNO_QUERY );
192                 }
193                 else if ( !rSource.is() )
194                 {
195                     x = m_rFactory->createInstance(
196                         OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.DataOutputStream") ) );
197                     rOutput = Reference< XDataOutputStream > ( x , UNO_QUERY );
198                     rSource = Reference< XActiveDataSource > ( x, UNO_QUERY );
199                 }
200 
201                 OSL_ASSERT( rPipeInput.is() );
202                 OSL_ASSERT( rPipeOutput.is() );
203                 rSink->setInputStream( rPipeInput );
204                 rSource->setOutputStream( rPipeOutput );
205 
206                 OSL_ASSERT( rSink->getInputStream().is() );
207                 OSL_ASSERT( rSource->getOutputStream().is() );
208 
209                 if( 1 == hTestHandle ) {
210                     testSimple( rInput , rOutput );
211                 }
212             }
213         }
214         catch( Exception & e )
215         {
216             OString o = OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US );
217             BUILD_ERROR( 0 , o.getStr() );
218         }
219         catch( ... )
220         {
221             BUILD_ERROR( 0 , "unknown exception (Exception is  not base class)" );
222         }
223 
224         hTestHandle ++;
225 
226         if( hTestHandle >= 2) {
227             // all tests finished.
228             hTestHandle = -1;
229         }
230     }
231     else {
232         BUILD_ERROR( 0 , "service not supported by test." );
233     }
234     return hTestHandle;
235 }
236 
237 
238 
testPassed(void)239 sal_Bool ODataStreamTest::testPassed(void)                                      throw (RuntimeException)
240 {
241     return m_seqErrors.getLength() == 0;
242 }
243 
244 
getErrors(void)245 Sequence< OUString > ODataStreamTest::getErrors(void)                           throw (RuntimeException)
246 {
247     return m_seqErrors;
248 }
249 
250 
getErrorExceptions(void)251 Sequence< Any > ODataStreamTest::getErrorExceptions(void)                   throw (RuntimeException)
252 {
253     return m_seqExceptions;
254 }
255 
256 
getWarnings(void)257 Sequence< OUString > ODataStreamTest::getWarnings(void)                         throw (RuntimeException)
258 {
259     return m_seqWarnings;
260 }
261 
testSimple(const Reference<XDataInputStream> & rInput,const Reference<XDataOutputStream> & rOutput)262 void ODataStreamTest::testSimple(   const Reference < XDataInputStream > &rInput,
263                                     const Reference < XDataOutputStream > &rOutput )
264 {
265     rOutput->writeLong( 0x34ff3c );
266     rOutput->writeLong( 0x34ff3d );
267     rOutput->writeLong( -1027 );
268 
269     ERROR_ASSERT( 0x34ff3c ==  rInput->readLong() , "long read/write mismatch" );
270     ERROR_ASSERT( 0x34ff3d ==  rInput->readLong() , "long read/write mismatch" );
271     ERROR_ASSERT( -1027    ==  rInput->readLong() , "long read/write mismatch" );
272 
273     rOutput->writeByte( 0x77 );
274     ERROR_ASSERT( 0x77 == rInput->readByte() , "byte read/write mismatch" );
275 
276     rOutput->writeBoolean( 25 );
277     ERROR_ASSERT( rInput->readBoolean() , "boolean read/write mismatch" );
278 
279     rOutput->writeBoolean( sal_False );
280     ERROR_ASSERT( ! rInput->readBoolean() , "boolean read/write mismatch" );
281 
282     rOutput->writeFloat( (float) 42.42 );
283     ERROR_ASSERT( rInput->readFloat() == ((float)42.42) , "float read/write mismatch" );
284 
285     rOutput->writeDouble( (double) 42.42 );
286     ERROR_ASSERT( rInput->readDouble() == 42.42 , "double read/write mismatch" );
287 
288     rOutput->writeHyper( 0x123456789abcdefLL );
289     ERROR_ASSERT( rInput->readHyper() == 0x123456789abcdefLL , "int64 read/write mismatch" );
290 
291     rOutput->writeUTF( OUString::createFromAscii("Live long and prosper !") );
292     ERROR_ASSERT( rInput->readUTF() == OUString::createFromAscii("Live long and prosper !") ,
293                     "UTF read/write mismatch" );
294 
295     Sequence<sal_Unicode> wc(0x10001);
296     for( int i = 0 ; i < 0x10000  ; i ++ ) {
297         wc.getArray()[i] = L'c';
298     }
299     wc.getArray()[0x10000] = 0;
300     OUString str( wc.getArray() , 0x10000 );
301     rOutput->writeUTF( str );
302     ERROR_ASSERT( rInput->readUTF() == str , "error reading 64k block" );
303 
304     rOutput->closeOutput();
305     try
306     {
307         rInput->readLong();
308         ERROR_ASSERT( 0 , "eof-exception does not occur !" );
309     }
310     catch ( IOException & )
311     {
312         //ok
313     }
314     catch( ... )
315     {
316         ERROR_ASSERT( 0 , "wrong exception after reading beyond eof" );
317     }
318 
319     Sequence<sal_Int8> dummy (1);
320     ERROR_ASSERT( ! rInput->readBytes( dummy , 1 ),
321                     "stream must be on eof !" );
322 
323     rInput->closeInput();
324 
325     try
326     {
327         rOutput->writeByte( 1 );
328         ERROR_ASSERT( 0 , "writing still possible though chain must be interrupted" );
329     }
330     catch( IOException & )
331     {
332         // ok
333     }
334     catch( ... ) {
335         ERROR_ASSERT( 0 , "IOException  expected, but another exception was thrown" );
336     }
337 
338 }
339 
340 
341 
342 /**
343 * for external binding
344 *
345 *
346 **/
ODataStreamTest_CreateInstance(const Reference<XMultiServiceFactory> & rSMgr)347 Reference < XInterface > SAL_CALL ODataStreamTest_CreateInstance( const Reference < XMultiServiceFactory > & rSMgr ) throw(Exception)
348 {
349     ODataStreamTest *p = new ODataStreamTest( rSMgr );
350     return Reference < XInterface > ( SAL_STATIC_CAST( OWeakObject * , p ) );
351 }
352 
ODataStreamTest_getSupportedServiceNames(int i)353 Sequence<OUString> ODataStreamTest_getSupportedServiceNames( int i) throw ()
354 {
355     Sequence<OUString> aRet(1);
356 
357     aRet.getArray()[0] = ODataStreamTest_getImplementationName( i);
358 
359 
360     return aRet;
361 }
362 
ODataStreamTest_getServiceName(int i)363 OUString     ODataStreamTest_getServiceName( int i) throw ()
364 {
365     if( 1 == i ) {
366         return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.DataInputStream" ));
367     }
368     else {
369         return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.DataOutputStream" ));
370     }
371 }
372 
ODataStreamTest_getImplementationName(int i)373 OUString    ODataStreamTest_getImplementationName( int i) throw ()
374 {
375     if( 1 == i ) {
376         return OUString(
377             RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.comp.extensions.stm.DataInputStream") );
378     }
379     else {
380         return OUString( RTL_CONSTASCII_USTRINGPARAM(
381             "test.com.sun.star.comp.extensions.stm.DataOutputStream" ) );
382     }
383 }
384 
385 
386 /**------------------------------------------------------
387 *
388 *
389 *
390 *
391 *
392 *------------------------------------------------------*/
393 class MyPersistObject : public WeakImplHelper2< XPersistObject , XPropertySet >
394 {
395 public:
MyPersistObject()396     MyPersistObject( ) : m_sServiceName( OMyPersistObject_getServiceName() ) ,
397         m_l( -392 ),
398         m_f( 7883.2 ),
399         m_d( -123923.5 ),
400         m_b( sal_True ),
401         m_byte( 42 ),
402         m_c( 429 ),
403         m_s( OUString( RTL_CONSTASCII_USTRINGPARAM( "foo" ) ) )
404         {}
MyPersistObject(const OUString & sServiceName)405     MyPersistObject( const OUString & sServiceName ) : m_sServiceName( sServiceName )
406         {}
407 
408 
409 public:
410     virtual OUString SAL_CALL getServiceName(void)  throw (RuntimeException);
411     virtual void SAL_CALL write( const Reference< XObjectOutputStream >& OutStream )
412         throw (IOException, RuntimeException);
413     virtual void SAL_CALL read(const Reference< XObjectInputStream >& InStream)
414         throw (IOException, RuntimeException);
415 
416 public:
417 
418     virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo(void)
419         throw (RuntimeException);
420 
421     virtual void SAL_CALL setPropertyValue(const OUString& aPropertyName, const Any& aValue)
422         throw ( UnknownPropertyException,
423                 PropertyVetoException,
424                 IllegalArgumentException,
425                 WrappedTargetException,
426                 RuntimeException);
427     virtual Any SAL_CALL getPropertyValue(const OUString& PropertyName)
428         throw ( UnknownPropertyException,
429                 WrappedTargetException,
430                 RuntimeException);
431     virtual void SAL_CALL addPropertyChangeListener(
432         const OUString& aPropertyName,
433         const Reference < XPropertyChangeListener > & xListener)
434         throw ( UnknownPropertyException,
435                 WrappedTargetException,
436                 RuntimeException);
437 
438     virtual void SAL_CALL removePropertyChangeListener(
439         const OUString& aPropertyName,
440         const Reference< XPropertyChangeListener > & aListener)
441         throw ( UnknownPropertyException,
442                 WrappedTargetException,
443                 RuntimeException);
444     virtual void SAL_CALL addVetoableChangeListener(
445         const OUString& PropertyName,
446         const Reference< XVetoableChangeListener > & aListener)
447         throw ( UnknownPropertyException,
448                 WrappedTargetException,
449                 RuntimeException);
450 
451     virtual void SAL_CALL removeVetoableChangeListener(
452         const OUString& PropertyName,
453         const Reference<  XVetoableChangeListener >& aListener)
454         throw ( UnknownPropertyException,
455                 WrappedTargetException,
456                 RuntimeException);
457 
458 public:
459     sal_Int32   m_l;
460     float   m_f;
461     double  m_d;
462     sal_Bool    m_b;
463     sal_Int8    m_byte;
464     sal_Unicode m_c;
465     OUString    m_s;
466     Reference< XPersistObject > m_ref;
467     OUString m_sServiceName;
468 };
469 
470 
471 
getPropertySetInfo(void)472 Reference <XPropertySetInfo > MyPersistObject::getPropertySetInfo(void)
473     throw (RuntimeException)
474 {
475     return Reference< XPropertySetInfo >();
476 }
477 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)478 void MyPersistObject::setPropertyValue(
479     const OUString& aPropertyName,
480     const Any& aValue)
481     throw ( UnknownPropertyException,
482             PropertyVetoException,
483             IllegalArgumentException,
484             WrappedTargetException,
485             RuntimeException)
486 {
487     if( 0 == aPropertyName.compareToAscii("long")  ) {
488         aValue >>= m_l;
489     }
490     else if ( 0 == aPropertyName.compareToAscii("float") ) {
491         aValue >>= m_f;
492     }
493     else if( 0 == aPropertyName.compareToAscii("double") ) {
494         aValue >>= m_d;
495     }
496     else if( 0  == aPropertyName.compareToAscii("bool") ) {
497         aValue >>= m_b;
498     }
499     else if( 0 == aPropertyName.compareToAscii("byte" ) ) {
500         aValue >>= m_byte;
501     }
502     else if( 0 == aPropertyName.compareToAscii("char") ) {
503         aValue >>= m_c;
504     }
505     else if( 0 == aPropertyName.compareToAscii("string") ) {
506         aValue >>= m_s;
507     }
508     else if( 0 == aPropertyName.compareToAscii("object") ) {
509         if( aValue.getValueType() == getCppuType( (Reference< XPersistObject> *)0 ) )
510         {
511             aValue >>= m_ref;
512         }
513         else
514         {
515             m_ref = 0;
516         }
517     }
518 }
519 
520 
getPropertyValue(const OUString & aPropertyName)521 Any MyPersistObject::getPropertyValue(const OUString& aPropertyName)
522     throw ( UnknownPropertyException,
523             WrappedTargetException,
524             RuntimeException)
525 {
526     Any aValue;
527     if( 0 == aPropertyName.compareToAscii("long" )  ) {
528         aValue <<= m_l;
529     }
530     else if ( 0 == aPropertyName.compareToAscii("float") ) {
531         aValue <<= m_f;
532     }
533     else if( 0 == aPropertyName.compareToAscii("double") ) {
534         aValue <<= m_d;
535     }
536     else if( 0 == aPropertyName.compareToAscii("bool") ) {
537         aValue <<= m_b;
538     }
539     else if( 0 == aPropertyName.compareToAscii("byte") ) {
540         aValue <<= m_byte;
541     }
542     else if( 0 == aPropertyName.compareToAscii("char" ) ) {
543         aValue <<= m_c;
544     }
545     else if( 0 == aPropertyName.compareToAscii("string") ) {
546         aValue <<= m_s;
547     }
548     else if( 0 == aPropertyName.compareToAscii("object" ) )
549     {
550         aValue <<= m_ref;
551     }
552     return aValue;
553 }
554 
555 
addPropertyChangeListener(const OUString & aPropertyName,const Reference<XPropertyChangeListener> & xListener)556 void MyPersistObject::addPropertyChangeListener(
557     const OUString& aPropertyName,
558     const Reference< XPropertyChangeListener > & xListener)
559     throw ( UnknownPropertyException,
560             WrappedTargetException,
561             RuntimeException)
562 {
563 
564 }
565 
removePropertyChangeListener(const OUString & aPropertyName,const Reference<XPropertyChangeListener> & aListener)566 void MyPersistObject::removePropertyChangeListener(
567     const OUString& aPropertyName,
568     const Reference < XPropertyChangeListener > & aListener)
569     throw ( UnknownPropertyException,
570             WrappedTargetException,
571             RuntimeException)
572 {
573 }
574 
575 
addVetoableChangeListener(const OUString & PropertyName,const Reference<XVetoableChangeListener> & aListener)576 void MyPersistObject::addVetoableChangeListener(
577     const OUString& PropertyName,
578     const Reference <XVetoableChangeListener >& aListener)
579     throw ( UnknownPropertyException,
580             WrappedTargetException,
581             RuntimeException)
582 {
583 
584 }
585 
removeVetoableChangeListener(const OUString & PropertyName,const Reference<XVetoableChangeListener> & aListener)586 void MyPersistObject::removeVetoableChangeListener(
587     const OUString& PropertyName,
588     const Reference < XVetoableChangeListener > & aListener)
589     throw ( UnknownPropertyException,
590             WrappedTargetException,
591             RuntimeException)
592 {
593 
594 }
595 
596 
597 
598 
getServiceName()599 OUString MyPersistObject::getServiceName() throw (RuntimeException)
600 {
601     return m_sServiceName;
602 }
603 
write(const Reference<XObjectOutputStream> & rOut)604 void MyPersistObject::write( const Reference< XObjectOutputStream >  & rOut )
605     throw (IOException,RuntimeException)
606 {
607     rOut->writeLong( m_l);
608     rOut->writeFloat( m_f );
609     rOut->writeDouble( m_d );
610     rOut->writeBoolean( m_b );
611     rOut->writeByte( m_byte );
612     rOut->writeChar( m_c );
613     rOut->writeUTF( m_s );
614     rOut->writeObject( m_ref );
615 }
616 
617 
read(const Reference<XObjectInputStream> & rIn)618 void MyPersistObject::read( const Reference< XObjectInputStream > & rIn )
619     throw (IOException, RuntimeException)
620 {
621     m_l = rIn->readLong();
622     m_f = rIn->readFloat();
623     m_d = rIn->readDouble();
624     m_b = rIn->readBoolean();
625     m_byte = rIn->readByte();
626     m_c = rIn->readChar();
627     m_s = rIn->readUTF();
628     m_ref = rIn->readObject();
629 }
630 
OMyPersistObject_CreateInstance(const Reference<XMultiServiceFactory> & rSMgr)631 Reference < XInterface > SAL_CALL OMyPersistObject_CreateInstance(
632     const Reference < XMultiServiceFactory > & rSMgr )
633     throw(Exception)
634 {
635     MyPersistObject *p = new MyPersistObject( );
636     return Reference < XInterface > ( SAL_STATIC_CAST( OWeakObject * , p ) );
637 }
638 
OMyPersistObject_getSupportedServiceNames()639 Sequence<OUString> OMyPersistObject_getSupportedServiceNames( ) throw ()
640 {
641     Sequence<OUString> aRet(1);
642     aRet.getArray()[0] = OMyPersistObject_getImplementationName();
643     return aRet;
644 }
645 
OMyPersistObject_getServiceName()646 OUString     OMyPersistObject_getServiceName( ) throw ()
647 {
648     return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.PersistTest" ));
649 }
650 
OMyPersistObject_getImplementationName()651 OUString    OMyPersistObject_getImplementationName( ) throw ()
652 {
653     return OUString( RTL_CONSTASCII_USTRINGPARAM( "test.com.sun.star.io.PersistTest" ) );
654 }
655 
656 
657 // ---------------------------------------------
658 // -----------------------------------------------
659 class OObjectStreamTest :
660         public ODataStreamTest
661 {
662 public:
OObjectStreamTest(const Reference<XMultiServiceFactory> & r)663     OObjectStreamTest( const Reference < XMultiServiceFactory > &r) : ODataStreamTest(r) {}
664 
665 public:
666     virtual void SAL_CALL testInvariant(const OUString& TestName,
667                                const Reference < XInterface >& TestObject)
668         throw ( IllegalArgumentException,
669                 RuntimeException);
670 
671     virtual sal_Int32 SAL_CALL test(
672         const OUString& TestName,
673         const Reference < XInterface >& TestObject,
674         sal_Int32 hTestHandle)
675         throw ( IllegalArgumentException,
676                 RuntimeException);
677 
678 
679 private:
680     void OObjectStreamTest::testObject(     const Reference <XObjectOutputStream > &rOut,
681                                             const Reference <XObjectInputStream> &rIn );
682 
683 private:
684 };
685 
686 
testInvariant(const OUString & TestName,const Reference<XInterface> & TestObject)687 void OObjectStreamTest::testInvariant( const OUString& TestName,
688                                        const Reference < XInterface >& TestObject )
689     throw ( IllegalArgumentException, RuntimeException)
690 {
691 
692     if( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.ObjectInputStream" ) )
693                   == TestName )
694     {
695         ODataStreamTest::testInvariant( TestName , TestObject );
696         Reference< XObjectInputStream > dataInput( TestObject , UNO_QUERY );
697         Reference< XMarkableStream >  markable( TestObject , UNO_QUERY );
698         ERROR_ASSERT( dataInput.is() , "XObjectInputStream cannot be queried" );
699         ERROR_ASSERT(   markable.is() , "XMarkableStream cannot be queried" );
700     }
701     else if( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.ObjectOutputStream") )
702              == TestName )
703     {
704         ODataStreamTest::testInvariant( TestName , TestObject );
705         Reference < XMarkableStream > markable( TestObject , UNO_QUERY );
706         Reference < XObjectOutputStream > dataOutput( TestObject , UNO_QUERY );
707         ERROR_ASSERT(   dataOutput.is(),    "XObjectOutputStream cannot be queried" );
708         ERROR_ASSERT(   markable.is() , "XMarkableStream cannot be queried" );
709     }
710 
711     Reference < XServiceInfo > info( TestObject, UNO_QUERY );
712     ERROR_ASSERT( info.is() , "XServiceInfo not supported !" );
713     if( info.is() )
714     {
715         ERROR_ASSERT( info->supportsService( TestName ), "XServiceInfo test failed" );
716         ERROR_ASSERT( ! info->supportsService( OUString::createFromAscii("bla bluzb") ) , "XServiceInfo test failed" );
717     }
718 
719 }
720 
test(const OUString & TestName,const Reference<XInterface> & TestObject,sal_Int32 hTestHandle)721 sal_Int32 OObjectStreamTest::test(  const OUString& TestName,
722                         const Reference < XInterface >& TestObject,
723                         sal_Int32 hTestHandle)
724     throw ( IllegalArgumentException,
725             RuntimeException)
726 {
727     if( 0 == TestName.compareToAscii("com.sun.star.io.ObjectInputStream") ||
728         0 == TestName.compareToAscii("com.sun.star.io.ObjectOutputStream" ) )  {
729 
730         try
731         {
732             if( 0 == hTestHandle ) {
733                 testInvariant( TestName , TestObject );
734             }
735             else if( DATASTREAM_TEST_MAX_HANDLE >= hTestHandle ) {
736                 sal_Int32 hOldHandle = hTestHandle;
737                 hTestHandle = ODataStreamTest::test(
738                     OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.DataInputStream" )),
739                     TestObject , hTestHandle );
740                 if( hTestHandle == -1 ){
741                     hTestHandle = hOldHandle;
742                 }
743             }
744             else {
745 
746                 Reference<XActiveDataSink >  rSink( TestObject, UNO_QUERY );
747                 Reference<XActiveDataSource >  rSource( TestObject , UNO_QUERY );
748 
749                 Reference< XObjectInputStream >  rInput( TestObject , UNO_QUERY );
750                 Reference< XObjectOutputStream > rOutput( TestObject , UNO_QUERY );
751 
752 
753                 Reference < XInterface > x = m_rFactory->createInstance(
754                     OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.Pipe" )) );
755 
756                 Reference <XInputStream > rPipeInput( x , UNO_QUERY );
757                 Reference <XOutputStream >  rPipeOutput( x , UNO_QUERY );
758 
759                 x = m_rFactory->createInstance(
760                     OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.MarkableInputStream") ) );
761 
762                 Reference <XInputStream > markableInput( x , UNO_QUERY );
763                 Reference <XActiveDataSink> markableSink( x , UNO_QUERY );
764 
765                 x = m_rFactory->createInstance( OUString(
766                     RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.MarkableOutputStream" ) ) );
767                 Reference <XOutputStream >  markableOutput( x , UNO_QUERY );
768                 Reference <XActiveDataSource >  markableSource( x , UNO_QUERY );
769 
770                 OSL_ASSERT( markableInput.is()  );
771                 OSL_ASSERT( markableOutput.is() );
772                 OSL_ASSERT( markableSink.is()   );
773                 OSL_ASSERT( markableSource.is() );
774 
775                 markableSink->setInputStream( rPipeInput );
776                 markableSource->setOutputStream( rPipeOutput );
777 
778                 if( ! rSink.is() ) {
779                     x = m_rFactory->createInstance(
780                         OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.ObjectInputStream") ));
781                     rInput = Reference < XObjectInputStream > ( x , UNO_QUERY );
782                     rSink = Reference < XActiveDataSink > ( x , UNO_QUERY );
783                 }
784                 else if ( !rSource.is() ) {
785                     x = m_rFactory->createInstance(
786                         OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.io.ObjectOutputStream" )));
787                     rOutput = Reference <XObjectOutputStream > ( x , UNO_QUERY );
788                     rSource = Reference <XActiveDataSource>( x, UNO_QUERY );
789                 }
790 
791                 OSL_ASSERT( rPipeInput.is() );
792                 OSL_ASSERT( rPipeOutput.is() );
793 
794                 rSink->setInputStream( markableInput );
795                 rSource->setOutputStream( markableOutput );
796 
797                 OSL_ASSERT( rSink->getInputStream().is() );
798                 OSL_ASSERT( rSource->getOutputStream().is() );
799 
800                 if( 1 + DATASTREAM_TEST_MAX_HANDLE == hTestHandle ) {
801                     testObject( rOutput , rInput);
802                 }
803                 rInput->closeInput();
804                 rOutput->closeOutput();
805 
806             }
807         }
808         catch( Exception &e )  {
809             OString o = OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US );
810             BUILD_ERROR( 0 , o.getStr() );
811         }
812         catch( ... ) {
813             BUILD_ERROR( 0 , "unknown exception (Exception is  not base class)" );
814         }
815 
816         hTestHandle ++;
817 
818         if( hTestHandle > 1 +DATASTREAM_TEST_MAX_HANDLE ) {
819             // all tests finished.
820             hTestHandle = -1;
821         }
822     }
823     else {
824         BUILD_ERROR( 0 , "service not supported by test." );
825     }
826     return hTestHandle;
827 }
828 
829 
compareMyPropertySet(Reference<XPropertySet> & r1,Reference<XPropertySet> & r2)830 sal_Bool compareMyPropertySet( Reference< XPropertySet > &r1 , Reference < XPropertySet > &r2 )
831 {
832     sal_Bool b = sal_True;
833 
834     if( r1->getPropertyValue( OUString::createFromAscii("long") ).getValueType() == getCppuVoidType() ||
835         r2->getPropertyValue( OUString::createFromAscii("long") ).getValueType() == getCppuVoidType() ) {
836 
837         // one of the objects is not the correct propertyset !
838         fprintf( stderr, "compareMyPropertySet: 1\n" );
839         return sal_False;
840     }
841 
842     b = b && (  r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("long")) ) ==
843                 r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("long")) ) );
844     if( ! b ) fprintf( stderr, "compareMyPropertySet: 2\n" );
845 
846     b = b && (  r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("float")) ) ==
847                 r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("float")) ) );
848     if( ! b ){
849         float f1(0.0);
850         float f2(0.0);
851         r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("float")) ) >>= f1;
852         r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("float")) ) >>= f2;
853         fprintf( stderr, "compareMyPropertySet: %f %f 3\n",f1,f2 );
854     }
855 
856     b = b && (  r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("double")) ) ==
857                 r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("double" ))) );
858     if( ! b ) fprintf( stderr, "compareMyPropertySet: 4\n" );
859 
860     sal_Bool b1(sal_False), b2(sal_False);
861     Any a =r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("bool")) );
862     a >>= b1;
863     a = r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("bool")) );
864     a >>= b2;
865     b = b && ( (b1 && b2) || b1 == b2 );
866     if( ! b ) fprintf( stderr, "compareMyPropertySet: 5\n" );
867 
868 //      b = b &&    r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("bool")) ) ==
869 //                  r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("bool")) ) );
870 
871     b = b && (  r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("byte")) ) ==
872                 r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("byte")) ) );
873     if( ! b ) fprintf( stderr, "compareMyPropertySet: 6\n" );
874 
875     b = b && (  r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("char")) ) ==
876                 r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("char")) ) );
877     if( ! b ) fprintf( stderr, "compareMyPropertySet: 7\n" );
878 
879     b = b && (  r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("string")) ) ==
880                 r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("string")) ));
881     if( ! b ) fprintf( stderr, "compareMyPropertySet: 8\n" );
882 
883     Any o1 = r1->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("object")) );
884     Any o2 = r2->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("object")) );
885 
886     if( o1.getValueType() == getCppuType( (Reference<XPersistObject>*)0 ) ) {
887 
888         if( o2.getValueType() == getCppuType( (Reference<XPersistObject>*)0 ) ) {
889             Reference < XPersistObject > rPersist1;
890             Reference < XPersistObject > rPersist2;
891             o1 >>= rPersist1;
892             o2 >>= rPersist2;
893             Reference <XPropertySet > rProp1( rPersist1 , UNO_QUERY );
894             Reference < XPropertySet > rProp2( rPersist2 , UNO_QUERY );
895 
896             if( rProp1.is() && rProp2.is() && ! ( rProp1 == rProp2 )
897                 &&( rProp1 != r1 )) {
898                     b = b && compareMyPropertySet( rProp1 , rProp2 );
899             }
900         }
901         else {
902             b = sal_False;
903         }
904         if( ! b ) fprintf( stderr, "compareMyPropertySet: 9\n" );
905     }
906     else {
907         if( o2.getValueType()  == getCppuType( (Reference<XPersistObject>*)0 ) ) {
908             b = sal_False;
909         }
910         if( ! b ) fprintf( stderr, "compareMyPropertySet: 10\n" );
911     }
912 
913     return b;
914 }
915 
testObject(const Reference<XObjectOutputStream> & rOut,const Reference<XObjectInputStream> & rIn)916 void OObjectStreamTest::testObject(     const Reference<  XObjectOutputStream >  &rOut,
917                                         const Reference < XObjectInputStream > &rIn )
918 {
919     ERROR_ASSERT( rOut.is() , "no objectOutputStream" );
920     ERROR_ASSERT( rIn.is() , "no objectInputStream" );
921 
922 
923 
924     // tests, if saving an object with an unknown service name allows
925     // reading the data behind the object !
926     {
927         Reference < XInterface > x = * new MyPersistObject(
928             OUString( RTL_CONSTASCII_USTRINGPARAM("bla blubs")) );
929 
930         Reference< XPersistObject > persistRef( x , UNO_QUERY );
931         ERROR_ASSERT( persistRef.is() , "couldn't instantiate PersistTest object" );
932 
933         rOut->writeObject( persistRef );
934         rOut->writeLong( (sal_Int32) 0xdeadbeef );
935 
936         ERROR_ASSERT( 0 != rIn->available() , "no data arrived at input" );
937 
938         try
939         {
940             Reference <XPersistObject >  xReadPersistRef = rIn->readObject();
941             ERROR_ASSERT( 0 , "expected exception not thrown" );
942         }
943         catch( IOException & )
944         {
945             // all is ok
946         }
947 
948         ERROR_ASSERT( (sal_Int32) 0xdeadbeef == rIn->readLong() ,
949                       "wrong data after object with unknown service name." );
950     }
951 
952     {
953         Reference < XInterface > x = m_rFactory->createInstance(
954             OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.PersistTest")));
955         Reference< XPersistObject > persistRef( x , UNO_QUERY );
956 
957         ERROR_ASSERT( persistRef.is() , "couldn't instantiate PersistTest object" );
958 
959         Reference < XPropertySet > rProp( persistRef , UNO_QUERY );
960         ERROR_ASSERT( rProp.is() , "test object is no property set " );
961 
962         Any any;
963         sal_Int32 i = 0x83482;
964         any <<= i;
965         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("long")) , any );
966 
967         float f = (float)42.23;
968         any <<= f;
969         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("float")) , any );
970 
971         double d = 233.321412;
972         any <<= d;
973         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("double")) , any );
974 
975         sal_Bool b = sal_True;
976         any.setValue( &b , getCppuBooleanType() );
977         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("bool")) , any );
978 
979         sal_Int8 by = 120;
980         any <<= by;
981         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("byte")) , any );
982 
983         sal_Unicode c = 'h';
984         any.setValue( &c , getCppuCharType() );
985         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("char")) , any );
986 
987         OUString str( RTL_CONSTASCII_USTRINGPARAM( "hi du !" ) );
988         any <<= str;
989         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("string")) , any );
990 
991         any <<= persistRef;
992         rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("object")) , any );
993 
994         // do read and write
995         rOut->writeObject( persistRef );
996         ERROR_ASSERT( 0 != rIn->available() , "no data arrived at input" );
997         Reference< XPersistObject > xReadPersist    =   rIn->readObject( );
998 
999         Reference< XPropertySet >  rPropRead( xReadPersist , UNO_QUERY );
1000         ERROR_ASSERT( compareMyPropertySet( rProp , rPropRead ) , "objects has not been read properly !" );
1001 
1002         // destroy selfreferences
1003         rProp->setPropertyValue( OUString::createFromAscii("object"), Any() );
1004         rPropRead->setPropertyValue( OUString::createFromAscii("object"), Any() );
1005     }
1006 
1007     {
1008         Reference< XMarkableStream > markableOut( rOut , UNO_QUERY );
1009         ERROR_ASSERT( markableOut.is() , "markable stream cannot be queried" );
1010 
1011         // do the same thing multiple times to check if
1012         // buffering and marks work correctly
1013         for( int i = 0 ; i < 2000 ; i ++ ) {
1014 
1015             Reference < XInterface > x = m_rFactory->createInstance(OUString::createFromAscii("test.com.sun.star.io.PersistTest"));
1016             Reference< XPersistObject >  persistRef( x , UNO_QUERY );
1017 
1018             Reference < XPropertySet >  rProp( persistRef , UNO_QUERY );
1019             ERROR_ASSERT( rProp.is() , "test object is no property set " );
1020 
1021             Any any;
1022             sal_Int32 i = 0x83482;
1023             any <<= i;
1024             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("long")) , any );
1025 
1026             float f = 42.23;
1027             any <<= f;
1028             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("float")) , any );
1029 
1030             double d = 233.321412;
1031             any <<= d;
1032             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("double")) , any );
1033 
1034             sal_Bool b = sal_True;
1035             any.setValue( &b , getCppuBooleanType() );
1036             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("bool")) , any );
1037 
1038             sal_Int8 by = 120;
1039             any <<= by;
1040             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("byte")) , any );
1041 
1042             sal_Unicode c = 'h';
1043             any.setValue( &c , getCppuCharType() );
1044             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("char")) , any );
1045 
1046             OUString str( RTL_CONSTASCII_USTRINGPARAM( "hi du !" ) );
1047             any <<= str;
1048             rProp->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("string")) , any );
1049 
1050             x = m_rFactory->createInstance(OUString::createFromAscii("test.com.sun.star.io.PersistTest"));
1051             Reference <XPersistObject > persist2ndRef( x , UNO_QUERY );
1052 
1053             // Note : persist2ndRef contains coincident values, but also coincident values must be
1054             // saved properly !
1055             any <<= persist2ndRef;
1056             rProp->setPropertyValue( OUString::createFromAscii("object") , any );
1057 
1058             // simply test, if markable operations and object operations do not interfere
1059             sal_Int32 nMark = markableOut->createMark();
1060 
1061             // do read and write
1062             rOut->writeObject( persistRef );
1063 
1064             // further markable tests !
1065             sal_Int32 nOffset = markableOut->offsetToMark( nMark );
1066             markableOut->jumpToMark( nMark );
1067             markableOut->deleteMark( nMark );
1068             markableOut->jumpToFurthest();
1069 
1070 
1071 
1072 
1073 
1074             ERROR_ASSERT( 0 != rIn->available() , "no data arrived at input" );
1075             Reference < XPersistObject > xReadPersistRef    =   rIn->readObject( );
1076 
1077             Reference< XPropertySet > rProp1( persistRef , UNO_QUERY );
1078             Reference< XPropertySet >  rProp2( xReadPersistRef , UNO_QUERY );
1079             ERROR_ASSERT( compareMyPropertySet( rProp1, rProp2) ,
1080                           "objects has not been read properly !" );
1081         }
1082     }
1083 }
1084 
1085 
OObjectStreamTest_CreateInstance(const Reference<XMultiServiceFactory> & rSMgr)1086 Reference < XInterface > SAL_CALL OObjectStreamTest_CreateInstance( const Reference < XMultiServiceFactory > & rSMgr ) throw(Exception)
1087 {
1088     OObjectStreamTest *p = new OObjectStreamTest( rSMgr );
1089     return Reference < XInterface > ( SAL_STATIC_CAST( OWeakObject * , p ) );
1090 }
1091 
OObjectStreamTest_getSupportedServiceNames(int i)1092 Sequence<OUString> OObjectStreamTest_getSupportedServiceNames( int i) throw ()
1093 {
1094     Sequence<OUString> aRet(1);
1095     aRet.getArray()[0] = OObjectStreamTest_getImplementationName( i);
1096     return aRet;
1097 }
1098 
OObjectStreamTest_getServiceName(int i)1099 OUString     OObjectStreamTest_getServiceName( int i) throw ()
1100 {
1101     if( 1 == i ) {
1102         return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.ObjectInputStream" ));
1103     }
1104     else {
1105         return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.ObjectOutputStream"));
1106     }
1107 }
1108 
OObjectStreamTest_getImplementationName(int i)1109 OUString    OObjectStreamTest_getImplementationName( int i) throw ()
1110 {
1111     if( 1 == i ) {
1112         return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.comp.extensions.stm.ObjectInputStream" ));
1113     }
1114     else {
1115         return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.comp.extensions.stm.ObjectOutputStream"));
1116     }
1117 }
1118 
1119 
1120