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