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