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