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