| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sal.hxx" |
| |
| /** test coder preface: |
| 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform |
| if you are not including ws2_32.lib in makefile.mk, the including format will be like this: |
| |
| .IF "$(GUI)" == "WNT" |
| SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib |
| SHL1STDLIBS += ws2_32.lib |
| .ENDIF |
| |
| likewise on Solaris platform. |
| .IF "$(GUI)" == "UNX" |
| SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a |
| SHL1STDLIBS += -lsocket -ldl -lnsl |
| .ENDIF |
| |
| 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4 |
| category. |
| |
| 3. some fragment of Socket source implementation are lack of comment so it is hard for testers |
| guess what the exact functionality or usage of a member. Hope the Socket section's comment |
| will be added. |
| |
| 4. following functions are declared but not implemented: |
| inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const; |
| */ |
| |
| //------------------------------------------------------------------------ |
| // include files |
| //------------------------------------------------------------------------ |
| |
| #include "gtest/gtest.h" |
| |
| #include "osl_Socket_Const.h" |
| #include "sockethelper.hxx" |
| |
| using namespace osl; |
| using namespace rtl; |
| |
| #define IP_PORT_MYPORT2 8883 |
| #define IP_PORT_FTP 21 |
| #define IP_PORT_MYPORT3 8884 |
| |
| //------------------------------------------------------------------------ |
| // helper functions |
| //------------------------------------------------------------------------ |
| |
| class CloseSocketThread : public Thread |
| { |
| ::osl::Socket &m_sSocket; |
| protected: |
| void SAL_CALL run( ) |
| { |
| thread_sleep( 1 ); |
| m_sSocket.close( ); |
| } |
| public: |
| CloseSocketThread(::osl::Socket & sSocket ) |
| : m_sSocket( sSocket ) |
| { |
| } |
| |
| ~CloseSocketThread( ) |
| { |
| if ( isRunning( ) ) |
| { |
| printf("# error: CloseSocketThread not terminated.\n" ); |
| } |
| } |
| }; |
| |
| namespace osl_ConnectorSocket |
| { |
| |
| /** testing the method: |
| ConnectorSocket(oslAddrFamily Family = osl_Socket_FamilyInet, |
| oslProtocol Protocol = osl_Socket_ProtocolIp, |
| oslSocketType Type = osl_Socket_TypeStream); |
| */ |
| |
| class ctors : public ::testing::Test |
| { |
| public: |
| }; // class ctors |
| |
| TEST_F(ctors, ctors_001) |
| { |
| /// Socket constructor. |
| ::osl::ConnectorSocket csSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream ); |
| |
| ASSERT_TRUE( osl_Socket_TypeStream == csSocket.getType( ) ) |
| << "test for ctors_001 constructor function: check if the connector socket was created successfully."; |
| } |
| |
| /** testing the method: |
| oslSocketResult SAL_CALL connect(const SocketAddr& TargetHost, const TimeValue* pTimeout = 0); |
| */ |
| |
| class connect : public ::testing::Test |
| { |
| public: |
| TimeValue *pTimeout; |
| ::osl::AcceptorSocket asAcceptorSocket; |
| ::osl::ConnectorSocket csConnectorSocket; |
| |
| |
| // initialization |
| void SetUp( ) |
| { |
| pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) ); |
| pTimeout->Seconds = 3; |
| pTimeout->Nanosec = 0; |
| // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp ); |
| } |
| |
| void TearDown( ) |
| { |
| free( pTimeout ); |
| // sHandle = NULL; |
| asAcceptorSocket.close( ); |
| csConnectorSocket.close( ); |
| } |
| }; // class connect |
| |
| TEST_F(connect, connect_001) |
| { |
| ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT2 ); |
| ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT2 ); |
| ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP ); |
| ::osl::StreamSocket ssConnection; |
| |
| /// launch server socket |
| asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); |
| sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); |
| ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind address failed."; |
| sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); |
| ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; |
| |
| //asAcceptorSocket.enableNonBlockingMode( sal_True ); |
| //oslSocketResult eResultAccept = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection... |
| //ASSERT_TRUE(osl_Socket_Ok == eResultAccept) << "accept failed."; |
| /// launch client socket |
| oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... |
| ASSERT_TRUE(osl_Socket_Ok == eResult) << "connect failed."; |
| |
| /// get peer information |
| csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected. |
| |
| ASSERT_TRUE( |
| ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) && |
| ( osl_Socket_Ok == eResult )) |
| << "test for connect function: try to create a connection with remote host. and check the setup address."; |
| } |
| //non-blocking mode connect? |
| TEST_F(connect, connect_002) |
| { |
| ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 ); |
| ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 ); |
| ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP ); |
| |
| asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True); |
| asAcceptorSocket.enableNonBlockingMode( sal_True ); |
| sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr ); |
| ASSERT_TRUE(sal_True == bOK1) << "AcceptorSocket bind address failed."; |
| sal_Bool bOK2 = asAcceptorSocket.listen( 1 ); |
| ASSERT_TRUE(sal_True == bOK2) << "AcceptorSocket listen failed."; |
| |
| csConnectorSocket.enableNonBlockingMode( sal_True ); |
| |
| oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... |
| ASSERT_TRUE(osl_Socket_InProgress == eResult || osl_Socket_Ok == eResult) << "connect failed."; |
| |
| /// get peer information |
| csConnectorSocket.getPeerAddr( saPeerSocketAddr ); |
| |
| ASSERT_TRUE( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) |
| << "test for connect function: try to create a connection with remote host. and check the setup address."; |
| } |
| // really an error or just delayed |
| // how to design scenarios that will return osl_Socket_Interrupted, osl_Socket_TimedOut |
| TEST_F(connect, connect_003) |
| { |
| ::osl::SocketAddr saTargetSocketAddr1( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 ); |
| ::osl::SocketAddr saTargetSocketAddr2( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT3 ); |
| |
| csConnectorSocket.enableNonBlockingMode( sal_False ); |
| |
| oslSocketResult eResult1 = csConnectorSocket.connect( saTargetSocketAddr1, pTimeout ); |
| oslSocketResult eResult2 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout ); |
| CloseSocketThread myCloseThread( csConnectorSocket ); |
| oslSocketResult eResult3 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout ); |
| myCloseThread.join(); |
| ASSERT_TRUE(osl_Socket_Error == eResult1 && |
| osl_Socket_Error == eResult2 && osl_Socket_Error == eResult3) << "connect should failed."; |
| |
| } |
| |
| // really an error in non-blocking mode |
| TEST_F(connect, connect_004) |
| { |
| ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT3 ); |
| |
| csConnectorSocket.enableNonBlockingMode( sal_True ); |
| |
| oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server... |
| ASSERT_TRUE(osl_Socket_Error == eResult) << "connect should failed."; |
| } |
| /** here need a case: immediate connection, say in non-blocking mode connect return osl_Socket_Ok |
| */ |
| |
| } // namespace osl_ConnectorSocket |
| |
| int main(int argc, char **argv) |
| { |
| ::testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |