1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sal.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir // Documentation about bootstraping can be found at:
32*cdf0e10cSrcweir // http://udk.openoffice.org/common/man/concept/micro_deployment.html
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <math.h>
35*cdf0e10cSrcweir #include <stdio.h>
36*cdf0e10cSrcweir #include <stdlib.h>
37*cdf0e10cSrcweir #include <algorithm> // STL
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir #include "testshl/stringhelper.hxx"
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir #include <testshl/simpleheader.hxx>
42*cdf0e10cSrcweir //#include "stringhelper.hxx"
43*cdf0e10cSrcweir //#include "valueequal.hxx"
44*cdf0e10cSrcweir #include <rtl/bootstrap.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
47*cdf0e10cSrcweir #include <rtl/ustring.h>
48*cdf0e10cSrcweir #include <rtl/ustring.hxx>
49*cdf0e10cSrcweir #include <osl/file.hxx>
50*cdf0e10cSrcweir #include <osl/module.hxx>
51*cdf0e10cSrcweir #include <osl/process.h> /* osl_getExecutableFile() */
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir #include <osl/thread.hxx>
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir // using namespace osl;
56*cdf0e10cSrcweir using namespace rtl;
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir #define TESTSHL2_INI "testshl2"
59*cdf0e10cSrcweir #define PSEUDO_INI   "pseudo"
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir /** print a UNI_CODE String. And also print some comments of the string.
62*cdf0e10cSrcweir  */
63*cdf0e10cSrcweir inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" )
64*cdf0e10cSrcweir {
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir     if (strlen(msg) > 0)
67*cdf0e10cSrcweir     {
68*cdf0e10cSrcweir         t_print("%s: ", msg );
69*cdf0e10cSrcweir     }
70*cdf0e10cSrcweir     rtl::OString aString;
71*cdf0e10cSrcweir     aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
72*cdf0e10cSrcweir     t_print("%s\n", (char *)aString.getStr( ) );
73*cdf0e10cSrcweir }
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir /** if the file exist
76*cdf0e10cSrcweir  */
77*cdf0e10cSrcweir bool t_fileExist(rtl::OUString const& _sFilename)
78*cdf0e10cSrcweir {
79*cdf0e10cSrcweir     ::osl::FileBase::RC   nError1;
80*cdf0e10cSrcweir     ::osl::File aTestFile( _sFilename );
81*cdf0e10cSrcweir     nError1 = aTestFile.open ( OpenFlag_Read );
82*cdf0e10cSrcweir     if ( ( ::osl::FileBase::E_NOENT != nError1 ) && ( ::osl::FileBase::E_ACCES != nError1 ) )
83*cdf0e10cSrcweir     {
84*cdf0e10cSrcweir         aTestFile.close( );
85*cdf0e10cSrcweir         return true;
86*cdf0e10cSrcweir     }
87*cdf0e10cSrcweir     return false;
88*cdf0e10cSrcweir }
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir /** get the exectutable path ( here is bootstrap_process), on Linux, such as "sal/unxlngi4.pro/bin/"
91*cdf0e10cSrcweir   */
92*cdf0e10cSrcweir inline ::rtl::OUString getModulePath( void )
93*cdf0e10cSrcweir {
94*cdf0e10cSrcweir     ::rtl::OUString suDirPath;
95*cdf0e10cSrcweir     ::osl::Module::getUrlFromAddress( ( oslGenericFunction ) &getModulePath, suDirPath );
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir     suDirPath = suDirPath.copy( 0, suDirPath.lastIndexOf('/') );
98*cdf0e10cSrcweir     suDirPath = suDirPath.copy( 0, suDirPath.lastIndexOf('/') + 1);
99*cdf0e10cSrcweir     suDirPath += rtl::OUString::createFromAscii("bin");
100*cdf0e10cSrcweir     return suDirPath;
101*cdf0e10cSrcweir }
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir #define TESTSHL2_INI "testshl2"
104*cdf0e10cSrcweir #define PSEUDO_INI   "pseudo"
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir static rtl::OUString getExecutableDirectory()
108*cdf0e10cSrcweir {
109*cdf0e10cSrcweir     rtl::OUString fileName;
110*cdf0e10cSrcweir     osl_getExecutableFile(&fileName.pData);
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir     sal_Int32 nDirEnd = fileName.lastIndexOf('/');
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir     OSL_ENSURE(nDirEnd >= 0, "Cannot locate executable directory");
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir     rtl::OUString aDirURL = fileName.copy(0, nDirEnd);
117*cdf0e10cSrcweir     return aDirURL;
118*cdf0e10cSrcweir }
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir // get the URL of testshl2rc/rtlrc/pseudorc
122*cdf0e10cSrcweir inline rtl::OUString t_getSourcePath(rtl::OString const& _sFilename)
123*cdf0e10cSrcweir {
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir      rtl::OUString aDirURL(getExecutableDirectory());
126*cdf0e10cSrcweir      aDirURL += OUString::createFromAscii( "/");
127*cdf0e10cSrcweir      aDirURL += OUString::createFromAscii( _sFilename.getStr() );
128*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
129*cdf0e10cSrcweir     aDirURL += rtl::OUString::createFromAscii(".ini");
130*cdf0e10cSrcweir #else
131*cdf0e10cSrcweir     aDirURL += rtl::OUString::createFromAscii("rc");
132*cdf0e10cSrcweir #endif
133*cdf0e10cSrcweir     return aDirURL;
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir // LLA: does not right work on my personal laptop, SRC_ROOT does not show where the source is :-(.
136*cdf0e10cSrcweir /*
137*cdf0e10cSrcweir   sal_Char *  pStr = getenv("SRC_ROOT");
138*cdf0e10cSrcweir   rtl::OUString suPath;
139*cdf0e10cSrcweir   if (filename != "")
140*cdf0e10cSrcweir   {
141*cdf0e10cSrcweir   suPath = rtl::OUString::createFromAscii(pStr) + rtl::OUString::createFromAscii( "/sal/qa/rtl/bootstrap/" )
142*cdf0e10cSrcweir   + rtl::OUString::createFromAscii( filename );
143*cdf0e10cSrcweir   }
144*cdf0e10cSrcweir   else
145*cdf0e10cSrcweir   {
146*cdf0e10cSrcweir   suPath = rtl::OUString::createFromAscii(pStr) + rtl::OUString::createFromAscii( "/sal/qa/rtl/bootstrap" );
147*cdf0e10cSrcweir   }
148*cdf0e10cSrcweir   rtl::OUString suURL;
149*cdf0e10cSrcweir   ::osl::FileBase::getFileURLFromSystemPath( suPath, suURL );
150*cdf0e10cSrcweir   return suURL;
151*cdf0e10cSrcweir */
152*cdf0e10cSrcweir }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir void thread_sleep_tenth_sec(sal_Int32 _nTenthSec)
155*cdf0e10cSrcweir {
156*cdf0e10cSrcweir #ifdef WNT      //Windows
157*cdf0e10cSrcweir     Sleep(_nTenthSec * 100 );
158*cdf0e10cSrcweir #endif
159*cdf0e10cSrcweir #if ( defined UNX ) || ( defined OS2 )  //Unix
160*cdf0e10cSrcweir     TimeValue nTV;
161*cdf0e10cSrcweir     nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
162*cdf0e10cSrcweir     nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
163*cdf0e10cSrcweir     osl_waitThread(&nTV);
164*cdf0e10cSrcweir #endif
165*cdf0e10cSrcweir }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir // -----------------------------------------------------------------------------
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir namespace rtl_Bootstrap
170*cdf0e10cSrcweir {
171*cdf0e10cSrcweir     class ctor : public CppUnit::TestFixture
172*cdf0e10cSrcweir     {
173*cdf0e10cSrcweir     public:
174*cdf0e10cSrcweir         // initialise your test code values here.
175*cdf0e10cSrcweir         void setUp()
176*cdf0e10cSrcweir             {
177*cdf0e10cSrcweir             }
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir         void tearDown()
180*cdf0e10cSrcweir             {
181*cdf0e10cSrcweir             }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir         // ctor with ini name
184*cdf0e10cSrcweir         void ctor_001()
185*cdf0e10cSrcweir             {
186*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
187*cdf0e10cSrcweir                 printUString( suIniname );
188*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname );
189*cdf0e10cSrcweir                 rtl::OUString suGetname; // = rtl::OUString::createFromAscii("");
190*cdf0e10cSrcweir                 aBootstrap.getIniName( suGetname );
191*cdf0e10cSrcweir                 printUString( suGetname );
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir                 // LLA: first: this seems to be a wrong test.
194*cdf0e10cSrcweir                 //      second: there seems to be a design hole, if I give a absolute path ini file,
195*cdf0e10cSrcweir                 //              but try to use ${file::KEYVALUE} than 'file' will only used out of the 'executable path'/file
196*cdf0e10cSrcweir                 //              not from the path given from the absolute path.
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir                 // Due to the fact, we create at this position a file (createTestshl2rc() ), we check for existance
199*cdf0e10cSrcweir                 bool bFileExist = t_fileExist( suGetname );
200*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("ctor error with initial file.", bFileExist == true );
201*cdf0e10cSrcweir             }
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir         void ctor_002()
204*cdf0e10cSrcweir             {
205*cdf0e10cSrcweir                 rtl::Bootstrap aBootstrap;
206*cdf0e10cSrcweir                 rtl::OUString suGetname;
207*cdf0e10cSrcweir                 aBootstrap.getIniName( suGetname );
208*cdf0e10cSrcweir                 printUString( suGetname );
209*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("ctor error without initial file.", suGetname.getLength() != 0 );
210*cdf0e10cSrcweir             }
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(ctor);
213*cdf0e10cSrcweir         CPPUNIT_TEST(ctor_001);
214*cdf0e10cSrcweir         CPPUNIT_TEST(ctor_002);
215*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
216*cdf0e10cSrcweir     }; // class ctor
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir     class getFrom : public CppUnit::TestFixture
219*cdf0e10cSrcweir     {
220*cdf0e10cSrcweir     public:
221*cdf0e10cSrcweir         // initialise your test code values here.
222*cdf0e10cSrcweir         void setUp()
223*cdf0e10cSrcweir             {
224*cdf0e10cSrcweir             }
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir         void tearDown()
227*cdf0e10cSrcweir             {
228*cdf0e10cSrcweir             }
229*cdf0e10cSrcweir         // get the value of env variable
230*cdf0e10cSrcweir         void getFrom_001()
231*cdf0e10cSrcweir             {
232*cdf0e10cSrcweir                 Bootstrap aBootstrap;
233*cdf0e10cSrcweir                 rtl::OUString suValue;
234*cdf0e10cSrcweir                 rtl::OUString suValuename = rtl::OUString::createFromAscii( "SOLAR_JAVA" );
235*cdf0e10cSrcweir                 //aBootstrap.getFrom( suValuename, suValue );
236*cdf0e10cSrcweir                 aBootstrap.getFrom( suValuename, suValue );
237*cdf0e10cSrcweir                 sal_Char *  pStr = getenv("SOLAR_JAVA");
238*cdf0e10cSrcweir                 //      printUString( suGetname );
239*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("get the value of environment variable.", suValue.compareToAscii( pStr ) == 0 );
240*cdf0e10cSrcweir             }
241*cdf0e10cSrcweir         /* Notes on Windows:
242*cdf0e10cSrcweir            void getFrom_001_1()
243*cdf0e10cSrcweir            {
244*cdf0e10cSrcweir            Bootstrap aBootstrap;
245*cdf0e10cSrcweir            rtl::OUString suValue;
246*cdf0e10cSrcweir            rtl::OUString suValuename = rtl::OUString::createFromAscii( "SRC_ROOT" );
247*cdf0e10cSrcweir            //aBootstrap.getFrom( suValuename, suValue );
248*cdf0e10cSrcweir            aBootstrap.getFrom( suValuename, suValue );
249*cdf0e10cSrcweir            sal_Char *  pStr = getenv("SRC_ROOT");
250*cdf0e10cSrcweir            //   printUString( suGetname );
251*cdf0e10cSrcweir            CPPUNIT_ASSERT_MESSAGE("get the value of environment variable.", suValue.compareToAscii( pStr ) == 0 );
252*cdf0e10cSrcweir            }
253*cdf0e10cSrcweir            The result on Windows:
254*cdf0e10cSrcweir            # # the SRC_ROOT is e:\Qadev\cvs\m19
255*cdf0e10cSrcweir            # # suValue is e:Qadevcvsm19
256*cdf0e10cSrcweir            reason:
257*cdf0e10cSrcweir            The problem is that the internally getenv()ed variable SRC_ROOT is macro expanded,
258*cdf0e10cSrcweir            thus every \ will introduce an escape.
259*cdf0e10cSrcweir         */
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir         // get the value of a variable in ini file
262*cdf0e10cSrcweir         void getFrom_002()
263*cdf0e10cSrcweir             {
264*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
265*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname );
266*cdf0e10cSrcweir                 rtl::OUString suGetname;
267*cdf0e10cSrcweir                 rtl::OUString suValuename = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
268*cdf0e10cSrcweir                 aBootstrap.getFrom( suValuename, suGetname );
269*cdf0e10cSrcweir                 printUString( suGetname );
270*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("get the value of a variable in ini file.", suGetname.getLength() != 0 );
271*cdf0e10cSrcweir             }
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir         //use defaut value
274*cdf0e10cSrcweir         void getFrom_003()
275*cdf0e10cSrcweir             {
276*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
277*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname );
278*cdf0e10cSrcweir                 rtl::OUString suGetname;
279*cdf0e10cSrcweir                 rtl::OUString suValuename = rtl::OUString::createFromAscii( "MY_VALUE" );
280*cdf0e10cSrcweir                 rtl::OUString myDefault = rtl::OUString::createFromAscii( "2" );
281*cdf0e10cSrcweir                 aBootstrap.getFrom( suValuename, suGetname, myDefault );
282*cdf0e10cSrcweir                 //printUString( suGetname );
283*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("getFrom use default.", suGetname.compareTo( myDefault ) == 0 );
284*cdf0e10cSrcweir             }
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir         void getFrom_004()
287*cdf0e10cSrcweir             {
288*cdf0e10cSrcweir                 t_print("1\n");
289*cdf0e10cSrcweir                 // initialise Bootstrap with an own ini file
290*cdf0e10cSrcweir                 // PSEUDO_INI is pseudo(rc|.ini) created be create_pseudorc()
291*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(PSEUDO_INI);
292*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname );
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir                 rtl::OUString suGetIniName;
295*cdf0e10cSrcweir                 aBootstrap.getIniName( suGetIniName );
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir                 printUString(suGetIniName, "Current bootstrap file");
298*cdf0e10cSrcweir                 sal_Int32 nIndex = suGetIniName.indexOf(rtl::OUString::createFromAscii( "pseudo" ));
299*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("ini name must have 'pseudo' in name.", nIndex > 0);
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir                 // rtlBootstrapHandle bsHandle = aBootstrap.getHandle();
302*cdf0e10cSrcweir                 // CPPUNIT_ASSERT_MESSAGE("getHandle return NULL!", bsHandle != 0);
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir                 rtl::OUString suValue;
305*cdf0e10cSrcweir                 rtl::OUString suKeyName = rtl::OUString::createFromAscii( "FILE" );
306*cdf0e10cSrcweir                 aBootstrap.getFrom( suKeyName, suValue );
307*cdf0e10cSrcweir                 printUString( suValue );
308*cdf0e10cSrcweir                 sal_Int32 nCompare = suValue.compareTo( rtl::OUString::createFromAscii("pseudo file") );
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("<Bootstrap('pseudo')>.getFrom('FILE', ...) result is unexpected.",  nCompare == 0);
311*cdf0e10cSrcweir             }
312*cdf0e10cSrcweir         void getFrom_004_1()
313*cdf0e10cSrcweir             {
314*cdf0e10cSrcweir                 // get the same key out of the default context
315*cdf0e10cSrcweir                 rtl::OUString suKeyName = rtl::OUString::createFromAscii( "FILE" );
316*cdf0e10cSrcweir                 rtl::OUString suGetValue;
317*cdf0e10cSrcweir                 Bootstrap::get( suKeyName, suGetValue );
318*cdf0e10cSrcweir                 printUString( suGetValue );
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("Bootstrap::get('FILE', ...)", suGetValue.compareTo( rtl::OUString::createFromAscii("testshl2 file") ) == 0 );
321*cdf0e10cSrcweir             }
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir 	/** helper function: return the child process's ret value( typedef sal_uInt32 oslProcessExitCode;)
324*cdf0e10cSrcweir 	   * param1 is the process's name(only file name, not include path)
325*cdf0e10cSrcweir 	  */
326*cdf0e10cSrcweir 	 oslProcessExitCode ini_execProcess( const sal_Char* process_name, const sal_Char * flag )
327*cdf0e10cSrcweir 	 {
328*cdf0e10cSrcweir 	 	rtl::OUString suCWD = getModulePath();
329*cdf0e10cSrcweir     		oslProcess hProcess = NULL;
330*cdf0e10cSrcweir    		rtl::OUString suFileURL = suCWD;
331*cdf0e10cSrcweir         	suFileURL += rtl::OUString::createFromAscii("/") +  rtl::OUString::createFromAscii(process_name) ;
332*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
333*cdf0e10cSrcweir 		suFileURL += rtl::OUString::createFromAscii(".exe");
334*cdf0e10cSrcweir #endif
335*cdf0e10cSrcweir         	const int nParameterCount = 3;
336*cdf0e10cSrcweir     		rtl_uString* pParameters[ nParameterCount ];
337*cdf0e10cSrcweir     		OUString suFlag( OUString::createFromAscii(flag) );
338*cdf0e10cSrcweir 		OUString suEnv1( OUString::createFromAscii("-env:UNO_SERVICES=service.rdb"));
339*cdf0e10cSrcweir 		OUString suIniname = t_getSourcePath("rtl");
340*cdf0e10cSrcweir 		printUString( suIniname, "rtl path:");
341*cdf0e10cSrcweir 		//OUString suEnv2( OUString::createFromAscii("-env:MYENV=bootstrap_process"));
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir         	pParameters[0] = suFlag.pData;
344*cdf0e10cSrcweir         	pParameters[1] = suEnv1.pData;
345*cdf0e10cSrcweir         	// the custom ini/rc file's URL
346*cdf0e10cSrcweir         	pParameters[2] = suIniname.pData;
347*cdf0e10cSrcweir 
348*cdf0e10cSrcweir         	oslProcessError osl_error = osl_executeProcess(
349*cdf0e10cSrcweir         	    suFileURL.pData,
350*cdf0e10cSrcweir         	    pParameters,
351*cdf0e10cSrcweir             	    nParameterCount,
352*cdf0e10cSrcweir         	    osl_Process_WAIT,
353*cdf0e10cSrcweir         	    0,
354*cdf0e10cSrcweir         	    suCWD.pData,
355*cdf0e10cSrcweir         	    NULL,
356*cdf0e10cSrcweir         	    0,
357*cdf0e10cSrcweir         	    &hProcess );
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE
360*cdf0e10cSrcweir         	(
361*cdf0e10cSrcweir         	    "osl_createProcess failed",
362*cdf0e10cSrcweir         	    osl_error == osl_Process_E_None
363*cdf0e10cSrcweir         	);
364*cdf0e10cSrcweir 	       	osl_joinProcess(hProcess);
365*cdf0e10cSrcweir         	oslProcessInfo* pInfo = new oslProcessInfo;
366*cdf0e10cSrcweir 		pInfo->Size = sizeof( oslProcessInfo );
367*cdf0e10cSrcweir 		osl_error = osl_getProcessInfo( hProcess, osl_Process_EXITCODE, pInfo );
368*cdf0e10cSrcweir 		CPPUNIT_ASSERT_MESSAGE
369*cdf0e10cSrcweir         	(
370*cdf0e10cSrcweir         	    "osl_getProcessInfo returned with failure",
371*cdf0e10cSrcweir         	    osl_Process_E_None == osl_error
372*cdf0e10cSrcweir         	);
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir 		t_print("the exit code is %d.\n", pInfo->Code );
375*cdf0e10cSrcweir 		oslProcessExitCode nCode = pInfo->Code;
376*cdf0e10cSrcweir 		delete pInfo;
377*cdf0e10cSrcweir 	 	return nCode;
378*cdf0e10cSrcweir 	}
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir          void getFrom_005_1()
381*cdf0e10cSrcweir             {
382*cdf0e10cSrcweir 	       	oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "1" );
383*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE("Parameters passed by command line can not be gotten!",
384*cdf0e10cSrcweir 				nExitCode == 10 );
385*cdf0e10cSrcweir 	    }
386*cdf0e10cSrcweir 	 void getFrom_005_2()
387*cdf0e10cSrcweir             {
388*cdf0e10cSrcweir 	       	oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "2" );
389*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE("Parameters passed by .ini/rc file can not be gotten!",
390*cdf0e10cSrcweir 				nExitCode == 20 );
391*cdf0e10cSrcweir 	    }
392*cdf0e10cSrcweir 	 void getFrom_005_3()
393*cdf0e10cSrcweir             {
394*cdf0e10cSrcweir #if (defined WNT) || (defined SOLARIS)
395*cdf0e10cSrcweir 		putenv(const_cast< char * >("QADEV_BOOTSTRAP=sun&ms"));
396*cdf0e10cSrcweir #else
397*cdf0e10cSrcweir             	setenv("QADEV_BOOTSTRAP", "sun&ms", 0);
398*cdf0e10cSrcweir #endif
399*cdf0e10cSrcweir 	       	oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "3" );
400*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE("Parameters passed by environment variables can not be gotten!",
401*cdf0e10cSrcweir 				nExitCode == 30 );
402*cdf0e10cSrcweir 	    }
403*cdf0e10cSrcweir 	void getFrom_005_4()
404*cdf0e10cSrcweir             {
405*cdf0e10cSrcweir             	oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "4" );
406*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE("Parameters passed by customed .ini/rc file can not be gotten!",
407*cdf0e10cSrcweir 				nExitCode == 40 );
408*cdf0e10cSrcweir 	    }
409*cdf0e10cSrcweir 	void getFrom_005_5()
410*cdf0e10cSrcweir             {
411*cdf0e10cSrcweir             	oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "5" );
412*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE("Parameters passed by inheritance can not be gotten!",
413*cdf0e10cSrcweir 				nExitCode == 50 );
414*cdf0e10cSrcweir 	    }
415*cdf0e10cSrcweir 	void getFrom_005_6()
416*cdf0e10cSrcweir             {
417*cdf0e10cSrcweir             	oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "6" );
418*cdf0e10cSrcweir         	CPPUNIT_ASSERT_MESSAGE("Parameters passed by default can not be gotten!",
419*cdf0e10cSrcweir 				nExitCode == 60 );
420*cdf0e10cSrcweir 	    }
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(getFrom);
423*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_001);
424*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_002);
425*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_003);
426*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_004);
427*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_004_1);
428*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_005_1);
429*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_005_2);
430*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_005_3);
431*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_005_4);
432*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_005_5);
433*cdf0e10cSrcweir         CPPUNIT_TEST(getFrom_005_6);
434*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
435*cdf0e10cSrcweir     }; // class getFrom
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir     class setIniFilename : public CppUnit::TestFixture
438*cdf0e10cSrcweir     {
439*cdf0e10cSrcweir     public:
440*cdf0e10cSrcweir         // initialise your test code values here.
441*cdf0e10cSrcweir         void setUp()
442*cdf0e10cSrcweir             {
443*cdf0e10cSrcweir             }
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir         void tearDown()
446*cdf0e10cSrcweir             {
447*cdf0e10cSrcweir             }
448*cdf0e10cSrcweir 
449*cdf0e10cSrcweir         void setIniFilename_001()
450*cdf0e10cSrcweir             {
451*cdf0e10cSrcweir                 Bootstrap aBootstrap;
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir                 rtl::OUString suGetIniname;
454*cdf0e10cSrcweir                 aBootstrap.getIniName( suGetIniname );
455*cdf0e10cSrcweir                 //which should be .....testshl2rc
456*cdf0e10cSrcweir                 //printUString( suGetIniname );
457*cdf0e10cSrcweir 
458*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(PSEUDO_INI);
459*cdf0e10cSrcweir                 Bootstrap::setIniFilename( suIniname );
460*cdf0e10cSrcweir 
461*cdf0e10cSrcweir                 rtl::OUString suGetname;
462*cdf0e10cSrcweir                 aBootstrap.getIniName( suGetname );
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir                 printUString( suGetname );
465*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("setIniFilename then get it.", suGetname.compareTo( suIniname ) == 0
466*cdf0e10cSrcweir                                        && suGetname.compareTo( suGetIniname ) != 0 );
467*cdf0e10cSrcweir             }
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir         void setIniFilename_002()
470*cdf0e10cSrcweir             {
471*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
472*cdf0e10cSrcweir                 // CPPUNIT_ASSERT_MESSAGE("test failed, Bootstrap ini does not exist.", t_fileExist(suIniname ) == true);
473*cdf0e10cSrcweir 
474*cdf0e10cSrcweir                 Bootstrap::setIniFilename( suIniname );
475*cdf0e10cSrcweir                 //rtl_bootstrap_args_open( suIniname.pData );
476*cdf0e10cSrcweir                 rtl::OUString suGetname;
477*cdf0e10cSrcweir                 rtl::OUString suValuename = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
478*cdf0e10cSrcweir                 //aBootstrap.getFrom( suValuename, suGetname  );
479*cdf0e10cSrcweir                 Bootstrap::get( suValuename, suGetname  );
480*cdf0e10cSrcweir                 printUString( suGetname );
481*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("setIniFilename and get value of the argument.", suGetname.getLength() != 0 );
482*cdf0e10cSrcweir             }
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(setIniFilename);
485*cdf0e10cSrcweir         CPPUNIT_TEST(setIniFilename_001);
486*cdf0e10cSrcweir         CPPUNIT_TEST(setIniFilename_002);
487*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
488*cdf0e10cSrcweir     }; // class setIniFilename
489*cdf0e10cSrcweir 
490*cdf0e10cSrcweir     class getHandle : public CppUnit::TestFixture
491*cdf0e10cSrcweir     {
492*cdf0e10cSrcweir     public:
493*cdf0e10cSrcweir         // initialise your test code values here.
494*cdf0e10cSrcweir         void setUp()
495*cdf0e10cSrcweir             {
496*cdf0e10cSrcweir             }
497*cdf0e10cSrcweir 
498*cdf0e10cSrcweir         void tearDown()
499*cdf0e10cSrcweir             {
500*cdf0e10cSrcweir             }
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir         void getHandle_001()
503*cdf0e10cSrcweir             {
504*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
505*cdf0e10cSrcweir                 Bootstrap aBootstrap;
506*cdf0e10cSrcweir                 rtlBootstrapHandle bsHandle = aBootstrap.getHandle();
507*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("getHandle should return 0 if the bootstrap has no ini file!", bsHandle == 0 );
508*cdf0e10cSrcweir             }
509*cdf0e10cSrcweir         void getHandle_002()
510*cdf0e10cSrcweir             {
511*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(PSEUDO_INI);
512*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname );
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir                 rtlBootstrapHandle bsHandle = aBootstrap.getHandle();
515*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("getHandle return NULL!", bsHandle != 0);
516*cdf0e10cSrcweir 
517*cdf0e10cSrcweir                 //rtl::OUString iniName;
518*cdf0e10cSrcweir                 //rtl_bootstrap_get_iniName_from_handle( bsHandle, &iniName.pData );
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir                 rtl::OUString suValue;
521*cdf0e10cSrcweir                 rtl::OUString suKeyName = rtl::OUString::createFromAscii( "PSEUDOFILE" );
522*cdf0e10cSrcweir                 rtl_bootstrap_get_from_handle(bsHandle, suKeyName.pData, &suValue.pData, NULL);
523*cdf0e10cSrcweir                 printUString( suValue);
524*cdf0e10cSrcweir 
525*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("Can not use the handle which is returned by getHandle!", suValue.equals( rtl::OUString::createFromAscii("be pseudo") ) == sal_True );
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir                 // CPPUNIT_ASSERT_MESSAGE("Can not use the handle which is returned by getHandle!",
528*cdf0e10cSrcweir                 //      suGetname.equalsIgnoreAsciiCase( iniName ) == sal_True );
529*cdf0e10cSrcweir             }
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(getHandle);
532*cdf0e10cSrcweir         CPPUNIT_TEST(getHandle_001);
533*cdf0e10cSrcweir         CPPUNIT_TEST(getHandle_002);
534*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
535*cdf0e10cSrcweir     }; // class getHandle
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir     class set : public CppUnit::TestFixture
538*cdf0e10cSrcweir     {
539*cdf0e10cSrcweir     public:
540*cdf0e10cSrcweir         // initialise your test code values here.
541*cdf0e10cSrcweir         void setUp()
542*cdf0e10cSrcweir             {
543*cdf0e10cSrcweir             }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir         void tearDown()
546*cdf0e10cSrcweir             {
547*cdf0e10cSrcweir             }
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir         void set_001()
550*cdf0e10cSrcweir             {
551*cdf0e10cSrcweir                 //in ini fle, INHERITED_VALUE=inherited_value
552*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
553*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname);
554*cdf0e10cSrcweir                 rtl::OUString suName = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
555*cdf0e10cSrcweir                 rtl::OUString suValue = rtl::OUString::createFromAscii( "ok" );
556*cdf0e10cSrcweir                 // set to another value
557*cdf0e10cSrcweir                 Bootstrap::set( suName, suValue );
558*cdf0e10cSrcweir                 rtl::OUString suGetValue;
559*cdf0e10cSrcweir                 Bootstrap::get( suName, suGetValue);
560*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("set and get argument failed.", suGetValue.compareTo(suValue) == 0 );
561*cdf0e10cSrcweir             }
562*cdf0e10cSrcweir         void set_002()
563*cdf0e10cSrcweir             {
564*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
565*cdf0e10cSrcweir                 Bootstrap myBootstrap( suIniname);
566*cdf0e10cSrcweir                 rtl::OUString suName = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
567*cdf0e10cSrcweir                 rtl::OUString suGetOrientValue;
568*cdf0e10cSrcweir                 Bootstrap::get( suName, suGetOrientValue);
569*cdf0e10cSrcweir                 // ??  INHERITED_VALUE = ok now, which is set in set_001
570*cdf0e10cSrcweir                 printUString( suGetOrientValue );
571*cdf0e10cSrcweir 
572*cdf0e10cSrcweir                 rtl::OUString suValue = rtl::OUString::createFromAscii( TESTSHL2_INI );
573*cdf0e10cSrcweir                 // set to another value
574*cdf0e10cSrcweir                 Bootstrap::set( suName, suValue );
575*cdf0e10cSrcweir                 rtl::OUString suGetValue;
576*cdf0e10cSrcweir                 Bootstrap::get( suName, suGetValue);
577*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("set and get argument failed.", suGetValue.compareTo(suValue) == 0 );
578*cdf0e10cSrcweir             }
579*cdf0e10cSrcweir 
580*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(set);
581*cdf0e10cSrcweir         CPPUNIT_TEST(set_001);
582*cdf0e10cSrcweir         CPPUNIT_TEST(set_002);
583*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
584*cdf0e10cSrcweir     }; // class set
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir     class expandMacrosFrom : public CppUnit::TestFixture
587*cdf0e10cSrcweir     {
588*cdf0e10cSrcweir     public:
589*cdf0e10cSrcweir         void setUp()
590*cdf0e10cSrcweir             {
591*cdf0e10cSrcweir             }
592*cdf0e10cSrcweir 
593*cdf0e10cSrcweir         void tearDown()
594*cdf0e10cSrcweir             {
595*cdf0e10cSrcweir             }
596*cdf0e10cSrcweir         void expandMacrosFrom_001()
597*cdf0e10cSrcweir             {
598*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
599*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname);
600*cdf0e10cSrcweir                 rtl::OUString suMacro = rtl::OUString::createFromAscii( "$MYVAR/expand1" );
601*cdf0e10cSrcweir                 //printUString( suMacro );
602*cdf0e10cSrcweir                 //expandMacro now
603*cdf0e10cSrcweir                 aBootstrap.expandMacrosFrom( suMacro );
604*cdf0e10cSrcweir                 rtl::OUString suExpectedMacro = rtl::OUString::createFromAscii( "src680_test/expand1" );
605*cdf0e10cSrcweir                 //printUString( suMacro );
606*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("expandMacrosFrom failed.", suMacro.compareTo(suExpectedMacro) == 0 );
607*cdf0e10cSrcweir             }
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir         /** here a special macro should expand
610*cdf0e10cSrcweir           * if rtlrc is under sal/qa/rtl/bootstrap/, "${rtlrc:Bootstrap:RTLVALUE}" could be expanded
611*cdf0e10cSrcweir           * else rtlrc is under solver/680/unxlngi4.pro/bin/, "${file:/// ....solver/680/unxlngi4.pro/bin/rtlrc:Bootstrap:RTLVALUE}"
612*cdf0e10cSrcweir 	  * could not be expanded
613*cdf0e10cSrcweir 	  */
614*cdf0e10cSrcweir         void expandMacrosFrom_002()
615*cdf0e10cSrcweir             {
616*cdf0e10cSrcweir                 // Build a string with '${rtl.ini:RTLVALUE}' and try to expand it.
617*cdf0e10cSrcweir                 // In function 'create_rtlrc() is the content of the rtl.ini file.
618*cdf0e10cSrcweir 
619*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
620*cdf0e10cSrcweir                 t_print("inifile is:");
621*cdf0e10cSrcweir     	        printUString( suIniname );
622*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname) ;
623*cdf0e10cSrcweir               	rtl::OUString suMacro = rtl::OUString::createFromAscii( "${" );         //rtlrc:Bootstrap:RTLVALUE}");
624*cdf0e10cSrcweir 
625*cdf0e10cSrcweir      rtl::OUString aDirURL = OUString::createFromAscii( "$ORIGIN");
626*cdf0e10cSrcweir      aDirURL += OUString::createFromAscii( "/");
627*cdf0e10cSrcweir      aDirURL += OUString::createFromAscii( "rtl" );
628*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
629*cdf0e10cSrcweir     aDirURL += rtl::OUString::createFromAscii(".ini");
630*cdf0e10cSrcweir #else
631*cdf0e10cSrcweir     aDirURL += rtl::OUString::createFromAscii("rc");
632*cdf0e10cSrcweir #endif
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir                 suMacro += aDirURL;//t_getSourcePath("rtl");
635*cdf0e10cSrcweir     	        suMacro += rtl::OUString::createFromAscii( "::RTLVALUE}");
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir                 t_print("created macro is: ");
638*cdf0e10cSrcweir     	        printUString( suMacro );
639*cdf0e10cSrcweir                 //expandMacro now
640*cdf0e10cSrcweir                 aBootstrap.expandMacrosFrom( suMacro );
641*cdf0e10cSrcweir                 t_print("expanded macro is:");
642*cdf0e10cSrcweir                 printUString( suMacro );
643*cdf0e10cSrcweir                 rtl::OUString suExpectedMacro = rtl::OUString::createFromAscii( "qadev17" );
644*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("failed, can't expand '${file:///.../" SAL_CONFIGFILE("rtl") "::RTLVALUE}' to 'qadev17'", suMacro.compareTo(suExpectedMacro) == 0 );
645*cdf0e10cSrcweir             }
646*cdf0e10cSrcweir         void expandMacrosFrom_002_1()
647*cdf0e10cSrcweir             {
648*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
649*cdf0e10cSrcweir                 t_print("inifile is:");
650*cdf0e10cSrcweir     	        printUString( suIniname );
651*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname);
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir                 rtl::OUString suMacro;
654*cdf0e10cSrcweir                 // just a simple test, if this really work.
655*cdf0e10cSrcweir                 aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE2" ), suMacro );
656*cdf0e10cSrcweir                 t_print("SOFROMVALUE2:");
657*cdf0e10cSrcweir                 printUString( suMacro );
658*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("'SOFROMVALUE2' seems to do not exist.", suMacro.getLength() > 0 );
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir                 aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE" ), suMacro );
661*cdf0e10cSrcweir 
662*cdf0e10cSrcweir                 t_print("SOFROMVALUE:");
663*cdf0e10cSrcweir     	        printUString( suMacro );
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir                 //expandMacro now
666*cdf0e10cSrcweir                 // seems to be, that getFrom() already expand the string
667*cdf0e10cSrcweir                 // t_print("expanded macro is:");
668*cdf0e10cSrcweir                 // aBootstrap.expandMacrosFrom( suMacro );
669*cdf0e10cSrcweir                 // printUString( suMacro );
670*cdf0e10cSrcweir                 rtl::OUString suExpectedMacro = rtl::OUString::createFromAscii( "src680_qadev" );
671*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("failed, can't expand '${" SAL_CONFIGFILE("rtl") "::SOVALUE}' to 'src680_qadev'", suMacro.compareTo(suExpectedMacro) == 0 );
672*cdf0e10cSrcweir             }
673*cdf0e10cSrcweir         void expandMacrosFrom_002_2()
674*cdf0e10cSrcweir             {
675*cdf0e10cSrcweir                 // test, to read and expand SOFROMVALUE3
676*cdf0e10cSrcweir                 // SOFROMVALUE3 is 'rtl(.ini|rc)::TESTSHL_SOVALUE' which should expand to 'rtlfile' if all is ok.
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
679*cdf0e10cSrcweir                 t_print("inifile is:");
680*cdf0e10cSrcweir     	        printUString( suIniname );
681*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname);
682*cdf0e10cSrcweir 
683*cdf0e10cSrcweir                 rtl::OUString suMacro;
684*cdf0e10cSrcweir                 aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE3" ), suMacro );
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir                 t_print("SOFROMVALUE3:");
687*cdf0e10cSrcweir                 printUString( suMacro );
688*cdf0e10cSrcweir 
689*cdf0e10cSrcweir                 if (suMacro.equals(rtl::OUString::createFromAscii("testshl2_file") ) == sal_True)
690*cdf0e10cSrcweir                 {
691*cdf0e10cSrcweir                     CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE3' is read from the wrong ini file.", 0 );
692*cdf0e10cSrcweir                 }
693*cdf0e10cSrcweir                 else
694*cdf0e10cSrcweir                 {
695*cdf0e10cSrcweir                     CPPUNIT_ASSERT_MESSAGE("SOFROMVALUE3 should contain 'rtlfile'.", suMacro.equals(rtl::OUString::createFromAscii("rtlfile") ) == sal_True );
696*cdf0e10cSrcweir                 }
697*cdf0e10cSrcweir             }
698*cdf0e10cSrcweir //? I don't know if this is a right test.
699*cdf0e10cSrcweir //         void expandMacrosFrom_002_3()
700*cdf0e10cSrcweir //             {
701*cdf0e10cSrcweir //                 // test, to read and expand SOFROMVALUE4
702*cdf0e10cSrcweir //                 // SOFROMVALUE4 is 'rtl(.ini|rc):Other_Section:TESTSHL_SOVALUE' which should expand to '' if all is ok.
703*cdf0e10cSrcweir //
704*cdf0e10cSrcweir //                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
705*cdf0e10cSrcweir //                 t_print("inifile is:");
706*cdf0e10cSrcweir //     	        printUString( suIniname );
707*cdf0e10cSrcweir //                 Bootstrap aBootstrap( suIniname);
708*cdf0e10cSrcweir //
709*cdf0e10cSrcweir //                 rtl::OUString suMacro;
710*cdf0e10cSrcweir //                 aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE4" ), suMacro );
711*cdf0e10cSrcweir //
712*cdf0e10cSrcweir //                 t_print("SOFROMVALUE4:");
713*cdf0e10cSrcweir //                 printUString( suMacro );
714*cdf0e10cSrcweir //
715*cdf0e10cSrcweir //                 if (suMacro.equals(rtl::OUString::createFromAscii("testshl2_file") ) == sal_True)
716*cdf0e10cSrcweir //                 {
717*cdf0e10cSrcweir //                     CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE4' is read from the wrong section out of the wrong ini file.", 0 );
718*cdf0e10cSrcweir //                 }
719*cdf0e10cSrcweir //                 else if (suMacro.equals(rtl::OUString::createFromAscii("testshl2_file_other") ) == sal_True)
720*cdf0e10cSrcweir //                 {
721*cdf0e10cSrcweir //                     CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE4' is read from the wrong ini file.", 0 );
722*cdf0e10cSrcweir //                 }
723*cdf0e10cSrcweir //                 else
724*cdf0e10cSrcweir //                 {
725*cdf0e10cSrcweir //                     CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE4' should contain 'rtlfile_other'.", suMacro.equals(rtl::OUString::createFromAscii("rtlfile_other") ) == sal_True );
726*cdf0e10cSrcweir //                 }
727*cdf0e10cSrcweir //             }
728*cdf0e10cSrcweir         void expandMacrosFrom_003()
729*cdf0e10cSrcweir             {
730*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
731*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname);
732*cdf0e10cSrcweir                 rtl::OUString suMacro[4];
733*cdf0e10cSrcweir                 suMacro[0] = rtl::OUString::createFromAscii( "$SYSUSERCONFIG" );
734*cdf0e10cSrcweir                 suMacro[1] = rtl::OUString::createFromAscii( "$SYSUSERHOME" );
735*cdf0e10cSrcweir                 suMacro[2] = rtl::OUString::createFromAscii( "$SYSBINDIR" );
736*cdf0e10cSrcweir                 suMacro[3] = rtl::OUString::createFromAscii( "$ORIGIN" );
737*cdf0e10cSrcweir 
738*cdf0e10cSrcweir                 for ( int i = 0; i < 4; i++ )
739*cdf0e10cSrcweir                 {
740*cdf0e10cSrcweir                     aBootstrap.expandMacrosFrom( suMacro[i] );
741*cdf0e10cSrcweir                     printUString(suMacro[i]);
742*cdf0e10cSrcweir                 }
743*cdf0e10cSrcweir                 // printUString( t_getSourcePath("") );
744*cdf0e10cSrcweir                 // CPPUNIT_ASSERT_MESSAGE("some integral variables.", suMacro[3].equalsIgnoreAsciiCase(t_getSourcePath("")) == sal_True );
745*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("some integral variables.", suMacro[0].getLength() > 0 &&
746*cdf0e10cSrcweir                                        suMacro[1].getLength() > 0 &&
747*cdf0e10cSrcweir                                        suMacro[2].getLength() > 0 &&
748*cdf0e10cSrcweir                                        suMacro[3].getLength() > 0);
749*cdf0e10cSrcweir             }
750*cdf0e10cSrcweir 
751*cdf0e10cSrcweir         void testRecursion() {
752*cdf0e10cSrcweir             rtl::OUString t(RTL_CONSTASCII_USTRINGPARAM("$RECURSIVE"));
753*cdf0e10cSrcweir             Bootstrap(t_getSourcePath(TESTSHL2_INI)).expandMacrosFrom(t);
754*cdf0e10cSrcweir             CPPUNIT_ASSERT_MESSAGE(
755*cdf0e10cSrcweir                 "recursion detection",
756*cdf0e10cSrcweir                 t.equalsAsciiL(
757*cdf0e10cSrcweir                     RTL_CONSTASCII_STRINGPARAM("***RECURSION DETECTED***")));
758*cdf0e10cSrcweir         }
759*cdf0e10cSrcweir 
760*cdf0e10cSrcweir         void testLink() {
761*cdf0e10cSrcweir             rtl::OUString t(RTL_CONSTASCII_USTRINGPARAM("$LINKED"));
762*cdf0e10cSrcweir             Bootstrap(t_getSourcePath(TESTSHL2_INI)).expandMacrosFrom(t);
763*cdf0e10cSrcweir             CPPUNIT_ASSERT_MESSAGE(
764*cdf0e10cSrcweir                 "link file",
765*cdf0e10cSrcweir                 t.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("qadev17")));
766*cdf0e10cSrcweir         }
767*cdf0e10cSrcweir 
768*cdf0e10cSrcweir         void testOverride() {
769*cdf0e10cSrcweir             rtl::OUString t1(
770*cdf0e10cSrcweir                 RTL_CONSTASCII_USTRINGPARAM(
771*cdf0e10cSrcweir                     "${.override:$ORIGIN/" SAL_CONFIGFILE("rtl") ":ORIGIN}"));
772*cdf0e10cSrcweir             Bootstrap(t_getSourcePath("rtl")).expandMacrosFrom(t1);
773*cdf0e10cSrcweir             CPPUNIT_ASSERT_MESSAGE(
774*cdf0e10cSrcweir                 "override ORIGIN",
775*cdf0e10cSrcweir                 t1.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("direct")));
776*cdf0e10cSrcweir             rtl::OUString t2(
777*cdf0e10cSrcweir                 RTL_CONSTASCII_USTRINGPARAM(
778*cdf0e10cSrcweir                     "${.override:$ORIGIN/" SAL_CONFIGFILE("none") ":MYVAR}"));
779*cdf0e10cSrcweir             Bootstrap::expandMacros(t2);
780*cdf0e10cSrcweir             CPPUNIT_ASSERT_MESSAGE(
781*cdf0e10cSrcweir                 "override MYVAR",
782*cdf0e10cSrcweir                 t2.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("src680_test")));
783*cdf0e10cSrcweir         }
784*cdf0e10cSrcweir 
785*cdf0e10cSrcweir         void testNonexisting() {
786*cdf0e10cSrcweir             rtl::OUString t(
787*cdf0e10cSrcweir                 RTL_CONSTASCII_USTRINGPARAM(
788*cdf0e10cSrcweir                     "${$ORIGIN/" SAL_CONFIGFILE("none") ":MYVAR}"));
789*cdf0e10cSrcweir             Bootstrap::expandMacros(t);
790*cdf0e10cSrcweir             CPPUNIT_ASSERT_MESSAGE(
791*cdf0e10cSrcweir                 "nonexisting",
792*cdf0e10cSrcweir                 t.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("src680_test")));
793*cdf0e10cSrcweir         }
794*cdf0e10cSrcweir 
795*cdf0e10cSrcweir         void testSection() {
796*cdf0e10cSrcweir             rtl::OUStringBuffer b;
797*cdf0e10cSrcweir             b.appendAscii(RTL_CONSTASCII_STRINGPARAM("${"));
798*cdf0e10cSrcweir             rtl::OUString p(t_getSourcePath(TESTSHL2_INI));
799*cdf0e10cSrcweir             for (sal_Int32 i = 0; i < p.getLength(); ++i) {
800*cdf0e10cSrcweir                 if (p[i] != 'u') {
801*cdf0e10cSrcweir                     b.append(static_cast< sal_Unicode >('\\'));
802*cdf0e10cSrcweir                 }
803*cdf0e10cSrcweir                 b.append(p[i]);
804*cdf0e10cSrcweir             }
805*cdf0e10cSrcweir             b.appendAscii(RTL_CONSTASCII_STRINGPARAM(":Other_Section:EXPAND}"));
806*cdf0e10cSrcweir             rtl::OUString t(b.makeStringAndClear());
807*cdf0e10cSrcweir             Bootstrap(t_getSourcePath(TESTSHL2_INI)).expandMacrosFrom(t);
808*cdf0e10cSrcweir             CPPUNIT_ASSERT_MESSAGE(
809*cdf0e10cSrcweir                 "section expansion",
810*cdf0e10cSrcweir                 t.equalsAsciiL(
811*cdf0e10cSrcweir                     RTL_CONSTASCII_STRINGPARAM("$FILE")));
812*cdf0e10cSrcweir                 // the correct answer would be "testshl2 file" instead, but
813*cdf0e10cSrcweir                 // expansion including a section currently erroneously does not
814*cdf0e10cSrcweir                 // recursively expand macros in the resulting replacement text
815*cdf0e10cSrcweir         }
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(expandMacrosFrom);
818*cdf0e10cSrcweir         CPPUNIT_TEST(expandMacrosFrom_001);
819*cdf0e10cSrcweir         CPPUNIT_TEST(expandMacrosFrom_002);
820*cdf0e10cSrcweir         CPPUNIT_TEST(expandMacrosFrom_002_1);
821*cdf0e10cSrcweir         CPPUNIT_TEST(expandMacrosFrom_002_2);
822*cdf0e10cSrcweir //?        CPPUNIT_TEST(expandMacrosFrom_002_3);
823*cdf0e10cSrcweir         CPPUNIT_TEST(expandMacrosFrom_003);
824*cdf0e10cSrcweir         CPPUNIT_TEST(testRecursion);
825*cdf0e10cSrcweir         CPPUNIT_TEST(testLink);
826*cdf0e10cSrcweir         CPPUNIT_TEST(testOverride);
827*cdf0e10cSrcweir         CPPUNIT_TEST(testNonexisting);
828*cdf0e10cSrcweir         CPPUNIT_TEST(testSection);
829*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
830*cdf0e10cSrcweir     }; // class expandMacrosFrom
831*cdf0e10cSrcweir 
832*cdf0e10cSrcweir     class expandMacros : public CppUnit::TestFixture
833*cdf0e10cSrcweir     {
834*cdf0e10cSrcweir     public:
835*cdf0e10cSrcweir         // initialise your test code values here.
836*cdf0e10cSrcweir         void setUp()
837*cdf0e10cSrcweir             {
838*cdf0e10cSrcweir             }
839*cdf0e10cSrcweir 
840*cdf0e10cSrcweir         void tearDown()
841*cdf0e10cSrcweir             {
842*cdf0e10cSrcweir             }
843*cdf0e10cSrcweir 
844*cdf0e10cSrcweir         void expandMacros_001()
845*cdf0e10cSrcweir             {
846*cdf0e10cSrcweir                 rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
847*cdf0e10cSrcweir                 Bootstrap aBootstrap( suIniname) ;
848*cdf0e10cSrcweir                 rtl::OUString suMacro = rtl::OUString::createFromAscii( "$INHERITED_VALUE/well" );
849*cdf0e10cSrcweir                 Bootstrap::expandMacros( suMacro );
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir 		rtl::OUString suName = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
852*cdf0e10cSrcweir                 OUString suGetValue;
853*cdf0e10cSrcweir                 Bootstrap::get( suName, suGetValue );
854*cdf0e10cSrcweir                 suGetValue += OUString::createFromAscii( "/well" );
855*cdf0e10cSrcweir                 CPPUNIT_ASSERT_MESSAGE("expandMacros failed.", suGetValue.compareTo(suMacro) == 0 );
856*cdf0e10cSrcweir             }
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE(expandMacros);
859*cdf0e10cSrcweir         CPPUNIT_TEST(expandMacros_001);
860*cdf0e10cSrcweir         //  CPPUNIT_TEST(expandMacros_002);
861*cdf0e10cSrcweir         CPPUNIT_TEST_SUITE_END();
862*cdf0e10cSrcweir     }; // class expandMacros
863*cdf0e10cSrcweir 
864*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::ctor, "rtl_Bootstrap");
865*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::getFrom, "rtl_Bootstrap");
866*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::setIniFilename, "rtl_Bootstrap");
867*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::getHandle, "rtl_Bootstrap");
868*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::set, "rtl_Bootstrap");
869*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::expandMacrosFrom, "rtl_Bootstrap");
870*cdf0e10cSrcweir     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::expandMacros, "rtl_Bootstrap");
871*cdf0e10cSrcweir 
872*cdf0e10cSrcweir } // namespace rtl_Bootstrap
873*cdf0e10cSrcweir 
874*cdf0e10cSrcweir // -----------------------------------------------------------------------------
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir // this macro creates an empty function, which will called by the RegisterAllFunctions()
877*cdf0e10cSrcweir // to let the user the possibility to also register some functions by hand.
878*cdf0e10cSrcweir // NOADDITIONAL;
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir 
881*cdf0e10cSrcweir // Here are some helpers, which create a new file 'rtlrc' at the executable path position
882*cdf0e10cSrcweir // and fill the file with some information.
883*cdf0e10cSrcweir // static rtl::OUString getExecutableDirectory()
884*cdf0e10cSrcweir // {
885*cdf0e10cSrcweir //     rtl::OUString fileName;
886*cdf0e10cSrcweir //     osl_getExecutableFile(&fileName.pData);
887*cdf0e10cSrcweir //
888*cdf0e10cSrcweir //     sal_Int32 nDirEnd = fileName.lastIndexOf('/');
889*cdf0e10cSrcweir //
890*cdf0e10cSrcweir //     OSL_ENSURE(nDirEnd >= 0, "Cannot locate executable directory");
891*cdf0e10cSrcweir //
892*cdf0e10cSrcweir //     rtl::OUString aDirURL = fileName.copy(0, nDirEnd);
893*cdf0e10cSrcweir //     return aDirURL;
894*cdf0e10cSrcweir // }
895*cdf0e10cSrcweir 
896*cdf0e10cSrcweir static void removeAndCreateFile(rtl::OUString const& _suFileURL, rtl::OString const& _sContent)
897*cdf0e10cSrcweir {
898*cdf0e10cSrcweir     osl::File::remove(_suFileURL);
899*cdf0e10cSrcweir 
900*cdf0e10cSrcweir     ::std::auto_ptr<osl::File> pFile( new osl::File( _suFileURL ) );
901*cdf0e10cSrcweir     ::osl::FileBase::RC nError = pFile->open( OpenFlag_Write | OpenFlag_Create );
902*cdf0e10cSrcweir     if ( ::osl::FileBase::E_None == nError || ::osl::FileBase::E_EXIST == nError )
903*cdf0e10cSrcweir     {
904*cdf0e10cSrcweir         t_print(T_VERBOSE, "%s\n" , OString(_suFileURL, _suFileURL.getLength(), RTL_TEXTENCODING_ASCII_US).getStr());
905*cdf0e10cSrcweir         sal_uInt64 nWritenBytes;
906*cdf0e10cSrcweir         pFile->write(_sContent.getStr(), _sContent.getLength(), nWritenBytes);
907*cdf0e10cSrcweir         // t_print("nBytes: %ld\n", nBytes);
908*cdf0e10cSrcweir 
909*cdf0e10cSrcweir         rtl::OString sError = "can't write enough bytes to file";
910*cdf0e10cSrcweir         sError += OString(_suFileURL, _suFileURL.getLength(), RTL_TEXTENCODING_ASCII_US);
911*cdf0e10cSrcweir         OSL_ENSURE(nWritenBytes == _sContent.getLength(), sError.getStr());
912*cdf0e10cSrcweir 
913*cdf0e10cSrcweir         pFile->close();
914*cdf0e10cSrcweir     }
915*cdf0e10cSrcweir     else
916*cdf0e10cSrcweir     {
917*cdf0e10cSrcweir         rtl::OString sError = "can't create file URL: '";
918*cdf0e10cSrcweir         rtl::OString sFile;
919*cdf0e10cSrcweir         sFile <<= _suFileURL;
920*cdf0e10cSrcweir         sError += sFile;
921*cdf0e10cSrcweir         sError += "' maybe no write access. If it is true with no write access, please create a local environment and start these tests again. rtl::Bootstrap test must quit.";
922*cdf0e10cSrcweir         t_print("%s\n", sError.getStr() );
923*cdf0e10cSrcweir         exit(1);
924*cdf0e10cSrcweir     }
925*cdf0e10cSrcweir     OSL_ASSERT(t_fileExist(_suFileURL) == true);
926*cdf0e10cSrcweir }
927*cdf0e10cSrcweir 
928*cdf0e10cSrcweir // -----------------------------------------------------------------------------
929*cdf0e10cSrcweir static void create_rtlrc()
930*cdf0e10cSrcweir {
931*cdf0e10cSrcweir     rtl::OUString aFileURL(getExecutableDirectory());
932*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
933*cdf0e10cSrcweir     aFileURL += rtl::OUString::createFromAscii("/rtl.ini");
934*cdf0e10cSrcweir #else
935*cdf0e10cSrcweir     aFileURL += rtl::OUString::createFromAscii("/rtlrc");
936*cdf0e10cSrcweir #endif
937*cdf0e10cSrcweir 
938*cdf0e10cSrcweir     rtl::OString sLines;
939*cdf0e10cSrcweir     sLines += "[Bootstrap]\n";
940*cdf0e10cSrcweir     sLines += "SOVALUE=src680_qadev\n";
941*cdf0e10cSrcweir     sLines += "RTLVALUE=qadev17\n";
942*cdf0e10cSrcweir     sLines += "TESTSHL_SOVALUE=rtlfile\n";
943*cdf0e10cSrcweir     sLines += "RECURSIVE=${$ORIGIN/" SAL_CONFIGFILE("testshl2") ":RECURSIVE}\n";
944*cdf0e10cSrcweir     sLines += "ORIGIN=direct\n";
945*cdf0e10cSrcweir     sLines += "[Other_Section]\n";
946*cdf0e10cSrcweir     sLines += "TESTSHL_SOVALUE=rtlfile_other\n";
947*cdf0e10cSrcweir 
948*cdf0e10cSrcweir     removeAndCreateFile(aFileURL, sLines);
949*cdf0e10cSrcweir }
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir // -----------------------------------------------------------------------------
952*cdf0e10cSrcweir static void create_testshl2rc()
953*cdf0e10cSrcweir {
954*cdf0e10cSrcweir     rtl::OUString aFileURL(getExecutableDirectory());
955*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
956*cdf0e10cSrcweir     aFileURL += rtl::OUString::createFromAscii("/testshl2.ini");
957*cdf0e10cSrcweir #else
958*cdf0e10cSrcweir     aFileURL += rtl::OUString::createFromAscii("/testshl2rc");
959*cdf0e10cSrcweir #endif
960*cdf0e10cSrcweir     rtl::OString sLines;
961*cdf0e10cSrcweir     sLines += "[Bootstrap]\n";
962*cdf0e10cSrcweir     sLines += "FILE=testshl2 file\n";
963*cdf0e10cSrcweir     sLines += "MYBOOTSTRAPTESTVALUE=file\n";
964*cdf0e10cSrcweir     sLines += "INHERITED_VALUE=inherited_value\n";
965*cdf0e10cSrcweir     sLines += "INHERITED_OVERWRITTEN_VALUE=not_overwritten\n";
966*cdf0e10cSrcweir     sLines += "MYVAR=src680_test\n";
967*cdf0e10cSrcweir     sLines += "SOFROMVALUE=${$ORIGIN/" SAL_CONFIGFILE("rtl") "::SOVALUE}\n";
968*cdf0e10cSrcweir     sLines += "SOFROMVALUE2=test\n";
969*cdf0e10cSrcweir     sLines += "SOFROMVALUE3=${$ORIGIN/" SAL_CONFIGFILE("rtl") "::TESTSHL_SOVALUE}\n";
970*cdf0e10cSrcweir     sLines += "TESTSHL_SOVALUE=testshl2_file\n";
971*cdf0e10cSrcweir     //? sLines += "SOFROMVALUE4=${" SAL_CONFIGFILE("rtl") ":Other_Section:TESTSHL_SOVALUE}\n";
972*cdf0e10cSrcweir     sLines += "ILLEGAL VALUE=test\n";
973*cdf0e10cSrcweir     sLines += "ILLEGAL.DOT=test\n";
974*cdf0e10cSrcweir     sLines += "ILLEGAL;SEMICOLON=test\n";
975*cdf0e10cSrcweir     sLines += "ILLEGAL:COLON=test\n";
976*cdf0e10cSrcweir     sLines += "  KEY_FOR_TRIM_TEST  =   value for trim test    \n";
977*cdf0e10cSrcweir     sLines += "RECURSIVE=${$ORIGIN/" SAL_CONFIGFILE("rtl") ":RECURSIVE}\n";
978*cdf0e10cSrcweir     sLines += "LINKED=${${.link:$ORIGIN/testshl2-link}:RTLVALUE}\n";
979*cdf0e10cSrcweir     sLines += "[Other_Section]\n";
980*cdf0e10cSrcweir     sLines += "FILE=testshl2 file other\n";
981*cdf0e10cSrcweir     sLines += "EXPAND=$FILE\n";
982*cdf0e10cSrcweir     //? sLines += "TESTSHL_SOVALUE=testshl2_file_other\n";
983*cdf0e10cSrcweir 
984*cdf0e10cSrcweir     removeAndCreateFile(aFileURL, sLines);
985*cdf0e10cSrcweir 
986*cdf0e10cSrcweir     removeAndCreateFile(
987*cdf0e10cSrcweir         (getExecutableDirectory() +
988*cdf0e10cSrcweir          rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/testshl2-link"))),
989*cdf0e10cSrcweir         SAL_CONFIGFILE("rtl"));
990*cdf0e10cSrcweir }
991*cdf0e10cSrcweir 
992*cdf0e10cSrcweir // -----------------------------------------------------------------------------
993*cdf0e10cSrcweir 
994*cdf0e10cSrcweir static void create_pseudorc()
995*cdf0e10cSrcweir {
996*cdf0e10cSrcweir     rtl::OUString aFileURL(getExecutableDirectory());
997*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
998*cdf0e10cSrcweir     aFileURL += rtl::OUString::createFromAscii("/pseudo.ini");
999*cdf0e10cSrcweir #else
1000*cdf0e10cSrcweir     aFileURL += rtl::OUString::createFromAscii("/pseudorc");
1001*cdf0e10cSrcweir #endif
1002*cdf0e10cSrcweir     rtl::OString sLines;
1003*cdf0e10cSrcweir     sLines += "[Bootstrap]\n";
1004*cdf0e10cSrcweir     sLines += "FILE=pseudo file\n";
1005*cdf0e10cSrcweir     sLines += "PSEUDOFILE=be pseudo\n";
1006*cdf0e10cSrcweir 
1007*cdf0e10cSrcweir     removeAndCreateFile(aFileURL, sLines);
1008*cdf0e10cSrcweir }
1009*cdf0e10cSrcweir 
1010*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1011*cdf0e10cSrcweir void create_bootstrap_processrc()
1012*cdf0e10cSrcweir {
1013*cdf0e10cSrcweir     rtl::OUString aDirURL(getModulePath());
1014*cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
1015*cdf0e10cSrcweir     aDirURL += rtl::OUString::createFromAscii("/bootstrap_process.ini");
1016*cdf0e10cSrcweir #else
1017*cdf0e10cSrcweir     aDirURL += rtl::OUString::createFromAscii("/bootstrap_processrc");
1018*cdf0e10cSrcweir #endif
1019*cdf0e10cSrcweir     rtl::OString sLines;
1020*cdf0e10cSrcweir     sLines += "[Bootstrap]\n";
1021*cdf0e10cSrcweir     sLines += "EXECUTABLE_RC=true\n";
1022*cdf0e10cSrcweir     sLines += "IF_CUSTOM_RC=false\n";
1023*cdf0e10cSrcweir 
1024*cdf0e10cSrcweir     removeAndCreateFile(aDirURL, sLines);
1025*cdf0e10cSrcweir }
1026*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1027*cdf0e10cSrcweir 
1028*cdf0e10cSrcweir void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
1029*cdf0e10cSrcweir {
1030*cdf0e10cSrcweir     (void) _pFunc;
1031*cdf0e10cSrcweir     // start message
1032*cdf0e10cSrcweir     t_print(T_VERBOSE, "Initializing ...\n" );
1033*cdf0e10cSrcweir     create_rtlrc();
1034*cdf0e10cSrcweir     create_testshl2rc();
1035*cdf0e10cSrcweir     create_pseudorc();
1036*cdf0e10cSrcweir     create_bootstrap_processrc();
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir     t_print(T_VERBOSE, "Initialization Done.\n" );
1039*cdf0e10cSrcweir }
1040*cdf0e10cSrcweir 
1041