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 // include files 55 //------------------------------------------------------------------------ 56 57 #include "gtest/gtest.h" 58 59 //#include "osl_Socket_Const.h" 60 #include "sockethelper.hxx" 61 62 using namespace osl; 63 using namespace rtl; 64 65 #define IP_PORT_FTP 21 66 #define IP_PORT_TELNET 23 67 #define IP_PORT_HTTP2 8080 68 #define IP_PORT_INVAL 99999 69 #define IP_PORT_POP3 110 70 #define IP_PORT_NETBIOS 139 71 #define IP_PORT_MYPORT 8881 72 #define IP_PORT_MYPORT1 8882 73 #define IP_PORT_MYPORT5 8886 74 #define IP_PORT_MYPORT6 8887 75 #define IP_PORT_MYPORT7 8895 76 #define IP_PORT_MYPORT8 8896 77 #define IP_PORT_MYPORT9 8897 78 79 //------------------------------------------------------------------------ 80 // helper functions 81 //------------------------------------------------------------------------ 82 83 // just used to test socket::close() when accepting 84 class AcceptorThread : public Thread 85 { 86 ::osl::AcceptorSocket asAcceptorSocket; 87 ::rtl::OUString aHostIP; 88 sal_Bool bOK; 89 protected: 90 void SAL_CALL run( ) 91 { 92 ::osl::SocketAddr saLocalSocketAddr( aHostIP, IP_PORT_MYPORT9 ); 93 ::osl::StreamSocket ssStreamConnection; 94 95 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True); 96 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 97 if ( sal_True != bOK1 ) 98 { 99 printf("# AcceptorSocket bind address failed.\n" ) ; 100 return; 101 } 102 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 103 if ( sal_True != bOK2 ) 104 { 105 printf("# AcceptorSocket listen address failed.\n" ) ; 106 return; 107 } 108 109 asAcceptorSocket.enableNonBlockingMode( sal_False ); 110 111 oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection ); 112 if (eResult != osl_Socket_Ok ) 113 { 114 bOK = sal_True; 115 printf("AcceptorThread: acceptConnection failed! \n"); 116 } 117 } 118 public: 119 AcceptorThread(::osl::AcceptorSocket & asSocket, ::rtl::OUString const& aBindIP ) 120 : asAcceptorSocket( asSocket ), aHostIP( aBindIP ) 121 { 122 bOK = sal_False; 123 } 124 125 sal_Bool isOK() { return bOK; } 126 127 ~AcceptorThread( ) 128 { 129 if ( isRunning( ) ) 130 { 131 asAcceptorSocket.shutdown(); 132 printf("# error: Acceptor thread not terminated.\n" ); 133 } 134 } 135 }; 136 137 namespace osl_Socket 138 { 139 140 /** testing the methods: 141 inline Socket( ); 142 inline Socket( const Socket & socket ); 143 inline Socket( oslSocket socketHandle ); 144 inline Socket( oslSocket socketHandle, __sal_NoAcquire noacquire ); 145 */ 146 147 /** test writer's comment: 148 149 class Socket can not be initialized by its protected constructor, though the protected 150 constructor is the most convenient way to create a new socket. 151 it only allow the method of C function osl_createSocket like: 152 ::osl::Socket sSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, 153 osl_Socket_ProtocolIp ) ); 154 the use of C method lost some of the transparent of tester using C++ wrapper. 155 */ 156 157 158 class ctors : public ::testing::Test 159 { 160 public: 161 oslSocket sHandle; 162 // initialization 163 void SetUp( ) 164 { 165 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 166 } 167 168 void TearDown( ) 169 { 170 sHandle = NULL; 171 } 172 }; // class ctors 173 174 TEST_F(ctors, ctors_none) 175 { 176 /// Socket constructor. 177 // ::osl::Socket sSocket(); 178 179 ASSERT_TRUE(1 == 1) << "test for ctors_none constructor function: check if the socket was created successfully, if no exception occurred"; 180 } 181 182 TEST_F(ctors, ctors_acquire) 183 { 184 /// Socket constructor. 185 ::osl::Socket sSocket( sHandle ); 186 187 ASSERT_TRUE(osl_Socket_TypeStream == sSocket.getType( )) << "test for ctors_acquire constructor function: check if the socket was created successfully"; 188 } 189 190 TEST_F(ctors, ctors_no_acquire) 191 { 192 /// Socket constructor. 193 ::osl::Socket sSocket( sHandle, SAL_NO_ACQUIRE ); 194 195 ASSERT_TRUE(osl_Socket_TypeStream == sSocket.getType( )) << " test for ctors_no_acquire constructor function: check if the socket was created successfully"; 196 } 197 198 TEST_F(ctors, ctors_copy_ctor) 199 { 200 ::osl::Socket sSocket( sHandle ); 201 /// Socket copy constructor. 202 ::osl::Socket copySocket( sSocket ); 203 204 ASSERT_TRUE(osl_Socket_TypeStream == copySocket.getType( )) << " test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor"; 205 } 206 207 TEST_F(ctors, ctors_TypeRaw) 208 { 209 #ifdef WNT 210 oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp ); 211 // LLA: ? ::osl::Socket sSocket( sHandleRaw ); 212 ASSERT_TRUE(sHandleRaw != NULL) << " type osl_Socket_TypeRaw socket create failed on UNX "; 213 #else 214 oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp ); 215 ASSERT_TRUE(sHandleRaw == NULL) << " can't create socket with type osl_Socket_TypeRaw within UNX is ok."; 216 #endif 217 } 218 219 TEST_F(ctors, ctors_family_Ipx) 220 { 221 oslSocket sHandleIpx = osl_createSocket( osl_Socket_FamilyIpx, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 222 ASSERT_TRUE(sHandleIpx != NULL) << " family osl_Socket_FamilyIpx socket create failed! "; 223 ::osl::Socket sSocket( sHandleIpx ); //, SAL_NO_ACQUIRE ); 224 printf("#Type is %d \n", sSocket.getType( ) ); 225 226 ASSERT_TRUE(osl_Socket_TypeStream == sSocket.getType( )) << " test for create new Socket instance that family is osl_Socket_FamilyIpx"; 227 } 228 229 /** testing the methods: 230 inline Socket& SAL_CALL operator= ( oslSocket socketHandle); 231 inline Socket& SAL_CALL operator= (const Socket& sock); 232 inline sal_Bool SAL_CALL operator==( const Socket& rSocket ) const ; 233 inline sal_Bool SAL_CALL operator==( const oslSocket socketHandle ) const; 234 */ 235 236 class operators : public ::testing::Test 237 { 238 public: 239 oslSocket sHandle; 240 // initialization 241 void SetUp( ) 242 { 243 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 244 } 245 246 void TearDown( ) 247 { 248 sHandle = NULL; 249 } 250 }; // class operators 251 252 /** test writer's comment: 253 254 the assignment operator does not support direct assinment like: 255 ::osl::Socket sSocket = sHandle. 256 */ 257 TEST_F(operators, operators_assignment_handle) 258 { 259 ::osl::Socket sSocket(sHandle); 260 ::osl::Socket assignSocket = sSocket.getHandle(); 261 262 ASSERT_TRUE(osl_Socket_TypeStream == assignSocket.getType( )) << "test for operators_assignment_handle function: test the assignment operator."; 263 } 264 265 TEST_F(operators, operators_assignment) 266 { 267 ::osl::Socket sSocket( sHandle ); 268 ::osl::Socket assignSocket = sSocket; 269 270 ASSERT_TRUE(osl_Socket_TypeStream == assignSocket.getType( )) << "test for operators_assignment function: assignment operator"; 271 } 272 273 TEST_F(operators, operators_equal_handle_001) 274 { 275 /// Socket constructor. 276 ::osl::Socket sSocket( sHandle ); 277 ::osl::Socket equalSocket = sSocket; 278 279 ASSERT_TRUE(equalSocket == sHandle) << " test for operators_equal_handle_001 function: check equal."; 280 } 281 282 TEST_F(operators, operators_equal_handle_002) 283 { 284 /// Socket constructor. 285 ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) ); 286 287 ASSERT_TRUE(!( equalSocket == sHandle )) << " test for operators_equal_handle_001 function: check unequal."; 288 } 289 290 TEST_F(operators, operators_equal_001) 291 { 292 ::osl::Socket sSocket( sHandle ); 293 /// Socket copy constructor. 294 ::osl::Socket equalSocket( sSocket ); 295 296 ASSERT_TRUE(equalSocket == sSocket) << " test for operators_equal function: check equal."; 297 } 298 299 TEST_F(operators, operators_equal_002) 300 { 301 ::osl::Socket sSocket( sHandle ); 302 /// Socket copy constructor. 303 ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) ); 304 305 ASSERT_TRUE(!( equalSocket == sSocket )) << " test for operators_equal_002 function: check unequal."; 306 } 307 308 /** testing the methods: 309 inline void SAL_CALL shutdown( oslSocketDirection Direction = osl_Socket_DirReadWrite ); 310 inline void SAL_CALL close(); 311 */ 312 313 class close : public ::testing::Test 314 { 315 public: 316 oslSocket sHandle; 317 // initialization 318 void SetUp( ) 319 { 320 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 321 } 322 323 void TearDown( ) 324 { 325 sHandle = NULL; 326 } 327 }; // class close 328 329 TEST_F(close, close_001) 330 { 331 ::osl::Socket sSocket(sHandle); 332 sSocket.close(); 333 334 ASSERT_TRUE(sSocket.getHandle() == sHandle) << "test for close_001 function: this function is reserved for test."; 335 } 336 337 TEST_F(close, close_002) 338 { 339 // This blocks forever on FreeBSD 340 #if defined(LINUX) 341 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 342 AcceptorThread myAcceptorThread( asSocket, rtl::OUString::createFromAscii("127.0.0.1") ); 343 myAcceptorThread.create(); 344 345 thread_sleep( 1 ); 346 //when accepting, close the socket, the thread will not block for accepting 347 //man close:Any locks held on the file it was associated with, and owned by the process, are removed 348 asSocket.close(); 349 //thread_sleep( 2 ); 350 myAcceptorThread.join(); 351 352 ASSERT_TRUE(myAcceptorThread.isOK() == sal_True) << "test for close when is accepting: the socket will quit accepting status."; 353 #endif 354 } 355 356 // to cover "if ( pSockAddrIn->sin_addr.s_addr == htonl(INADDR_ANY) )" in osl_closeSocket( ) 357 TEST_F(close, close_003) 358 { 359 // This blocks forever on FreeBSD 360 #if defined(LINUX) 361 ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); 362 AcceptorThread myAcceptorThread( asSocket, rtl::OUString::createFromAscii("0.0.0.0") ); 363 myAcceptorThread.create(); 364 365 thread_sleep( 1 ); 366 asSocket.close(); 367 myAcceptorThread.join(); 368 369 ASSERT_TRUE(myAcceptorThread.isOK() == sal_True) << "test for close when is accepting: the socket will quit accepting status."; 370 #endif 371 } 372 373 /** testing the method: 374 inline void SAL_CALL getLocalAddr( SocketAddr &Addr ) const; 375 */ 376 377 class getLocalAddr : public ::testing::Test 378 { 379 public: 380 oslSocket sHandle; 381 // initialization 382 void SetUp( ) 383 { 384 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 385 } 386 387 void TearDown( ) 388 { 389 sHandle = NULL; 390 } 391 }; // class getLocalAddr 392 393 // get the Address of the local end of the socket 394 TEST_F(getLocalAddr, getLocalAddr_001) 395 { 396 ::osl::Socket sSocket(sHandle); 397 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT8 ); 398 ::osl::SocketAddr saLocalSocketAddr; 399 400 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 401 402 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 403 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 404 ASSERT_TRUE(sal_True == bOK1) << suError1.pData; 405 406 sSocket.getLocalAddr( saLocalSocketAddr ); 407 408 sal_Bool bOK = compareUString( saLocalSocketAddr.getHostname( 0 ), sSocket.getLocalHost() ) ; 409 410 ASSERT_TRUE(sal_True == bOK) << "test for getLocalAddr function: first create a new socket, then a socket address, bind them, and check the address."; 411 } 412 413 /** testing the method: 414 inline sal_Int32 SAL_CALL getLocalPort() const; 415 */ 416 417 class getLocalPort : public ::testing::Test 418 { 419 public: 420 oslSocket sHandle; 421 // initialization 422 void SetUp( ) 423 { 424 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 425 } 426 427 void TearDown( ) 428 { 429 sHandle = NULL; 430 } 431 }; // class getLocalPort 432 433 TEST_F(getLocalPort, getLocalPort_001) 434 { 435 ::osl::Socket sSocket(sHandle); 436 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT7 ); // aHostIp1 localhost 437 ::osl::SocketAddr saLocalSocketAddr; 438 439 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 440 441 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 442 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 443 ASSERT_TRUE(sal_True == bOK1) << suError1.pData; 444 sal_Bool bOK = ( IP_PORT_MYPORT7 == sSocket.getLocalPort( ) ); 445 446 ASSERT_TRUE(sal_True == bOK) << "test for getLocalPort function: first create a new socket, then a socket address, bind them, and check the port."; 447 } 448 449 /** test writer's comment: 450 451 the invalid port number can not be set by giving invalid port number 452 such as 99999 or -1, it will convert to ( x mod 65535 ), so it will always be 453 valid, the only instance that the getLocalPort returns OSL_INVALID_PORT 454 is when saSocketAddr itself is an invalid one, that is , the IP or host name 455 can not be found, then the created socket address is not valid. 456 */ 457 TEST_F(getLocalPort, getLocalPort_002) 458 { 459 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_TELNET); 460 #ifdef WNT 461 ::osl::Socket sSocket(sHandle); 462 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True); 463 sSocket.bind( saBindSocketAddr ); 464 //Invalid IP, so bind should fail 465 ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )), 466 ::rtl::OUString::valueOf((sal_Int32)OSL_INVALID_PORT), 467 "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned."); 468 sal_Bool bOK = ( OSL_INVALID_PORT == sSocket.getLocalPort( ) ); 469 (void)bOK; 470 #else 471 //on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT 472 ::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"); 473 #endif 474 ASSERT_TRUE(sal_False) << suError.pData; 475 476 } 477 478 TEST_F(getLocalPort, getLocalPort_003) 479 { 480 ::osl::Socket sSocket(sHandle); 481 ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_INVAL); 482 483 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 484 485 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 486 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 487 ASSERT_TRUE(sal_True == bOK1) << suError1.pData; 488 ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )), 489 ::rtl::OUString::createFromAscii("34463"), 490 "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned"); 491 sal_Bool bOK = ( sSocket.getLocalPort( ) >= 1 && sSocket.getLocalPort( ) <= 65535); 492 493 ASSERT_TRUE(sal_True == bOK) << suError.pData; 494 } 495 496 /** testing the method: 497 inline ::rtl::OUString SAL_CALL getLocalHost() const; 498 499 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; 500 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 501 will return hostname of current processor such as "aegean.PRC.Sun.COM" 502 */ 503 504 class getLocalHost : public ::testing::Test 505 { 506 public: 507 oslSocket sHandle; 508 // initialization 509 void SetUp( ) 510 { 511 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 512 } 513 514 void TearDown( ) 515 { 516 sHandle = NULL; 517 } 518 }; // class getLocalHost 519 520 TEST_F(getLocalHost, getLocalHost_001) 521 { 522 ::osl::Socket sSocket(sHandle); 523 //port number from IP_PORT_HTTP1 to IP_PORT_MYPORT6, mindyliu 524 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT6 ); 525 526 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 527 528 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 529 ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString(); 530 ASSERT_TRUE(sal_True == bOK1) << suError1.pData; 531 sal_Bool bOK; 532 ::rtl::OUString suError; 533 #ifdef WNT 534 bOK = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ; 535 suError = outputError(sSocket.getLocalHost( ), getThisHostname( ), 536 "test for getLocalHost function: create localhost socket and check name"); 537 #else 538 ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) "localhost" ); 539 sal_Bool bRes1, bRes2; 540 bRes1 = compareUString( sSocket.getLocalHost( ), aUString ) ; 541 bRes2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname(0) ) ; 542 bOK = bRes1 || bRes2; 543 suError = outputError(sSocket.getLocalHost( ), aUString, "test for getLocalHost function: create localhost socket and check name"); 544 #endif 545 ASSERT_TRUE(sal_True == bOK) << suError.pData; 546 } 547 548 TEST_F(getLocalHost, getLocalHost_002) 549 { 550 ::osl::Socket sSocket(sHandle); 551 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_POP3); 552 ::osl::SocketAddr saLocalSocketAddr; 553 554 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 555 sSocket.bind( saBindSocketAddr ); 556 //Invalid IP, so bind should fail 557 sal_Bool bOK = compareUString( sSocket.getLocalHost( ), rtl::OUString::createFromAscii("") ) ; 558 ::rtl::OUString suError = outputError(sSocket.getLocalHost( ), rtl::OUString::createFromAscii(""), "test for getLocalHost function: getLocalHost with invalid SocketAddr"); 559 560 ASSERT_TRUE(sal_True == bOK) << suError.pData; 561 } 562 563 /** testing the methods: 564 inline void SAL_CALL getPeerAddr( SocketAddr & Addr) const; 565 inline sal_Int32 SAL_CALL getPeerPort() const; 566 inline ::rtl::OUString SAL_CALL getPeerHost() const; 567 */ 568 class getPeer : public ::testing::Test 569 { 570 public: 571 oslSocket sHandle; 572 TimeValue *pTimeout; 573 ::osl::AcceptorSocket asAcceptorSocket; 574 ::osl::ConnectorSocket csConnectorSocket; 575 576 577 // initialization 578 void SetUp( ) 579 { 580 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 581 pTimeout->Seconds = 3; 582 pTimeout->Nanosec = 0; 583 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 584 } 585 586 void TearDown( ) 587 { 588 free( pTimeout ); 589 sHandle = NULL; 590 asAcceptorSocket.close( ); 591 csConnectorSocket.close( ); 592 } 593 }; // class getPeer 594 595 TEST_F(getPeer, getPeer_001) 596 { 597 ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT ); 598 ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT ); 599 ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP ); 600 ::osl::StreamSocket ssConnection; 601 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 602 /// launch server socket 603 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 604 ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind '127.0.0.1' address failed."; 605 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 606 ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; 607 608 asAcceptorSocket.enableNonBlockingMode( sal_True ); 609 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 610 611 /// launch client socket 612 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 613 614 /// get peer information 615 csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected. 616 sal_Int32 peerPort = csConnectorSocket.getPeerPort( ); 617 ::rtl::OUString peerHost = csConnectorSocket.getPeerHost( ); 618 619 ASSERT_TRUE(( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) )&& 620 ( sal_True == compareUString( peerHost, saLocalSocketAddr.getHostname( 0 ) ) ) && 621 ( peerPort == saLocalSocketAddr.getPort( ) )) << "test for getPeer function: setup a connection and then get the peer address, port and host from client side."; 622 } 623 624 /** testing the methods: 625 inline sal_Bool SAL_CALL bind(const SocketAddr& LocalInterface); 626 */ 627 628 629 class bind : public ::testing::Test 630 { 631 public: 632 oslSocket sHandle; 633 // initialization 634 void SetUp( ) 635 { 636 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 637 } 638 639 void TearDown( ) 640 { 641 sHandle = NULL; 642 } 643 }; // class bind 644 645 TEST_F(bind, bind_001) 646 { 647 ::osl::Socket sSocket(sHandle); 648 //bind must use local IP address ---mindyliu 649 ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_MYPORT5 ); 650 651 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 652 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 653 ASSERT_TRUE(sal_True == bOK1) << "Socket bind fail."; 654 655 sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname( ) ) ; 656 657 sSocket.close(); 658 ASSERT_TRUE(sal_True == bOK2) << "test for bind function: bind a valid address."; 659 } 660 661 TEST_F(bind, bind_002) 662 { 663 ::osl::Socket sSocket(sHandle); 664 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_NETBIOS ); 665 ::osl::SocketAddr saLocalSocketAddr; 666 667 sSocket.setOption( osl_Socket_OptionReuseAddr, 1); // sal_True); 668 sal_Bool bOK1 = sSocket.bind( saBindSocketAddr ); 669 sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ; 670 671 ASSERT_TRUE(( sal_False == bOK1 ) && ( sal_False == bOK2 )) << "test for bind function: bind a valid address."; 672 } 673 674 /** testing the methods: 675 inline sal_Bool SAL_CALL isRecvReady(const TimeValue *pTimeout = 0) const; 676 677 */ 678 class isRecvReady : public ::testing::Test 679 { 680 public: 681 oslSocket sHandle; 682 TimeValue *pTimeout; 683 ::osl::AcceptorSocket asAcceptorSocket; 684 ::osl::ConnectorSocket csConnectorSocket; 685 686 687 // initialization 688 void SetUp( ) 689 { 690 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 691 pTimeout->Seconds = 3; 692 pTimeout->Nanosec = 0; 693 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 694 } 695 696 void TearDown( ) 697 { 698 free( pTimeout ); 699 sHandle = NULL; 700 asAcceptorSocket.close( ); 701 csConnectorSocket.close( ); 702 } 703 }; // class isRecvReady 704 705 TEST_F(isRecvReady, isRecvReady_001) 706 { 707 ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT1 ); 708 ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT1 ); 709 ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP ); 710 ::osl::StreamSocket ssConnection; 711 /// launch server socket 712 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True); 713 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 714 ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind address failed."; 715 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 716 ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; 717 asAcceptorSocket.enableNonBlockingMode( sal_True ); 718 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 719 720 /// launch client socket 721 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 722 723 /// is receive ready? 724 sal_Bool bOK3 = asAcceptorSocket.isRecvReady( pTimeout ); 725 726 ASSERT_TRUE(( sal_True == bOK3 )) << "test for isRecvReady function: setup a connection and then check if it can transmit data."; 727 } 728 729 /** testing the methods: 730 inline sal_Bool SAL_CALL isSendReady(const TimeValue *pTimeout = 0) const; 731 */ 732 class isSendReady : public ::testing::Test 733 { 734 public: 735 oslSocket sHandle; 736 TimeValue *pTimeout; 737 ::osl::AcceptorSocket asAcceptorSocket; 738 ::osl::ConnectorSocket csConnectorSocket; 739 740 741 // initialization 742 void SetUp( ) 743 { 744 pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); 745 pTimeout->Seconds = 3; 746 pTimeout->Nanosec = 0; 747 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 748 } 749 750 void TearDown( ) 751 { 752 free( pTimeout ); 753 sHandle = NULL; 754 asAcceptorSocket.close( ); 755 csConnectorSocket.close( ); 756 } 757 }; // class isSendReady 758 759 TEST_F(isSendReady, isSendReady_001) 760 { 761 ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT ); 762 ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT ); 763 ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP ); 764 ::osl::StreamSocket ssConnection; 765 766 /// launch server socket 767 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 768 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 769 ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind address failed."; 770 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 771 ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; 772 asAcceptorSocket.enableNonBlockingMode( sal_True ); 773 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 774 775 /// launch client socket 776 csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... 777 778 /// is send ready? 779 sal_Bool bOK3 = csConnectorSocket.isSendReady( pTimeout ); 780 781 ASSERT_TRUE(( sal_True == bOK3 )) << "test for isSendReady function: setup a connection and then check if it can transmit data."; 782 } 783 784 /** testing the methods: 785 inline oslSocketType SAL_CALL getType() const; 786 787 */ 788 789 class getType : public ::testing::Test 790 { 791 public: 792 oslSocket sHandle; 793 // initialization 794 void SetUp( ) 795 { 796 797 } 798 799 void TearDown( ) 800 { 801 sHandle = NULL; 802 } 803 }; // class getType 804 805 TEST_F(getType, getType_001) 806 { 807 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 808 ::osl::Socket sSocket(sHandle); 809 810 ASSERT_TRUE(osl_Socket_TypeStream == sSocket.getType( )) << "test for getType function: get type of socket."; 811 } 812 813 TEST_F(getType, getType_002) 814 { 815 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 816 ::osl::Socket sSocket(sHandle); 817 818 ASSERT_TRUE(osl_Socket_TypeDgram == sSocket.getType( )) << "test for getType function: get type of socket."; 819 } 820 821 #ifdef UNX 822 // mindy: since on LINUX and SOLARIS, Raw type socket can not be created, so do not test getType() here 823 // mindy: and add one test case to test creating Raw type socket--> ctors_TypeRaw() 824 TEST_F(getType, getType_003) 825 { 826 ASSERT_TRUE(sal_True) << "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."; 827 } 828 #else 829 TEST_F(getType, getType_003) 830 { 831 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp ); 832 ::osl::Socket sSocket(sHandle); 833 834 ASSERT_TRUE(osl_Socket_TypeRaw == sSocket.getType( )) << "test for getType function: get type of socket."; 835 } 836 #endif 837 838 839 /** testing the methods: 840 inline sal_Int32 SAL_CALL getOption( 841 oslSocketOption Option, 842 void* pBuffer, 843 sal_uInt32 BufferLen, 844 oslSocketOptionLevel Level= osl_Socket_LevelSocket) const; 845 846 inline sal_Int32 getOption( oslSocketOption option ) const; 847 848 */ 849 850 class getOption : public ::testing::Test 851 { 852 public: 853 oslSocket sHandle; 854 // initialization 855 void SetUp( ) 856 { 857 858 } 859 860 void TearDown( ) 861 { 862 sHandle = NULL; 863 } 864 }; // class getOption 865 866 867 /** test writer's comment: 868 869 in oslSocketOption, the osl_Socket_OptionType denote 1 as osl_Socket_TypeStream. 870 2 as osl_Socket_TypeDgram, etc which is not mapping the oslSocketType enum. differ 871 in 1. 872 */ 873 874 TEST_F(getOption, getOption_001) 875 { 876 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 877 ::osl::Socket sSocket(sHandle); 878 sal_Int32 * pType = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) ); 879 *pType = 0; 880 sSocket.getOption( osl_Socket_OptionType, pType, sizeof ( sal_Int32 ) ); 881 sal_Bool bOK = ( SOCK_STREAM == *pType ); 882 // there is a TypeMap(socket.c) which map osl_Socket_TypeStream to SOCK_STREAM on UNX, and SOCK_STREAM != osl_Socket_TypeStream 883 //sal_Bool bOK = ( TYPE_TO_NATIVE(osl_Socket_TypeStream) == *pType ); 884 free( pType ); 885 886 ASSERT_TRUE(sal_True == bOK) << "test for getOption function: get type option of socket."; 887 } 888 889 // getsockopt error 890 TEST_F(getOption, getOption_004) 891 { 892 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 893 ::osl::Socket sSocket(sHandle); 894 895 sal_Bool * pbDontRoute = ( sal_Bool * )malloc( sizeof ( sal_Bool ) ); 896 sal_Int32 nRes = sSocket.getOption( osl_Socket_OptionInvalid, pbDontRoute, sizeof ( sal_Bool ) ); 897 free( pbDontRoute ); 898 899 ASSERT_TRUE(nRes == -1) << "test for getOption function: get invalid option of socket, should return -1."; 900 } 901 902 TEST_F(getOption, getOption_simple_001) 903 { 904 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 905 ::osl::Socket sSocket(sHandle); 906 907 sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDontRoute ) ); 908 909 ASSERT_TRUE(sal_True == bOK) << "test for getOption function: get debug option of socket."; 910 } 911 912 TEST_F(getOption, getOption_simple_002) 913 { 914 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ); 915 ::osl::Socket sSocket(sHandle); 916 917 sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDebug ) ); 918 919 ASSERT_TRUE(sal_True == bOK) << "test for getOption function: get debug option of socket."; 920 } 921 922 /** testing the methods: 923 inline sal_Bool SAL_CALL setOption( oslSocketOption Option, 924 void* pBuffer, 925 sal_uInt32 BufferLen, 926 oslSocketOptionLevel Level= osl_Socket_LevelSocket ) const; 927 */ 928 929 class setOption : public ::testing::Test 930 { 931 public: 932 TimeValue *pTimeout; 933 // LLA: maybe there is an error in the source, 934 // as long as I remember, if a derived class do not overload all ctors there is a problem. 935 936 ::osl::AcceptorSocket asAcceptorSocket; 937 938 void SetUp( ) 939 { 940 941 } 942 943 void TearDown( ) 944 { 945 asAcceptorSocket.close( ); 946 } 947 }; // class setOption 948 949 // LLA: 950 // getSocketOption returns BufferLen, or -1 if something failed 951 952 // setSocketOption returns sal_True, if option could stored 953 // else sal_False 954 955 TEST_F(setOption, setOption_001) 956 { 957 /// set and get option. 958 int nBufferLen = sizeof ( sal_Int32); 959 // LLA: SO_DONTROUTE expect an integer boolean, what ever it is, it's not sal_Bool! 960 961 sal_Int32 * pbDontRouteSet = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) ); 962 *pbDontRouteSet = 1; // sal_True; 963 964 sal_Int32 * pGetBuffer = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) ); 965 *pGetBuffer = 0; 966 967 // maybe asAcceptorSocket is not right initialized 968 sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, nBufferLen ); 969 ASSERT_TRUE(( sal_True == b1 )) << "setOption function failed."; 970 sal_Int32 n2 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen ); 971 ASSERT_TRUE(( n2 == nBufferLen )) << "getOption function failed."; 972 973 // on Linux, the value of option is 1, on Solaris, it's 16, but it's not important the exact value, 974 // just judge it is zero or not! 975 sal_Bool bOK = ( 0 != *pGetBuffer ); 976 printf("#setOption_001: getOption is %d \n", *pGetBuffer); 977 978 // toggle check, set to 0 979 *pbDontRouteSet = 0; 980 981 sal_Bool b3 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, sizeof ( sal_Int32 ) ); 982 ASSERT_TRUE(( sal_True == b3 )) << "setOption function failed."; 983 sal_Int32 n4 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen ); 984 ASSERT_TRUE(( n4 == nBufferLen )) << "getOption (DONTROUTE) function failed."; 985 986 sal_Bool bOK2 = ( 0 == *pGetBuffer ); 987 988 printf("#setOption_001: getOption is %d \n", *pGetBuffer); 989 990 // LLA: sal_Bool * pbDontTouteSet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) ); 991 // LLA: *pbDontTouteSet = sal_True; 992 // LLA: sal_Bool * pbDontTouteGet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) ); 993 // LLA: *pbDontTouteGet = sal_False; 994 // LLA: asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontTouteSet, sizeof ( sal_Bool ) ); 995 // LLA: asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pbDontTouteGet, sizeof ( sal_Bool ) ); 996 // LLA: ::rtl::OUString suError = outputError(::rtl::OUString::valueOf((sal_Int32)*pbDontTouteGet), 997 // LLA: ::rtl::OUString::valueOf((sal_Int32)*pbDontTouteSet), 998 // LLA: "test for setOption function: set osl_Socket_OptionDontRoute and then check"); 999 // LLA: 1000 // LLA: sal_Bool bOK = ( sal_True == *pbDontTouteGet ); 1001 // LLA: free( pbDontTouteSet ); 1002 // LLA: free( pbDontTouteGet ); 1003 1004 ASSERT_TRUE(( sal_True == bOK ) && (sal_True == bOK2)) << "test for setOption function: set option of a socket and then check."; 1005 1006 free( pbDontRouteSet ); 1007 free( pGetBuffer ); 1008 // LLA: ASSERT_TRUE(sal_True == bOK) << suError; 1009 } 1010 1011 TEST_F(setOption, setOption_002) 1012 { 1013 /// set and get option. 1014 1015 // sal_Int32 * pbLingerSet = ( sal_Int32 * )malloc( nBufferLen ); 1016 // *pbLingerSet = 7; 1017 // sal_Int32 * pbLingerGet = ( sal_Int32 * )malloc( nBufferLen ); 1018 /* struct */linger aLingerSet; 1019 sal_Int32 nBufferLen = sizeof( struct linger ); 1020 aLingerSet.l_onoff = 1; 1021 aLingerSet.l_linger = 7; 1022 1023 linger aLingerGet; 1024 1025 asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen ); 1026 1027 sal_Int32 n1 = asAcceptorSocket.getOption( osl_Socket_OptionLinger, &aLingerGet, nBufferLen ); 1028 ASSERT_TRUE(( n1 == nBufferLen )) << "getOption (SO_LINGER) function failed."; 1029 1030 //printf("#setOption_002: getOption is %d \n", aLingerGet.l_linger); 1031 sal_Bool bOK = ( 7 == aLingerGet.l_linger ); 1032 ASSERT_TRUE(sal_True == bOK) << "test for setOption function: set option of a socket and then check. "; 1033 1034 } 1035 1036 TEST_F(setOption, setOption_003) 1037 { 1038 linger aLingerSet; 1039 aLingerSet.l_onoff = 1; 1040 aLingerSet.l_linger = 7; 1041 1042 sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, 0 ); 1043 printUString( asAcceptorSocket.getErrorAsString( ) ); 1044 ASSERT_TRUE(( b1 == sal_False )) << "setOption (SO_LINGER) function failed for optlen is 0."; 1045 } 1046 1047 TEST_F(setOption, setOption_simple_001) 1048 { 1049 /// set and get option. 1050 asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, 1 ); //sal_True ); 1051 sal_Bool bOK = ( 0 != asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) ); 1052 1053 printf("setOption_simple_001(): getoption is %d \n", asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) ); 1054 ASSERT_TRUE(( sal_True == bOK )) << "test for setOption function: set option of a socket and then check."; 1055 } 1056 1057 TEST_F(setOption, setOption_simple_002) 1058 { 1059 /// set and get option. 1060 // LLA: this does not work, due to the fact that SO_LINGER is a structure 1061 // LLA: asAcceptorSocket.setOption( osl_Socket_OptionLinger, 7 ); 1062 // LLA: sal_Bool bOK = ( 7 == asAcceptorSocket.getOption( osl_Socket_OptionLinger ) ); 1063 1064 // LLA: ASSERT_TRUE(// LLA: ( sal_True == bOK )) << "test for setOption function: set option of a socket and then check."; 1065 } 1066 1067 1068 /** testing the method: 1069 inline sal_Bool SAL_CALL enableNonBlockingMode( sal_Bool bNonBlockingMode); 1070 */ 1071 class enableNonBlockingMode : public ::testing::Test 1072 { 1073 public: 1074 ::osl::AcceptorSocket asAcceptorSocket; 1075 }; // class enableNonBlockingMode 1076 1077 TEST_F(enableNonBlockingMode, enableNonBlockingMode_001) 1078 { 1079 ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT ); 1080 ::osl::StreamSocket ssConnection; 1081 1082 /// launch server socket 1083 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1084 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 1085 ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind address failed."; 1086 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 1087 ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; 1088 asAcceptorSocket.enableNonBlockingMode( sal_True ); 1089 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 1090 1091 /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default. 1092 sal_Bool bOK = sal_True; 1093 asAcceptorSocket.close( ); 1094 1095 ASSERT_TRUE(( sal_True == bOK )) << "test for enableNonBlockingMode function: launch a server socket and make it non blocking. if it can pass the acceptConnection statement, it is non-blocking"; 1096 } 1097 1098 1099 /** testing the method: 1100 inline sal_Bool SAL_CALL isNonBlockingMode() const; 1101 */ 1102 class isNonBlockingMode : public ::testing::Test 1103 { 1104 public: 1105 ::osl::AcceptorSocket asAcceptorSocket; 1106 }; // class isNonBlockingMode 1107 1108 TEST_F(isNonBlockingMode, isNonBlockingMode_001) 1109 { 1110 ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT ); 1111 ::osl::StreamSocket ssConnection; 1112 1113 /// launch server socket 1114 asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True); 1115 sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); 1116 ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind address failed."; 1117 sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); 1118 ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; 1119 1120 sal_Bool bOK3 = asAcceptorSocket.isNonBlockingMode( ); 1121 asAcceptorSocket.enableNonBlockingMode( sal_True ); 1122 asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... 1123 1124 /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default. 1125 sal_Bool bOK4 = asAcceptorSocket.isNonBlockingMode( ); 1126 asAcceptorSocket.close( ); 1127 1128 ASSERT_TRUE(( sal_False == bOK3 ) && ( sal_True == bOK4 )) << "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."; 1129 } 1130 1131 /** testing the method: 1132 inline void SAL_CALL clearError() const; 1133 */ 1134 class clearError : public ::testing::Test 1135 { 1136 public: 1137 oslSocket sHandle; 1138 // initialization 1139 void SetUp( ) 1140 { 1141 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1142 } 1143 1144 void TearDown( ) 1145 { 1146 sHandle = NULL; 1147 } 1148 }; // class clearError 1149 1150 TEST_F(clearError, clearError_001) 1151 { 1152 ::osl::Socket sSocket(sHandle); 1153 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_HTTP2 ); 1154 ::osl::SocketAddr saLocalSocketAddr; 1155 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1156 sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail" 1157 oslSocketError seBind = sSocket.getError( ); 1158 sSocket.clearError( ); 1159 1160 ASSERT_TRUE(osl_Socket_E_None == sSocket.getError( ) && seBind != osl_Socket_E_None) << "test for clearError function: trick an error called sSocket.getError( ), and then clear the error states, check the result."; 1161 } 1162 1163 /** testing the methods: 1164 inline oslSocketError getError() const; 1165 inline ::rtl::OUString getErrorAsString( ) const; 1166 */ 1167 class getError : public ::testing::Test 1168 { 1169 public: 1170 oslSocket sHandle; 1171 // initialization 1172 void SetUp( ) 1173 { 1174 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1175 } 1176 1177 void TearDown( ) 1178 { 1179 sHandle = NULL; 1180 } 1181 }; // class getError 1182 1183 TEST_F(getError, getError_001) 1184 { 1185 ::osl::Socket sSocket(sHandle); 1186 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP ); 1187 ::osl::SocketAddr saLocalSocketAddr; 1188 1189 ASSERT_TRUE(osl_Socket_E_None == sSocket.getError( )) << "test for getError function: should get no error."; 1190 } 1191 1192 TEST_F(getError, getError_002) 1193 { 1194 ::osl::Socket sSocket(sHandle); 1195 ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_FTP ); 1196 ::osl::SocketAddr saLocalSocketAddr; 1197 sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); 1198 sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail" 1199 //on Solaris, the error no is EACCES, but it has no mapped value, so getError() returned osl_Socket_E_InvalidError. 1200 #if defined(SOLARIS) 1201 ASSERT_TRUE(osl_Socket_E_InvalidError == sSocket.getError( )) << "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. "; 1202 #else 1203 //while on Linux & Win32, the errno is EADDRNOTAVAIL, getError returned osl_Socket_E_AddrNotAvail. 1204 1205 ASSERT_TRUE(osl_Socket_E_AddrNotAvail == sSocket.getError( )) << "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"; 1206 #endif 1207 } 1208 1209 1210 /** testing the methods: 1211 inline oslSocket getHandle() const; 1212 */ 1213 1214 class getHandle : public ::testing::Test 1215 { 1216 public: 1217 oslSocket sHandle; 1218 // initialization 1219 void SetUp( ) 1220 { 1221 sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); 1222 } 1223 1224 void TearDown( ) 1225 { 1226 sHandle = NULL; 1227 } 1228 }; // class getHandle 1229 1230 TEST_F(getHandle, getHandle_001) 1231 { 1232 ::osl::Socket sSocket(sHandle); 1233 ::osl::Socket assignSocket = sSocket.getHandle(); 1234 1235 ASSERT_TRUE(osl_Socket_TypeStream == assignSocket.getType( )) << "test for operators_assignment_handle function: test the assignment operator."; 1236 } 1237 1238 TEST_F(getHandle, getHandle_002) 1239 { 1240 ::osl::Socket sSocket( sHandle ); 1241 ::osl::Socket assignSocket ( sSocket.getHandle( ) ); 1242 1243 ASSERT_TRUE(osl_Socket_TypeStream == assignSocket.getType( )) << "test for operators_assignment function: assignment operator"; 1244 } 1245 1246 1247 } // namespace osl_Socket 1248 1249 int main(int argc, char **argv) 1250 { 1251 ::testing::InitGoogleTest(&argc, argv); 1252 return RUN_ALL_TESTS(); 1253 } 1254