xref: /AOO41X/main/sal/qa/osl/socket/osl_SocketAddr.cxx (revision 87d2adbc9cadf14644c3679b041b9226f7630199)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sal.hxx"
26 
27 /**  test coder preface:
28     1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
29     if you are not including ws2_32.lib in makefile.mk,  the including format will be like this:
30 
31     .IF "$(GUI)" == "WNT"
32     SHL1STDLIBS +=  $(SOLARLIBDIR)$/cppunit.lib
33     SHL1STDLIBS +=  ws2_32.lib
34     .ENDIF
35 
36     likewise on Solaris platform.
37     .IF "$(GUI)" == "UNX"
38     SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
39     SHL1STDLIBS += -lsocket -ldl -lnsl
40     .ENDIF
41 
42     2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
43     category.
44 
45     3. some fragment of Socket source implementation are lack of comment so it is hard for testers
46     guess what the exact functionality or usage of a member.  Hope the Socket section's comment
47     will be added.
48 
49     4. following functions are declared but not implemented:
50     inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
51  */
52 
53 //------------------------------------------------------------------------
54 // include files
55 //------------------------------------------------------------------------
56 
57 #include <testshl/simpleheader.hxx>
58 
59 //#include "osl_Socket_Const.h"
60 #include "sockethelper.hxx"
61 
62 using namespace osl;
63 using namespace rtl;
64 
65 #define IP_PORT_ZERO   0
66 #define IP_PORT_FTP    21
67 #define IP_PORT_TELNET 23
68 #define IP_PORT_HTTP1  80
69 #define IP_PORT_HTTP2  8080
70 
71 #define IP_PORT_MYPORT  8881    //8888
72 #define IP_PORT_MYPORT2  8883   //8890
73 #define IP_PORT_MYPORT3  8884   //8891
74 #define IP_PORT_INVAL  99999
75 #define IP_PORT_MYPORT4  8885   //8892
76 #define IP_PORT_NETBIOS_DGM  138
77 
78 
79 namespace osl_SocketAddr
80 {
81 
82     /** testing the methods:
83         inline SocketAddr();
84         inline SocketAddr(const SocketAddr& Addr);
85         inline SocketAddr(const oslSocketAddr , __osl_socket_NoCopy nocopy );
86         inline SocketAddr(oslSocketAddr Addr);
87         inline SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort );
88     */
89 
90     class ctors : public CppUnit::TestFixture
91     {
92     public:
93 
ctors_none()94         void ctors_none()
95         {
96             /// SocketAddr constructor.
97             ::osl::SocketAddr saSocketAddr;
98 
99             // oslSocketResult aResult;
100             // rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult);
101 
102             // rtl::OUString suHost2 = getThisHostname();
103 
104             CPPUNIT_ASSERT_MESSAGE("test for none parameter constructor function: check if the socket address was created successfully",
105                                     sal_True == saSocketAddr.is( ) );
106         }
107 
ctors_none_000()108         void ctors_none_000()
109         {
110             /// SocketAddr constructor.
111             ::osl::SocketAddr saSocketAddr;
112 
113             oslSocketResult aResult;
114             rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult);
115             rtl::OUString suHost2 = getThisHostname();
116 
117             sal_Bool bOk = compareUString(suHost, suHost2);
118 
119             rtl::OUString suError = rtl::OUString::createFromAscii("Host names should be the same. From SocketAddr.getLocalHostname() it is'");
120             suError += suHost;
121             suError += rtl::OUString::createFromAscii("', from getThisHostname() it is '");
122             suError += suHost2;
123             suError += rtl::OUString::createFromAscii("'.");
124 
125             CPPUNIT_ASSERT_MESSAGE(suError, sal_True == bOk);
126         }
127 
ctors_copy()128         void ctors_copy()
129         {
130             /// SocketAddr copy constructor.
131             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
132             ::osl::SocketAddr saCopySocketAddr( saSocketAddr );
133 
134             sal_Int32 nPort = saCopySocketAddr.getPort( );
135 
136             CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy constructor function: copy constructor, do an action of copy construction then check the port with original set.",
137                                     ( sal_True == saCopySocketAddr.is( ) ) && ( nPort == IP_PORT_HTTP1 ) );
138         }
139 
ctors_copy_no_001()140         void ctors_copy_no_001()
141         {
142 #if 0
143             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
144             oslSocketAddr psaOSLSocketAddr = saSocketAddr.getHandle( );
145 
146             ::osl::SocketAddr saSocketAddrCopy( psaOSLSocketAddr, SAL_NO_COPY );
147             saSocketAddrCopy.setPort( IP_PORT_HTTP2 );
148 
149             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.",
150                                     saSocketAddr.getPort( ) == IP_PORT_HTTP2 );
151 #endif
152             ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
153             CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
154 
155             oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
156 
157             ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
158 
159             pSocketAddrCopy->setPort( IP_PORT_HTTP2 );
160             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.",
161                                    pSocketAddr->getPort( ) == IP_PORT_HTTP2 );
162 
163             delete pSocketAddrCopy;
164             // LLA: don't do this also:           delete pSocketAddr;
165         }
166 
ctors_copy_no_002()167         void ctors_copy_no_002()
168         {
169             ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
170                 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
171                 oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
172                 ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
173 
174                 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.",
175                         pSocketAddr->getHandle( ) ==  pSocketAddrCopy->getHandle( ) );
176 
177                 delete pSocketAddrCopy;
178         }
179 
ctors_copy_handle_001()180         void ctors_copy_handle_001()
181         {
182             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
183             ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) );
184 
185             CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, get its port to check copy effect.",
186                                     saSocketAddrCopy.getPort( ) == IP_PORT_HTTP1 );
187         }
188 
ctors_copy_handle_002()189         void ctors_copy_handle_002()
190         {
191             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
192             ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) );
193             saSocketAddrCopy.setPort( IP_PORT_HTTP2 );
194 
195             CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, the original one should not be changed.",
196                                     saSocketAddr.getPort( ) != IP_PORT_HTTP2 );
197         }
198 
ctors_hostname_port_001()199         void ctors_hostname_port_001()
200         {
201             /// tcpip-specif constructor.
202             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
203             printUString( saSocketAddr.getHostname( ), "ctors_hostname_port_001:getHostname");
204 
205             CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: do a constructor using tcpip spec, check the result.",
206                                     saSocketAddr.is( ) == sal_True &&
207                                     ( saSocketAddr.getPort( ) == IP_PORT_FTP )/*&&
208                                     ( sal_True == compareUString( saSocketAddr.getHostname( ), aHostName1 ) ) */);
209         }
210 
211         //same as is_002
ctors_hostname_port_002()212         void ctors_hostname_port_002()
213         {
214             /// tcpip-specif constructor.
215             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT2 );
216 
217             CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: using an invalid IP address, the socketaddr ctors should fail", sal_False == saSocketAddr.is( ));
218         }
219         CPPUNIT_TEST_SUITE( ctors );
220         CPPUNIT_TEST( ctors_none );
221         CPPUNIT_TEST( ctors_none_000 );
222         CPPUNIT_TEST( ctors_copy );
223         CPPUNIT_TEST( ctors_copy_no_001 );
224         CPPUNIT_TEST( ctors_copy_no_002 );
225         CPPUNIT_TEST( ctors_copy_handle_001 );
226         CPPUNIT_TEST( ctors_copy_handle_002 );
227         CPPUNIT_TEST( ctors_hostname_port_001 );
228         CPPUNIT_TEST( ctors_hostname_port_002 );
229         CPPUNIT_TEST_SUITE_END();
230 
231     }; // class ctors
232 
233 
234     /** testing the method:
235         inline sal_Bool is() const;
236     */
237 
238     class is : public CppUnit::TestFixture
239     {
240     public:
is_001()241         void is_001()
242         {
243             ::osl::SocketAddr saSocketAddr;
244 
245             CPPUNIT_ASSERT_MESSAGE("test for is() function: create an unknown type socket, it should be True when call is.",
246                                     sal_True == saSocketAddr.is( ) );
247         }
248         // refer to setPort_003()
is_002()249         void is_002()
250         {
251             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_INVAL );
252 
253             CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid port number",
254                                     sal_True == saSocketAddr.is( ) );
255         }
256 
is_003()257         void is_003()
258         {
259             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT );
260 
261             CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid Ip number",
262                                     sal_True != saSocketAddr.is( ) );
263         }
264 
265         CPPUNIT_TEST_SUITE( is );
266         CPPUNIT_TEST( is_001 );
267         CPPUNIT_TEST( is_002 );
268         CPPUNIT_TEST( is_003 );
269         CPPUNIT_TEST_SUITE_END();
270 
271     }; // class is
272 
273 
274     /** testing the method:
275         inline ::rtl::OUString SAL_CALL getHostname( oslSocketResult *pResult = 0 ) const;
276     */
277 
278     class getHostname : public CppUnit::TestFixture
279     {
280     public:
setUp()281         void setUp()
282         {
283         }
284 
tearDown()285         void tearDown()
286         {
287         }
288 
getHostname_000()289         void getHostname_000()
290             {
291                 ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.107"), IP_PORT_FTP );
292                 rtl::OUString suResult = saSocketAddr.getHostname( 0 );
293 
294             }
295 
296         /** it will search the Ip in current machine's /etc/hosts at first, if find, then return the
297             mapped hostname, otherwise, it will search via DNS server, and often return hostname+ Domain name
298             like "sceri.PRC.Sun.COM"
299             The process is same as Socket::getLocalHost(), but getLocalHost can only return hostname of the current machine.
300         */
getHostname_001()301         void getHostname_001()
302         {
303             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.107"), IP_PORT_FTP );
304             rtl::OUString suResult = saSocketAddr.getHostname( 0 );
305             rtl::OUString suError = outputError(suResult, rtl::OUString::createFromAscii("sceri.PRC.Sun.COM"), "test for getHostname(0)");
306             sal_Bool bOK = compareUString( suResult, rtl::OUString::createFromAscii("sceri.PRC.Sun.COM") );
307             // search the returned hostname in /etc/hosts, if find, and the IP in the row is same as IP
308             // in the Addr, it's right also.
309             if ( bOK == sal_False)
310             {
311                 rtl::OString aString = ::rtl::OUStringToOString( suResult, RTL_TEXTENCODING_ASCII_US );
312                 if ( compareUString( getIPbyName( aString ), rtl::OUString::createFromAscii("129.158.217.107") ) == sal_True )
313                     bOK = sal_True;
314             }
315             CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK);
316         }
317 
318 // LLA: now we have to control, if this behaviour is right.
319 // LLA: this function does not work in company (Linux, Windows) but at home
getHostname_002()320         void getHostname_002()
321         {
322             rtl::OUString suHostname = rtl::OUString::createFromAscii("cn-1.germany.sun.com");
323             rtl::OString aString = ::rtl::OUStringToOString( suHostname, RTL_TEXTENCODING_ASCII_US );
324             rtl::OUString aHostIP    = getIPbyName( aString );
325 
326             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_FTP );
327             sal_Bool bOK = saSocketAddr.setHostname( suHostname );
328             CPPUNIT_ASSERT_MESSAGE("#SocketAddr.setHostname failed", sal_True == bOK );
329             oslSocketResult aResult;
330             rtl::OUString suResult = saSocketAddr.getHostname( &aResult );
331             CPPUNIT_ASSERT_MESSAGE("SocketAddr.getHostname failed.", aResult == osl_Socket_Ok);
332 
333             rtl::OUString suError = outputError(suResult, suHostname, "test for getHostname(0)");
334             bOK = compareUString( suResult, suHostname );
335             if ( bOK == sal_False)
336             {
337                 rtl::OString aStringResult = ::rtl::OUStringToOString( suResult, RTL_TEXTENCODING_ASCII_US );
338                 rtl::OString aStringHostname = ::rtl::OUStringToOString( suHostname, RTL_TEXTENCODING_ASCII_US );
339                 if ( compareUString( getIPbyName( aStringResult ) ,  getIPbyName( aStringHostname ) ) == sal_True )
340                 {
341                     bOK = sal_True;
342                 }
343             }
344 
345             CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
346         }
347 
348 
349         CPPUNIT_TEST_SUITE( getHostname );
350         CPPUNIT_TEST( getHostname_001 );
351         CPPUNIT_TEST( getHostname_002 );
352         CPPUNIT_TEST_SUITE_END();
353 
354     }; // class getHostname
355 
356 
357     /** testing the method:
358         inline sal_Int32 SAL_CALL getPort() const;
359     */
360 
361     class getPort : public CppUnit::TestFixture
362     {
363     public:
getPort_001()364         void getPort_001()
365         {
366             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
367 
368             CPPUNIT_ASSERT_MESSAGE( "test for getPort() function: get a normal port number.",
369                                     IP_PORT_FTP == saSocketAddr.getPort( ) );
370         }
371 
getPort_002()372         void getPort_002()
373         {
374             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_INVAL );
375 
376             //t_print("#getPort_002: Port number is %d \n", saSocketAddr.getPort( ));
377 
378             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).",
379                                     saSocketAddr.getPort( )>=1 && saSocketAddr.getPort( ) <= 65535 );
380         }
381         //two cases will return OSL_INVALID_PORT: 1. not valid SocketAddr
382         //2. SocketAddr family is not osl_Socket_FamilyInet, but case 2 could not be constructed
getPort_003()383         void getPort_003()
384         {
385             rtl::OUString suInvalidIP = rtl::OUString::createFromAscii("123.345.67.89");
386             ::osl::SocketAddr saSocketAddr( suInvalidIP, IP_PORT_MYPORT );
387 
388             CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid IP to a SocketAddr, get the port to see returned value. ",
389                                     saSocketAddr.getPort( ) == OSL_INVALID_PORT );
390         }
391 
392         CPPUNIT_TEST_SUITE( getPort );
393         CPPUNIT_TEST( getPort_001 );
394         CPPUNIT_TEST( getPort_002 );
395         CPPUNIT_TEST( getPort_003 );
396         CPPUNIT_TEST_SUITE_END( );
397 
398     }; // class getPort
399 
400 
401     /** testing the method:
402         inline sal_Bool SAL_CALL setPort( sal_Int32 nPort );
403         rfc1413.txt: TCP port numbers are from 1-65535
404         rfc1700.txt: 0/tcp    Reserved ;  0/udp    Reserved
405     */
406 
407     class setPort : public CppUnit::TestFixture
408     {
409     public:
setPort_001()410         void setPort_001()
411         {
412             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
413             sal_Bool bOK = saSocketAddr.setPort( IP_PORT_TELNET );
414 
415             CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: modify a port number setting, and check it.",
416                                     ( sal_True == bOK ) &&
417                                     ( IP_PORT_TELNET == saSocketAddr.getPort( ) ) );
418         }
419 
420         /** 0 to 1024 is known as the reserved port range (traditionally only root can assign programs to ports in
421             this range) and the ephemeral port range from 1025 to 65535.
422             As many of you programmers will know, when you specify the source port of 0 when you connect to a host,
423             the OS automatically reassigns the port number to high numbered ephemeral port. The same happens if you
424             try to bind a listening socket to port 0.
425             http://www.securiteam.com/securityreviews/5XP0Q2AAKS.html
426             another: http://www.muq.org/~cynbe/muq/mufref_564.html
427         */
setPort_002()428         void setPort_002()
429         {
430             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
431             sal_Bool bOK = saSocketAddr.setPort( IP_PORT_ZERO );
432 
433             oslSocket sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
434             ::osl::Socket sSocket(sHandle);
435             sSocket.setOption( osl_Socket_OptionReuseAddr, 1 );//sal_True);
436             sal_Bool bOK1 = sSocket.bind( saSocketAddr );
437             CPPUNIT_ASSERT_MESSAGE( "bind SocketAddr failed", bOK1 == sal_True );
438 
439             sal_Int32 newPort = sSocket.getLocalPort();
440             //t_print("#new port is %d\n", newPort );
441 
442             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.",
443                                     ( 1024 <= newPort ) && ( 65535 >= newPort ) && ( bOK == sal_True ) );
444 
445         }
446 
setPort_003()447         void setPort_003()
448         {
449             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP);
450             sal_Bool bOK = saSocketAddr.setPort( IP_PORT_INVAL );
451             //on Linux, getPort return 34463
452             //t_print("#Port number is %d \n", saSocketAddr.getPort( ));
453 
454             CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an address with invalid port. it should return error or convert it to a valid port.",
455                                      ( ( 1 <= saSocketAddr.getPort( ) ) && ( 65535 >= saSocketAddr.getPort( ) ) &&( bOK == sal_True ) ) ||
456                                      bOK == sal_False);
457         }
458 
459         /* this is not a inet-addr => can't set port */
setPort_004()460         void setPort_004()
461         {
462             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_FTP);
463             sal_Bool bOK = saSocketAddr.setPort( IP_PORT_MYPORT );
464 
465             CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an invalid address with valid port. it should return error.",
466                                      bOK == sal_False);
467         }
468 
469 
470         CPPUNIT_TEST_SUITE( setPort );
471         CPPUNIT_TEST( setPort_001 );
472         CPPUNIT_TEST( setPort_002 );
473         CPPUNIT_TEST( setPort_003 );
474         CPPUNIT_TEST( setPort_004 );
475         CPPUNIT_TEST_SUITE_END( );
476 
477     }; // class setPort
478 
479 
480     /**  tester comment:
481 
482         In the following two functions, it use ::rtl::ByteSequence as an intermediate storage for address,
483         the ByteSequence object can hold sal_Int8 arrays, which is raged [-127, 127], in case of IP addr
484         that is greater than 127, say 129.158.217.202, it will stored as -127, -98, -39, -54,  it is unique
485         in the range of sal_Int8, but lack of readability.
486         so may be a sal_uInt8 array is better.
487     */
488 
489 
490     /** testing the method:
491         inline sal_Bool SAL_CALL setAddr( const ::rtl::ByteSequence & address );
492     */
493 
494     class setAddr : public CppUnit::TestFixture
495     {
496     public:
setAddr_001()497         void setAddr_001()
498         {
499             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
500             saSocketAddr.setAddr( UStringIPToByteSequence( rtl::OUString::createFromAscii("127.0.0.1") ) );
501             ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 );
502             sal_Bool bOK = sal_False;
503 
504             // if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) && ( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
505             //  bOK = sal_True;
506             bOK = ifIpv4is( bsSocketAddr, 127, 0, 0, 1 );
507 
508             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 ",
509                                       sal_True == bOK );
510         }
511 
512 
513         CPPUNIT_TEST_SUITE( setAddr );
514         CPPUNIT_TEST( setAddr_001 );
515         CPPUNIT_TEST_SUITE_END( );
516 
517     }; // class setAddr
518 
519 
520     /** testing the method:
521         inline ::rtl::ByteSequence  SAL_CALL getAddr( oslSocketResult *pResult = 0 ) const;
522     */
523 
524     class getAddr : public CppUnit::TestFixture
525     {
526     public:
getAddr_001()527         void getAddr_001()
528         {
529             oslSocketResult SocketResult;
530             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
531             ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( &SocketResult );
532 
533             sal_Bool bOK = sal_False;
534 
535             //if ( ( osl_Socket_Ok == SocketResult ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
536             //  bOK = sal_True;
537             bOK = ifIpv4is( bsSocketAddr, 127, 0, 0, 1 );
538 
539             CPPUNIT_ASSERT_MESSAGE( "test for getAddr() function: construct a socketaddr with IP assigned, get the address to check correctness.Caught unknown exception on (Win32)",
540                 sal_True == bOK && SocketResult == osl_Socket_Ok);
541         }
542 
543         CPPUNIT_TEST_SUITE( getAddr );
544         CPPUNIT_TEST( getAddr_001 );
545         CPPUNIT_TEST_SUITE_END( );
546 
547     }; // class getAddr
548 
549 
550     /** testing the methods:
551         inline SocketAddr & SAL_CALL operator= (oslSocketAddr Addr);
552         inline SocketAddr & SAL_CALL operator= (const SocketAddr& Addr);
553         inline SocketAddr & SAL_CALL assign( oslSocketAddr Addr, __osl_socket_NoCopy nocopy );
554         inline sal_Bool SAL_CALL operator== (oslSocketAddr Addr) const;
555         inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;    /// not implemented.
556     */
557 
558     class operator_equal : public CppUnit::TestFixture
559     {
560     public:
operator_equal_001()561         void operator_equal_001()
562         {
563             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
564             ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
565 
566             saSocketAddrEqual = saSocketAddr;
567             sal_Bool bOK = sal_False;
568             ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 );
569 
570             // if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
571             if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&  ( ifIpv4is( bsSocketAddr, 127, 0, 0, 1 ) == sal_True ) )
572                 bOK = sal_True;
573 
574             CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: use operator= to assign Ip1 to Ip2, check its modification.",
575                                       sal_True == bOK );
576         }
577 
578 
operator_equal_002()579         void operator_equal_002()
580         {
581             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.199"), IP_PORT_TELNET);
582             ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
583 
584             saSocketAddrEqual = saSocketAddr;
585             CPPUNIT_ASSERT_MESSAGE( "after assign, the assigned SocketAddr is not same as the original Addr",
586                                      IP_PORT_TELNET == saSocketAddrEqual.getPort( )  );
587             saSocketAddrEqual.setPort( IP_PORT_MYPORT3 );
588             saSocketAddr.setPort( IP_PORT_HTTP2 );
589 
590             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.",
591                                      IP_PORT_MYPORT3 == saSocketAddrEqual.getPort( )  );
592         }
593 
operator_equal_const_001()594         void operator_equal_const_001()
595         {
596             const ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
597             ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
598 
599             saSocketAddrEqual = saSocketAddr;
600             sal_Bool bOK = sal_False;
601             ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 );
602 
603             // if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
604             if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) && ifIpv4is( bsSocketAddr, 127, 0, 0, 1 ) == sal_True )
605                 bOK = sal_True;
606 
607             CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: use operator= const to assign Ip1 to Ip2, verify the change on the second one.",
608                                       sal_True == bOK );
609         }
610 
operator_equal_const_002()611         void operator_equal_const_002()
612         {
613             const ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
614             ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
615 
616             saSocketAddrEqual = saSocketAddr;
617             saSocketAddrEqual.setPort( IP_PORT_HTTP1 );
618 
619             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.",
620                                       IP_PORT_HTTP1 != saSocketAddr.getPort( ) );
621         }
622 
operator_equal_assign_001()623         void operator_equal_assign_001()
624         {
625             ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET );
626                 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
627                 ::osl::SocketAddr* pSocketAddrAssign = new ::osl::SocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
628                 oslSocketAddr poslSocketAddr = pSocketAddr->getHandle( );
629                 //if( m_handle ) osl_destroySocketAddr( m_handle ); so pSocketAddrAssign had been destroyed and then point to pSocketAddr
630                 pSocketAddrAssign->assign(poslSocketAddr, SAL_NO_COPY);
631 
632                 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.",
633                         pSocketAddrAssign->getPort( ) == IP_PORT_TELNET );
634 
635                 delete pSocketAddrAssign;
636         }
637 
operator_is_equal_001()638         void operator_is_equal_001()
639         {
640             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
641             ::osl::SocketAddr saSocketAddrequal( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET );
642 
643             CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two identical Address.",
644                                       sal_True == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) );
645         }
646 
operator_is_equal_002()647         void operator_is_equal_002()
648         {
649             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP);
650             ::osl::SocketAddr saSocketAddrequal( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET );
651 
652             CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two different Address.",
653                                       sal_False == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) );
654         }
655 
656         CPPUNIT_TEST_SUITE( operator_equal );
657         CPPUNIT_TEST( operator_equal_001 );
658         CPPUNIT_TEST( operator_equal_002 );
659         CPPUNIT_TEST( operator_equal_const_001 );
660         CPPUNIT_TEST( operator_equal_const_002 );
661         CPPUNIT_TEST( operator_equal_assign_001 );
662         CPPUNIT_TEST( operator_is_equal_001 );
663         CPPUNIT_TEST( operator_is_equal_002 );
664         CPPUNIT_TEST_SUITE_END( );
665 
666     }; // class operator_equal
667 
668 
669 
670     /** testing the method:
671         inline oslSocketAddr SAL_CALL getHandle() const;
672     */
673 
674     class getSocketAddrHandle : public CppUnit::TestFixture
675     {
676     public:
677 
getSocketAddrHandle_001()678         void getSocketAddrHandle_001()
679         {
680             ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
681                 CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
682                 oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
683                 ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
684 
685                 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.",
686                         pSocketAddr->getHandle( ) ==  pSocketAddrCopy->getHandle( ) );
687 
688                 delete pSocketAddrCopy;
689         }
690 
getSocketAddrHandle_002()691         void getSocketAddrHandle_002()
692         {
693             ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("deuce.PRC.Sun.COM"), IP_PORT_MYPORT4 );
694             oslSocketAddr poslSocketAddr = saSocketAddr.getHandle( );
695 
696             sal_Bool bOK = ( saSocketAddr == poslSocketAddr );
697             //t_print("getSocketAddrHandle_002\n");
698             CPPUNIT_ASSERT_MESSAGE( "test for getHandle() function: use getHandle() function as an intermediate way to create identical address.",
699                                       sal_True == bOK );
700         }
701 
702         CPPUNIT_TEST_SUITE( getSocketAddrHandle );
703         CPPUNIT_TEST( getSocketAddrHandle_001 );
704         CPPUNIT_TEST( getSocketAddrHandle_002 );
705         CPPUNIT_TEST_SUITE_END( );
706 
707     }; // class getSocketAddrHandle
708 
709 
710     /** testing the method:
711         static inline ::rtl::OUString SAL_CALL getLocalHostname( oslSocketResult *pResult = 0);
712     */
713 
714     class getLocalHostname : public CppUnit::TestFixture
715     {
716     public:
717         /* the process of getLocalHostname: 1.gethostname (same as /bin/hostname) returned name A
718            2. search A in /etc/hosts, if there is an alias name is A, return the name in the same row
719         */
720 
getLocalHostname_000()721         void getLocalHostname_000()
722             {
723                 // _osl_getFullQualifiedDomainName( );
724                 oslSocketResult aResult = osl_Socket_Error;
725                 rtl::OUString suHostname = osl::SocketAddr::getLocalHostname(&aResult);
726                 CPPUNIT_ASSERT_MESSAGE("getLocalHostname failed", aResult == osl_Socket_Ok);
727             }
728 
getLocalHostname_001()729         void getLocalHostname_001()
730         {
731             oslSocketResult *pResult = NULL;
732             //printSocketResult(*pResult);
733             ::rtl::OUString suResult = ::osl::SocketAddr::getLocalHostname( pResult );
734 
735             // LLA: IMHO localhost, or hostname by itself should be ok.
736             rtl::OUString suThisHost = getThisHostname( );
737             bool bOk = false;
738             if (suThisHost.equals(rtl::OUString::createFromAscii("localhost")))
739             {
740                 bOk = true;
741             }
742             else
743             {
744                 if (suThisHost.equals(suResult))
745                 {
746                     bOk = true;
747                 }
748             }
749 
750             ::rtl::OUString suError;
751             suError = outputError(suResult, getThisHostname( ), "test for getLocalHostname() function");
752 
753             CPPUNIT_ASSERT_MESSAGE( suError, bOk == true );
754         }
755 
756         CPPUNIT_TEST_SUITE( getLocalHostname );
757         CPPUNIT_TEST( getLocalHostname_000 );
758         CPPUNIT_TEST( getLocalHostname_001 );
759         CPPUNIT_TEST_SUITE_END( );
760 
761     }; // class getLocalHostname
762 
763 
764     /** testing the method:
765         static inline void SAL_CALL resolveHostname( const ::rtl::OUString & strHostName , SocketAddr & Addr );
766     */
767 
768     class resolveHostname : public CppUnit::TestFixture
769     {
770     public:
resolveHostname_001()771         void resolveHostname_001()
772         {
773             ::osl::SocketAddr saSocketAddr;
774             ::osl::SocketAddr::resolveHostname( rtl::OUString::createFromAscii("127.0.0.1"), saSocketAddr );
775             ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 );
776             sal_Bool bOK = sal_False;
777 
778              if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
779                 bOK = sal_True;
780 
781             CPPUNIT_ASSERT_MESSAGE( "test for resolveHostname() function: try to resolve localhost to 127.0.0.1.",
782                                       sal_True == bOK );
783         }
784 
785         CPPUNIT_TEST_SUITE( resolveHostname );
786         CPPUNIT_TEST( resolveHostname_001 );
787         CPPUNIT_TEST_SUITE_END( );
788 
789     }; // class resolveHostname
790 
791 
792     /** testing the method:
793         static inline sal_Int32 SAL_CALL getServicePort(
794             const ::rtl::OUString& strServiceName,
795             const ::rtl::OUString & strProtocolName= ::rtl::OUString::createFromAscii( "tcp" ) );
796     */
797 
798     class gettheServicePort : public CppUnit::TestFixture
799     {
800     public:
gettheServicePort_001()801         void gettheServicePort_001()
802         {
803             rtl::OUString suServiceFTP  = rtl::OUString::createFromAscii( "ftp" );
804             rtl::OUString suProtocolTCP = rtl::OUString::createFromAscii( "tcp" );
805 
806             CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get ftp service port on TCP protocol.",
807                                       IP_PORT_FTP== ::osl::SocketAddr::getServicePort( suServiceFTP, suProtocolTCP ) );
808         }
809 
gettheServicePort_002()810         void gettheServicePort_002()
811         {
812             rtl::OUString suServiceTELNET  = rtl::OUString::createFromAscii( "telnet" );
813             rtl::OUString suProtocolTCP    = rtl::OUString::createFromAscii( "tcp" );
814             CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get telnet service port on TCP protocol.",
815                                       IP_PORT_TELNET== ::osl::SocketAddr::getServicePort( suServiceTELNET, suProtocolTCP ) );
816         }
817 
gettheServicePort_003()818         void gettheServicePort_003()
819         {
820         //Solaris has no service called "https", please see /etc/services
821             rtl::OUString suServiceNETBIOS = rtl::OUString::createFromAscii( "netbios-dgm" );
822             rtl::OUString suProtocolUDP    = rtl::OUString::createFromAscii( "udp" );
823             CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get netbios-ssn service port on UDP protocol.",
824                                       IP_PORT_NETBIOS_DGM == ::osl::SocketAddr::getServicePort( suServiceNETBIOS, suProtocolUDP ) );
825         }
826 
gettheServicePort_004()827         void gettheServicePort_004()
828         {
829             rtl::OUString suProtocolUDP    = rtl::OUString::createFromAscii( "udp" );
830             CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get a service port which is not exist.",
831                                       OSL_INVALID_PORT == ::osl::SocketAddr::getServicePort( ::rtl::OUString::createFromAscii( "notexist" ), suProtocolUDP ) );
832         }
833 
834         CPPUNIT_TEST_SUITE( gettheServicePort );
835         CPPUNIT_TEST( gettheServicePort_001 );
836         CPPUNIT_TEST( gettheServicePort_002 );
837         CPPUNIT_TEST( gettheServicePort_003 );
838         CPPUNIT_TEST( gettheServicePort_004 );
839         CPPUNIT_TEST_SUITE_END( );
840 
841     }; // class gettheServicePort
842 
843     /** testing the method:
844 
845     */
846 
847     class getFamilyOfSocketAddr : public CppUnit::TestFixture
848     {
849     public:
getFamilyOfSocketAddr_001()850         void getFamilyOfSocketAddr_001()
851         {
852                 ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
853                 oslSocketAddr psaOSLSocketAddr = saSocketAddr.getHandle( );
854                 CPPUNIT_ASSERT_EQUAL(
855                     osl_Socket_FamilyInet,
856                     osl_getFamilyOfSocketAddr( psaOSLSocketAddr ) );
857 
858             CPPUNIT_ASSERT_MESSAGE( "test for osl_getFamilyOfSocketAddr.",
859                                       osl_getFamilyOfSocketAddr( psaOSLSocketAddr ) == osl_Socket_FamilyInet );
860         }
861 
862         CPPUNIT_TEST_SUITE( getFamilyOfSocketAddr );
863         CPPUNIT_TEST( getFamilyOfSocketAddr_001 );
864         CPPUNIT_TEST_SUITE_END( );
865 
866     }; // class getFamilyOfSocketAddr
867 
868 // -----------------------------------------------------------------------------
869 
870 
871 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::ctors, "osl_SocketAddr");
872 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::is, "osl_SocketAddr");
873 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getHostname, "osl_SocketAddr");
874 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getPort, "osl_SocketAddr");
875 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setPort, "osl_SocketAddr");
876 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setAddr, "osl_SocketAddr");
877 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getAddr, "osl_SocketAddr");
878 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::operator_equal, "osl_SocketAddr");
879 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getSocketAddrHandle, "osl_SocketAddr");
880 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getLocalHostname, "osl_SocketAddr");
881 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::resolveHostname, "osl_SocketAddr");
882 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::gettheServicePort, "osl_SocketAddr");
883 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getFamilyOfSocketAddr, "osl_SocketAddr");
884 
885 } // namespace osl_SocketAddr
886 
887 // -----------------------------------------------------------------------------
888 
889 // this macro creates an empty function, which will called by the RegisterAllFunctions()
890 // to let the user the possibility to also register some functions by hand.
891 NOADDITIONAL;
892