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_sal.hxx" 26 27 /** test coder preface: 28 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform 29 if you are not including ws2_32.lib in makefile.mk, the including format will be like this: 30 31 .IF "$(GUI)" == "WNT" 32 SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib 33 SHL1STDLIBS += ws2_32.lib 34 .ENDIF 35 36 likewise on Solaris platform. 37 .IF "$(GUI)" == "UNX" 38 SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a 39 SHL1STDLIBS += -lsocket -ldl -lnsl 40 .ENDIF 41 42 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4 43 category. 44 45 3. some fragment of Socket source implementation are lack of comment so it is hard for testers 46 guess what the exact functionality or usage of a member. Hope the Socket section's comment 47 will be added. 48 49 4. following functions are declared but not implemented: 50 inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const; 51 */ 52 53 54 //------------------------------------------------------------------------ 55 // include files 56 //------------------------------------------------------------------------ 57 58 #ifndef _OSL_SOCKET_CONST_H_ 59 #include <osl_Socket_Const_orig.h> 60 #endif 61 62 #include <testshl/simpleheader.hxx> 63 64 using namespace osl; 65 using namespace rtl; 66 67 //------------------------------------------------------------------------ 68 // helper functions 69 //------------------------------------------------------------------------ 70 71 /** compare two OUString. 72 */ 73 inline sal_Bool compareUString( const ::rtl::OUString & ustr1, const ::rtl::OUString & ustr2 ) 74 { 75 sal_Bool bOk = ustr1.equalsIgnoreAsciiCase( ustr2 ); 76 77 return bOk; 78 } 79 80 /** compare a OUString and an ASCII string. 81 */ 82 inline sal_Bool compareUString( const ::rtl::OUString & ustr, const sal_Char *astr ) 83 { 84 ::rtl::OUString ustr2 = rtl::OUString::createFromAscii( astr ); 85 sal_Bool bOk = ustr.equalsIgnoreAsciiCase( ustr2 ); 86 87 return bOk; 88 } 89 90 /** compare two socket address. 91 */ 92 inline sal_Bool compareSocketAddr( const ::osl::SocketAddr & addr1 , const ::osl::SocketAddr & addr2 ) 93 { 94 return ( ( sal_True == compareUString( addr1.getHostname( 0 ), addr2.getHostname( 0 ) ) ) && ( addr2.getPort( ) == addr2.getPort( ) ) ); 95 } 96 97 inline char * oustring2char( const ::rtl::OUString & str ) 98 { 99 rtl::OString aString; 100 aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US ); 101 return (char *)aString.getStr( ); 102 } 103 104 /** print a UNI_CODE String. And also print some comments of the string. 105 */ 106 inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" ) 107 { 108 t_print("#%s #printUString_u# ", msg ); 109 t_print("%s\n", oustring2char( str ) ); 110 } 111 112 /** get the local host name. 113 mindy: gethostbyname( "localhost" ), on Linux, it returns the hostname in /etc/hosts + domain name, 114 if no entry in /etc/hosts, it returns "localhost" + domain name 115 */ 116 inline ::rtl::OUString getHost( void ) 117 { 118 struct hostent *hptr; 119 120 hptr = gethostbyname( "localhost" ); 121 CPPUNIT_ASSERT_MESSAGE( "#In getHostname function, error on gethostbyname()", hptr != NULL ); 122 ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hptr->h_name ); 123 124 return aUString; 125 } 126 127 /** get the full host name of the current processor, such as "aegean.prc.sun.com" --mindyliu 128 */ 129 inline ::rtl::OUString getThisHostname( void ) 130 { 131 ::rtl::OUString aUString; 132 #ifdef WNT 133 struct hostent *hptr; 134 hptr = gethostbyname( "localhost" ); 135 CPPUNIT_ASSERT_MESSAGE( "#In getHostname function, error on gethostbyname()", hptr != NULL ); 136 aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hptr->h_name ); 137 #else 138 char hostname[255]; 139 CPPUNIT_ASSERT_MESSAGE( "#Error: gethostname failed.", gethostname(hostname, 255) == 0 ); 140 141 struct hostent *hptr; 142 //first search /ets/hosts, then search from dns 143 hptr = gethostbyname( hostname); 144 if ( hptr != NULL ) 145 { 146 strcpy( hostname, hptr->h_name ); 147 } 148 149 t_print("hostname is %s \n", hostname ); 150 aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hostname ); 151 #endif 152 return aUString; 153 } 154 155 /** get IP by name, search /etc/hosts first, then search from dns, fail return OUString("") 156 */ 157 inline ::rtl::OUString getIPbyName( rtl::OString const& str_name ) 158 { 159 ::rtl::OUString aUString; 160 struct hostent *hptr; 161 //first search /ets/hosts, then search from dns 162 hptr = gethostbyname( str_name.getStr()); 163 if ( hptr != NULL ) 164 { 165 struct in_addr ** addrptr; 166 addrptr = (struct in_addr **) hptr->h_addr_list ; 167 //if there are more than one IPs on the same machine, we select one 168 for (; *addrptr; addrptr++) 169 { 170 t_print("#Local IP Address: %s\n", inet_ntoa(**addrptr)); 171 aUString = ::rtl::OUString::createFromAscii( (sal_Char *) (inet_ntoa(**addrptr)) ); 172 } 173 } 174 return aUString; 175 } 176 177 /** get local ethernet IP 178 */ 179 inline ::rtl::OUString getLocalIP( ) 180 { 181 char hostname[255]; 182 gethostname(hostname, 255); 183 184 return getIPbyName( hostname ); 185 } 186 187 /** construct error message 188 */ 189 inline ::rtl::OUString outputError( const ::rtl::OUString & returnVal, const ::rtl::OUString & rightVal, const sal_Char * msg = "") 190 { 191 ::rtl::OUString aUString; 192 if ( returnVal.equals( rightVal ) ) 193 return aUString; 194 aUString += ::rtl::OUString::createFromAscii(msg); 195 aUString += ::rtl::OUString::createFromAscii(": the returned value is '"); 196 aUString += returnVal; 197 aUString += ::rtl::OUString::createFromAscii("', but the value should be '"); 198 aUString += rightVal; 199 aUString += ::rtl::OUString::createFromAscii("'."); 200 return aUString; 201 } 202 203 /** wait _nSec seconds. 204 */ 205 void thread_sleep( sal_Int32 _nSec ) 206 { 207 /// print statement in thread process must use fflush() to force display. 208 t_print("# wait %d seconds. ", _nSec ); 209 fflush(stdout); 210 211 #ifdef WNT //Windows 212 Sleep( _nSec * 100 ); 213 #endif 214 #if ( defined UNX ) || ( defined OS2 ) //Unix 215 usleep(_nSec * 100000); 216 #endif 217 t_print("# done\n" ); 218 } 219 220 /** print Boolean value. 221 */ 222 inline void printBool( sal_Bool bOk ) 223 { 224 t_print("#printBool# " ); 225 ( sal_True == bOk ) ? t_print("YES!\n" ): t_print("NO!\n" ); 226 } 227 228 /** print content of a ByteSequence. 229 */ 230 inline void printByteSequence_IP( const ::rtl::ByteSequence & bsByteSeq, sal_Int32 nLen ) 231 { 232 t_print("#ByteSequence is: " ); 233 for ( int i = 0; i < nLen; i++ ){ 234 if ( bsByteSeq[i] < 0 ) 235 t_print("%d ", 256 + bsByteSeq[i] ); 236 else 237 t_print("%d ", bsByteSeq[i] ); 238 } 239 t_print(" .\n" ); 240 } 241 242 /** convert an IP which is stored as a UString format to a ByteSequence array for later use. 243 */ 244 inline ::rtl::ByteSequence UStringIPToByteSequence( ::rtl::OUString aUStr ) 245 { 246 247 rtl::OString aString = ::rtl::OUStringToOString( aUStr, RTL_TEXTENCODING_ASCII_US ); 248 const sal_Char *pChar = aString.getStr( ) ; 249 sal_Char tmpBuffer[4]; 250 sal_Int32 nCharCounter = 0; 251 ::rtl::ByteSequence bsByteSequence( IP_VER ); 252 sal_Int32 nByteSeqCounter = 0; 253 254 for ( int i = 0; i < aString.getLength( ) + 1 ; i++ ) 255 { 256 if ( ( *pChar != '.' ) && ( i !=aString.getLength( ) ) ) 257 tmpBuffer[nCharCounter++] = *pChar; 258 else 259 { 260 tmpBuffer[nCharCounter] = '\0'; 261 nCharCounter = 0; 262 bsByteSequence[nByteSeqCounter++] = static_cast<sal_Int8>( atoi( tmpBuffer ) ); 263 } 264 pChar++; 265 } 266 return bsByteSequence; 267 } 268 269 /** print a socket result name. 270 */ 271 inline void printSocketResult( oslSocketResult eResult ) 272 { 273 t_print("#printSocketResult# " ); 274 if (!eResult) 275 switch (eResult) 276 { 277 case osl_Socket_Ok: 278 t_print("client connected\n"); 279 break; 280 case osl_Socket_Error: 281 t_print("got an error ... exiting\r\n\r\n" ); 282 break; 283 case osl_Socket_TimedOut: 284 t_print("timeout\n"); 285 break; 286 287 case osl_Socket_FORCE_EQUAL_SIZE: 288 t_print("FORCE EQUAL SIZE\n"); 289 break; 290 case osl_Socket_InProgress: 291 t_print("In Progress\n"); 292 break; 293 case osl_Socket_Interrupted: 294 t_print("Interrupted\n"); 295 break; 296 } 297 } 298 299 /** Client Socket Thread, served as a temp little client to communicate with server. 300 */ 301 class ClientSocketThread : public Thread 302 { 303 protected: 304 oslThreadIdentifier m_id; 305 ::osl::SocketAddr saTargetSocketAddr; 306 ::osl::ConnectorSocket csConnectorSocket; 307 308 void SAL_CALL run( ) 309 { 310 TimeValue *pTimeout; 311 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 312 pTimeout->Seconds = 5; 313 pTimeout->Nanosec = 0; 314 315 /// if the thread should terminate, schedule return false 316 //while ( schedule( ) == sal_True ) 317 //{ 318 if ( osl_Socket_Ok == csConnectorSocket.connect( saTargetSocketAddr, pTimeout )) 319 { 320 csConnectorSocket.send( pTestString1, 11 ); // "test socket" 321 csConnectorSocket.send( pTestString2, 10); 322 } 323 else 324 t_print("# ClientSocketThread: connect failed! \n"); 325 // terminate(); 326 //} 327 csConnectorSocket.close(); 328 free( pTimeout ); 329 } 330 331 void SAL_CALL onTerminated( ) 332 { 333 //t_print("# normally terminate this thread %d!\n", m_id ); 334 } 335 336 public: 337 ClientSocketThread( ): 338 saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT9 ), 339 csConnectorSocket( ) 340 { 341 m_id = getIdentifier( ); 342 //t_print("# successfully creat this client thread %d!\n", m_id ); 343 } 344 345 ~ClientSocketThread( ) 346 { 347 if ( isRunning( ) ) 348 t_print("# error: client thread not terminated.\n" ); 349 } 350 351 }; 352 353 354 /** Server Socket Thread, served as a temp little server to communicate with client. 355 */ 356 class ServerSocketThread : public Thread 357 { 358 protected: 359 oslThreadIdentifier m_id; 360 361 void SAL_CALL run( ) 362 { 363 ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 364 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9 ); 365 ::osl::StreamSocket ssStreamConnection; 366 367 //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket 368 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True); 369 while ( schedule( ) == sal_True ) 370 { 371 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 372 if ( sal_True != bOK1 ) 373 { 374 t_print("# ServerSocketThread: AcceptorSocket bind address failed.\n" ) ; 375 break; 376 } 377 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 378 if ( sal_True != bOK2 ) 379 { 380 t_print("# ServerSocketThread: AcceptorSocket listen address failed.\n" ) ; 381 break; 382 } 383 384 asAcceptorSocket.enableNonBlockingMode( sal_False ); 385 386 oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection ); 387 if (eResult != osl_Socket_Ok ) 388 { 389 t_print("ServerSocketThread: acceptConnection failed! \n"); 390 break; 391 } 392 sal_Int32 nReadNumber1 = ssStreamConnection.recv( pReadBuffer, 11 ); 393 sal_Int32 nReadNumber2 = ssStreamConnection.recv( pReadBuffer + nReadNumber1, 11 ); 394 pReadBuffer[nReadNumber1 + nReadNumber2] = '\0'; 395 //t_print("# read buffer content: %s\n", pReadBuffer ); 396 break; 397 } 398 ssStreamConnection.close(); 399 asAcceptorSocket.close(); 400 401 } 402 403 void SAL_CALL onTerminated( ) 404 { 405 //t_print("# normally terminate this server thread %d!\n", m_id ); 406 } 407 408 public: 409 // public to check if data transmition is OK 410 sal_Char pReadBuffer[30]; 411 ServerSocketThread( ) 412 { 413 m_id = getIdentifier( ); 414 //t_print("# successfully creat this server thread %d!\n", m_id ); 415 } 416 417 ~ServerSocketThread( ) 418 { 419 if ( isRunning( ) ) 420 t_print("# error: server thread not terminated.\n" ); 421 } 422 }; 423 424 // ----------------------------------------------------------------------------- 425 // Helper functions, to create buffers, check buffers 426 class ValueCheckProvider 427 { 428 bool m_bFoundFailure; 429 char *m_pBuffer; 430 sal_Int32 m_nBufferSize; 431 432 public: 433 ValueCheckProvider() 434 : 435 m_bFoundFailure(false), 436 m_pBuffer(NULL), 437 m_nBufferSize(0) 438 { 439 } 440 441 bool isFailure() {return m_bFoundFailure;} 442 443 const char* getBuffer() {return m_pBuffer;} 444 char* getWriteBuffer() {return m_pBuffer;} 445 446 sal_Int32 getBufferSize() {return m_nBufferSize;} 447 448 bool checkValues(sal_Int32 _nLength, int _nValue) 449 { 450 m_bFoundFailure = false; 451 for(sal_Int32 i=0;i<_nLength;i++) 452 { 453 if (m_pBuffer[i] != _nValue) 454 { 455 m_bFoundFailure = true; 456 } 457 } 458 return m_bFoundFailure; 459 } 460 461 void createBuffer(sal_Int32 _nLength, int _nValue) 462 { 463 m_nBufferSize = _nLength; 464 m_pBuffer = (char*) malloc(m_nBufferSize); 465 if (m_pBuffer) 466 { 467 memset(m_pBuffer, _nValue, m_nBufferSize); 468 } 469 } 470 471 void freeBuffer() 472 { 473 if (m_pBuffer) free(m_pBuffer); 474 } 475 476 }; 477 478 // ----------------------------------------------------------------------------- 479 /** Client Socket Thread, served as a temp little client to communicate with server. 480 */ 481 482 class ReadSocketThread : public Thread 483 { 484 int m_nValue; 485 ValueCheckProvider m_aValues; 486 487 protected: 488 oslThreadIdentifier m_id; 489 ::osl::SocketAddr saTargetSocketAddr; 490 ::osl::ConnectorSocket csConnectorSocket; 491 492 void SAL_CALL run( ) 493 { 494 TimeValue *pTimeout; 495 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 496 pTimeout->Seconds = 5; 497 pTimeout->Nanosec = 0; 498 499 /// if the thread should terminate, schedule return false 500 //while ( schedule( ) == sal_True ) 501 //{ 502 if ( osl_Socket_Ok == csConnectorSocket.connect( saTargetSocketAddr, pTimeout )) 503 { 504 sal_Int32 nReadCount = csConnectorSocket.read( m_aValues.getWriteBuffer(), m_aValues.getBufferSize() ); 505 m_aValues.checkValues(nReadCount, m_nValue); 506 } 507 else 508 { 509 t_print("# ReadSocketThread: connect failed! \n"); 510 } 511 // terminate(); 512 //} 513 //remove this line for deadlock on solaris( margritte.germany ) 514 csConnectorSocket.close(); 515 free( pTimeout ); 516 } 517 518 void SAL_CALL onTerminated( ) 519 { 520 //t_print("# normally terminate this thread %d!\n", m_id ); 521 } 522 523 public: 524 sal_Int32 getCount() {return m_aValues.getBufferSize();} 525 bool isOk() {return m_aValues.isFailure() == true ? false : true;} 526 527 ReadSocketThread(sal_Int32 _nBufferSize, int _nValue ) 528 : 529 m_nValue( _nValue ), 530 saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT10 ), 531 csConnectorSocket( ) 532 { 533 m_id = getIdentifier( ); 534 //t_print("# successfully creat this client thread %d!\n", m_id ); 535 m_aValues.createBuffer(_nBufferSize, 0); 536 } 537 538 ~ReadSocketThread( ) 539 { 540 if ( isRunning( ) ) 541 t_print("# error: client thread not terminated.\n" ); 542 m_aValues.freeBuffer(); 543 } 544 545 }; 546 547 /** Server Socket Thread, write a file which is large 548 */ 549 class WriteSocketThread : public Thread 550 { 551 ValueCheckProvider m_aValues; 552 553 protected: 554 oslThreadIdentifier m_id; 555 556 void SAL_CALL run( ) 557 { 558 ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 559 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT10 ); 560 ::osl::StreamSocket ssStreamConnection; 561 562 //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket 563 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 564 565 /// if the thread should terminate, schedule return false 566 while ( schedule( ) == sal_True ) 567 { 568 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 569 if ( sal_True != bOK1 ) 570 { 571 t_print("# WriteSocketThread: AcceptorSocket bind address failed. \n" ) ; 572 break; 573 } 574 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 575 if ( sal_True != bOK2 ) 576 { 577 t_print("# WriteSocketThread: AcceptorSocket listen address failed. \n" ) ; 578 break; 579 } 580 // blocking mode, if read/recv failed, block until success 581 asAcceptorSocket.enableNonBlockingMode( sal_False); 582 583 oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection ); 584 if (eResult != osl_Socket_Ok ) 585 { 586 t_print("WriteSocketThread: acceptConnection failed! \n"); 587 break; 588 } 589 590 ssStreamConnection.write( m_aValues.getBuffer(), m_aValues.getBufferSize() ); 591 break; 592 } 593 ssStreamConnection.close(); 594 asAcceptorSocket.close(); 595 } 596 597 void SAL_CALL onTerminated( ) 598 { 599 //t_print("# normally terminate this server thread %d!\n", m_id ); 600 } 601 602 public: 603 // public to check if data transmition is OK 604 WriteSocketThread(sal_Int32 _nBufferSize, int _nValue ) 605 { 606 m_id = getIdentifier( ); 607 //t_print("# successfully creat this server thread %d!\n", m_id ); 608 609 m_aValues.createBuffer(_nBufferSize, _nValue); 610 } 611 612 ~WriteSocketThread( ) 613 { 614 if ( isRunning( ) ) 615 t_print("# error: server thread not terminated.\n" ); 616 m_aValues.freeBuffer(); 617 } 618 619 }; 620 621 // ----------------------------------------------------------------------------- 622 // just used to test socket::close() when accepting 623 class AcceptorThread : public Thread 624 { 625 ::osl::AcceptorSocket asAcceptorSocket; 626 ::rtl::OUString aHostIP; 627 sal_Bool bOK; 628 protected: 629 void SAL_CALL run( ) 630 { 631 ::osl::SocketAddr saLocalSocketAddr( aHostIP, IP_PORT_MYPORT9 ); 632 ::osl::StreamSocket ssStreamConnection; 633 634 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True); 635 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 636 if ( sal_True != bOK1 ) 637 { 638 t_print("# AcceptorSocket bind address failed.\n" ) ; 639 return; 640 } 641 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 642 if ( sal_True != bOK2 ) 643 { 644 t_print("# AcceptorSocket listen address failed.\n" ) ; 645 return; 646 } 647 648 asAcceptorSocket.enableNonBlockingMode( sal_False ); 649 650 oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection ); 651 if (eResult != osl_Socket_Ok ) 652 { 653 bOK = sal_True; 654 t_print("AcceptorThread: acceptConnection failed! \n"); 655 } 656 } 657 public: 658 AcceptorThread(::osl::AcceptorSocket & asSocket, ::rtl::OUString & aBindIP ) 659 : asAcceptorSocket( asSocket ), aHostIP( aBindIP ) 660 { 661 bOK = sal_False; 662 } 663 664 sal_Bool isOK() { return bOK; } 665 666 ~AcceptorThread( ) 667 { 668 if ( isRunning( ) ) 669 { 670 asAcceptorSocket.shutdown(); 671 t_print("# error: Acceptor thread not terminated.\n" ); 672 } 673 } 674 }; 675 676 class CloseSocketThread : public Thread 677 { 678 ::osl::Socket m_sSocket; 679 protected: 680 void SAL_CALL run( ) 681 { 682 thread_sleep( 1 ); 683 m_sSocket.close( ); 684 } 685 public: 686 CloseSocketThread(::osl::Socket & sSocket ) 687 : m_sSocket( sSocket ) 688 { 689 } 690 691 ~CloseSocketThread( ) 692 { 693 if ( isRunning( ) ) 694 { 695 t_print("# error: CloseSocketThread not terminated.\n" ); 696 } 697 } 698 }; 699 700 //------------------------------------------------------------------------ 701 // tests cases begins here 702 //------------------------------------------------------------------------ 703 704 namespace osl_SocketAddr 705 { 706 707 /** testing the methods: 708 inline SocketAddr(); 709 inline SocketAddr(const SocketAddr& Addr); 710 inline SocketAddr(const oslSocketAddr , __osl_socket_NoCopy nocopy ); 711 inline SocketAddr(oslSocketAddr Addr); 712 inline SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort ); 713 */ 714 715 class ctors : public CppUnit::TestFixture 716 { 717 public: 718 719 void ctors_none() 720 { 721 /// SocketAddr constructor. 722 ::osl::SocketAddr saSocketAddr; 723 724 // oslSocketResult aResult; 725 // rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult); 726 727 // rtl::OUString suHost2 = getThisHostname(); 728 729 CPPUNIT_ASSERT_MESSAGE("test for none parameter constructor function: check if the socket address was created successfully", 730 sal_True == saSocketAddr.is( ) ); 731 } 732 733 void ctors_none_000() 734 { 735 /// SocketAddr constructor. 736 ::osl::SocketAddr saSocketAddr; 737 738 oslSocketResult aResult; 739 rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult); 740 rtl::OUString suHost2 = getThisHostname(); 741 742 sal_Bool bOk = compareUString(suHost, suHost2); 743 744 rtl::OUString suError = rtl::OUString::createFromAscii("Host names should be the same. From SocketAddr.getLocalHostname() it is'"); 745 suError += suHost; 746 suError += rtl::OUString::createFromAscii("', from getThisHostname() it is '"); 747 suError += suHost2; 748 suError += rtl::OUString::createFromAscii("'."); 749 750 CPPUNIT_ASSERT_MESSAGE(suError, sal_True == bOk); 751 } 752 753 void ctors_copy() 754 { 755 /// SocketAddr copy constructor. 756 ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 ); 757 ::osl::SocketAddr saCopySocketAddr( saSocketAddr ); 758 759 sal_Int32 nPort = saCopySocketAddr.getPort( ); 760 761 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy constructor function: copy constructor, do an action of copy construction then check the port with original set.", 762 ( sal_True == saCopySocketAddr.is( ) ) && ( nPort == IP_PORT_HTTP1 ) ); 763 } 764 765 void ctors_copy_no_001() 766 { 767 #if 0 768 ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 ); 769 oslSocketAddr psaOSLSocketAddr = saSocketAddr.getHandle( ); 770 771 ::osl::SocketAddr saSocketAddrCopy( psaOSLSocketAddr, SAL_NO_COPY ); 772 saSocketAddrCopy.setPort( IP_PORT_HTTP2 ); 773 774 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.", 775 saSocketAddr.getPort( ) == IP_PORT_HTTP2 ); 776 #endif 777 ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostName1, IP_PORT_HTTP1 ); 778 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL); 779 780 oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( ); 781 782 ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY ); 783 784 pSocketAddrCopy->setPort( IP_PORT_HTTP2 ); 785 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.", 786 pSocketAddr->getPort( ) == IP_PORT_HTTP2 ); 787 788 delete pSocketAddrCopy; 789 // LLA: don't do this also: delete pSocketAddr; 790 } 791 792 void ctors_copy_no_002() 793 { 794 ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostName1, IP_PORT_HTTP1 ); 795 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL); 796 oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( ); 797 ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY ); 798 799 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.", 800 pSocketAddr->getHandle( ) == pSocketAddrCopy->getHandle( ) ); 801 802 delete pSocketAddrCopy; 803 } 804 805 void ctors_copy_handle_001() 806 { 807 ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 ); 808 ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) ); 809 810 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, get its port to check copy effect.", 811 saSocketAddrCopy.getPort( ) == IP_PORT_HTTP1 ); 812 } 813 814 void ctors_copy_handle_002() 815 { 816 ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 ); 817 ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) ); 818 saSocketAddrCopy.setPort( IP_PORT_HTTP2 ); 819 820 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, the original one should not be changed.", 821 saSocketAddr.getPort( ) != IP_PORT_HTTP2 ); 822 } 823 824 void ctors_hostname_port_001() 825 { 826 /// tcpip-specif constructor. 827 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP ); 828 printUString(saSocketAddr.getHostname( ), "ctors_hostname_port_001:getHostname"); 829 830 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: do a constructor using tcpip spec, check the result.", 831 saSocketAddr.is( ) == sal_True && 832 ( saSocketAddr.getPort( ) == IP_PORT_FTP )/*&& 833 ( sal_True == compareUString( saSocketAddr.getHostname( ), aHostName1 ) ) */); 834 } 835 836 //same as is_002 837 void ctors_hostname_port_002() 838 { 839 /// tcpip-specif constructor. 840 ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_MYPORT2 ); 841 842 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: using an invalid IP address, the socketaddr ctors should fail", sal_False == saSocketAddr.is( )); 843 } 844 CPPUNIT_TEST_SUITE( ctors ); 845 CPPUNIT_TEST( ctors_none ); 846 CPPUNIT_TEST( ctors_none_000 ); 847 CPPUNIT_TEST( ctors_copy ); 848 CPPUNIT_TEST( ctors_copy_no_001 ); 849 CPPUNIT_TEST( ctors_copy_no_002 ); 850 CPPUNIT_TEST( ctors_copy_handle_001 ); 851 CPPUNIT_TEST( ctors_copy_handle_002 ); 852 CPPUNIT_TEST( ctors_hostname_port_001 ); 853 CPPUNIT_TEST( ctors_hostname_port_002 ); 854 CPPUNIT_TEST_SUITE_END(); 855 856 }; // class ctors 857 858 859 /** testing the method: 860 inline sal_Bool is() const; 861 */ 862 863 class is : public CppUnit::TestFixture 864 { 865 public: 866 void is_001() 867 { 868 ::osl::SocketAddr saSocketAddr; 869 870 CPPUNIT_ASSERT_MESSAGE("test for is() function: create an unknown type socket, it should be True when call is.", 871 sal_True == saSocketAddr.is( ) ); 872 } 873 // refer to setPort_003() 874 void is_002() 875 { 876 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_INVAL ); 877 878 CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid port number", 879 sal_True == saSocketAddr.is( ) ); 880 } 881 882 void is_003() 883 { 884 ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_MYPORT ); 885 886 CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid Ip number", 887 sal_True != saSocketAddr.is( ) ); 888 } 889 890 CPPUNIT_TEST_SUITE( is ); 891 CPPUNIT_TEST( is_001 ); 892 CPPUNIT_TEST( is_002 ); 893 CPPUNIT_TEST( is_003 ); 894 CPPUNIT_TEST_SUITE_END(); 895 896 }; // class is 897 898 899 /** testing the method: 900 inline ::rtl::OUString SAL_CALL getHostname( oslSocketResult *pResult = 0 ) const; 901 */ 902 903 class getHostname : public CppUnit::TestFixture 904 { 905 public: 906 void setUp() 907 { 908 } 909 910 void tearDown() 911 { 912 } 913 914 void getHostname_000() 915 { 916 ::osl::SocketAddr saSocketAddr( aHostIp4, IP_PORT_FTP ); 917 918 } 919 920 /** it will search the Ip in current machine's /etc/hosts at first, if find, then return the 921 mapped hostname, otherwise, it will search via DNS server, and often return hostname+ Domain name 922 like "sceri.PRC.Sun.COM" 923 The process is same as Socket::getLocalHost(), but getLocalHost can only return hostname of the current machine. 924 */ 925 void getHostname_001() 926 { 927 ::osl::SocketAddr saSocketAddr( aHostIp4, IP_PORT_FTP ); 928 rtl::OUString suResult = saSocketAddr.getHostname( 0 ); 929 rtl::OUString suError = outputError(suResult, aHostName4, "test for getHostname(0)"); 930 sal_Bool bOK = compareUString( suResult, aHostName4 ); 931 // search the returned hostname in /etc/hosts, if find, and the IP in the row is same as IP 932 // in the Addr, it's right also. 933 if ( bOK == sal_False) 934 { 935 if ( compareUString( getIPbyName( oustring2char( suResult ) ), aHostIp4 ) == sal_True ) 936 bOK = sal_True; 937 } 938 CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK); 939 } 940 941 // LLA: now we have to control, if this behaviour is right. 942 // LLA: this function does not work in company (Linux, Windows) but at home 943 void getHostname_002() 944 { 945 rtl::OUString suHostname = rtl::OUString::createFromAscii("cn-1.germany.sun.com"); 946 rtl::OUString aHostIP = getIPbyName( oustring2char( suHostname ) ); 947 948 ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_FTP ); 949 sal_Bool bOK = saSocketAddr.setHostname( suHostname ); 950 CPPUNIT_ASSERT_MESSAGE("#SocketAddr.setHostname failed", sal_True == bOK ); 951 oslSocketResult aResult; 952 rtl::OUString suResult = saSocketAddr.getHostname( &aResult ); 953 CPPUNIT_ASSERT_MESSAGE("SocketAddr.getHostname failed.", aResult == osl_Socket_Ok); 954 955 rtl::OUString suError = outputError(suResult, suHostname, "test for getHostname(0)"); 956 bOK = compareUString( suResult, suHostname ); 957 if ( bOK == sal_False) 958 { 959 rtl::OString aString = ::rtl::OUStringToOString( suResult, RTL_TEXTENCODING_ASCII_US ); 960 if ( compareUString( getIPbyName( aString) , aHostIp6 ) == sal_True ) 961 { 962 bOK = sal_True; 963 } 964 } 965 966 CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK ); 967 } 968 969 970 CPPUNIT_TEST_SUITE( getHostname ); 971 CPPUNIT_TEST( getHostname_001 ); 972 CPPUNIT_TEST( getHostname_002 ); 973 CPPUNIT_TEST_SUITE_END(); 974 975 }; // class getHostname 976 977 978 /** testing the method: 979 inline sal_Int32 SAL_CALL getPort() const; 980 */ 981 982 class getPort : public CppUnit::TestFixture 983 { 984 public: 985 void getPort_001() 986 { 987 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP ); 988 989 CPPUNIT_ASSERT_MESSAGE( "test for getPort() function: get a normal port number.", 990 IP_PORT_FTP == saSocketAddr.getPort( ) ); 991 } 992 993 void getPort_002() 994 { 995 ::osl::SocketAddr saSocketAddr( aHostIp2, IP_PORT_INVAL ); 996 997 //t_print("#getPort_002: Port number is %d \n", saSocketAddr.getPort( )); 998 999 CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid port to a SocketAddr, get the port to see if it can detect. it did not pass in (W32).", 1000 saSocketAddr.getPort( )>=1 && saSocketAddr.getPort( ) <= 65535 ); 1001 } 1002 //two cases will return OSL_INVALID_PORT: 1. not valid SocketAddr 1003 //2. SocketAddr family is not osl_Socket_FamilyInet, but case 2 could not be constructed 1004 void getPort_003() 1005 { 1006 ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_MYPORT ); 1007 1008 CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid IP to a SocketAddr, get the port to see returned value. ", 1009 saSocketAddr.getPort( ) == OSL_INVALID_PORT ); 1010 } 1011 1012 CPPUNIT_TEST_SUITE( getPort ); 1013 CPPUNIT_TEST( getPort_001 ); 1014 CPPUNIT_TEST( getPort_002 ); 1015 CPPUNIT_TEST( getPort_003 ); 1016 CPPUNIT_TEST_SUITE_END( ); 1017 1018 }; // class getPort 1019 1020 1021 /** testing the method: 1022 inline sal_Bool SAL_CALL setPort( sal_Int32 nPort ); 1023 rfc1413.txt: TCP port numbers are from 1-65535 1024 rfc1700.txt: 0/tcp Reserved ; 0/udp Reserved 1025 */ 1026 1027 class setPort : public CppUnit::TestFixture 1028 { 1029 public: 1030 void setPort_001() 1031 { 1032 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP ); 1033 sal_Bool bOK = saSocketAddr.setPort( IP_PORT_TELNET ); 1034 1035 CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: modify a port number setting, and check it.", 1036 ( sal_True == bOK ) && 1037 ( IP_PORT_TELNET == saSocketAddr.getPort( ) ) ); 1038 } 1039 1040 /** 0 to 1024 is known as the reserved port range (traditionally only root can assign programs to ports in 1041 this range) and the ephemeral port range from 1025 to 65535. 1042 As many of you programmers will know, when you specify the source port of 0 when you connect to a host, 1043 the OS automatically reassigns the port number to high numbered ephemeral port. The same happens if you 1044 try to bind a listening socket to port 0. 1045 http://www.securiteam.com/securityreviews/5XP0Q2AAKS.html 1046 another: http://www.muq.org/~cynbe/muq/mufref_564.html 1047 */ 1048 void setPort_002() 1049 { 1050 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP ); 1051 sal_Bool bOK = saSocketAddr.setPort( IP_PORT_ZERO ); 1052 1053 oslSocket sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1054 ::osl::Socket sSocket(sHandle); 1055 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 );//sal_True); 1056 sal_Bool bOK1 = sSocket.bind( saSocketAddr ); 1057 CPPUNIT_ASSERT_MESSAGE( "bind SocketAddr failed", bOK1 == sal_True ); 1058 1059 sal_Int32 newPort = sSocket.getLocalPort(); 1060 //t_print("#new port is %d\n", newPort ); 1061 1062 CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: port number should be in 1 ~ 65535, set port 0, it should be converted to a port number between 1024~65535.", 1063 ( 1024 <= newPort ) && ( 65535 >= newPort ) && ( bOK == sal_True ) ); 1064 1065 } 1066 1067 void setPort_003() 1068 { 1069 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP); 1070 sal_Bool bOK = saSocketAddr.setPort( IP_PORT_INVAL ); 1071 //on Linux, getPort return 34463 1072 //t_print("#Port number is %d \n", saSocketAddr.getPort( )); 1073 1074 CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an address with invalid port. it should return error or convert it to a valid port.", 1075 ( ( 1 <= saSocketAddr.getPort( ) ) && ( 65535 >= saSocketAddr.getPort( ) ) &&( bOK == sal_True ) ) || 1076 bOK == sal_False); 1077 } 1078 1079 /* this is not a inet-addr => can't set port */ 1080 void setPort_004() 1081 { 1082 ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_FTP); 1083 sal_Bool bOK = saSocketAddr.setPort( IP_PORT_MYPORT ); 1084 1085 CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an invalid address with valid port. it should return error.", 1086 bOK == sal_False); 1087 } 1088 1089 1090 CPPUNIT_TEST_SUITE( setPort ); 1091 CPPUNIT_TEST( setPort_001 ); 1092 CPPUNIT_TEST( setPort_002 ); 1093 CPPUNIT_TEST( setPort_003 ); 1094 CPPUNIT_TEST( setPort_004 ); 1095 CPPUNIT_TEST_SUITE_END( ); 1096 1097 }; // class setPort 1098 1099 1100 /** tester comment: 1101 1102 In the following two functions, it use ::rtl::ByteSequence as an intermediate storage for address, 1103 the ByteSequence object can hold sal_Int8 arrays, which is raged [-127, 127], in case of IP addr 1104 that is greater than 127, say 129.158.217.202, it will stored as -127, -98, -39, -54, it is unique 1105 in the range of sal_Int8, but lack of readability. 1106 so may be a sal_uInt8 array is better. 1107 */ 1108 1109 1110 /** testing the method: 1111 inline sal_Bool SAL_CALL setAddr( const ::rtl::ByteSequence & address ); 1112 */ 1113 1114 class setAddr : public CppUnit::TestFixture 1115 { 1116 public: 1117 void setAddr_001() 1118 { 1119 ::osl::SocketAddr saSocketAddr( aHostIp2, IP_PORT_FTP ); 1120 saSocketAddr.setAddr( UStringIPToByteSequence( aHostIp1 ) ); 1121 ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 ); 1122 sal_Bool bOK = sal_False; 1123 1124 if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) && ( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) ) 1125 bOK = sal_True; 1126 1127 CPPUNIT_ASSERT_MESSAGE( "test for setAddr() function: construct Addr with \"129.158.217.202\", set it to \"127.0.0.1\", and check the correctness ", 1128 sal_True == bOK ); 1129 } 1130 1131 1132 CPPUNIT_TEST_SUITE( setAddr ); 1133 CPPUNIT_TEST( setAddr_001 ); 1134 CPPUNIT_TEST_SUITE_END( ); 1135 1136 }; // class setAddr 1137 1138 1139 /** testing the method: 1140 inline ::rtl::ByteSequence SAL_CALL getAddr( oslSocketResult *pResult = 0 ) const; 1141 */ 1142 1143 class getAddr : public CppUnit::TestFixture 1144 { 1145 public: 1146 void getAddr_001() 1147 { 1148 oslSocketResult SocketResult; 1149 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP ); 1150 ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( &SocketResult ); 1151 1152 sal_Bool bOK = sal_False; 1153 1154 if ( ( osl_Socket_Ok == SocketResult ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) ) 1155 bOK = sal_True; 1156 1157 CPPUNIT_ASSERT_MESSAGE( "test for getAddr() function: construct a socketaddr with IP assigned, get the address to check correctness.Caught unknown exception on (Win32)", 1158 sal_True == bOK && SocketResult == osl_Socket_Ok); 1159 } 1160 1161 CPPUNIT_TEST_SUITE( getAddr ); 1162 CPPUNIT_TEST( getAddr_001 ); 1163 CPPUNIT_TEST_SUITE_END( ); 1164 1165 }; // class getAddr 1166 1167 1168 /** testing the methods: 1169 inline SocketAddr & SAL_CALL operator= (oslSocketAddr Addr); 1170 inline SocketAddr & SAL_CALL operator= (const SocketAddr& Addr); 1171 inline SocketAddr & SAL_CALL assign( oslSocketAddr Addr, __osl_socket_NoCopy nocopy ); 1172 inline sal_Bool SAL_CALL operator== (oslSocketAddr Addr) const; 1173 inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const; /// not implemented. 1174 */ 1175 1176 class operator_equal : public CppUnit::TestFixture 1177 { 1178 public: 1179 void operator_equal_001() 1180 { 1181 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET); 1182 ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP ); 1183 1184 saSocketAddrEqual = saSocketAddr; 1185 sal_Bool bOK = sal_False; 1186 ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 ); 1187 1188 if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) ) 1189 bOK = sal_True; 1190 1191 CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: use operator= to assign Ip1 to Ip2, check its modification.", 1192 sal_True == bOK ); 1193 } 1194 1195 1196 void operator_equal_002() 1197 { 1198 ::osl::SocketAddr saSocketAddr( aHostIp3, IP_PORT_TELNET); 1199 ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP ); 1200 1201 saSocketAddrEqual = saSocketAddr; 1202 CPPUNIT_ASSERT_MESSAGE( "after assign, the assigned SocketAddr is not same as the original Addr", 1203 IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ); 1204 saSocketAddrEqual.setPort( IP_PORT_MYPORT3 ); 1205 saSocketAddr.setPort( IP_PORT_HTTP2 ); 1206 1207 CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: perform an equal action, then try to change the original address's port. it should not be changed ( handle released), it did not pass in (W32), this is under discussion.", 1208 IP_PORT_MYPORT3 == saSocketAddrEqual.getPort( ) ); 1209 } 1210 1211 void operator_equal_const_001() 1212 { 1213 const ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET); 1214 ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP ); 1215 1216 saSocketAddrEqual = saSocketAddr; 1217 sal_Bool bOK = sal_False; 1218 ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 ); 1219 1220 if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) ) 1221 bOK = sal_True; 1222 1223 CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: use operator= const to assign Ip1 to Ip2, verify the change on the second one.", 1224 sal_True == bOK ); 1225 } 1226 1227 void operator_equal_const_002() 1228 { 1229 const ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET); 1230 ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP ); 1231 1232 saSocketAddrEqual = saSocketAddr; 1233 saSocketAddrEqual.setPort( IP_PORT_HTTP1 ); 1234 1235 CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: change the second instance, the first one should not be altered, since it does not released the handle.", 1236 IP_PORT_HTTP1 != saSocketAddr.getPort( ) ); 1237 } 1238 1239 void operator_equal_assign_001() 1240 { 1241 ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostIp1, IP_PORT_TELNET ); 1242 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL); 1243 ::osl::SocketAddr* pSocketAddrAssign = new ::osl::SocketAddr( aHostIp2, IP_PORT_FTP ); 1244 oslSocketAddr poslSocketAddr = pSocketAddr->getHandle( ); 1245 //if( m_handle ) osl_destroySocketAddr( m_handle ); so pSocketAddrAssign had been destroyed and then point to pSocketAddr 1246 pSocketAddrAssign->assign(poslSocketAddr, SAL_NO_COPY); 1247 1248 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.", 1249 pSocketAddrAssign->getPort( ) == IP_PORT_TELNET ); 1250 1251 delete pSocketAddrAssign; 1252 } 1253 1254 void operator_is_equal_001() 1255 { 1256 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET); 1257 ::osl::SocketAddr saSocketAddrequal( aHostIp1, IP_PORT_TELNET ); 1258 1259 CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two identical Address.", 1260 sal_True == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) ); 1261 } 1262 1263 void operator_is_equal_002() 1264 { 1265 ::osl::SocketAddr saSocketAddr( aHostIp2, IP_PORT_FTP); 1266 ::osl::SocketAddr saSocketAddrequal( aHostIp1, IP_PORT_TELNET ); 1267 1268 CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two different Address.", 1269 sal_False == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) ); 1270 } 1271 1272 CPPUNIT_TEST_SUITE( operator_equal ); 1273 CPPUNIT_TEST( operator_equal_001 ); 1274 CPPUNIT_TEST( operator_equal_002 ); 1275 CPPUNIT_TEST( operator_equal_const_001 ); 1276 CPPUNIT_TEST( operator_equal_const_002 ); 1277 CPPUNIT_TEST( operator_equal_assign_001 ); 1278 CPPUNIT_TEST( operator_is_equal_001 ); 1279 CPPUNIT_TEST( operator_is_equal_002 ); 1280 CPPUNIT_TEST_SUITE_END( ); 1281 1282 }; // class operator_equal 1283 1284 1285 1286 /** testing the method: 1287 inline oslSocketAddr SAL_CALL getHandle() const; 1288 */ 1289 1290 class getSocketAddrHandle : public CppUnit::TestFixture 1291 { 1292 public: 1293 1294 void getSocketAddrHandle_001() 1295 { 1296 ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostName1, IP_PORT_HTTP1 ); 1297 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL); 1298 oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( ); 1299 ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY ); 1300 1301 CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.", 1302 pSocketAddr->getHandle( ) == pSocketAddrCopy->getHandle( ) ); 1303 1304 delete pSocketAddrCopy; 1305 } 1306 1307 void getSocketAddrHandle_002() 1308 { 1309 ::osl::SocketAddr saSocketAddr( aHostName3, IP_PORT_MYPORT4 ); 1310 oslSocketAddr poslSocketAddr = saSocketAddr.getHandle( ); 1311 1312 sal_Bool bOK = ( saSocketAddr == poslSocketAddr ); 1313 //t_print("getSocketAddrHandle_002\n"); 1314 CPPUNIT_ASSERT_MESSAGE( "test for getHandle() function: use getHandle() function as an intermediate way to create identical address.", 1315 sal_True == bOK ); 1316 } 1317 1318 CPPUNIT_TEST_SUITE( getSocketAddrHandle ); 1319 CPPUNIT_TEST( getSocketAddrHandle_001 ); 1320 CPPUNIT_TEST( getSocketAddrHandle_002 ); 1321 CPPUNIT_TEST_SUITE_END( ); 1322 1323 }; // class getSocketAddrHandle 1324 1325 1326 /** testing the method: 1327 static inline ::rtl::OUString SAL_CALL getLocalHostname( oslSocketResult *pResult = 0); 1328 */ 1329 1330 class getLocalHostname : public CppUnit::TestFixture 1331 { 1332 public: 1333 /* the process of getLocalHostname: 1.gethostname (same as /bin/hostname) returned name A 1334 2. search A in /etc/hosts, if there is an alias name is A, return the name in the same row 1335 */ 1336 1337 void getLocalHostname_000() 1338 { 1339 // _osl_getFullQualifiedDomainName( ); 1340 oslSocketResult aResult = osl_Socket_Error; 1341 rtl::OUString suHostname = osl::SocketAddr::getLocalHostname(&aResult); 1342 CPPUNIT_ASSERT_MESSAGE("getLocalHostname failed", aResult == osl_Socket_Ok); 1343 } 1344 1345 void getLocalHostname_001() 1346 { 1347 oslSocketResult *pResult = NULL; 1348 //printSocketResult(*pResult); 1349 ::rtl::OUString suResult = ::osl::SocketAddr::getLocalHostname( pResult ); 1350 1351 // LLA: IMHO localhost, or hostname by itself should be ok. 1352 rtl::OUString suThisHost = getThisHostname( ); 1353 bool bOk = false; 1354 if (suThisHost.equals(rtl::OUString::createFromAscii("localhost"))) 1355 { 1356 bOk = true; 1357 } 1358 else 1359 { 1360 if (suThisHost.equals(suResult)) 1361 { 1362 bOk = true; 1363 } 1364 } 1365 1366 ::rtl::OUString suError; 1367 suError = outputError(suResult, getThisHostname( ), "test for getLocalHostname() function"); 1368 1369 CPPUNIT_ASSERT_MESSAGE( suError, bOk == true ); 1370 } 1371 1372 CPPUNIT_TEST_SUITE( getLocalHostname ); 1373 CPPUNIT_TEST( getLocalHostname_000 ); 1374 CPPUNIT_TEST( getLocalHostname_001 ); 1375 CPPUNIT_TEST_SUITE_END( ); 1376 1377 }; // class getLocalHostname 1378 1379 1380 /** testing the method: 1381 static inline void SAL_CALL resolveHostname( const ::rtl::OUString & strHostName , SocketAddr & Addr ); 1382 */ 1383 1384 class resolveHostname : public CppUnit::TestFixture 1385 { 1386 public: 1387 void resolveHostname_001() 1388 { 1389 ::osl::SocketAddr saSocketAddr; 1390 ::osl::SocketAddr::resolveHostname( aHostIp1, saSocketAddr ); 1391 ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 ); 1392 sal_Bool bOK = sal_False; 1393 1394 if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) ) 1395 bOK = sal_True; 1396 1397 CPPUNIT_ASSERT_MESSAGE( "test for resolveHostname() function: try to resolve localhost to 127.0.0.1.", 1398 sal_True == bOK ); 1399 } 1400 1401 CPPUNIT_TEST_SUITE( resolveHostname ); 1402 CPPUNIT_TEST( resolveHostname_001 ); 1403 CPPUNIT_TEST_SUITE_END( ); 1404 1405 }; // class resolveHostname 1406 1407 1408 /** testing the method: 1409 static inline sal_Int32 SAL_CALL getServicePort( 1410 const ::rtl::OUString& strServiceName, 1411 const ::rtl::OUString & strProtocolName= ::rtl::OUString::createFromAscii( "tcp" ) ); 1412 */ 1413 1414 class gettheServicePort : public CppUnit::TestFixture 1415 { 1416 public: 1417 void gettheServicePort_001() 1418 { 1419 CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get ftp service port on TCP protocol.", 1420 IP_PORT_FTP== ::osl::SocketAddr::getServicePort( aServiceFTP, aProtocolTCP ) ); 1421 } 1422 1423 void gettheServicePort_002() 1424 { 1425 CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get telnet service port on TCP protocol.", 1426 IP_PORT_TELNET== ::osl::SocketAddr::getServicePort( aServiceTELNET, aProtocolTCP ) ); 1427 } 1428 1429 void gettheServicePort_003() 1430 { 1431 //Solaris has no service called "https", please see /etc/services 1432 CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get netbios-ssn service port on UDP protocol.", 1433 IP_PORT_NETBIOS_DGM == ::osl::SocketAddr::getServicePort( aServiceNETBIOS, aProtocolUDP ) ); 1434 } 1435 1436 void gettheServicePort_004() 1437 { 1438 CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get a service port which is not exist.", 1439 OSL_INVALID_PORT == ::osl::SocketAddr::getServicePort( ::rtl::OUString::createFromAscii( "notexist" ), aProtocolUDP ) ); 1440 } 1441 1442 CPPUNIT_TEST_SUITE( gettheServicePort ); 1443 CPPUNIT_TEST( gettheServicePort_001 ); 1444 CPPUNIT_TEST( gettheServicePort_002 ); 1445 CPPUNIT_TEST( gettheServicePort_003 ); 1446 CPPUNIT_TEST( gettheServicePort_004 ); 1447 CPPUNIT_TEST_SUITE_END( ); 1448 1449 }; // class gettheServicePort 1450 1451 // ----------------------------------------------------------------------------- 1452 1453 1454 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::ctors, "osl_SocketAddr"); 1455 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::is, "osl_SocketAddr"); 1456 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getHostname, "osl_SocketAddr"); 1457 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getPort, "osl_SocketAddr"); 1458 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setPort, "osl_SocketAddr"); 1459 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setAddr, "osl_SocketAddr"); 1460 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getAddr, "osl_SocketAddr"); 1461 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::operator_equal, "osl_SocketAddr"); 1462 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getSocketAddrHandle, "osl_SocketAddr"); 1463 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getLocalHostname, "osl_SocketAddr"); 1464 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::resolveHostname, "osl_SocketAddr"); 1465 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::gettheServicePort, "osl_SocketAddr"); 1466 1467 1468 } // namespace osl_SocketAddr 1469 1470 1471 1472 namespace osl_Socket 1473 { 1474 1475 /** testing the methods: 1476 inline Socket( ); 1477 inline Socket( const Socket & socket ); 1478 inline Socket( oslSocket socketHandle ); 1479 inline Socket( oslSocket socketHandle, __sal_NoAcquire noacquire ); 1480 */ 1481 1482 /** test writer's comment: 1483 1484 class Socket can not be initialized by its protected constructor, though the protected 1485 constructor is the most convenient way to create a new socket. 1486 it only allow the method of C function osl_createSocket like: 1487 ::osl::Socket sSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, 1488 osl_Socket_ProtocolIp ) ); 1489 the use of C method lost some of the transparent of tester using C++ wrapper. 1490 */ 1491 1492 1493 class ctors : public CppUnit::TestFixture 1494 { 1495 public: 1496 oslSocket sHandle; 1497 // initialization 1498 void setUp( ) 1499 { 1500 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1501 } 1502 1503 void tearDown( ) 1504 { 1505 sHandle = NULL; 1506 } 1507 1508 1509 void ctors_none() 1510 { 1511 /// Socket constructor. 1512 // ::osl::Socket sSocket; 1513 1514 CPPUNIT_ASSERT_MESSAGE( "test for ctors_none constructor function: check if the socket was created successfully, if no exception occurred", 1515 1 == 1 ); 1516 } 1517 1518 void ctors_acquire() 1519 { 1520 /// Socket constructor. 1521 ::osl::Socket sSocket( sHandle ); 1522 1523 CPPUNIT_ASSERT_MESSAGE( "test for ctors_acquire constructor function: check if the socket was created successfully", 1524 osl_Socket_TypeStream == sSocket.getType( ) ); 1525 } 1526 1527 void ctors_no_acquire() 1528 { 1529 /// Socket constructor. 1530 ::osl::Socket sSocket( sHandle, SAL_NO_ACQUIRE ); 1531 1532 CPPUNIT_ASSERT_MESSAGE(" test for ctors_no_acquire constructor function: check if the socket was created successfully", 1533 osl_Socket_TypeStream == sSocket.getType( ) ); 1534 } 1535 1536 void ctors_copy_ctor() 1537 { 1538 ::osl::Socket sSocket( sHandle ); 1539 /// Socket copy constructor. 1540 ::osl::Socket copySocket( sSocket ); 1541 1542 CPPUNIT_ASSERT_MESSAGE(" test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor", 1543 osl_Socket_TypeStream == copySocket.getType( ) ); 1544 } 1545 1546 void ctors_TypeRaw() 1547 { 1548 #ifdef WNT 1549 oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp ); 1550 // LLA: ? ::osl::Socket sSocket( sHandleRaw ); 1551 CPPUNIT_ASSERT_MESSAGE( " type osl_Socket_TypeRaw socket create failed on UNX ", sHandleRaw != NULL); 1552 #else 1553 oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp ); 1554 CPPUNIT_ASSERT_MESSAGE( " can't create socket with type osl_Socket_TypeRaw within UNX is ok.", sHandleRaw == NULL); 1555 #endif 1556 } 1557 1558 void ctors_family_Ipx() 1559 { 1560 oslSocket sHandleIpx = osl_createSocket( osl_Socket_FamilyIpx, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1561 CPPUNIT_ASSERT_MESSAGE( " family osl_Socket_FamilyIpx socket create failed! ", sHandleIpx != NULL); 1562 ::osl::Socket sSocket( sHandleIpx ); //, SAL_NO_ACQUIRE ); 1563 t_print("#Type is %d \n", sSocket.getType( ) ); 1564 1565 CPPUNIT_ASSERT_MESSAGE(" test for create new Socket instance that family is osl_Socket_FamilyIpx", 1566 osl_Socket_TypeStream == sSocket.getType( ) ); 1567 } 1568 1569 1570 1571 CPPUNIT_TEST_SUITE( ctors ); 1572 CPPUNIT_TEST( ctors_none ); 1573 CPPUNIT_TEST( ctors_acquire ); 1574 CPPUNIT_TEST( ctors_no_acquire ); 1575 CPPUNIT_TEST( ctors_copy_ctor ); 1576 CPPUNIT_TEST( ctors_TypeRaw ); 1577 CPPUNIT_TEST( ctors_family_Ipx ); 1578 CPPUNIT_TEST_SUITE_END(); 1579 1580 }; // class ctors 1581 1582 1583 /** testing the methods: 1584 inline Socket& SAL_CALL operator= ( oslSocket socketHandle); 1585 inline Socket& SAL_CALL operator= (const Socket& sock); 1586 inline sal_Bool SAL_CALL operator==( const Socket& rSocket ) const ; 1587 inline sal_Bool SAL_CALL operator==( const oslSocket socketHandle ) const; 1588 */ 1589 1590 class operators : public CppUnit::TestFixture 1591 { 1592 public: 1593 oslSocket sHandle; 1594 // initialization 1595 void setUp( ) 1596 { 1597 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1598 } 1599 1600 void tearDown( ) 1601 { 1602 sHandle = NULL; 1603 } 1604 1605 1606 /** test writer's comment: 1607 1608 the assignment operator does not support direct assinment like: 1609 ::osl::Socket sSocket = sHandle. 1610 */ 1611 void operators_assignment_handle() 1612 { 1613 ::osl::Socket sSocket(sHandle); 1614 ::osl::Socket assignSocket = sSocket.getHandle(); 1615 1616 CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment_handle function: test the assignment operator.", 1617 osl_Socket_TypeStream == assignSocket.getType( ) ); 1618 } 1619 1620 void operators_assignment() 1621 { 1622 ::osl::Socket sSocket( sHandle ); 1623 ::osl::Socket assignSocket = sSocket; 1624 1625 CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment function: assignment operator", 1626 osl_Socket_TypeStream == assignSocket.getType( ) ); 1627 } 1628 1629 void operators_equal_handle_001() 1630 { 1631 /// Socket constructor. 1632 ::osl::Socket sSocket( sHandle ); 1633 ::osl::Socket equalSocket = sSocket; 1634 1635 CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_handle_001 function: check equal.", 1636 equalSocket == sHandle ); 1637 } 1638 1639 void operators_equal_handle_002() 1640 { 1641 /// Socket constructor. 1642 ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) ); 1643 1644 CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_handle_001 function: check unequal.", 1645 !( equalSocket == sHandle ) ); 1646 } 1647 1648 void operators_equal_001() 1649 { 1650 ::osl::Socket sSocket( sHandle ); 1651 /// Socket copy constructor. 1652 ::osl::Socket equalSocket( sSocket ); 1653 1654 CPPUNIT_ASSERT_MESSAGE(" test for operators_equal function: check equal.", 1655 equalSocket == sSocket ); 1656 } 1657 1658 void operators_equal_002() 1659 { 1660 ::osl::Socket sSocket( sHandle ); 1661 /// Socket copy constructor. 1662 ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) ); 1663 1664 CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_002 function: check unequal.", 1665 !( equalSocket == sSocket ) ); 1666 } 1667 1668 CPPUNIT_TEST_SUITE( operators ); 1669 CPPUNIT_TEST( operators_assignment_handle ); 1670 CPPUNIT_TEST( operators_assignment ); 1671 CPPUNIT_TEST( operators_equal_handle_001 ); 1672 CPPUNIT_TEST( operators_equal_handle_002 ); 1673 CPPUNIT_TEST( operators_equal_001 ); 1674 CPPUNIT_TEST( operators_equal_002 ); 1675 CPPUNIT_TEST_SUITE_END(); 1676 1677 }; // class operators 1678 1679 1680 /** testing the methods: 1681 inline void SAL_CALL shutdown( oslSocketDirection Direction = osl_Socket_DirReadWrite ); 1682 inline void SAL_CALL close(); 1683 */ 1684 1685 class close : public CppUnit::TestFixture 1686 { 1687 public: 1688 oslSocket sHandle; 1689 // initialization 1690 void setUp( ) 1691 { 1692 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1693 } 1694 1695 void tearDown( ) 1696 { 1697 sHandle = NULL; 1698 } 1699 1700 1701 void close_001() 1702 { 1703 ::osl::Socket sSocket(sHandle); 1704 sSocket.close(); 1705 1706 CPPUNIT_ASSERT_MESSAGE( "test for close_001 function: this function is reserved for test.", 1707 sSocket.getHandle() == sHandle ); 1708 } 1709 1710 void close_002() 1711 { 1712 //#if defined(LINUX) 1713 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 1714 AcceptorThread myAcceptorThread( asSocket, aHostIp1 ); 1715 myAcceptorThread.create(); 1716 1717 thread_sleep( 1 ); 1718 //when accepting, close the socket, the thread will not block for accepting 1719 //man close:Any locks held on the file it was associated with, and owned by the process, are removed 1720 asSocket.close(); 1721 //thread_sleep( 2 ); 1722 myAcceptorThread.join(); 1723 1724 CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.", 1725 myAcceptorThread.isOK() == sal_True ); 1726 //#endif 1727 } 1728 1729 // to cover "if ( pSockAddrIn->sin_addr.s_addr == htonl(INADDR_ANY) )" in osl_closeSocket( ) 1730 void close_003() 1731 { 1732 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 1733 AcceptorThread myAcceptorThread( asSocket, aHostIpZero ); 1734 myAcceptorThread.create(); 1735 1736 thread_sleep( 1 ); 1737 asSocket.close(); 1738 myAcceptorThread.join(); 1739 1740 CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.", 1741 myAcceptorThread.isOK() == sal_True ); 1742 } 1743 1744 CPPUNIT_TEST_SUITE( close ); 1745 CPPUNIT_TEST( close_001 ); 1746 CPPUNIT_TEST( close_002 ); 1747 CPPUNIT_TEST( close_003 ); 1748 CPPUNIT_TEST_SUITE_END(); 1749 1750 }; // class close 1751 1752 /** testing the method: 1753 inline void SAL_CALL getLocalAddr( SocketAddr &Addr ) const; 1754 */ 1755 1756 class getLocalAddr : public CppUnit::TestFixture 1757 { 1758 public: 1759 oslSocket sHandle; 1760 // initialization 1761 void setUp( ) 1762 { 1763 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1764 } 1765 1766 void tearDown( ) 1767 { 1768 sHandle = NULL; 1769 } 1770 1771 // get the Address of the local end of the socket 1772 void getLocalAddr_001() 1773 { 1774 ::osl::Socket sSocket(sHandle); 1775 ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_MYPORT8 ); 1776 ::osl::SocketAddr saLocalSocketAddr; 1777 1778 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1779 1780 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 1781 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 1782 CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 ); 1783 1784 sSocket.getLocalAddr( saLocalSocketAddr ); 1785 1786 sal_Bool bOK = compareUString( saLocalSocketAddr.getHostname( 0 ), sSocket.getLocalHost() ) ; 1787 1788 CPPUNIT_ASSERT_MESSAGE( "test for getLocalAddr function: first create a new socket, then a socket address, bind them, and check the address.", 1789 sal_True == bOK ); 1790 } 1791 1792 1793 CPPUNIT_TEST_SUITE( getLocalAddr ); 1794 CPPUNIT_TEST( getLocalAddr_001 ); 1795 CPPUNIT_TEST_SUITE_END(); 1796 1797 }; // class getLocalAddr 1798 1799 1800 /** testing the method: 1801 inline sal_Int32 SAL_CALL getLocalPort() const; 1802 */ 1803 1804 class getLocalPort : public CppUnit::TestFixture 1805 { 1806 public: 1807 oslSocket sHandle; 1808 // initialization 1809 void setUp( ) 1810 { 1811 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1812 } 1813 1814 void tearDown( ) 1815 { 1816 sHandle = NULL; 1817 } 1818 1819 1820 void getLocalPort_001() 1821 { 1822 ::osl::Socket sSocket(sHandle); 1823 ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_MYPORT7 ); // aHostIp1 localhost 1824 ::osl::SocketAddr saLocalSocketAddr; 1825 1826 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1827 1828 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 1829 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 1830 CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 ); 1831 sal_Bool bOK = ( IP_PORT_MYPORT7 == sSocket.getLocalPort( ) ); 1832 1833 CPPUNIT_ASSERT_MESSAGE( "test for getLocalPort function: first create a new socket, then a socket address, bind them, and check the port.", 1834 sal_True == bOK ); 1835 } 1836 1837 /** test writer's comment: 1838 1839 the invalid port number can not be set by giving invalid port number 1840 such as 99999 or -1, it will convert to ( x mod 65535 ), so it will always be 1841 valid, the only instance that the getLocalPort returns OSL_INVALID_PORT 1842 is when saSocketAddr itself is an invalid one, that is , the IP or host name 1843 can not be found, then the created socket address is not valid. 1844 */ 1845 void getLocalPort_002() 1846 { 1847 ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_TELNET); 1848 #ifdef WNT 1849 ::osl::Socket sSocket(sHandle); 1850 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True); 1851 sSocket.bind( saBindSocketAddr ); 1852 //Invalid IP, so bind should fail 1853 ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )), 1854 ::rtl::OUString::valueOf((sal_Int32)OSL_INVALID_PORT), 1855 "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned."); 1856 sal_Bool bOK = ( OSL_INVALID_PORT == sSocket.getLocalPort( ) ); 1857 (void)bOK; 1858 #else 1859 //on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT 1860 ::rtl::OUString suError = ::rtl::OUString::createFromAscii( "on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT, but can not create Addr of that case"); 1861 #endif 1862 CPPUNIT_ASSERT_MESSAGE( suError, sal_False ); 1863 1864 } 1865 1866 void getLocalPort_003() 1867 { 1868 ::osl::Socket sSocket(sHandle); 1869 ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_INVAL); 1870 1871 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1872 1873 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 1874 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 1875 CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 ); 1876 ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )), 1877 ::rtl::OUString::createFromAscii("34463"), 1878 "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned"); 1879 sal_Bool bOK = ( sSocket.getLocalPort( ) >= 1 && sSocket.getLocalPort( ) <= 65535); 1880 1881 CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK ); 1882 } 1883 1884 CPPUNIT_TEST_SUITE( getLocalPort ); 1885 CPPUNIT_TEST( getLocalPort_001 ); 1886 // LLA: CPPUNIT_TEST( getLocalPort_002 ); 1887 CPPUNIT_TEST( getLocalPort_003 ); 1888 CPPUNIT_TEST_SUITE_END(); 1889 1890 }; // class getLocalPort 1891 1892 1893 /** testing the method: 1894 inline ::rtl::OUString SAL_CALL getLocalHost() const; 1895 1896 Mindyliu: on Linux, at first it will check the binded in /etc/hosts, if it has the binded IP, it will return the hostname in it; 1897 else if the binded IP is "127.0.0.1", it will return "localhost", if it's the machine's ethernet ip such as "129.158.217.90", it 1898 will return hostname of current processor such as "aegean.PRC.Sun.COM" 1899 */ 1900 1901 class getLocalHost : public CppUnit::TestFixture 1902 { 1903 public: 1904 oslSocket sHandle; 1905 // initialization 1906 void setUp( ) 1907 { 1908 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1909 } 1910 1911 void tearDown( ) 1912 { 1913 sHandle = NULL; 1914 } 1915 1916 1917 void getLocalHost_001() 1918 { 1919 ::osl::Socket sSocket(sHandle); 1920 //port number from IP_PORT_HTTP1 to IP_PORT_MYPORT6, mindyliu 1921 ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_MYPORT6 ); 1922 1923 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1924 1925 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 1926 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 1927 CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 ); 1928 sal_Bool bOK; 1929 ::rtl::OUString suError; 1930 #ifdef WNT 1931 bOK = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ; 1932 suError = outputError(sSocket.getLocalHost( ), getThisHostname( ), 1933 "test for getLocalHost function: create localhost socket and check name"); 1934 #else 1935 ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) "localhost" ); 1936 sal_Bool bRes1, bRes2; 1937 bRes1 = compareUString( sSocket.getLocalHost( ), aUString ) ; 1938 bRes2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname(0) ) ; 1939 bOK = bRes1 || bRes2; 1940 suError = outputError(sSocket.getLocalHost( ), aUString, "test for getLocalHost function: create localhost socket and check name"); 1941 #endif 1942 CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK ); 1943 } 1944 1945 void getLocalHost_002() 1946 { 1947 ::osl::Socket sSocket(sHandle); 1948 ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_POP3); 1949 ::osl::SocketAddr saLocalSocketAddr; 1950 1951 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1952 sSocket.bind( saBindSocketAddr ); 1953 //Invalid IP, so bind should fail 1954 sal_Bool bOK = compareUString( sSocket.getLocalHost( ), aNullURL ) ; 1955 ::rtl::OUString suError = outputError(sSocket.getLocalHost( ), aNullURL, "test for getLocalHost function: getLocalHost with invalid SocketAddr"); 1956 1957 CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK ); 1958 } 1959 1960 CPPUNIT_TEST_SUITE( getLocalHost ); 1961 CPPUNIT_TEST( getLocalHost_001 ); 1962 CPPUNIT_TEST( getLocalHost_002 ); 1963 CPPUNIT_TEST_SUITE_END(); 1964 1965 }; // class getLocalHost 1966 1967 1968 /** testing the methods: 1969 inline void SAL_CALL getPeerAddr( SocketAddr & Addr) const; 1970 inline sal_Int32 SAL_CALL getPeerPort() const; 1971 inline ::rtl::OUString SAL_CALL getPeerHost() const; 1972 */ 1973 class getPeer : public CppUnit::TestFixture 1974 { 1975 public: 1976 oslSocket sHandle; 1977 TimeValue *pTimeout; 1978 ::osl::AcceptorSocket asAcceptorSocket; 1979 ::osl::ConnectorSocket csConnectorSocket; 1980 1981 1982 // initialization 1983 void setUp( ) 1984 { 1985 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 1986 pTimeout->Seconds = 3; 1987 pTimeout->Nanosec = 0; 1988 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1989 } 1990 1991 void tearDown( ) 1992 { 1993 free( pTimeout ); 1994 sHandle = NULL; 1995 asAcceptorSocket.close( ); 1996 csConnectorSocket.close( ); 1997 } 1998 1999 2000 void getPeer_001() 2001 { 2002 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT ); 2003 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT ); 2004 ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP ); 2005 ::osl::StreamSocket ssConnection; 2006 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 2007 /// launch server socket 2008 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 2009 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind '127.0.0.1' address failed.", sal_True == bOK1 ); 2010 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 2011 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 2012 2013 asAcceptorSocket.enableNonBlockingMode( sal_True ); 2014 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 2015 2016 /// launch client socket 2017 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 2018 2019 /// get peer information 2020 csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected. 2021 sal_Int32 peerPort = csConnectorSocket.getPeerPort( ); 2022 ::rtl::OUString peerHost = csConnectorSocket.getPeerHost( ); 2023 2024 CPPUNIT_ASSERT_MESSAGE( "test for getPeer function: setup a connection and then get the peer address, port and host from client side.", 2025 ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) )&& 2026 ( sal_True == compareUString( peerHost, saLocalSocketAddr.getHostname( 0 ) ) ) && 2027 ( peerPort == saLocalSocketAddr.getPort( ) )); 2028 } 2029 2030 2031 CPPUNIT_TEST_SUITE( getPeer ); 2032 CPPUNIT_TEST( getPeer_001 ); 2033 CPPUNIT_TEST_SUITE_END(); 2034 2035 }; // class getPeer 2036 2037 2038 /** testing the methods: 2039 inline sal_Bool SAL_CALL bind(const SocketAddr& LocalInterface); 2040 */ 2041 2042 2043 class bind : public CppUnit::TestFixture 2044 { 2045 public: 2046 oslSocket sHandle; 2047 // initialization 2048 void setUp( ) 2049 { 2050 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2051 } 2052 2053 void tearDown( ) 2054 { 2055 sHandle = NULL; 2056 } 2057 2058 2059 void bind_001() 2060 { 2061 ::osl::Socket sSocket(sHandle); 2062 //bind must use local IP address ---mindyliu 2063 ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_MYPORT5 ); 2064 2065 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 2066 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 2067 CPPUNIT_ASSERT_MESSAGE( "Socket bind fail.", sal_True == bOK1 ); 2068 2069 sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname( ) ) ; 2070 2071 sSocket.close(); 2072 CPPUNIT_ASSERT_MESSAGE( "test for bind function: bind a valid address.", sal_True == bOK2 ); 2073 } 2074 2075 void bind_002() 2076 { 2077 ::osl::Socket sSocket(sHandle); 2078 ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_NETBIOS ); 2079 ::osl::SocketAddr saLocalSocketAddr; 2080 2081 sSocket.setOption( osl_Socket_OptionReuseAddr, 1); // sal_True); 2082 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 2083 sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ; 2084 2085 CPPUNIT_ASSERT_MESSAGE( "test for bind function: bind a valid address.", 2086 ( sal_False == bOK1 ) && ( sal_False == bOK2 ) ); 2087 } 2088 2089 CPPUNIT_TEST_SUITE( bind ); 2090 CPPUNIT_TEST( bind_001 ); 2091 CPPUNIT_TEST( bind_002 ); 2092 CPPUNIT_TEST_SUITE_END(); 2093 2094 }; // class bind 2095 2096 2097 /** testing the methods: 2098 inline sal_Bool SAL_CALL isRecvReady(const TimeValue *pTimeout = 0) const; 2099 2100 */ 2101 class isRecvReady : public CppUnit::TestFixture 2102 { 2103 public: 2104 oslSocket sHandle; 2105 TimeValue *pTimeout; 2106 ::osl::AcceptorSocket asAcceptorSocket; 2107 ::osl::ConnectorSocket csConnectorSocket; 2108 2109 2110 // initialization 2111 void setUp( ) 2112 { 2113 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 2114 pTimeout->Seconds = 3; 2115 pTimeout->Nanosec = 0; 2116 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2117 } 2118 2119 void tearDown( ) 2120 { 2121 free( pTimeout ); 2122 sHandle = NULL; 2123 asAcceptorSocket.close( ); 2124 csConnectorSocket.close( ); 2125 } 2126 2127 2128 void isRecvReady_001() 2129 { 2130 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT1 ); 2131 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT1 ); 2132 ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP ); 2133 ::osl::StreamSocket ssConnection; 2134 /// launch server socket 2135 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True); 2136 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 2137 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 2138 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 2139 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 2140 asAcceptorSocket.enableNonBlockingMode( sal_True ); 2141 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 2142 2143 /// launch client socket 2144 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 2145 2146 /// is receive ready? 2147 sal_Bool bOK3 = asAcceptorSocket.isRecvReady( pTimeout ); 2148 2149 CPPUNIT_ASSERT_MESSAGE( "test for isRecvReady function: setup a connection and then check if it can transmit data.", 2150 ( sal_True == bOK3 ) ); 2151 } 2152 2153 2154 CPPUNIT_TEST_SUITE( isRecvReady ); 2155 CPPUNIT_TEST( isRecvReady_001 ); 2156 CPPUNIT_TEST_SUITE_END(); 2157 2158 }; // class isRecvReady 2159 2160 2161 /** testing the methods: 2162 inline sal_Bool SAL_CALL isSendReady(const TimeValue *pTimeout = 0) const; 2163 */ 2164 class isSendReady : public CppUnit::TestFixture 2165 { 2166 public: 2167 oslSocket sHandle; 2168 TimeValue *pTimeout; 2169 ::osl::AcceptorSocket asAcceptorSocket; 2170 ::osl::ConnectorSocket csConnectorSocket; 2171 2172 2173 // initialization 2174 void setUp( ) 2175 { 2176 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 2177 pTimeout->Seconds = 3; 2178 pTimeout->Nanosec = 0; 2179 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2180 } 2181 2182 void tearDown( ) 2183 { 2184 free( pTimeout ); 2185 sHandle = NULL; 2186 asAcceptorSocket.close( ); 2187 csConnectorSocket.close( ); 2188 } 2189 2190 2191 void isSendReady_001() 2192 { 2193 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT ); 2194 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT ); 2195 ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP ); 2196 ::osl::StreamSocket ssConnection; 2197 2198 /// launch server socket 2199 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 2200 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 2201 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 2202 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 2203 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 2204 asAcceptorSocket.enableNonBlockingMode( sal_True ); 2205 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 2206 2207 /// launch client socket 2208 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 2209 2210 /// is send ready? 2211 sal_Bool bOK3 = csConnectorSocket.isSendReady( pTimeout ); 2212 2213 CPPUNIT_ASSERT_MESSAGE( "test for isSendReady function: setup a connection and then check if it can transmit data.", 2214 ( sal_True == bOK3 ) ); 2215 } 2216 2217 2218 CPPUNIT_TEST_SUITE( isSendReady ); 2219 CPPUNIT_TEST( isSendReady_001 ); 2220 CPPUNIT_TEST_SUITE_END(); 2221 2222 }; // class isSendReady 2223 2224 2225 /** testing the methods: 2226 inline oslSocketType SAL_CALL getType() const; 2227 2228 */ 2229 2230 class getType : public CppUnit::TestFixture 2231 { 2232 public: 2233 oslSocket sHandle; 2234 // initialization 2235 void setUp( ) 2236 { 2237 2238 } 2239 2240 void tearDown( ) 2241 { 2242 sHandle = NULL; 2243 } 2244 2245 2246 void getType_001() 2247 { 2248 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2249 ::osl::Socket sSocket(sHandle); 2250 2251 CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.", 2252 osl_Socket_TypeStream == sSocket.getType( ) ); 2253 } 2254 2255 void getType_002() 2256 { 2257 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 2258 ::osl::Socket sSocket(sHandle); 2259 2260 CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.", 2261 osl_Socket_TypeDgram == sSocket.getType( ) ); 2262 } 2263 2264 #ifdef UNX 2265 // mindy: since on LINUX and SOLARIS, Raw type socket can not be created, so do not test getType() here 2266 // mindy: and add one test case to test creating Raw type socket--> ctors_TypeRaw() 2267 void getType_003() 2268 { 2269 CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.this is not passed in (LINUX, SOLARIS), the osl_Socket_TypeRaw, type socket can not be created.", 2270 sal_True); 2271 } 2272 #else 2273 void getType_003() 2274 { 2275 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp ); 2276 ::osl::Socket sSocket(sHandle); 2277 2278 CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.", 2279 osl_Socket_TypeRaw == sSocket.getType( ) ); 2280 } 2281 #endif 2282 2283 CPPUNIT_TEST_SUITE( getType ); 2284 CPPUNIT_TEST( getType_001 ); 2285 CPPUNIT_TEST( getType_002 ); 2286 CPPUNIT_TEST( getType_003 ); 2287 CPPUNIT_TEST_SUITE_END(); 2288 2289 }; // class getType 2290 2291 2292 2293 /** testing the methods: 2294 inline sal_Int32 SAL_CALL getOption( 2295 oslSocketOption Option, 2296 void* pBuffer, 2297 sal_uInt32 BufferLen, 2298 oslSocketOptionLevel Level= osl_Socket_LevelSocket) const; 2299 2300 inline sal_Int32 getOption( oslSocketOption option ) const; 2301 2302 */ 2303 2304 class getOption : public CppUnit::TestFixture 2305 { 2306 public: 2307 oslSocket sHandle; 2308 // initialization 2309 void setUp( ) 2310 { 2311 2312 } 2313 2314 void tearDown( ) 2315 { 2316 sHandle = NULL; 2317 } 2318 2319 /** test writer's comment: 2320 2321 in oslSocketOption, the osl_Socket_OptionType denote 1 as osl_Socket_TypeStream. 2322 2 as osl_Socket_TypeDgram, etc which is not mapping the oslSocketType enum. differ 2323 in 1. 2324 */ 2325 2326 void getOption_001() 2327 { 2328 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2329 ::osl::Socket sSocket(sHandle); 2330 sal_Int32 * pType = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) ); 2331 *pType = 0; 2332 sSocket.getOption( osl_Socket_OptionType, pType, sizeof ( sal_Int32 ) ); 2333 sal_Bool bOK = ( SOCK_STREAM == *pType ); 2334 // there is a TypeMap(socket.c) which map osl_Socket_TypeStream to SOCK_STREAM on UNX, and SOCK_STREAM != osl_Socket_TypeStream 2335 //sal_Bool bOK = ( TYPE_TO_NATIVE(osl_Socket_TypeStream) == *pType ); 2336 free( pType ); 2337 2338 CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get type option of socket.", 2339 sal_True == bOK ); 2340 } 2341 2342 // getsockopt error 2343 void getOption_004() 2344 { 2345 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 2346 ::osl::Socket sSocket(sHandle); 2347 2348 sal_Bool * pbDontRoute = ( sal_Bool * )malloc( sizeof ( sal_Bool ) ); 2349 sal_Int32 nRes = sSocket.getOption( osl_Socket_OptionInvalid, pbDontRoute, sizeof ( sal_Bool ) ); 2350 free( pbDontRoute ); 2351 2352 CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get invalid option of socket, should return -1.", 2353 nRes == -1 ); 2354 } 2355 2356 void getOption_simple_001() 2357 { 2358 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 2359 ::osl::Socket sSocket(sHandle); 2360 2361 sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDontRoute ) ); 2362 2363 CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get debug option of socket.", 2364 sal_True == bOK ); 2365 } 2366 2367 void getOption_simple_002() 2368 { 2369 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 2370 ::osl::Socket sSocket(sHandle); 2371 2372 sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDebug ) ); 2373 2374 CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get debug option of socket.", 2375 sal_True == bOK ); 2376 } 2377 2378 CPPUNIT_TEST_SUITE( getOption ); 2379 CPPUNIT_TEST( getOption_001 ); 2380 CPPUNIT_TEST( getOption_004 ); 2381 CPPUNIT_TEST( getOption_simple_001 ); 2382 CPPUNIT_TEST( getOption_simple_002 ); 2383 CPPUNIT_TEST_SUITE_END(); 2384 2385 }; // class getOption 2386 2387 2388 /** testing the methods: 2389 inline sal_Bool SAL_CALL setOption( oslSocketOption Option, 2390 void* pBuffer, 2391 sal_uInt32 BufferLen, 2392 oslSocketOptionLevel Level= osl_Socket_LevelSocket ) const; 2393 */ 2394 2395 class setOption : public CppUnit::TestFixture 2396 { 2397 public: 2398 TimeValue *pTimeout; 2399 // LLA: maybe there is an error in the source, 2400 // as long as I remember, if a derived class do not overload all ctors there is a problem. 2401 2402 ::osl::AcceptorSocket asAcceptorSocket; 2403 2404 void setUp( ) 2405 { 2406 2407 } 2408 2409 void tearDown( ) 2410 { 2411 asAcceptorSocket.close( ); 2412 } 2413 2414 2415 // LLA: 2416 // getSocketOption returns BufferLen, or -1 if something failed 2417 2418 // setSocketOption returns sal_True, if option could stored 2419 // else sal_False 2420 2421 void setOption_001() 2422 { 2423 /// set and get option. 2424 int nBufferLen = sizeof ( sal_Int32); 2425 // LLA: SO_DONTROUTE expect an integer boolean, what ever it is, it's not sal_Bool! 2426 2427 sal_Int32 * pbDontRouteSet = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) ); 2428 *pbDontRouteSet = 1; // sal_True; 2429 2430 sal_Int32 * pGetBuffer = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) ); 2431 *pGetBuffer = 0; 2432 2433 // maybe asAcceptorSocket is not right initialized 2434 sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, nBufferLen ); 2435 CPPUNIT_ASSERT_MESSAGE( "setOption function failed.", ( sal_True == b1 ) ); 2436 sal_Int32 n2 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen ); 2437 CPPUNIT_ASSERT_MESSAGE( "getOption function failed.", ( n2 == nBufferLen ) ); 2438 2439 // on Linux, the value of option is 1, on Solaris, it's 16, but it's not important the exact value, 2440 // just judge it is zero or not! 2441 sal_Bool bOK = ( 0 != *pGetBuffer ); 2442 t_print("#setOption_001: getOption is %d \n", *pGetBuffer); 2443 2444 // toggle check, set to 0 2445 *pbDontRouteSet = 0; 2446 2447 sal_Bool b3 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, sizeof ( sal_Int32 ) ); 2448 CPPUNIT_ASSERT_MESSAGE( "setOption function failed.", ( sal_True == b3 ) ); 2449 sal_Int32 n4 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen ); 2450 CPPUNIT_ASSERT_MESSAGE( "getOption (DONTROUTE) function failed.", ( n4 == nBufferLen ) ); 2451 2452 sal_Bool bOK2 = ( 0 == *pGetBuffer ); 2453 2454 t_print("#setOption_001: getOption is %d \n", *pGetBuffer); 2455 2456 // LLA: sal_Bool * pbDontTouteSet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) ); 2457 // LLA: *pbDontTouteSet = sal_True; 2458 // LLA: sal_Bool * pbDontTouteGet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) ); 2459 // LLA: *pbDontTouteGet = sal_False; 2460 // LLA: asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontTouteSet, sizeof ( sal_Bool ) ); 2461 // LLA: asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pbDontTouteGet, sizeof ( sal_Bool ) ); 2462 // LLA: ::rtl::OUString suError = outputError(::rtl::OUString::valueOf((sal_Int32)*pbDontTouteGet), 2463 // LLA: ::rtl::OUString::valueOf((sal_Int32)*pbDontTouteSet), 2464 // LLA: "test for setOption function: set osl_Socket_OptionDontRoute and then check"); 2465 // LLA: 2466 // LLA: sal_Bool bOK = ( sal_True == *pbDontTouteGet ); 2467 // LLA: free( pbDontTouteSet ); 2468 // LLA: free( pbDontTouteGet ); 2469 2470 CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.", 2471 ( sal_True == bOK ) && (sal_True == bOK2) ); 2472 2473 free( pbDontRouteSet ); 2474 free( pGetBuffer ); 2475 // LLA: CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK ); 2476 } 2477 2478 void setOption_002() 2479 { 2480 /// set and get option. 2481 2482 // sal_Int32 * pbLingerSet = ( sal_Int32 * )malloc( nBufferLen ); 2483 // *pbLingerSet = 7; 2484 // sal_Int32 * pbLingerGet = ( sal_Int32 * )malloc( nBufferLen ); 2485 /* struct */linger aLingerSet; 2486 sal_Int32 nBufferLen = sizeof( struct linger ); 2487 aLingerSet.l_onoff = 1; 2488 aLingerSet.l_linger = 7; 2489 2490 linger aLingerGet; 2491 2492 asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen ); 2493 2494 sal_Int32 n1 = asAcceptorSocket.getOption( osl_Socket_OptionLinger, &aLingerGet, nBufferLen ); 2495 CPPUNIT_ASSERT_MESSAGE( "getOption (SO_LINGER) function failed.", ( n1 == nBufferLen ) ); 2496 2497 //t_print("#setOption_002: getOption is %d \n", aLingerGet.l_linger); 2498 sal_Bool bOK = ( 7 == aLingerGet.l_linger ); 2499 CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check. ", 2500 sal_True == bOK ); 2501 2502 } 2503 2504 void setOption_003() 2505 { 2506 linger aLingerSet; 2507 aLingerSet.l_onoff = 1; 2508 aLingerSet.l_linger = 7; 2509 2510 sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, 0 ); 2511 printUString( asAcceptorSocket.getErrorAsString() ); 2512 CPPUNIT_ASSERT_MESSAGE( "setOption (SO_LINGER) function failed for optlen is 0.", 2513 ( b1 == sal_False ) ); 2514 } 2515 2516 void setOption_simple_001() 2517 { 2518 /// set and get option. 2519 asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, 1 ); //sal_True ); 2520 sal_Bool bOK = ( 0 != asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) ); 2521 2522 t_print("setOption_simple_001(): getoption is %d \n", asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) ); 2523 CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.", 2524 ( sal_True == bOK ) ); 2525 } 2526 2527 void setOption_simple_002() 2528 { 2529 /// set and get option. 2530 // LLA: this does not work, due to the fact that SO_LINGER is a structure 2531 // LLA: asAcceptorSocket.setOption( osl_Socket_OptionLinger, 7 ); 2532 // LLA: sal_Bool bOK = ( 7 == asAcceptorSocket.getOption( osl_Socket_OptionLinger ) ); 2533 2534 // LLA: CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.", 2535 // LLA: ( sal_True == bOK ) ); 2536 } 2537 2538 CPPUNIT_TEST_SUITE( setOption ); 2539 CPPUNIT_TEST( setOption_001 ); 2540 CPPUNIT_TEST( setOption_002 ); 2541 CPPUNIT_TEST( setOption_003 ); 2542 CPPUNIT_TEST( setOption_simple_001 ); 2543 // LLA: CPPUNIT_TEST( setOption_simple_002 ); 2544 CPPUNIT_TEST_SUITE_END(); 2545 2546 }; // class setOption 2547 2548 2549 2550 /** testing the method: 2551 inline sal_Bool SAL_CALL enableNonBlockingMode( sal_Bool bNonBlockingMode); 2552 */ 2553 class enableNonBlockingMode : public CppUnit::TestFixture 2554 { 2555 public: 2556 ::osl::AcceptorSocket asAcceptorSocket; 2557 2558 void enableNonBlockingMode_001() 2559 { 2560 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT ); 2561 ::osl::StreamSocket ssConnection; 2562 2563 /// launch server socket 2564 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 2565 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 2566 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 2567 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 2568 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 2569 asAcceptorSocket.enableNonBlockingMode( sal_True ); 2570 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 2571 2572 /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default. 2573 sal_Bool bOK = sal_True; 2574 asAcceptorSocket.close( ); 2575 2576 CPPUNIT_ASSERT_MESSAGE( "test for enableNonBlockingMode function: launch a server socket and make it non blocking. if it can pass the acceptConnection statement, it is non-blocking", 2577 ( sal_True == bOK ) ); 2578 } 2579 2580 2581 CPPUNIT_TEST_SUITE( enableNonBlockingMode ); 2582 CPPUNIT_TEST( enableNonBlockingMode_001 ); 2583 CPPUNIT_TEST_SUITE_END(); 2584 2585 }; // class enableNonBlockingMode 2586 2587 2588 /** testing the method: 2589 inline sal_Bool SAL_CALL isNonBlockingMode() const; 2590 */ 2591 class isNonBlockingMode : public CppUnit::TestFixture 2592 { 2593 public: 2594 ::osl::AcceptorSocket asAcceptorSocket; 2595 2596 void isNonBlockingMode_001() 2597 { 2598 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT ); 2599 ::osl::StreamSocket ssConnection; 2600 2601 /// launch server socket 2602 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True); 2603 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 2604 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 2605 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 2606 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 2607 2608 sal_Bool bOK3 = asAcceptorSocket.isNonBlockingMode( ); 2609 asAcceptorSocket.enableNonBlockingMode( sal_True ); 2610 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 2611 2612 /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default. 2613 sal_Bool bOK4 = asAcceptorSocket.isNonBlockingMode( ); 2614 asAcceptorSocket.close( ); 2615 2616 CPPUNIT_ASSERT_MESSAGE( "test for isNonBlockingMode function: launch a server socket and make it non blocking. it is expected to change from blocking mode to non-blocking mode.", 2617 ( sal_False == bOK3 ) && ( sal_True == bOK4 ) ); 2618 } 2619 2620 2621 CPPUNIT_TEST_SUITE( isNonBlockingMode ); 2622 CPPUNIT_TEST( isNonBlockingMode_001 ); 2623 CPPUNIT_TEST_SUITE_END(); 2624 2625 }; // class isNonBlockingMode 2626 2627 /** testing the method: 2628 inline void SAL_CALL clearError() const; 2629 */ 2630 class clearError : public CppUnit::TestFixture 2631 { 2632 public: 2633 oslSocket sHandle; 2634 // initialization 2635 void setUp( ) 2636 { 2637 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2638 } 2639 2640 void tearDown( ) 2641 { 2642 sHandle = NULL; 2643 } 2644 2645 2646 void clearError_001() 2647 { 2648 ::osl::Socket sSocket(sHandle); 2649 ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_HTTP2 ); 2650 ::osl::SocketAddr saLocalSocketAddr; 2651 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 2652 sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail" 2653 oslSocketError seBind = sSocket.getError( ); 2654 sSocket.clearError( ); 2655 2656 CPPUNIT_ASSERT_MESSAGE( "test for clearError function: trick an error called sSocket.getError( ), and then clear the error states, check the result.", 2657 osl_Socket_E_None == sSocket.getError( ) && seBind != osl_Socket_E_None ); 2658 } 2659 2660 2661 CPPUNIT_TEST_SUITE( clearError ); 2662 CPPUNIT_TEST( clearError_001 ); 2663 CPPUNIT_TEST_SUITE_END(); 2664 2665 }; // class clearError 2666 2667 2668 /** testing the methods: 2669 inline oslSocketError getError() const; 2670 inline ::rtl::OUString getErrorAsString( ) const; 2671 */ 2672 class getError : public CppUnit::TestFixture 2673 { 2674 public: 2675 oslSocket sHandle; 2676 // initialization 2677 void setUp( ) 2678 { 2679 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2680 } 2681 2682 void tearDown( ) 2683 { 2684 sHandle = NULL; 2685 } 2686 2687 2688 void getError_001() 2689 { 2690 ::osl::Socket sSocket(sHandle); 2691 ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_FTP ); 2692 ::osl::SocketAddr saLocalSocketAddr; 2693 2694 CPPUNIT_ASSERT_MESSAGE( "test for getError function: should get no error.", 2695 osl_Socket_E_None == sSocket.getError( ) ); 2696 } 2697 2698 void getError_002() 2699 { 2700 ::osl::Socket sSocket(sHandle); 2701 ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_FTP ); 2702 ::osl::SocketAddr saLocalSocketAddr; 2703 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 2704 sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail" 2705 //on Solaris, the error no is EACCES, but it has no mapped value, so getError() returned osl_Socket_E_InvalidError. 2706 #if defined(SOLARIS) 2707 CPPUNIT_ASSERT_MESSAGE( "trick an error called sSocket.getError( ), check the getError result.Failed on Solaris, returned osl_Socket_E_InvalidError because no entry to map the errno EACCES. ", 2708 osl_Socket_E_InvalidError == sSocket.getError( ) ); 2709 #else 2710 //while on Linux & Win32, the errno is EADDRNOTAVAIL, getError returned osl_Socket_E_AddrNotAvail. 2711 2712 CPPUNIT_ASSERT_MESSAGE( "trick an error called sSocket.getError( ), check the getError result.Failed on Solaris, returned osl_Socket_E_InvalidError because no entry to map the errno EACCES. Passed on Linux & Win32", 2713 osl_Socket_E_AddrNotAvail == sSocket.getError( ) ); 2714 #endif 2715 } 2716 2717 CPPUNIT_TEST_SUITE( getError ); 2718 CPPUNIT_TEST( getError_001 ); 2719 CPPUNIT_TEST( getError_002 ); 2720 CPPUNIT_TEST_SUITE_END(); 2721 2722 }; // class getError 2723 2724 2725 2726 /** testing the methods: 2727 inline oslSocket getHandle() const; 2728 */ 2729 2730 class getHandle : public CppUnit::TestFixture 2731 { 2732 public: 2733 oslSocket sHandle; 2734 // initialization 2735 void setUp( ) 2736 { 2737 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2738 } 2739 2740 void tearDown( ) 2741 { 2742 sHandle = NULL; 2743 } 2744 2745 void getHandle_001() 2746 { 2747 ::osl::Socket sSocket(sHandle); 2748 ::osl::Socket assignSocket = sSocket.getHandle(); 2749 2750 CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment_handle function: test the assignment operator.", 2751 osl_Socket_TypeStream == assignSocket.getType( ) ); 2752 } 2753 2754 void getHandle_002() 2755 { 2756 ::osl::Socket sSocket( sHandle ); 2757 ::osl::Socket assignSocket ( sSocket.getHandle( ) ); 2758 2759 CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment function: assignment operator", 2760 osl_Socket_TypeStream == assignSocket.getType( ) ); 2761 } 2762 2763 CPPUNIT_TEST_SUITE( getHandle ); 2764 CPPUNIT_TEST( getHandle_001 ); 2765 CPPUNIT_TEST( getHandle_002 ); 2766 CPPUNIT_TEST_SUITE_END(); 2767 2768 }; // class getHandle 2769 2770 2771 // ----------------------------------------------------------------------------- 2772 2773 2774 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::ctors, "osl_Socket"); 2775 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::operators, "osl_Socket"); 2776 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::close, "osl_Socket"); 2777 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalAddr, "osl_Socket"); 2778 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalPort, "osl_Socket"); 2779 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalHost, "osl_Socket"); 2780 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getPeer, "osl_Socket"); 2781 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::bind, "osl_Socket"); 2782 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isRecvReady, "osl_Socket"); 2783 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isSendReady, "osl_Socket"); 2784 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getType, "osl_Socket"); 2785 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getOption, "osl_Socket"); 2786 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::setOption, "osl_Socket"); 2787 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::enableNonBlockingMode, "osl_Socket"); 2788 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isNonBlockingMode, "osl_Socket"); 2789 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::clearError, "osl_Socket"); 2790 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getError, "osl_Socket"); 2791 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getHandle, "osl_Socket"); 2792 2793 } // namespace osl_Socket 2794 2795 2796 2797 namespace osl_StreamSocket 2798 { 2799 2800 /** testing the methods: 2801 inline StreamSocket(oslAddrFamily Family = osl_Socket_FamilyInet, 2802 oslProtocol Protocol = osl_Socket_ProtocolIp, 2803 oslSocketType Type = osl_Socket_TypeStream); 2804 2805 inline StreamSocket( const StreamSocket & ); 2806 2807 inline StreamSocket( oslSocket Socket , __sal_NoAcquire noacquire ); 2808 2809 inline StreamSocket( oslSocket Socket ); 2810 */ 2811 2812 class ctors : public CppUnit::TestFixture 2813 { 2814 public: 2815 oslSocket sHandle; 2816 // initialization 2817 void setUp( ) 2818 { 2819 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 2820 } 2821 2822 void tearDown( ) 2823 { 2824 sHandle = NULL; 2825 } 2826 2827 2828 void ctors_none() 2829 { 2830 /// Socket constructor. 2831 ::osl::StreamSocket ssSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 2832 2833 CPPUNIT_ASSERT_MESSAGE( "test for ctors_none constructor function: check if the stream socket was created successfully.", 2834 osl_Socket_TypeStream == ssSocket.getType( ) ); 2835 } 2836 2837 void ctors_acquire() 2838 { 2839 /// Socket constructor. 2840 ::osl::StreamSocket ssSocket( sHandle ); 2841 2842 CPPUNIT_ASSERT_MESSAGE( "test for ctors_acquire constructor function: check if the socket was created successfully", 2843 osl_Socket_TypeStream == ssSocket.getType( ) ); 2844 } 2845 2846 void ctors_no_acquire() 2847 { 2848 /// Socket constructor. 2849 ::osl::StreamSocket ssSocket( sHandle, SAL_NO_ACQUIRE ); 2850 2851 CPPUNIT_ASSERT_MESSAGE(" test for ctors_no_acquire constructor function: check if the socket was created successfully", 2852 osl_Socket_TypeStream == ssSocket.getType( ) ); 2853 } 2854 2855 void ctors_copy_ctor() 2856 { 2857 /// Socket constructor. 2858 ::osl::StreamSocket ssSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 2859 /// Socket copy constructor. 2860 ::osl::StreamSocket copySocket( ssSocket ); 2861 2862 CPPUNIT_ASSERT_MESSAGE(" test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor", 2863 osl_Socket_TypeStream == copySocket.getType( ) ); 2864 } 2865 2866 CPPUNIT_TEST_SUITE( ctors ); 2867 CPPUNIT_TEST( ctors_none ); 2868 CPPUNIT_TEST( ctors_acquire ); 2869 CPPUNIT_TEST( ctors_no_acquire ); 2870 CPPUNIT_TEST( ctors_copy_ctor ); 2871 CPPUNIT_TEST_SUITE_END(); 2872 2873 }; // class ctors 2874 2875 class send_recv: public CppUnit::TestFixture 2876 { 2877 public: 2878 // initialization 2879 void setUp( ) 2880 { 2881 } 2882 2883 void tearDown( ) 2884 { 2885 2886 } 2887 2888 void send_recv1() 2889 { 2890 //client sent two strings, and server received, check the order and value 2891 ServerSocketThread myServerThread; 2892 ClientSocketThread myClientThread; 2893 myServerThread.create( ); 2894 myClientThread.create( ); 2895 2896 //wait until the thread terminate 2897 myClientThread.join( ); 2898 myServerThread.join( ); 2899 sal_Char myStr[30] = ""; 2900 strcat( myStr, pTestString1 ); 2901 strcat( myStr, pTestString2 ); 2902 sal_Int32 nRes = strcmp( myServerThread.pReadBuffer, myStr ); 2903 CPPUNIT_ASSERT_MESSAGE(" test for send/recv with two threads: launch Server/Client threads, send data from client, check received data in Server thread.", 2904 nRes == 0 ); 2905 } 2906 2907 // error when recv 2908 void send_recv2() 2909 { 2910 ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 2911 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9 ); 2912 ::osl::StreamSocket ssStreamConnection; 2913 sal_Char pReadBuffer[30] = ""; 2914 2915 ClientSocketThread myClientThread; 2916 myClientThread.create( ); 2917 2918 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); 2919 2920 asAcceptorSocket.bind( saLocalSocketAddr ); 2921 asAcceptorSocket.listen( 1 ); 2922 asAcceptorSocket.enableNonBlockingMode( sal_True ); 2923 asAcceptorSocket.acceptConnection( ssStreamConnection ); 2924 sal_Int32 nReadNumber = ssStreamConnection.recv( pReadBuffer, 11 ); 2925 2926 myClientThread.join( ) ; 2927 ssStreamConnection.close(); 2928 asAcceptorSocket.close(); 2929 CPPUNIT_ASSERT_MESSAGE(" test for send/recv, recv error!", nReadNumber == -1 ); 2930 } 2931 2932 void write_read(sal_Int32 _nBufferSize, int _nValue) 2933 { 2934 //client sent two strings, and server received, check the order and value 2935 WriteSocketThread myServerThread(_nBufferSize, _nValue); 2936 ReadSocketThread myClientThread(_nBufferSize, _nValue); 2937 myServerThread.create( ); 2938 // thread_sleep( 1 ); 2939 myClientThread.create( ); 2940 2941 //wait until the thread terminate 2942 myClientThread.join( ); 2943 myServerThread.join( ); 2944 2945 //Maximum Packet Size is ( ARPANET, MILNET = 1007 Ethernet (10Mb) = 1500 2946 // Proteon PRONET = 2046), so here test read 4000 bytes 2947 sal_Int32 nLength = myClientThread.getCount(); 2948 bool bIsOk = myClientThread.isOk(); // check if the values are right. 2949 2950 t_print("Length:=%d\n", nLength); 2951 t_print(" bIsOk:=%d\n", bIsOk); 2952 2953 CPPUNIT_ASSERT_MESSAGE(" test for write/read values with two threads: send data from server, check readed data in client.", 2954 nLength == _nBufferSize && bIsOk == true); 2955 } 2956 2957 void write_read_001() 2958 { 2959 write_read(50, 10); 2960 } 2961 void write_read_002() 2962 { 2963 write_read(1024, 20); 2964 } 2965 void write_read_003() 2966 { 2967 write_read(4000, 1); 2968 } 2969 void write_read_004() 2970 { 2971 write_read(8192, 3); 2972 } 2973 2974 CPPUNIT_TEST_SUITE( send_recv ); 2975 CPPUNIT_TEST( write_read_001 ); 2976 CPPUNIT_TEST( write_read_002 ); 2977 CPPUNIT_TEST( write_read_003 ); 2978 CPPUNIT_TEST( write_read_004 ); 2979 CPPUNIT_TEST( send_recv1 ); 2980 CPPUNIT_TEST( send_recv2 ); 2981 // CPPUNIT_TEST( write_read ); 2982 CPPUNIT_TEST_SUITE_END(); 2983 }; // class send_recv 2984 2985 class SendClientThread : public ClientSocketThread 2986 { 2987 protected: 2988 2989 void SAL_CALL run( ) 2990 { 2991 TimeValue *pTimeout; 2992 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 2993 pTimeout->Seconds = 5; 2994 pTimeout->Nanosec = 0; 2995 2996 if ( osl_Socket_Ok == csConnectorSocket.connect( saTargetSocketAddr, pTimeout )) 2997 { 2998 sal_Int32 nWrite1 = csConnectorSocket.write( pTestString1, 11 ); // "test socket" 2999 3000 sal_Int32 nWrite2 = csConnectorSocket.write( pTestString2, strlen( pTestString2 ) + 1 ); 3001 thread_sleep( 2 ); 3002 csConnectorSocket.write( pTestString2, strlen( pTestString2 ) + 1 ); 3003 t_print("nWrite1 is %d, nWrite2 is %d\n", nWrite1, nWrite2 ); 3004 //thread_sleep( 1 ); 3005 } 3006 else 3007 t_print("# SendClientThread: connect failed! \n"); 3008 3009 csConnectorSocket.close(); 3010 free( pTimeout ); 3011 } 3012 3013 }; 3014 3015 class shutdown: public CppUnit::TestFixture 3016 { 3017 public: 3018 // initialization 3019 void setUp( ) 3020 { 3021 } 3022 3023 void tearDown( ) 3024 { 3025 3026 } 3027 3028 // similar to close_002 3029 void shutdown_001() 3030 { 3031 #if defined(LINUX) 3032 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3033 AcceptorThread myAcceptorThread( asSocket, aHostIp1 ); 3034 myAcceptorThread.create(); 3035 3036 thread_sleep( 1 ); 3037 3038 //when accepting, shutdown the socket, the thread will not block for accepting 3039 asSocket.shutdown(); 3040 myAcceptorThread.join(); 3041 3042 CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.", 3043 myAcceptorThread.isOK( ) == sal_True ); 3044 #endif 3045 } 3046 3047 void shutdown_002() 3048 { 3049 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3050 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9); 3051 asSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); 3052 CPPUNIT_ASSERT_MESSAGE("shutdown_002: bind fail", asSocket.bind( saLocalSocketAddr ) == sal_True); 3053 CPPUNIT_ASSERT_MESSAGE("shutdown_002: listen fail", asSocket.listen( 1 ) == sal_True ); 3054 sal_Char pReadBuffer[40]; 3055 SendClientThread mySendThread; 3056 mySendThread.create(); 3057 3058 asSocket.enableNonBlockingMode( sal_False ); 3059 ::osl::StreamSocket ssConnectionSocket; 3060 oslSocketResult eResult = asSocket.acceptConnection( ssConnectionSocket ); 3061 CPPUNIT_ASSERT_MESSAGE("shutdown_002: acceptConnection fail", eResult == osl_Socket_Ok ); 3062 3063 /* set socket option SO_LINGER 0, so close immediately */ 3064 linger aLingerSet; 3065 sal_Int32 nBufferLen = sizeof( struct linger ); 3066 aLingerSet.l_onoff = 0; 3067 aLingerSet.l_linger = 0; 3068 3069 ssConnectionSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen ); 3070 thread_sleep( 1 ); 3071 //sal_uInt32 nRecv1 = 0; 3072 sal_Int32 nRead1 = ssConnectionSocket.read( pReadBuffer, 11 ); 3073 3074 //shutdown read after client the first send complete 3075 ssConnectionSocket.shutdown( osl_Socket_DirRead ); 3076 3077 sal_Int32 nRead2 = ssConnectionSocket.read( pReadBuffer + nRead1, 12 ); 3078 sal_Int32 nRead3 = ssConnectionSocket.read( pReadBuffer + nRead1 + nRead2, 12 ); 3079 t_print("after read 2, nRead1 is %d, nRead2 is %d, nRead3 is %d \n", nRead1, nRead2, nRead3 ); 3080 mySendThread.join(); 3081 3082 ssConnectionSocket.close(); 3083 asSocket.close(); 3084 3085 /* on Linux, if send is before shutdown(DirRead), can read, nRecv2 still > 0, 3086 http://dbforums.com/arch/186/2002/12/586417 3087 While on Solaris, after shutdown(DirRead), all read will return 0 3088 */ 3089 #ifdef LINUX 3090 CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not read(recv).", 3091 nRead1 > 0 && nRead3 == 0 ); 3092 #else 3093 CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not read(recv).", 3094 nRead1 > 0 && nRead2 == 0 && nRead3 == 0 ); 3095 #endif 3096 3097 } 3098 3099 void shutdown_003() 3100 { 3101 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3102 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9); 3103 asSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); 3104 CPPUNIT_ASSERT_MESSAGE("shutdown_002: bind fail", asSocket.bind( saLocalSocketAddr ) == sal_True); 3105 CPPUNIT_ASSERT_MESSAGE("shutdown_002: listen fail", asSocket.listen( 1 ) == sal_True ); 3106 sal_Char pReadBuffer[40]; 3107 SendClientThread mySendThread; 3108 mySendThread.create(); 3109 3110 asSocket.enableNonBlockingMode( sal_False ); 3111 ::osl::StreamSocket ssConnectionSocket; 3112 oslSocketResult eResult = asSocket.acceptConnection( ssConnectionSocket ); 3113 CPPUNIT_ASSERT_MESSAGE("shutdown_002: acceptConnection fail", eResult == osl_Socket_Ok ); 3114 3115 thread_sleep( 1 ); 3116 //shutdown write after client the first send complete 3117 ssConnectionSocket.shutdown( osl_Socket_DirWrite ); 3118 3119 // recv should not shutdown 3120 sal_Int32 nRead1 = ssConnectionSocket.read( pReadBuffer, 11 ); 3121 3122 sal_Int32 nWrite = ssConnectionSocket.write( pReadBuffer, 11 ); 3123 // still can read 3124 sal_Int32 nRead3 = ssConnectionSocket.read( pReadBuffer + nRead1 , 12 ); 3125 t_print("after read 2, nRead1 is %d, nWrite is %d, nRead3 is %d\n", nRead1, nWrite, nRead3 ); 3126 mySendThread.join(); 3127 ssConnectionSocket.close(); 3128 asSocket.close(); 3129 3130 CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not send(write).", 3131 nRead1 > 0 && nWrite == 0 && nRead3 > 0); 3132 3133 } 3134 3135 CPPUNIT_TEST_SUITE( shutdown ); 3136 CPPUNIT_TEST( shutdown_001 ); 3137 CPPUNIT_TEST( shutdown_002 ); 3138 CPPUNIT_TEST( shutdown_003 ); 3139 CPPUNIT_TEST_SUITE_END(); 3140 }; // class shutdown 3141 3142 class isExceptionPending: public CppUnit::TestFixture 3143 { 3144 public: 3145 void isExPending_001() 3146 { 3147 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3148 TimeValue *pTimeout; 3149 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 3150 pTimeout->Seconds = 3; 3151 pTimeout->Nanosec = 0; 3152 sal_Bool bOk = asSocket.isExceptionPending( pTimeout ); 3153 free( pTimeout ); 3154 3155 CPPUNIT_ASSERT_MESSAGE( "test for isExceptionPending.", 3156 bOk == sal_False ); 3157 } 3158 3159 /**tester's comments: lack of a case that return sal_True, do not know when it will return sal_True*/ 3160 3161 3162 CPPUNIT_TEST_SUITE( isExceptionPending ); 3163 CPPUNIT_TEST( isExPending_001 ); 3164 CPPUNIT_TEST_SUITE_END(); 3165 }; // class isExceptionPending 3166 3167 // ----------------------------------------------------------------------------- 3168 3169 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::ctors, "osl_StreamSocket"); 3170 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::send_recv, "osl_StreamSocket"); 3171 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::shutdown, "osl_StreamSocket"); 3172 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::isExceptionPending, "osl_StreamSocket"); 3173 3174 } // namespace osl_StreamSocket 3175 3176 3177 namespace osl_ConnectorSocket 3178 { 3179 3180 /** testing the method: 3181 ConnectorSocket(oslAddrFamily Family = osl_Socket_FamilyInet, 3182 oslProtocol Protocol = osl_Socket_ProtocolIp, 3183 oslSocketType Type = osl_Socket_TypeStream); 3184 */ 3185 3186 class ctors : public CppUnit::TestFixture 3187 { 3188 public: 3189 void ctors_001() 3190 { 3191 /// Socket constructor. 3192 ::osl::ConnectorSocket csSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3193 3194 CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the connector socket was created successfully.", 3195 osl_Socket_TypeStream == csSocket.getType( ) ); 3196 } 3197 3198 CPPUNIT_TEST_SUITE( ctors ); 3199 CPPUNIT_TEST( ctors_001 ); 3200 CPPUNIT_TEST_SUITE_END(); 3201 3202 }; // class ctors 3203 3204 /** testing the method: 3205 oslSocketResult SAL_CALL connect(const SocketAddr& TargetHost, const TimeValue* pTimeout = 0); 3206 */ 3207 3208 class connect : public CppUnit::TestFixture 3209 { 3210 public: 3211 TimeValue *pTimeout; 3212 ::osl::AcceptorSocket asAcceptorSocket; 3213 ::osl::ConnectorSocket csConnectorSocket; 3214 3215 3216 // initialization 3217 void setUp( ) 3218 { 3219 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 3220 pTimeout->Seconds = 3; 3221 pTimeout->Nanosec = 0; 3222 // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 3223 } 3224 3225 void tearDown( ) 3226 { 3227 free( pTimeout ); 3228 // sHandle = NULL; 3229 asAcceptorSocket.close( ); 3230 csConnectorSocket.close( ); 3231 } 3232 3233 3234 void connect_001() 3235 { 3236 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT2 ); 3237 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT2 ); 3238 ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP ); 3239 ::osl::StreamSocket ssConnection; 3240 3241 /// launch server socket 3242 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 3243 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 3244 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 3245 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 3246 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 3247 3248 //asAcceptorSocket.enableNonBlockingMode( sal_True ); 3249 //oslSocketResult eResultAccept = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 3250 //CPPUNIT_ASSERT_MESSAGE( "accept failed.", osl_Socket_Ok == eResultAccept ); 3251 /// launch client socket 3252 oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 3253 CPPUNIT_ASSERT_MESSAGE( "connect failed.", osl_Socket_Ok == eResult ); 3254 3255 /// get peer information 3256 csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected. 3257 3258 CPPUNIT_ASSERT_MESSAGE( "test for connect function: try to create a connection with remote host. and check the setup address.", 3259 ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) && 3260 ( osl_Socket_Ok == eResult )); 3261 } 3262 //non-blocking mode connect? 3263 void connect_002() 3264 { 3265 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT3 ); 3266 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT3 ); 3267 ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP ); 3268 3269 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 3270 asAcceptorSocket.enableNonBlockingMode( sal_True ); 3271 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 3272 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 3273 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 3274 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 3275 3276 csConnectorSocket.enableNonBlockingMode( sal_True ); 3277 3278 oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 3279 CPPUNIT_ASSERT_MESSAGE( "connect failed.", osl_Socket_InProgress == eResult || osl_Socket_Ok == eResult ); 3280 3281 /// get peer information 3282 csConnectorSocket.getPeerAddr( saPeerSocketAddr ); 3283 3284 CPPUNIT_ASSERT_MESSAGE( "test for connect function: try to create a connection with remote host. and check the setup address.", 3285 sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) ; 3286 } 3287 // really an error or just delayed 3288 // how to design scenarios that will return osl_Socket_Interrupted, osl_Socket_TimedOut 3289 void connect_003() 3290 { 3291 ::osl::SocketAddr saTargetSocketAddr1( aHostIp1, IP_PORT_MYPORT3 ); 3292 ::osl::SocketAddr saTargetSocketAddr2( aHostIpInval1, IP_PORT_MYPORT3 ); 3293 3294 csConnectorSocket.enableNonBlockingMode( sal_False ); 3295 3296 oslSocketResult eResult1 = csConnectorSocket.connect( saTargetSocketAddr1, pTimeout ); 3297 oslSocketResult eResult2 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout ); 3298 CloseSocketThread myCloseThread( csConnectorSocket ); 3299 oslSocketResult eResult3 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout ); 3300 myCloseThread.join(); 3301 CPPUNIT_ASSERT_MESSAGE( "connect should failed.", osl_Socket_Error == eResult1 && 3302 osl_Socket_Error == eResult2 && osl_Socket_Error == eResult3 ); 3303 3304 } 3305 3306 // really an error in non-blocking mode 3307 void connect_004() 3308 { 3309 ::osl::SocketAddr saTargetSocketAddr( aHostIpInval1, IP_PORT_MYPORT3 ); 3310 3311 csConnectorSocket.enableNonBlockingMode( sal_True ); 3312 3313 oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 3314 CPPUNIT_ASSERT_MESSAGE( "connect should failed.", osl_Socket_Error == eResult ); 3315 } 3316 /** here need a case: immediate connection, say in non-blocking mode connect return osl_Socket_Ok 3317 */ 3318 3319 CPPUNIT_TEST_SUITE( connect ); 3320 CPPUNIT_TEST( connect_001 ); 3321 CPPUNIT_TEST( connect_002 ); 3322 CPPUNIT_TEST( connect_003 ); 3323 CPPUNIT_TEST( connect_004 ); 3324 CPPUNIT_TEST_SUITE_END(); 3325 3326 }; // class connect 3327 3328 3329 // ----------------------------------------------------------------------------- 3330 3331 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ConnectorSocket::ctors, "osl_ConnectorSocket"); 3332 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ConnectorSocket::connect, "osl_ConnectorSocket"); 3333 3334 } // namespace osl_ConnectorSocket 3335 3336 3337 3338 namespace osl_AcceptorSocket 3339 { 3340 3341 /** testing the methods: 3342 inline AcceptorSocket(oslAddrFamily Family = osl_Socket_FamilyInet, 3343 oslProtocol Protocol = osl_Socket_ProtocolIp, 3344 oslSocketType Type = osl_Socket_TypeStream); 3345 */ 3346 3347 class ctors : public CppUnit::TestFixture 3348 { 3349 public: 3350 3351 void ctors_001() 3352 { 3353 /// Socket constructor. 3354 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3355 3356 CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the acceptor socket was created successfully.", 3357 osl_Socket_TypeStream == asSocket.getType( ) ); 3358 } 3359 3360 CPPUNIT_TEST_SUITE( ctors ); 3361 CPPUNIT_TEST( ctors_001 ); 3362 CPPUNIT_TEST_SUITE_END(); 3363 3364 }; // class ctors 3365 3366 #if 0 3367 class operator_assign : public CppUnit::TestFixture 3368 { 3369 public: 3370 3371 void assign_001() 3372 { 3373 #if defined(LINUX) 3374 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3375 ::osl::AcceptorSocket asSocketAssign( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 3376 asSocket.setOption( osl_Socket_OptionReuseAddr, 1); 3377 ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_MYPORT4 ); 3378 asSocket.bind( saSocketAddr ); 3379 3380 AcceptorThread myAcceptorThread( asSocketAssign, aHostIp1 ); 3381 myAcceptorThread.create(); 3382 3383 thread_sleep( 1 ); 3384 //when accepting, assign another socket to the socket, the thread will not be closed, so is blocking 3385 asSocketAssign = asSocket; 3386 3387 t_print("#asSocketAssign port number is %d\n", asSocketAssign.getLocalPort() ); 3388 3389 asSocketAssign.shutdown(); 3390 myAcceptorThread.join(); 3391 3392 CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.", 3393 myAcceptorThread.isOK() == sal_True ); 3394 3395 3396 #endif /* LINUX */ 3397 } 3398 3399 3400 CPPUNIT_TEST_SUITE( operator_assign ); 3401 CPPUNIT_TEST( assign_001 ); 3402 CPPUNIT_TEST_SUITE_END(); 3403 3404 }; // class operator_assign 3405 #endif 3406 3407 /** testing the method: 3408 inline sal_Bool SAL_CALL listen(sal_Int32 MaxPendingConnections= -1); 3409 inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection); 3410 inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection, SocketAddr & PeerAddr); 3411 */ 3412 3413 class listen_accept : public CppUnit::TestFixture 3414 { 3415 public: 3416 TimeValue *pTimeout; 3417 ::osl::AcceptorSocket asAcceptorSocket; 3418 ::osl::ConnectorSocket csConnectorSocket; 3419 3420 3421 // initialization 3422 void setUp( ) 3423 { 3424 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 3425 pTimeout->Seconds = 3; 3426 pTimeout->Nanosec = 0; 3427 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1); 3428 // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 3429 } 3430 3431 void tearDown( ) 3432 { 3433 free( pTimeout ); 3434 // sHandle = NULL; 3435 asAcceptorSocket.close( ); 3436 csConnectorSocket.close( ); 3437 } 3438 3439 3440 void listen_accept_001() 3441 { 3442 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT3 ); 3443 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT3 ); 3444 ::osl::StreamSocket ssConnection; 3445 3446 /// launch server socket 3447 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 3448 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 3449 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 3450 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 3451 asAcceptorSocket.enableNonBlockingMode( sal_True ); 3452 3453 /// launch client socket 3454 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 3455 3456 oslSocketResult eResult = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 3457 3458 CPPUNIT_ASSERT_MESSAGE( "test for listen_accept function: try to create a connection with remote host, using listen and accept.", 3459 ( osl_Socket_Ok == eResult ) ); 3460 } 3461 3462 void listen_accept_002() 3463 { 3464 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT4 ); 3465 ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT4 ); 3466 ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP ); 3467 ::osl::StreamSocket ssConnection; 3468 3469 /// launch server socket 3470 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 3471 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 ); 3472 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 3473 CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 ); 3474 asAcceptorSocket.enableNonBlockingMode( sal_True ); 3475 3476 /// launch client socket 3477 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 3478 3479 oslSocketResult eResult = asAcceptorSocket.acceptConnection(ssConnection, saPeerSocketAddr); /// waiting for incoming connection... 3480 3481 CPPUNIT_ASSERT_MESSAGE( "test for listen_accept function: try to create a connection with remote host, using listen and accept, accept with peer address.", 3482 ( sal_True == bOK2 ) && 3483 ( osl_Socket_Ok == eResult ) && 3484 ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) ); 3485 } 3486 3487 void listen_accept_003() 3488 { 3489 3490 } 3491 3492 CPPUNIT_TEST_SUITE( listen_accept ); 3493 CPPUNIT_TEST( listen_accept_001 ); 3494 CPPUNIT_TEST( listen_accept_002 ); 3495 CPPUNIT_TEST_SUITE_END(); 3496 3497 }; // class listen_accept 3498 3499 3500 // ----------------------------------------------------------------------------- 3501 3502 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::ctors, "osl_AcceptorSocket"); 3503 //CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::operator_assign, "osl_AcceptorSocket"); 3504 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::listen_accept, "osl_AcceptorSocket"); 3505 3506 } // namespace osl_AcceptorSocket 3507 3508 3509 namespace osl_DatagramSocket 3510 { 3511 3512 /** testing the methods: 3513 inline DatagramSocket(oslAddrFamily Family= osl_Socket_FamilyInet, 3514 oslProtocol Protocol= osl_Socket_ProtocolIp, 3515 oslSocketType Type= osl_Socket_TypeDgram); 3516 */ 3517 3518 class ctors : public CppUnit::TestFixture 3519 { 3520 public: 3521 3522 void ctors_001() 3523 { 3524 /// Socket constructor. 3525 ::osl::DatagramSocket dsSocket; 3526 3527 CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the datagram socket was created successfully.", 3528 osl_Socket_TypeDgram == dsSocket.getType( ) ); 3529 } 3530 3531 3532 CPPUNIT_TEST_SUITE( ctors ); 3533 CPPUNIT_TEST( ctors_001 ); 3534 CPPUNIT_TEST_SUITE_END(); 3535 3536 }; // class ctors 3537 3538 /**thread do sendTo, refer to http://www.coding-zone.co.uk/cpp/articles/140101networkprogrammingv.shtml 3539 */ 3540 class TalkerThread : public Thread 3541 { 3542 protected: 3543 ::osl::SocketAddr saTargetSocketAddr; 3544 ::osl::DatagramSocket dsSocket; 3545 3546 void SAL_CALL run( ) 3547 { 3548 dsSocket.sendTo( saTargetSocketAddr, pTestString1, strlen( pTestString1 ) + 1 ); // "test socket" 3549 dsSocket.shutdown(); 3550 } 3551 3552 void SAL_CALL onTerminated( ) 3553 { 3554 } 3555 3556 public: 3557 TalkerThread( ): 3558 saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT9 ) 3559 { 3560 } 3561 3562 ~TalkerThread( ) 3563 { 3564 if ( isRunning( ) ) 3565 t_print("# error: TalkerThread not terminated normally.\n" ); 3566 } 3567 }; 3568 3569 /**thread do listen, refer to http://www.coding-zone.co.uk/cpp/articles/140101networkprogrammingv.shtml 3570 */ 3571 class ListenerThread : public Thread 3572 { 3573 protected: 3574 ::osl::SocketAddr saTargetSocketAddr; 3575 ::osl::DatagramSocket dsSocket; 3576 3577 void SAL_CALL run( ) 3578 { 3579 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT10 ); 3580 dsSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); 3581 if ( dsSocket.bind( saLocalSocketAddr ) == sal_False ) 3582 { 3583 t_print("DatagramSocket bind failed \n"); 3584 return; 3585 } 3586 //blocking mode: default 3587 sal_Int32 nRecv = dsSocket.recvFrom( pRecvBuffer, 30, &saTargetSocketAddr); //strlen( pTestString2 ) + 1 3588 t_print("After recvFrom, nRecv is %d\n", nRecv); 3589 } 3590 3591 void SAL_CALL onTerminated( ) 3592 { 3593 } 3594 3595 public: 3596 sal_Char pRecvBuffer[30]; 3597 ListenerThread( ): 3598 saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT10 ) 3599 { 3600 pRecvBuffer[0] = '\0'; 3601 } 3602 3603 ~ListenerThread( ) 3604 { 3605 if ( isRunning( ) ) 3606 t_print("# error: ListenerThread not terminated normally.\n" ); 3607 } 3608 3609 }; 3610 3611 /** testing the methods: 3612 inline sal_Int32 DatagramSocket::recvFrom(void* pBuffer, sal_uInt32 BufferSize, 3613 SocketAddr* pSenderAddr, oslSocketMsgFlag Flag ) 3614 inline sal_Int32 DatagramSocket::sendTo( const SocketAddr& ReceiverAddr, 3615 const void* pBuffer, sal_uInt32 BufferSize, oslSocketMsgFlag Flag ) 3616 */ 3617 3618 class sendTo_recvFrom : public CppUnit::TestFixture 3619 { 3620 public: 3621 3622 void sr_001() 3623 { 3624 ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9 ); 3625 ::osl::DatagramSocket dsSocket; 3626 dsSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); 3627 dsSocket.bind( saLocalSocketAddr ); 3628 3629 sal_Char pReadBuffer[30]; 3630 TalkerThread myTalkThread; 3631 myTalkThread.create(); 3632 sal_Int32 nRecv = dsSocket.recvFrom( pReadBuffer, 30, &saLocalSocketAddr); 3633 myTalkThread.join(); 3634 //t_print("#received buffer is %s# \n", pReadBuffer); 3635 3636 sal_Bool bOk = ( strcmp(pReadBuffer, pTestString1) == 0 ); 3637 3638 CPPUNIT_ASSERT_MESSAGE( "test for sendTo/recvFrom function: create a talker thread and recvFrom in the main thread, check if the datagram socket can communicate successfully.", 3639 nRecv > 0 && bOk == sal_True ); 3640 } 3641 3642 void sr_002() 3643 { 3644 ::osl::SocketAddr saListenSocketAddr( aHostIp1, IP_PORT_MYPORT10 ); 3645 ::osl::DatagramSocket dsSocket; 3646 3647 //listener thread construct a DatagramSocket, recvFrom waiting for data, then main thread sendto data 3648 ListenerThread myListenThread; 3649 myListenThread.create(); 3650 //to grantee the recvFrom is before sendTo 3651 thread_sleep( 1 ); 3652 3653 sal_Int32 nSend = dsSocket.sendTo( saListenSocketAddr, pTestString2, strlen( pTestString2 ) + 1 ); 3654 3655 CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo failed: nSend <= 0.", nSend > 0); 3656 3657 myListenThread.join(); 3658 //t_print("#received buffer is %s# \n", myListenThread.pRecvBuffer); 3659 3660 sal_Bool bOk = ( strcmp( myListenThread.pRecvBuffer, pTestString2) == 0 ); 3661 3662 CPPUNIT_ASSERT_MESSAGE( "test for sendTo/recvFrom function: create a listener thread and sendTo in the main thread, check if the datagram socket can communicate successfully.", 3663 bOk == sal_True ); 3664 } 3665 3666 //sendTo error, return -1; recvFrom error, return -1 3667 void sr_003() 3668 { 3669 ::osl::SocketAddr saListenSocketAddr( aHostIpInval1, IP_PORT_MYPORT10 ); 3670 ::osl::DatagramSocket dsSocket; 3671 // Transport endpoint is not connected 3672 sal_Int32 nSend = dsSocket.sendTo( saListenSocketAddr, pTestString2, strlen( pTestString2 ) + 1 ); 3673 CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo should fail: nSend <= 0.", 3674 nSend == -1 ); 3675 } 3676 3677 void sr_004() 3678 { 3679 ::osl::SocketAddr saListenSocketAddr1( aHostIpInval1, IP_PORT_MYPORT10 ); 3680 ::osl::SocketAddr saListenSocketAddr2( aHostIp2, IP_PORT_MYPORT10 ); 3681 ::osl::DatagramSocket dsSocket; 3682 3683 dsSocket.enableNonBlockingMode( sal_True ); 3684 3685 sal_Char pReadBuffer[30]; 3686 //sal_Int32 nRecv1 = dsSocket.recvFrom( pReadBuffer, 30, &saListenSocketAddr1 ); 3687 3688 // will block ? 3689 CloseSocketThread myThread( dsSocket ); 3690 myThread.create(); 3691 sal_Int32 nRecv2 = dsSocket.recvFrom( pReadBuffer, 30, &saListenSocketAddr1 ); 3692 myThread.join(); 3693 //t_print("#nRecv1 is %d nRecv2 is %d\n", nRecv1, nRecv2 ); 3694 CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo should fail: nSend <= 0.", 3695 nRecv2 == -1 ); 3696 } 3697 3698 CPPUNIT_TEST_SUITE( sendTo_recvFrom ); 3699 CPPUNIT_TEST( sr_001 ); 3700 CPPUNIT_TEST( sr_002 ); 3701 CPPUNIT_TEST( sr_003 ); 3702 CPPUNIT_TEST( sr_004 ); 3703 CPPUNIT_TEST_SUITE_END(); 3704 3705 }; // class sendTo_recvFrom 3706 3707 // ----------------------------------------------------------------------------- 3708 3709 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DatagramSocket::ctors, "osl_DatagramSocket"); 3710 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DatagramSocket::sendTo_recvFrom, "osl_DatagramSocket"); 3711 3712 } // namespace osl_DatagramSocket 3713 3714 3715 // ----------------------------------------------------------------------------- 3716 3717 // this macro creates an empty function, which will called by the RegisterAllFunctions() 3718 // to let the user the possibility to also register some functions by hand. 3719 NOADDITIONAL; 3720