xref: /trunk/main/sal/qa/osl/pipe/osl_Pipe.cxx (revision 87d2adbc)
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 //------------------------------------------------------------------------
28 // include files
29 //------------------------------------------------------------------------
30 
31 #include "cppunit/TestAssert.h"
32 #include "cppunit/TestFixture.h"
33 #include "cppunit/extensions/HelperMacros.h"
34 #include "cppunit/plugin/TestPlugIn.h"
35 #include "test/uniquepipename.hxx"
36 #include <sal/types.h>
37 #include <rtl/ustring.hxx>
38 
39 #ifndef	_OSL_THREAD_HXX
40 #include <osl/thread.hxx>
41 #endif
42 
43 #ifndef	_OSL_MUTEX_HXX
44 #include <osl/mutex.hxx>
45 #endif
46 
47 #ifndef	_OSL_MUTEX_HXX
48 #include <osl/pipe.hxx>
49 #endif
50 #include <osl/time.h>
51 
52 #ifdef UNX
53 #include <unistd.h>
54 #endif
55 #include <string.h>
56 
57 using namespace osl;
58 using namespace rtl;
59 
60 //------------------------------------------------------------------------
61 // helper functions
62 //------------------------------------------------------------------------
63 
64 /** print Boolean value.
65  */
66 inline void printBool( sal_Bool bOk )
67 {
68     printf("#printBool# " );
69     ( sal_True == bOk ) ? printf("YES!\n" ): printf("NO!\n" );
70 }
71 
72 /** print a UNI_CODE String.
73  */
74 inline void printUString( const ::rtl::OUString & str )
75 {
76     rtl::OString aString;
77 
78     printf("#printUString_u# " );
79     aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
80     printf("%s\n", aString.getStr( ) );
81 }
82 
83 /** print last error of pipe system.
84  */
85 inline void printPipeError( ::osl::Pipe aPipe )
86 {
87     oslPipeError nError = aPipe.getError( );
88     printf("#printPipeError# " );
89     switch ( nError ) {
90     case osl_Pipe_E_None:
91         printf("Success!\n" );
92         break;
93     case osl_Pipe_E_NotFound:
94         printf("The returned error is: Not found!\n" );
95         break;
96     case osl_Pipe_E_AlreadyExists:
97         printf("The returned error is: Already exist!\n" );
98         break;
99     case osl_Pipe_E_NoProtocol:
100         printf("The returned error is: No protocol!\n" );
101         break;
102     case osl_Pipe_E_NetworkReset:
103         printf("The returned error is: Network reset!\n" );
104         break;
105     case osl_Pipe_E_ConnectionAbort:
106         printf("The returned error is: Connection aborted!\n" );
107         break;
108     case osl_Pipe_E_ConnectionReset:
109         printf("The returned error is: Connection reset!\n" );
110         break;
111     case osl_Pipe_E_NoBufferSpace:
112         printf("The returned error is: No buffer space!\n" );
113         break;
114     case osl_Pipe_E_TimedOut:
115         printf("The returned error is: Timeout!\n" );
116         break;
117     case osl_Pipe_E_ConnectionRefused:
118         printf("The returned error is: Connection refused!\n" );
119         break;
120     case osl_Pipe_E_invalidError:
121         printf("The returned error is: Invalid error!\n" );
122         break;
123     default:
124         printf("The returned error is: Number %d, Unknown Error\n", nError );
125         break;
126     }
127 }
128 
129 
130 
131 //------------------------------------------------------------------------
132 // pipe name and transfer contents
133 //------------------------------------------------------------------------
134 const rtl::OUString aTestPipeName = rtl::OUString::createFromAscii( "testpipe2" );
135 const rtl::OUString aTestPipe1 = rtl::OUString::createFromAscii( "testpipe1" );
136 const rtl::OUString aTestString = rtl::OUString::createFromAscii( "Sun Microsystems" );
137 
138 const OString m_pTestString1("Sun Microsystems");
139 const OString m_pTestString2("test pipe PASS/OK");
140 
141 //------------------------------------------------------------------------
142 // test code start here
143 //------------------------------------------------------------------------
144 
145 namespace osl_Pipe
146 {
147 
148 //------------------------------------------------------------------------
149 // most return value -1 denote a fail of operation.
150 //------------------------------------------------------------------------
151 #define OSL_PIPE_FAIL   -1
152 
153     /** testing the methods:
154         inline Pipe();
155         inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options);
156         inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options,const Security & rSecurity);
157         inline Pipe(const Pipe& pipe);
158         inline Pipe(oslPipe pipe, __sal_NoAcquire noacquire );
159         inline Pipe(oslPipe Pipe);
160     */
161     class ctors : public CppUnit::TestFixture
162     {
163     public:
164         sal_Bool bRes, bRes1;
165 
166         void setUp( )
167             {
168             }
169 
170         void tearDown( )
171             {
172             }
173 
174         void ctors_none( )
175             {
176                 ::osl::Pipe aPipe;
177                 bRes = aPipe.is( );
178 
179                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no parameter, yet no case to test.",
180                                         sal_False == bRes );
181             }
182 
183         void ctors_name_option( )
184             {
185                 /// create a named pipe.
186                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
187                 ::osl::Pipe aAssignPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
188 
189                 bRes = aPipe.is( ) && aAssignPipe.is( );
190 
191                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name and option.",
192                                         sal_True == bRes );
193             }
194 
195         void ctors_name_option_security( )
196             {
197                 /// create a security pipe.
198                 const ::osl::Security rSecurity;
199                 ::osl::Pipe aSecurityPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSecurity );
200 
201                 bRes = aSecurityPipe.is( );
202 
203                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name, option and security, the test of security is not implemented yet.",
204                                         sal_True == bRes );
205             }
206 
207         void ctors_copy( )
208             {
209                 /// create a pipe.
210                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
211                 /// create a pipe using copy constructor.
212                 ::osl::Pipe aCopyPipe( aPipe );
213 
214                 bRes = aCopyPipe.is( ) && aCopyPipe == aPipe;
215 
216                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test copy constructor.",
217                                         sal_True == bRes );
218             }
219 
220         /**  tester comment:
221 
222         When test the following two constructors, don't know how to test the
223         acquire and no acquire action. possible plans:
224         1.release one handle and check the other( did not success since the
225         other still exist and valid. )
226         2. release one handle twice to see getLastError( )(the getLastError
227         always returns invalidError(LINUX)).
228         */
229 
230         void ctors_no_acquire( )
231             {
232                 /// create a pipe.
233                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
234                 /// constructs a pipe reference without acquiring the handle.
235                 ::osl::Pipe aNoAcquirePipe( aPipe.getHandle( ), SAL_NO_ACQUIRE );
236 
237                 bRes = aNoAcquirePipe.is( );
238                 ///aPipe.clear( );
239                 ///bRes1 = aNoAcquirePipe.is( );
240 
241 
242                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no aquire of handle, only validation test, do not know how to test no acquire.",
243                                         sal_True == bRes );
244             }
245 
246         void ctors_acquire( )
247             {
248                 /// create a base pipe.
249                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
250                 /// constructs two pipes without acquiring the handle on the base pipe.
251                 ::osl::Pipe aAcquirePipe( aPipe.getHandle( ) );
252                 ::osl::Pipe aAcquirePipe1( NULL );
253 
254                 bRes = aAcquirePipe.is( );
255                 bRes1 = aAcquirePipe1.is( );
256 
257                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no aquire of handle.only validation test, do not know how to test no acquire.",
258                                         sal_True == bRes && sal_False == bRes1 );
259             }
260 
261         CPPUNIT_TEST_SUITE( ctors );
262         CPPUNIT_TEST( ctors_none );
263         CPPUNIT_TEST( ctors_name_option );
264         CPPUNIT_TEST( ctors_name_option_security );
265         CPPUNIT_TEST( ctors_copy );
266         CPPUNIT_TEST( ctors_no_acquire );
267         CPPUNIT_TEST( ctors_acquire );
268         CPPUNIT_TEST_SUITE_END( );
269     }; // class ctors
270 
271 
272     /** testing the method:
273         inline sal_Bool SAL_CALL is() const;
274     */
275     class is : public CppUnit::TestFixture
276     {
277     public:
278         void is_001( )
279             {
280                 ::osl::Pipe aPipe;
281 
282                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), check if the pipe is a valid one.", sal_False == aPipe.is( ) );
283             }
284 
285         void is_002( )
286             {
287                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
288 
289                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), a normal pipe creation.", sal_True == aPipe.is( ) );
290             }
291 
292         void is_003( )
293             {
294                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
295                 aPipe.clear( );
296 
297                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), an invalid case.", sal_False == aPipe.is( ) );
298             }
299 
300         void is_004( )
301             {
302                 ::osl::Pipe aPipe( NULL );
303 
304                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), an invalid constructor.", sal_False == aPipe.is( ) );
305             }
306 
307         CPPUNIT_TEST_SUITE( is );
308         CPPUNIT_TEST( is_001 );
309         CPPUNIT_TEST( is_002 );
310         CPPUNIT_TEST( is_003 );
311         CPPUNIT_TEST( is_004 );
312         CPPUNIT_TEST_SUITE_END( );
313     }; // class is
314 
315 
316     /** testing the methods:
317         inline sal_Bool create( const ::rtl::OUString & strName,
318         oslPipeOptions Options, const Security &rSec );
319         nline sal_Bool create( const ::rtl::OUString & strName,
320         oslPipeOptions Options = osl_Pipe_OPEN );
321     */
322     class create : public CppUnit::TestFixture
323     {
324     public:
325         sal_Bool bRes, bRes1;
326 
327         /**  tester comment:
328 
329         security create only be tested creation, security section is
330         untested yet.
331         */
332 
333         void create_named_security_001( )
334             {
335                 const Security rSec;
336                 ::osl::Pipe aPipe;
337                 bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSec );
338                 bRes1 = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSec );
339                 aPipe.clear( );
340 
341                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation.",
342                                         sal_True == bRes && sal_False == bRes1);
343             }
344 
345         void create_named_security_002( )
346             {
347                 const Security rSec;
348                 ::osl::Pipe aPipe, aPipe1;
349                 bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSec );
350                 bRes1 = aPipe1.create( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN, rSec );
351                 aPipe.clear( );
352 
353                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation and open.",
354                                         sal_True == bRes && sal_True == bRes1);
355             }
356 
357         void create_named_001( )
358             {
359                 ::osl::Pipe aPipe;
360                 bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
361                 bRes1 = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
362                 aPipe.clear( );
363 
364                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation.",
365                                         sal_True == bRes && sal_False == bRes1);
366             }
367 
368         void create_named_002( )
369             {
370                 ::osl::Pipe aPipe, aPipe1;
371                 bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
372                 bRes1 = aPipe1.create( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
373                 aPipe.clear( );
374 
375                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation and open.",
376                                         sal_True == bRes && sal_True == bRes1);
377             }
378 
379         void create_named_003( )
380             {
381                 ::osl::Pipe aPipe;
382                 bRes = aPipe.create( test::uniquePipeName(aTestPipeName) );
383                 aPipe.clear( );
384 
385                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test default option is open.",
386                                         sal_False == bRes );
387             }
388 
389         CPPUNIT_TEST_SUITE( create );
390         CPPUNIT_TEST( create_named_security_001 );
391         CPPUNIT_TEST( create_named_security_002 );
392         CPPUNIT_TEST( create_named_001 );
393         CPPUNIT_TEST( create_named_002 );
394         CPPUNIT_TEST( create_named_003 );
395         CPPUNIT_TEST_SUITE_END( );
396     }; // class create
397 
398 
399     /** testing the method:
400         inline void SAL_CALL clear();
401     */
402     class clear : public CppUnit::TestFixture
403     {
404     public:
405         sal_Bool bRes, bRes1;
406 
407         void clear_001( )
408             {
409                 ::osl::Pipe aPipe;
410                 aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
411                 aPipe.clear( );
412                 bRes = aPipe.is( );
413 
414                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test clear.",
415                                         sal_False == bRes );
416             }
417 
418         CPPUNIT_TEST_SUITE( clear );
419         CPPUNIT_TEST( clear_001 );
420         CPPUNIT_TEST_SUITE_END( );
421     }; // class clear
422 
423 
424     /** testing the methods:
425         inline Pipe& SAL_CALL operator= (const Pipe& pipe);
426         inline Pipe& SAL_CALL operator= (const oslPipe pipe );
427     */
428     class assign : public CppUnit::TestFixture
429     {
430     public:
431         sal_Bool bRes, bRes1;
432 
433         void assign_ref( )
434             {
435                 ::osl::Pipe aPipe, aPipe1;
436                 aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
437                 aPipe1 = aPipe;
438                 bRes = aPipe1.is( );
439                 bRes1 = aPipe == aPipe1;
440                 aPipe.close( );
441                 aPipe1.close( );
442 
443                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with reference.",
444                                         sal_True == bRes && sal_True == bRes1 );
445             }
446 
447         void assign_handle( )
448             {
449                 ::osl::Pipe aPipe, aPipe1;
450                 aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
451                 aPipe1 = aPipe.getHandle( );
452                 bRes = aPipe1.is( );
453                 bRes1 = aPipe == aPipe1;
454                 aPipe.close( );
455                 aPipe1.close( );
456 
457                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with handle.",
458                                         sal_True == bRes && sal_True == bRes1 );
459             }
460 
461         CPPUNIT_TEST_SUITE( assign );
462         CPPUNIT_TEST( assign_ref );
463         CPPUNIT_TEST( assign_handle );
464         CPPUNIT_TEST_SUITE_END( );
465     }; // class assign
466 
467 
468     /** testing the method:
469         inline sal_Bool SAL_CALL isValid() const;
470         isValid( ) has not been implemented under the following platforms, please refer to osl/pipe.hxx
471     */
472     /*class isValid : public CppUnit::TestFixture
473       {
474       public:
475       sal_Bool bRes, bRes1;
476 
477       void isValid_001( )
478       {
479       CPPUNIT_ASSERT_MESSAGE( "#test comment#: isValid() has not been implemented on all platforms.",
480       sal_False );
481       }
482 
483       CPPUNIT_TEST_SUITE( isValid );
484       CPPUNIT_TEST( isValid_001 );
485       CPPUNIT_TEST_SUITE_END( );
486       };*/ // class isValid
487 
488 
489     /** testing the method:
490         inline sal_Bool SAL_CALL operator==( const Pipe& rPipe ) const;
491     */
492     class isEqual : public CppUnit::TestFixture
493     {
494     public:
495         sal_Bool bRes, bRes1;
496 
497         void isEqual_001( )
498             {
499                 ::osl::Pipe aPipe;
500                 aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
501                 bRes  = aPipe == aPipe;
502                 aPipe.close( );
503 
504                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test isEqual(), compare its self.",
505                                         sal_True == bRes );
506             }
507 
508         void isEqual_002( )
509             {
510                 ::osl::Pipe aPipe, aPipe1, aPipe2;
511                 aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
512 
513                 aPipe1 = aPipe;
514                 aPipe2.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
515 
516                 bRes  = aPipe == aPipe1;
517                 bRes1 = aPipe == aPipe2;
518                 aPipe.close( );
519                 aPipe1.close( );
520                 aPipe2.close( );
521 
522                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test isEqual(),create one copy instance, and compare.",
523                                         sal_True == bRes && sal_False == bRes1 );
524             }
525 
526         CPPUNIT_TEST_SUITE( isEqual );
527         CPPUNIT_TEST( isEqual_001 );
528         CPPUNIT_TEST( isEqual_002 );
529         CPPUNIT_TEST_SUITE_END( );
530     }; // class isEqual
531 
532 
533     /** testing the method:
534         inline void SAL_CALL close();
535     */
536     class close : public CppUnit::TestFixture
537     {
538     public:
539         sal_Bool bRes, bRes1;
540 
541         void close_001( )
542             {
543                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipe1), osl_Pipe_CREATE );
544                 aPipe.close( );
545                 bRes = aPipe.is( );
546 
547                 aPipe.clear( );
548                 bRes1 = aPipe.is( );
549 
550                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: difference between close and clear.",
551                                         sal_True == bRes && sal_False == bRes1);
552             }
553 
554         void close_002( )
555             {
556                 ::osl::StreamPipe aPipe( test::uniquePipeName(aTestPipe1), osl_Pipe_CREATE );
557                 aPipe.close( );
558                 int nRet = aPipe.send( m_pTestString1.getStr(), 3 );
559 
560                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: use after close.",
561                                         OSL_PIPE_FAIL == nRet );
562             }
563 
564         CPPUNIT_TEST_SUITE( close );
565         CPPUNIT_TEST( close_001 );
566         CPPUNIT_TEST( close_002 );
567         CPPUNIT_TEST_SUITE_END( );
568     }; // class close
569 
570 
571     /** testing the method:
572         inline oslPipeError SAL_CALL accept(StreamPipe& Connection);
573         please refer to StreamPipe::recv
574     */
575    /* class accept : public CppUnit::TestFixture
576     {
577     public:
578         sal_Bool bRes, bRes1;
579 
580         void accept_001( )
581             {
582 
583                 // CPPUNIT_ASSERT_MESSAGE( "#test comment#: accept, untested.", 1 == 1 );
584                 //CPPUNIT_ASSERT_STUB();
585             }
586 
587         CPPUNIT_TEST_SUITE( accept );
588         CPPUNIT_TEST( accept_001 );
589         CPPUNIT_TEST_SUITE_END( );
590     };*/ // class accept
591 
592 
593     /** testing the method:
594         inline oslPipeError SAL_CALL getError() const;
595     */
596     class getError : public CppUnit::TestFixture
597     {
598     public:
599         sal_Bool bRes, bRes1;
600         /*
601           PipeError[]= {
602           { 0,                     osl_Pipe_E_None                      },      // no error
603           { EPROTOTYPE,    osl_Pipe_E_NoProtocol            },  // Protocol wrong type for socket
604           { ENOPROTOOPT,           osl_Pipe_E_NoProtocol            },  // Protocol not available
605           { EPROTONOSUPPORT, osl_Pipe_E_NoProtocol              },      // Protocol not supported
606           { ESOCKTNOSUPPORT, osl_Pipe_E_NoProtocol              },      // Socket type not supported
607           { EPFNOSUPPORT,          osl_Pipe_E_NoProtocol        },      // Protocol family not supported
608           { EAFNOSUPPORT,          osl_Pipe_E_NoProtocol        },      // Address family not supported by
609           // protocol family
610           { ENETRESET,     osl_Pipe_E_NetworkReset              },      // Network dropped connection because
611           // of reset
612           { ECONNABORTED,          osl_Pipe_E_ConnectionAbort   },      // Software caused connection abort
613           { ECONNRESET,    osl_Pipe_E_ConnectionReset   },      // Connection reset by peer
614           { ENOBUFS,       osl_Pipe_E_NoBufferSpace     },      // No buffer space available
615           { ETIMEDOUT,     osl_Pipe_E_TimedOut                  },      // Connection timed out
616           { ECONNREFUSED,          osl_Pipe_E_ConnectionRefused },      // Connection refused
617           { -1,            osl_Pipe_E_invalidError              }
618           };
619           did not define osl_Pipe_E_NotFound, osl_Pipe_E_AlreadyExists
620         */
621 
622         void getError_001( )
623             {
624                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
625                 oslPipeError nError = aPipe.getError( );
626                 printPipeError( aPipe );
627                 aPipe.clear( );
628 
629                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: open a non-exist pipe.",
630                                         nError != osl_Pipe_E_None );
631             }
632 
633         void getError_002( )
634             {
635                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
636                 ::osl::Pipe aPipe1( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
637                 oslPipeError nError = aPipe.getError( );
638                 printPipeError( aPipe );
639                 aPipe.clear( );
640                 aPipe1.clear( );
641 
642                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: create an already exist pipe.",
643                                         nError != osl_Pipe_E_None );
644             }
645 
646         CPPUNIT_TEST_SUITE( getError );
647         CPPUNIT_TEST( getError_001 );
648         CPPUNIT_TEST( getError_002 );
649         CPPUNIT_TEST_SUITE_END( );
650     }; // class getError
651 
652 
653     /** testing the method:
654         inline oslPipe SAL_CALL getHandle() const;
655     */
656     class getHandle : public CppUnit::TestFixture
657     {
658     public:
659         sal_Bool bRes, bRes1;
660 
661         void getHandle_001( )
662             {
663                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
664                 bRes = aPipe == aPipe.getHandle( );
665                 aPipe.clear( );
666 
667                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: one pipe should equal to its handle.",
668                                         sal_True == bRes );
669             }
670 
671         void getHandle_002( )
672             {
673                 ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
674                 ::osl::Pipe aPipe1( aPipe.getHandle( ) );
675                 bRes = aPipe == aPipe1;
676                 aPipe.clear( );
677                 aPipe1.clear( );
678 
679                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: one pipe derived from another pipe's handle.",
680                                         sal_True == bRes );
681             }
682 
683         CPPUNIT_TEST_SUITE( getHandle );
684         CPPUNIT_TEST( getHandle_001 );
685         CPPUNIT_TEST( getHandle_002 );
686         CPPUNIT_TEST_SUITE_END( );
687     }; // class getHandle
688 
689 
690 // -----------------------------------------------------------------------------
691     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::ctors);
692     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::is);
693     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::create);
694     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::clear);
695     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::assign);
696 //CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::isValid);
697     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::isEqual);
698     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::close);
699     //CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::accept);
700     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::getError);
701     CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::getHandle);
702 // -----------------------------------------------------------------------------
703 
704 } // namespace osl_Pipe
705 
706 
707 namespace osl_StreamPipe
708 {
709 
710     /** testing the methods:
711         inline StreamPipe();
712         inline StreamPipe(oslPipe Pipe);;
713         inline StreamPipe(const StreamPipe& Pipe);
714         inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options = osl_Pipe_OPEN);
715         inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options, const Security &rSec );
716         inline StreamPipe( oslPipe pipe, __sal_NoAcquire noacquire );
717     */
718     class ctors : public CppUnit::TestFixture
719     {
720     public:
721         sal_Bool bRes, bRes1;
722 
723         void ctors_none( )
724             {
725                 // create a pipe.
726                 ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
727                 // create an unattached pipe.
728                 ::osl::StreamPipe aStreamPipe1;
729                 bRes  = aStreamPipe1.is( );
730 
731                 // assign it and check.
732                 aStreamPipe1 = aStreamPipe;
733                 bRes1 = aStreamPipe1.is( );
734                 aStreamPipe.clear( );
735                 aStreamPipe1.clear( );
736 
737                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no parameter, before and after assign.",
738                                         sal_False == bRes && sal_True == bRes1 );
739             }
740 
741         void ctors_handle( )
742             {
743                 // create a pipe.
744                 ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
745                 // create a pipe with last handle.
746                 ::osl::StreamPipe aStreamPipe1( aStreamPipe.getHandle( ) );
747                 bRes  = aStreamPipe1.is( ) && aStreamPipe == aStreamPipe1;
748                 aStreamPipe.clear( );
749                 aStreamPipe1.clear( );
750 
751                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with other's handle.",
752                                         sal_True == bRes );
753             }
754 
755         void ctors_copy( )
756             {
757                 // create a pipe.
758                 ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
759                 // create an unattached pipe.
760                 ::osl::StreamPipe aStreamPipe1( aStreamPipe );
761                 bRes  = aStreamPipe1.is( ) && aStreamPipe == aStreamPipe1;
762                 aStreamPipe.clear( );
763                 aStreamPipe1.clear( );
764 
765                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test copy constructor.",
766                                         sal_True == bRes );
767             }
768 
769         void ctors_name_option( )
770             {
771                 // create a pipe.
772                 ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
773                 // create an unattached pipe.
774                 ::osl::StreamPipe aStreamPipe1( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
775                 bRes  = aStreamPipe1.is( ) && aStreamPipe.is( );
776                 aStreamPipe.clear( );
777                 aStreamPipe1.clear( );
778 
779                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name and option.",
780                                         sal_True == bRes );
781             }
782 
783         void ctors_name_option_security( )
784             {
785                 /// create a security pipe.
786                 const ::osl::Security rSecurity;
787                 ::osl::StreamPipe aSecurityPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSecurity );
788 
789                 bRes = aSecurityPipe.is( );
790                 aSecurityPipe.clear( );
791 
792                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name, option and security, the test of security is not implemented yet.",
793                                         sal_True == bRes );
794             }
795 
796         /**  tester comment:
797 
798         When test the following constructor, don't know how to test the
799         acquire and no acquire action. possible plans:
800         1.release one handle and check the other( did not success since the
801         other still exist and valid. )
802         2. release one handle twice to see getLastError( )(the getLastError
803         always returns invalidError(LINUX)).
804         */
805 
806         void ctors_no_acquire( )
807             {
808                 // create a pipe.
809                 ::osl::StreamPipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
810                 // constructs a pipe reference without acquiring the handle.
811                 ::osl::StreamPipe aNoAcquirePipe( aPipe.getHandle( ), SAL_NO_ACQUIRE );
812 
813                 bRes = aNoAcquirePipe.is( );
814                 aPipe.clear( );
815                 // bRes1 = aNoAcquirePipe.is( );
816 
817                 CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no aquire of handle, only validation test, do not know how to test no acquire.",
818                                         sal_True == bRes );
819             }
820 
821         CPPUNIT_TEST_SUITE( ctors );
822         CPPUNIT_TEST( ctors_none );
823         CPPUNIT_TEST( ctors_handle );
824         CPPUNIT_TEST( ctors_copy );
825         CPPUNIT_TEST( ctors_name_option );
826         CPPUNIT_TEST( ctors_name_option_security );
827         CPPUNIT_TEST( ctors_no_acquire );
828         CPPUNIT_TEST_SUITE_END( );
829     }; // class ctors
830 
831 
832     /** testing the methods:
833         inline StreamPipe & SAL_CALL operator=(oslPipe Pipe);
834         inline StreamPipe& SAL_CALL operator=(const Pipe& pipe);
835         mindy: not implementated in osl/pipe.hxx, so remove the cases
836     */
837     /*
838        class assign : public CppUnit::TestFixture
839        {
840        public:
841        sal_Bool bRes, bRes1;
842 
843        void assign_ref( )
844        {
845        ::osl::StreamPipe aPipe, aPipe1;
846        aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
847        aPipe1 = aPipe;
848        bRes = aPipe1.is( );
849        bRes1 = aPipe == aPipe1;
850        aPipe.close( );
851        aPipe1.close( );
852 
853        CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with reference.",
854        sal_True == bRes && sal_True == bRes1 );
855        }
856 
857        void assign_handle( )
858        {
859        ::osl::StreamPipe * pPipe = new ::osl::StreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
860        ::osl::StreamPipe * pAssignPipe = new ::osl::StreamPipe;
861        *pAssignPipe = pPipe->getHandle( );
862 
863        bRes = pAssignPipe->is( );
864        bRes1 = ( *pPipe == *pAssignPipe );
865        pPipe->close( );
866 
867        delete pAssignPipe;
868 
869        CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with handle., seems not implemented under (LINUX)(W32)",
870        sal_True == bRes && sal_True == bRes1  );
871        }
872 
873        CPPUNIT_TEST_SUITE( assign );
874        CPPUNIT_TEST( assign_ref );
875        CPPUNIT_TEST( assign_handle );
876        CPPUNIT_TEST_SUITE_END( );
877        };*/ // class assign
878 
879 
880     /** wait _nSec seconds.
881      */
882     void thread_sleep( sal_Int32 _nSec )
883     {
884         /// print statement in thread process must use fflush() to force display.
885         // printf("wait %d seconds. ", _nSec );
886         fflush(stdout);
887 
888 #ifdef WNT                               //Windows
889         Sleep( _nSec * 1000 );
890 #endif
891 #if ( defined UNX ) || ( defined OS2 )   //Unix
892         sleep( _nSec );
893 #endif
894         // printf("done\n" );
895     }
896     // test read/write & send/recv data to pipe
897     // -----------------------------------------------------------------------------
898 
899     class Pipe_DataSink_Thread : public Thread
900     {
901     public:
902         sal_Char buf[256];
903         Pipe_DataSink_Thread( ) { }
904 
905         ~Pipe_DataSink_Thread( )
906             {
907             }
908     protected:
909         void SAL_CALL run( )
910             {
911                 sal_Int32 nChars = 0;
912 
913                 printf("open pipe\n");
914                 ::osl::StreamPipe aSenderPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );  // test::uniquePipeName(aTestPipeName) is a string = "TestPipe"
915                 if ( aSenderPipe.is() == sal_False )
916                 {
917                     printf("pipe open failed! \n");
918                 }
919                 else
920                 {
921                     printf("read\n");
922                     nChars = aSenderPipe.read( buf, m_pTestString1.getLength() + 1 );
923                     if ( nChars < 0 )
924                     {
925                         printf("read failed! \n");
926                         return;
927                     }
928                     printf("buffer is %s \n", buf);
929                     printf("send\n");
930                     nChars = aSenderPipe.send( m_pTestString2.getStr(), m_pTestString2.getLength() + 1 );
931                     if ( nChars < 0 )
932                     {
933                         printf("client send failed! \n");
934                         return;
935                     }
936                 }
937             }
938 
939     };
940 
941     // -----------------------------------------------------------------------------
942 
943     class Pipe_DataSource_Thread : public Thread
944     {
945     public:
946         sal_Char buf[256];
947         //::osl::StreamPipe aListenPipe;  //( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
948         ::osl::Pipe aListenPipe;
949         ::osl::StreamPipe aConnectionPipe;
950         Pipe_DataSource_Thread( )
951             {
952                 printf("create pipe\n");
953                 aListenPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
954             }
955         ~Pipe_DataSource_Thread( )
956             {
957                 aListenPipe.close();
958             }
959     protected:
960         void SAL_CALL run( )
961             {
962                 //create pipe.
963                 sal_Int32 nChars;
964                 //::osl::StreamPipe aListenPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
965                 printf("listen\n");
966                 if ( aListenPipe.is() == sal_False )
967                 {
968                     printf("pipe create failed! \n");
969                 }
970                 else
971                 {
972                     //::osl::StreamPipe aConnectionPipe;
973 
974                     //start server and wait for connection.
975                     printf("accept\n");
976                     if ( osl_Pipe_E_None != aListenPipe.accept( aConnectionPipe ) )
977                     {
978                         printf("pipe accept failed!");
979                         return;
980                     }
981                     printf("write\n");
982                     // write to pipe
983                     nChars = aConnectionPipe.write( m_pTestString1.getStr(), m_pTestString1.getLength() + 1 );
984                     if ( nChars < 0)
985                     {
986                         printf("server write failed! \n");
987                         return;
988                     }
989                     printf("recv\n");
990                     nChars = aConnectionPipe.recv( buf, 256 );
991 
992                     if ( nChars < 0)
993                     {
994                         printf("server receive failed! \n");
995                         return;
996                     }
997                     //thread_sleep( 2 );
998                     printf("received message is: %s\n", buf );
999                     //aConnectionPipe.close();
1000                 }
1001             }
1002     };
1003 
1004     /** testing the method: read/write/send/recv and Pipe::accept
1005      */
1006     class recv : public CppUnit::TestFixture
1007     {
1008     public:
1009         sal_Bool bRes, bRes1;
1010 
1011         void recv_001( )
1012             {
1013                 //launch threads.
1014                 Pipe_DataSource_Thread myDataSourceThread;
1015                 Pipe_DataSink_Thread myDataSinkThread;
1016                 myDataSourceThread.create( );
1017                 thread_sleep( 1 );
1018                 myDataSinkThread.create( );
1019 
1020                 //wait until the thread terminate
1021                 myDataSinkThread.join( );
1022                 myDataSourceThread.join( );
1023 
1024                 int nCompare1 = strcmp( myDataSinkThread.buf, m_pTestString1.getStr() );
1025                 int nCompare2 = strcmp( myDataSourceThread.buf, m_pTestString2.getStr() );
1026                 CPPUNIT_ASSERT_MESSAGE( "test send/recv/write/read.", nCompare1 == 0 && nCompare2 == 0 );
1027             }
1028         //close pipe when accept
1029         void recv_002()
1030             {
1031                 thread_sleep( 1 );
1032 
1033                 Pipe_DataSource_Thread myDataSourceThread;
1034                 Pipe_DataSink_Thread myDataSinkThread;
1035                 myDataSourceThread.create( );
1036                 thread_sleep( 1 );
1037                 myDataSourceThread.aListenPipe.close();
1038                 myDataSourceThread.join( );
1039                 //no condition judgement here, if the case could finish excuting within 1 or 2 seconds, it passes.
1040             }
1041 
1042         CPPUNIT_TEST_SUITE( recv );
1043         CPPUNIT_TEST( recv_001 );
1044         CPPUNIT_TEST( recv_002 );
1045         CPPUNIT_TEST_SUITE_END( );
1046     }; // class recv
1047 
1048 // -----------------------------------------------------------------------------
1049     CPPUNIT_TEST_SUITE_REGISTRATION(osl_StreamPipe::ctors);
1050 //CPPUNIT_TEST_SUITE_REGISTRATION(osl_StreamPipe::assign);
1051     CPPUNIT_TEST_SUITE_REGISTRATION(osl_StreamPipe::recv);
1052 // -----------------------------------------------------------------------------
1053 
1054 } // namespace osl_StreamPipe
1055 
1056 CPPUNIT_PLUGIN_IMPLEMENT();
1057