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