xref: /aoo4110/main/sal/qa/rtl/logfile/rtl_logfile.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 
25*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
26*b1cdbd2cSJim Jagielski #include "precompiled_sal.hxx"
27*b1cdbd2cSJim Jagielski // LLA:
28*b1cdbd2cSJim Jagielski // this file is converted to use with testshl2
29*b1cdbd2cSJim Jagielski // original was placed in sal/test/textenc.cxx
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
33*b1cdbd2cSJim Jagielski #include <stdio.h>
34*b1cdbd2cSJim Jagielski #include <stdlib.h>
35*b1cdbd2cSJim Jagielski #include <string.h>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #if defined(UNX) || defined(OS2)
38*b1cdbd2cSJim Jagielski #       include <unistd.h>
39*b1cdbd2cSJim Jagielski #endif
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
42*b1cdbd2cSJim Jagielski #include <testshl/simpleheader.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski // #ifndef      _OSL_MODULE_HXX_
45*b1cdbd2cSJim Jagielski // #include <osl/module.hxx>
46*b1cdbd2cSJim Jagielski // #endif
47*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
48*b1cdbd2cSJim Jagielski #if ( defined WNT )                     // Windows
49*b1cdbd2cSJim Jagielski #include <tools/prewin.h>
50*b1cdbd2cSJim Jagielski // #define UNICODE
51*b1cdbd2cSJim Jagielski // #define WIN32_LEAN_AND_MEAN
52*b1cdbd2cSJim Jagielski // #include <windows.h>
53*b1cdbd2cSJim Jagielski #include <tchar.h>
54*b1cdbd2cSJim Jagielski #include <tools/postwin.h>
55*b1cdbd2cSJim Jagielski #endif
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski using namespace ::osl;
58*b1cdbd2cSJim Jagielski 
printUString(const::rtl::OUString & str,const sal_Char * msg="")59*b1cdbd2cSJim Jagielski inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" )
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski     if (strlen(msg) > 0)
63*b1cdbd2cSJim Jagielski     {
64*b1cdbd2cSJim Jagielski         t_print("%s: ", msg );
65*b1cdbd2cSJim Jagielski     }
66*b1cdbd2cSJim Jagielski     rtl::OString aString;
67*b1cdbd2cSJim Jagielski     aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
68*b1cdbd2cSJim Jagielski     t_print("%s\n", (char *)aString.getStr( ) );
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski /** get the absolute source file URL "file:///.../sal/qa/rtl/logfile/"
72*b1cdbd2cSJim Jagielski   */
73*b1cdbd2cSJim Jagielski 
getTempPath(void)74*b1cdbd2cSJim Jagielski inline ::rtl::OUString getTempPath( void )
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski #ifdef UNX
77*b1cdbd2cSJim Jagielski     rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///tmp/"));
78*b1cdbd2cSJim Jagielski #else /* Windows */
79*b1cdbd2cSJim Jagielski     rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///c:/temp/"));
80*b1cdbd2cSJim Jagielski #endif
81*b1cdbd2cSJim Jagielski     return suDirURL;
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski /** if the file exist
85*b1cdbd2cSJim Jagielski  */
t_fileExist(rtl::OUString const & _sFilename)86*b1cdbd2cSJim Jagielski bool t_fileExist(rtl::OUString const& _sFilename)
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski     ::osl::FileBase::RC   nError1;
89*b1cdbd2cSJim Jagielski     ::osl::File aTestFile( _sFilename );
90*b1cdbd2cSJim Jagielski     nError1 = aTestFile.open ( OpenFlag_Read );
91*b1cdbd2cSJim Jagielski     if ( ( ::osl::FileBase::E_NOENT != nError1 ) && ( ::osl::FileBase::E_ACCES != nError1 ) )
92*b1cdbd2cSJim Jagielski     {
93*b1cdbd2cSJim Jagielski         aTestFile.close( );
94*b1cdbd2cSJim Jagielski         return true;
95*b1cdbd2cSJim Jagielski     }
96*b1cdbd2cSJim Jagielski     return false;
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski /** get Current PID.
99*b1cdbd2cSJim Jagielski */
getCurrentPID()100*b1cdbd2cSJim Jagielski inline ::rtl::OUString getCurrentPID(  )
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski         //~ Get current PID and turn it into OUString;
103*b1cdbd2cSJim Jagielski         int nPID = 0;
104*b1cdbd2cSJim Jagielski #ifdef WNT
105*b1cdbd2cSJim Jagielski         nPID = GetCurrentProcessId();
106*b1cdbd2cSJim Jagielski #else
107*b1cdbd2cSJim Jagielski         nPID = getpid();
108*b1cdbd2cSJim Jagielski #endif
109*b1cdbd2cSJim Jagielski         return ( ::rtl::OUString::valueOf( ( long )nPID ) );
110*b1cdbd2cSJim Jagielski }
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
114*b1cdbd2cSJim Jagielski /*
115*b1cdbd2cSJim Jagielski  * LLA:
116*b1cdbd2cSJim Jagielski  * check if logfile is create
117*b1cdbd2cSJim Jagielski  * be careful with relative logfiles they will create near the source, maybe it's no write access to it.
118*b1cdbd2cSJim Jagielski  * use absolute path to logfile instead.
119*b1cdbd2cSJim Jagielski  */
120*b1cdbd2cSJim Jagielski namespace rtl_logfile
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski     class logfile : public CppUnit::TestFixture
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski     public:
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski         //directly call rtl_logfile_trace
logfile_001()127*b1cdbd2cSJim Jagielski         void logfile_001()
128*b1cdbd2cSJim Jagielski         {
129*b1cdbd2cSJim Jagielski #ifdef SOLARIS
130*b1cdbd2cSJim Jagielski                 putenv(const_cast< char * >("RTL_LOGFILE=/tmp/logfile1"));
131*b1cdbd2cSJim Jagielski #endif
132*b1cdbd2cSJim Jagielski #ifdef WNT
133*b1cdbd2cSJim Jagielski                 putenv("RTL_LOGFILE=c:\\temp\\logfile1");
134*b1cdbd2cSJim Jagielski #endif
135*b1cdbd2cSJim Jagielski #ifdef LINUX
136*b1cdbd2cSJim Jagielski                 setenv("RTL_LOGFILE", "/tmp/logfile1", 0);
137*b1cdbd2cSJim Jagielski #endif
138*b1cdbd2cSJim Jagielski                 rtl_logfile_trace("trace %d\n", 2 );
139*b1cdbd2cSJim Jagielski                 rtl_logfile_trace("trace %d %d\n" , 1,2 );
140*b1cdbd2cSJim Jagielski                 rtl_logfile_trace("trace %d %d %d\n" , 1 , 2 ,3 );
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski                 rtl::OUString suFilePath = getTempPath();
143*b1cdbd2cSJim Jagielski                 suFilePath +=  rtl::OUString::createFromAscii("logfile1_") + getCurrentPID( );
144*b1cdbd2cSJim Jagielski                 suFilePath +=  rtl::OUString::createFromAscii(".log");
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski                 ::osl::FileBase::RC   nError1;
147*b1cdbd2cSJim Jagielski                 ::osl::File aTestFile( suFilePath );
148*b1cdbd2cSJim Jagielski                 printUString( suFilePath );
149*b1cdbd2cSJim Jagielski                 nError1 = aTestFile.open ( OpenFlag_Read );
150*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE("create the log file: but the logfile does not exist",
151*b1cdbd2cSJim Jagielski                                        ( ::osl::FileBase::E_NOENT != nError1 ) &&
152*b1cdbd2cSJim Jagielski                                        ( ::osl::FileBase::E_ACCES != nError1 ) );
153*b1cdbd2cSJim Jagielski                 sal_Char       buffer_read[400];
154*b1cdbd2cSJim Jagielski                 sal_uInt64      nCount_read;
155*b1cdbd2cSJim Jagielski                 nError1 = aTestFile.read( buffer_read, 400, nCount_read );
156*b1cdbd2cSJim Jagielski                 //t_print("buffer is %s\n", buffer_read );
157*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE("write right logs", strstr( buffer_read, "trace 1 2 3") != NULL );
158*b1cdbd2cSJim Jagielski                 aTestFile.sync();
159*b1cdbd2cSJim Jagielski                 aTestFile.close();
160*b1cdbd2cSJim Jagielski                 /*// delete logfile on the disk
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski                 nError1 = osl::File::remove( suFilePath );
163*b1cdbd2cSJim Jagielski                 printError( nError1 );
164*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: remove ", ( ::osl::FileBase::E_None == nError1 ) || ( nError1 == ::osl::FileBase::E_NOENT ) );
165*b1cdbd2cSJim Jagielski                 */
166*b1cdbd2cSJim Jagielski         }
167*b1cdbd2cSJim Jagielski         //Profiling output should only be generated for a special product version of OpenOffice
168*b1cdbd2cSJim Jagielski         // which is compiled with a defined preprocessor symbol 'TIMELOG'. Now, the symbol not defined
logfile_002()169*b1cdbd2cSJim Jagielski         void logfile_002()
170*b1cdbd2cSJim Jagielski             {
171*b1cdbd2cSJim Jagielski #ifdef SOLARIS
172*b1cdbd2cSJim Jagielski                 putenv(const_cast< char * >("RTL_LOGFILE=/tmp/logfile2"));
173*b1cdbd2cSJim Jagielski #endif
174*b1cdbd2cSJim Jagielski #ifdef WNT
175*b1cdbd2cSJim Jagielski                 putenv("RTL_LOGFILE=c:\\temp\\logfile2");
176*b1cdbd2cSJim Jagielski #endif
177*b1cdbd2cSJim Jagielski #ifdef LINUX
178*b1cdbd2cSJim Jagielski                 setenv("RTL_LOGFILE", "/tmp/logfile2", 0);
179*b1cdbd2cSJim Jagielski #endif
180*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_TRACE( "trace the log" );
181*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_TRACE1( "trace %d" , 1 );
182*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_TRACE2( "trace %d %d" , 1,2 );
183*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_TRACE3( "trace %d %d %d" , 1 , 2 ,3 );
184*b1cdbd2cSJim Jagielski // TODO: assertion test!
185*b1cdbd2cSJim Jagielski         }
186*b1cdbd2cSJim Jagielski 
logfile_003()187*b1cdbd2cSJim Jagielski         void logfile_003()
188*b1cdbd2cSJim Jagielski             {
189*b1cdbd2cSJim Jagielski #ifdef SOLARIS
190*b1cdbd2cSJim Jagielski                 putenv(const_cast< char * >("RTL_LOGFILE=/tmp/logfile2"));
191*b1cdbd2cSJim Jagielski #endif
192*b1cdbd2cSJim Jagielski #ifdef WNT
193*b1cdbd2cSJim Jagielski                 putenv("RTL_LOGFILE=c:\\temp\\logfile2");
194*b1cdbd2cSJim Jagielski #endif
195*b1cdbd2cSJim Jagielski #ifdef LINUX
196*b1cdbd2cSJim Jagielski                 setenv("RTL_LOGFILE", "/tmp/logfile2", 0);
197*b1cdbd2cSJim Jagielski #endif
198*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_CONTEXT ( foo , "foo-function" );
199*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_CONTEXT_TRACE ( foo , "trace" );
200*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_CONTEXT_TRACE1 ( foo , "trace %d" , 1 );
201*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_CONTEXT_TRACE2 ( foo , "trace %d %d" , 1 , 2 );
202*b1cdbd2cSJim Jagielski                 RTL_LOGFILE_CONTEXT_TRACE3 ( foo , "trace %d %d %d" , 1 , 2 , 3);
203*b1cdbd2cSJim Jagielski // TODO: assertion test!
204*b1cdbd2cSJim Jagielski             }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE( logfile );
208*b1cdbd2cSJim Jagielski         CPPUNIT_TEST( logfile_001 );
209*b1cdbd2cSJim Jagielski         CPPUNIT_TEST( logfile_002 );
210*b1cdbd2cSJim Jagielski         CPPUNIT_TEST( logfile_003 );
211*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END( );
212*b1cdbd2cSJim Jagielski     };
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski } // namespace rtl_logfile
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
217*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_logfile::logfile, "rtl_logfile" );
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
220*b1cdbd2cSJim Jagielski NOADDITIONAL;
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski //~ do some clean up work after all test completed.
223*b1cdbd2cSJim Jagielski class GlobalObject
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski public:
~GlobalObject()226*b1cdbd2cSJim Jagielski     ~GlobalObject()
227*b1cdbd2cSJim Jagielski         {
228*b1cdbd2cSJim Jagielski             try
229*b1cdbd2cSJim Jagielski             {
230*b1cdbd2cSJim Jagielski                 t_print( "\n#Do some clean-ups ... only delete logfile1_*.log here!\n" );
231*b1cdbd2cSJim Jagielski                 rtl::OUString suFilePath = getTempPath();
232*b1cdbd2cSJim Jagielski                 suFilePath +=  rtl::OUString::createFromAscii("logfile1_") + getCurrentPID( );
233*b1cdbd2cSJim Jagielski                 suFilePath +=  rtl::OUString::createFromAscii(".log");
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski                 //if ( ifFileExist( suFilePath )  == sal_True )
236*b1cdbd2cSJim Jagielski                 ::osl::FileBase::RC nError1;
237*b1cdbd2cSJim Jagielski                 nError1 = osl::File::remove( suFilePath );
238*b1cdbd2cSJim Jagielski #ifdef WNT
239*b1cdbd2cSJim Jagielski                 t_print("Please remove logfile* manully! Error is Permision denied!");
240*b1cdbd2cSJim Jagielski #endif
241*b1cdbd2cSJim Jagielski             }
242*b1cdbd2cSJim Jagielski             catch (CppUnit::Exception &e)
243*b1cdbd2cSJim Jagielski             {
244*b1cdbd2cSJim Jagielski                 t_print("Exception caught in GlobalObject dtor(). Exception message: '%s'. Source line: %d\n", e.what(), e.sourceLine().lineNumber());
245*b1cdbd2cSJim Jagielski             }
246*b1cdbd2cSJim Jagielski             catch (...)
247*b1cdbd2cSJim Jagielski             {
248*b1cdbd2cSJim Jagielski                 t_print("Exception caught (...) in GlobalObject dtor()\n");
249*b1cdbd2cSJim Jagielski             }
250*b1cdbd2cSJim Jagielski         }
251*b1cdbd2cSJim Jagielski };
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski GlobalObject theGlobalObject;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 
257