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: 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 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 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 239 sal_Bool ODataStreamTest::testPassed(void) throw (RuntimeException) 240 { 241 return m_seqErrors.getLength() == 0; 242 } 243 244 245 Sequence< OUString > ODataStreamTest::getErrors(void) throw (RuntimeException) 246 { 247 return m_seqErrors; 248 } 249 250 251 Sequence< Any > ODataStreamTest::getErrorExceptions(void) throw (RuntimeException) 252 { 253 return m_seqExceptions; 254 } 255 256 257 Sequence< OUString > ODataStreamTest::getWarnings(void) throw (RuntimeException) 258 { 259 return m_seqWarnings; 260 } 261 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 **/ 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 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 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 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: 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 {} 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 472 Reference <XPropertySetInfo > MyPersistObject::getPropertySetInfo(void) 473 throw (RuntimeException) 474 { 475 return Reference< XPropertySetInfo >(); 476 } 477 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 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 556 void MyPersistObject::addPropertyChangeListener( 557 const OUString& aPropertyName, 558 const Reference< XPropertyChangeListener > & xListener) 559 throw ( UnknownPropertyException, 560 WrappedTargetException, 561 RuntimeException) 562 { 563 564 } 565 566 void MyPersistObject::removePropertyChangeListener( 567 const OUString& aPropertyName, 568 const Reference < XPropertyChangeListener > & aListener) 569 throw ( UnknownPropertyException, 570 WrappedTargetException, 571 RuntimeException) 572 { 573 } 574 575 576 void MyPersistObject::addVetoableChangeListener( 577 const OUString& PropertyName, 578 const Reference <XVetoableChangeListener >& aListener) 579 throw ( UnknownPropertyException, 580 WrappedTargetException, 581 RuntimeException) 582 { 583 584 } 585 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 599 OUString MyPersistObject::getServiceName() throw (RuntimeException) 600 { 601 return m_sServiceName; 602 } 603 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 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 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 639 Sequence<OUString> OMyPersistObject_getSupportedServiceNames( ) throw () 640 { 641 Sequence<OUString> aRet(1); 642 aRet.getArray()[0] = OMyPersistObject_getImplementationName(); 643 return aRet; 644 } 645 646 OUString OMyPersistObject_getServiceName( ) throw () 647 { 648 return OUString( RTL_CONSTASCII_USTRINGPARAM("test.com.sun.star.io.PersistTest" )); 649 } 650 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: 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 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 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 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 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 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 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 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 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