xref: /aoo4110/main/sal/qa/osl/module/osl_Module.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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sal.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
28*b1cdbd2cSJim Jagielski // include files
29*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
30*b1cdbd2cSJim Jagielski #include <osl_Module_Const.h>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski using namespace	osl;
33*b1cdbd2cSJim Jagielski using namespace	rtl;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
37*b1cdbd2cSJim Jagielski // helper functions and classes
38*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski /** print Boolean value.
41*b1cdbd2cSJim Jagielski */
printBool(sal_Bool bOk)42*b1cdbd2cSJim Jagielski inline void printBool( sal_Bool bOk )
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski 	t_print("#printBool# " );
45*b1cdbd2cSJim Jagielski 	( sal_True == bOk ) ? t_print("TRUE!\n" ): t_print("FALSE!\n" );
46*b1cdbd2cSJim Jagielski }
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski /** print a UNI_CODE String.
49*b1cdbd2cSJim Jagielski */
printUString(const::rtl::OUString & str)50*b1cdbd2cSJim Jagielski inline void printUString( const ::rtl::OUString & str )
51*b1cdbd2cSJim Jagielski {
52*b1cdbd2cSJim Jagielski 	rtl::OString aString;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski 	t_print("#printUString_u# " );
55*b1cdbd2cSJim Jagielski 	aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
56*b1cdbd2cSJim Jagielski 	t_print("%s\n", aString.getStr( ) );
57*b1cdbd2cSJim Jagielski }
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski /** get dll file URL.
60*b1cdbd2cSJim Jagielski */
getDllURL(void)61*b1cdbd2cSJim Jagielski inline ::rtl::OUString getDllURL( void )
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski #if ( defined WNT )	       // lib in Unix and lib in Windows are not same in file name.
64*b1cdbd2cSJim Jagielski 	::rtl::OUString libPath( rtl::OUString::createFromAscii( "Module_DLL.dll" ) );
65*b1cdbd2cSJim Jagielski #else
66*b1cdbd2cSJim Jagielski 	::rtl::OUString libPath( rtl::OUString::createFromAscii( "libModule_DLL.so" ) );
67*b1cdbd2cSJim Jagielski #endif
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 	::rtl::OUString dirPath, dllPath;
70*b1cdbd2cSJim Jagielski 	osl::Module::getUrlFromAddress( ( void* ) &getDllURL, dirPath );
71*b1cdbd2cSJim Jagielski 	dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
72*b1cdbd2cSJim Jagielski 	osl::FileBase::getAbsoluteFileURL( dirPath, libPath, dllPath );
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 	return dllPath;
75*b1cdbd2cSJim Jagielski }
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski /** print a UNI_CODE file name.
78*b1cdbd2cSJim Jagielski */
printFileName(const::rtl::OUString & str)79*b1cdbd2cSJim Jagielski inline void printFileName( const ::rtl::OUString & str )
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski 	rtl::OString aString;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 	t_print("#printFileName_u# " );
84*b1cdbd2cSJim Jagielski 	aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
85*b1cdbd2cSJim Jagielski 	t_print("%s\n", aString.getStr( ) );
86*b1cdbd2cSJim Jagielski }
87*b1cdbd2cSJim Jagielski 
isURL(const::rtl::OUString pathname)88*b1cdbd2cSJim Jagielski inline sal_Bool isURL( const ::rtl::OUString pathname )
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski 	::rtl::OUString aPreURL( rtl::OUString::createFromAscii( "file:///" ) );
91*b1cdbd2cSJim Jagielski 	return ( ( pathname.indexOf( aPreURL ) == 0 ) ? sal_True : sal_False );
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski /** create a temp test directory using OUString name of full qualified URL or system path.
95*b1cdbd2cSJim Jagielski */
createTestDirectory(const::rtl::OUString dirname)96*b1cdbd2cSJim Jagielski inline void createTestDirectory( const ::rtl::OUString dirname )
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	::rtl::OUString     aPathURL   = dirname.copy( 0 );
99*b1cdbd2cSJim Jagielski 	::osl::FileBase::RC	nError;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	if ( !isURL( dirname ) )
102*b1cdbd2cSJim Jagielski 		::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
103*b1cdbd2cSJim Jagielski 	nError = ::osl::Directory::create( aPathURL );
104*b1cdbd2cSJim Jagielski 	CPPUNIT_ASSERT_MESSAGE( "In createTestDirectory Function: creation: ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_EXIST ) );
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski /** delete a temp test directory using OUString name of full qualified URL or system path.
108*b1cdbd2cSJim Jagielski */
deleteTestDirectory(const::rtl::OUString dirname)109*b1cdbd2cSJim Jagielski inline void deleteTestDirectory( const ::rtl::OUString dirname )
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski 	::rtl::OUString     aPathURL   = dirname.copy( 0 );
112*b1cdbd2cSJim Jagielski 	::osl::FileBase::RC	nError;
113*b1cdbd2cSJim Jagielski 	if ( !isURL( dirname ) )
114*b1cdbd2cSJim Jagielski 		::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	::osl::Directory testDir( aPathURL );
117*b1cdbd2cSJim Jagielski 	if ( testDir.isOpen( ) == sal_True )
118*b1cdbd2cSJim Jagielski 	{
119*b1cdbd2cSJim Jagielski         	testDir.close( );  //close if still open.
120*b1cdbd2cSJim Jagielski     	}
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 	nError = ::osl::Directory::remove( aPathURL );
123*b1cdbd2cSJim Jagielski  	CPPUNIT_ASSERT_MESSAGE( "In deleteTestDirectory function: remove ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ) );
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski //check if the file exist
ifFileExist(const::rtl::OUString & str)127*b1cdbd2cSJim Jagielski inline sal_Bool ifFileExist( const ::rtl::OUString & str )
128*b1cdbd2cSJim Jagielski {
129*b1cdbd2cSJim Jagielski 	::rtl::OUString 	aUStr;
130*b1cdbd2cSJim Jagielski 	if ( isURL( str ) )
131*b1cdbd2cSJim Jagielski 		::osl::FileBase::getSystemPathFromFileURL( str, aUStr );
132*b1cdbd2cSJim Jagielski 	else
133*b1cdbd2cSJim Jagielski 		return sal_False;
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 	::osl::File strFile( aUStr );
136*b1cdbd2cSJim Jagielski 	::osl::FileBase::RC	nError = strFile.open( OpenFlag_Read );
137*b1cdbd2cSJim Jagielski 	if ( ::File::E_NOENT == nError )
138*b1cdbd2cSJim Jagielski 		return sal_False;
139*b1cdbd2cSJim Jagielski 	else{
140*b1cdbd2cSJim Jagielski 		strFile.close( );
141*b1cdbd2cSJim Jagielski 		return sal_True;
142*b1cdbd2cSJim Jagielski 	}
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski /** detete a temp test file using OUString name.
146*b1cdbd2cSJim Jagielski */
deleteTestFile(const::rtl::OUString filename)147*b1cdbd2cSJim Jagielski inline void deleteTestFile( const ::rtl::OUString filename )
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski 	::rtl::OUString	aPathURL   = filename.copy( 0 );
150*b1cdbd2cSJim Jagielski 	::osl::FileBase::RC	nError;
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 	if ( !isURL( filename ) )
153*b1cdbd2cSJim Jagielski 		::osl::FileBase::getFileURLFromSystemPath( filename, aPathURL ); //convert if not full qualified URL
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	nError = ::osl::File::setAttributes( aPathURL, Attribute_GrpWrite| Attribute_OwnWrite| Attribute_OthWrite ); // if readonly, make writtenable.
156*b1cdbd2cSJim Jagielski 	CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: set writtenable ", ( ::osl::FileBase::E_None == nError ) || ( ::osl::FileBase::E_NOENT == nError ) );
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 	nError = ::osl::File::remove( aPathURL );
159*b1cdbd2cSJim Jagielski 	CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: remove ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ) );
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
164*b1cdbd2cSJim Jagielski // test code start here
165*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski namespace osl_Module
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	/** class and member function that is available for module test :
171*b1cdbd2cSJim Jagielski 	*/
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	class testClass
174*b1cdbd2cSJim Jagielski 	{
175*b1cdbd2cSJim Jagielski 	public:
myFunc()176*b1cdbd2cSJim Jagielski 		static void myFunc()
177*b1cdbd2cSJim Jagielski 		{
178*b1cdbd2cSJim Jagielski 			t_print("#Sun Microsystem\n");
179*b1cdbd2cSJim Jagielski 		};
180*b1cdbd2cSJim Jagielski 	};
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 	/** testing the methods:
184*b1cdbd2cSJim Jagielski 		Module();
185*b1cdbd2cSJim Jagielski 		Module( const ::rtl::OUString& strModuleName, sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT);
186*b1cdbd2cSJim Jagielski 	*/
187*b1cdbd2cSJim Jagielski 	class ctors : public CppUnit::TestFixture
188*b1cdbd2cSJim Jagielski 	{
189*b1cdbd2cSJim Jagielski 	public:
190*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
191*b1cdbd2cSJim Jagielski 
ctors_none()192*b1cdbd2cSJim Jagielski 		void ctors_none( )
193*b1cdbd2cSJim Jagielski 		{
194*b1cdbd2cSJim Jagielski 			::osl::Module aMod;
195*b1cdbd2cSJim Jagielski 			bRes = aMod.is();
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor without parameter.",
198*b1cdbd2cSJim Jagielski 									sal_False == bRes  );
199*b1cdbd2cSJim Jagielski 		}
200*b1cdbd2cSJim Jagielski 
ctors_name_mode()201*b1cdbd2cSJim Jagielski 		void ctors_name_mode( )
202*b1cdbd2cSJim Jagielski 		{
203*b1cdbd2cSJim Jagielski 			OUString aFileURL;
204*b1cdbd2cSJim Jagielski             bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL );
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 			if ( !( bRes ) )
207*b1cdbd2cSJim Jagielski 			{
208*b1cdbd2cSJim Jagielski 				CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.",  sal_False  );
209*b1cdbd2cSJim Jagielski 			}
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 			::osl::Module aMod( aFileURL );
212*b1cdbd2cSJim Jagielski 			bRes = aMod.is( );
213*b1cdbd2cSJim Jagielski 			aMod.unload( );
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with load action.",
216*b1cdbd2cSJim Jagielski 									sal_True == bRes  );
217*b1cdbd2cSJim Jagielski 		}
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( ctors );
220*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( ctors_none );
221*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( ctors_name_mode );
222*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
223*b1cdbd2cSJim Jagielski 	}; // class ctors
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 	/** testing the methods:
227*b1cdbd2cSJim Jagielski 		static sal_Bool getUrlFromAddress(void * addr, ::rtl::OUString & libraryUrl)
228*b1cdbd2cSJim Jagielski 	*/
229*b1cdbd2cSJim Jagielski 	class getUrlFromAddress : public CppUnit::TestFixture
230*b1cdbd2cSJim Jagielski 	{
231*b1cdbd2cSJim Jagielski 	public:
232*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
233*b1cdbd2cSJim Jagielski 
getUrlFromAddress_001()234*b1cdbd2cSJim Jagielski 		void getUrlFromAddress_001( )
235*b1cdbd2cSJim Jagielski 		{
236*b1cdbd2cSJim Jagielski 			OUString aFileURL;
237*b1cdbd2cSJim Jagielski             bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL ) ;
238*b1cdbd2cSJim Jagielski 			if ( !( bRes ) )
239*b1cdbd2cSJim Jagielski 			{
240*b1cdbd2cSJim Jagielski 				CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.",  sal_False  );
241*b1cdbd2cSJim Jagielski 			}
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: test get Module URL from address.",
244*b1cdbd2cSJim Jagielski 									sal_True == bRes && 0 < aFileURL.lastIndexOf('/')  );
245*b1cdbd2cSJim Jagielski 		}
246*b1cdbd2cSJim Jagielski 
getUrlFromAddress_002()247*b1cdbd2cSJim Jagielski 		void getUrlFromAddress_002( )
248*b1cdbd2cSJim Jagielski 		{
249*b1cdbd2cSJim Jagielski 			::osl::Module aMod( getDllURL( ) );
250*b1cdbd2cSJim Jagielski 			FuncPtr pFunc = ( FuncPtr ) aMod.getSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 			OUString aFileURL;
253*b1cdbd2cSJim Jagielski             bRes = osl::Module::getUrlFromAddress( ( void* )pFunc, aFileURL );
254*b1cdbd2cSJim Jagielski 			if ( !( bRes  ) )
255*b1cdbd2cSJim Jagielski 			{
256*b1cdbd2cSJim Jagielski 				CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.",  sal_False  );
257*b1cdbd2cSJim Jagielski 			}
258*b1cdbd2cSJim Jagielski 			aMod.unload( );
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: load an external library, get its function address and get its URL.",
261*b1cdbd2cSJim Jagielski 									sal_True == bRes && 0 < aFileURL.lastIndexOf('/') && aFileURL.equalsIgnoreAsciiCase( getDllURL( ) ) );
262*b1cdbd2cSJim Jagielski 		}
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 		/* tester comments: another case is getFunctionSymbol_001*/
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( getUrlFromAddress );
267*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( getUrlFromAddress_001 );
268*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( getUrlFromAddress_002 );
269*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
270*b1cdbd2cSJim Jagielski 	}; // class getUrlFromAddress
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 	/** testing the method:
274*b1cdbd2cSJim Jagielski 		sal_Bool SAL_CALL load( const ::rtl::OUString& strModuleName,
275*b1cdbd2cSJim Jagielski         	                                     sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT)
276*b1cdbd2cSJim Jagielski 	*/
277*b1cdbd2cSJim Jagielski 	class load : public CppUnit::TestFixture
278*b1cdbd2cSJim Jagielski 	{
279*b1cdbd2cSJim Jagielski 	public:
280*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
281*b1cdbd2cSJim Jagielski 
load_001()282*b1cdbd2cSJim Jagielski 		void load_001( )
283*b1cdbd2cSJim Jagielski 		{
284*b1cdbd2cSJim Jagielski 			::osl::Module aMod( getDllURL( ) );
285*b1cdbd2cSJim Jagielski 			::osl::Module aMod1;
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 			aMod1.load( getDllURL( ) );
288*b1cdbd2cSJim Jagielski 			bRes = oslModule(aMod) == oslModule(aMod1);
289*b1cdbd2cSJim Jagielski 			aMod.unload( );
290*b1cdbd2cSJim Jagielski 			aMod1.unload( );
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: load function should do the same thing as constructor with library name.",
293*b1cdbd2cSJim Jagielski 									sal_True == bRes  );
294*b1cdbd2cSJim Jagielski 		}
295*b1cdbd2cSJim Jagielski 		// load lib which is under a CJK directory
load_002()296*b1cdbd2cSJim Jagielski 		void load_002( )
297*b1cdbd2cSJim Jagielski 		{
298*b1cdbd2cSJim Jagielski #ifdef UNX
299*b1cdbd2cSJim Jagielski 			//Can not get a CJK directory already exist, so here create one. Perhaps reason is encoding problem.
300*b1cdbd2cSJim Jagielski 			::rtl::OUString aPidDirURL = rtl::OUString::createFromAscii( "file:///tmp/" ) + ::rtl::OUString::valueOf( ( long )getpid( ) );
301*b1cdbd2cSJim Jagielski 			::rtl::OUString aMyDirURL = aPidDirURL + aKname;
302*b1cdbd2cSJim Jagielski 			createTestDirectory( aPidDirURL );
303*b1cdbd2cSJim Jagielski 			createTestDirectory( aMyDirURL );
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 			::rtl::OUString aDLLURL = aMyDirURL + rtl::OUString::createFromAscii( "/libModule_DLL.so" );
306*b1cdbd2cSJim Jagielski 			//check if the lib exist.
307*b1cdbd2cSJim Jagielski 			//FIXME: if assert condition is false, the case will return, so the directory will not be clean-up
308*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#Source file is not exist. please manually clean-up directory and file under /tmp", ifFileExist( getDllURL( ) ) == sal_True );
309*b1cdbd2cSJim Jagielski 			::osl::FileBase::RC nError = ::osl::File::copy( getDllURL( ), aDLLURL );
310*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#copy failed. please manually clean-up directory and file under /tmp", nError == ::osl::FileBase::E_None );
311*b1cdbd2cSJim Jagielski 			//ifFileExist returned false but the file exist
312*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#This file is not exist, copy failed. please manually clean-up directory and file under /tmp", ifFileExist( aDLLURL ) == sal_True );
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 			//test if can create a normal file
315*b1cdbd2cSJim Jagielski 			::rtl::OUString aFileURL = aMyDirURL + rtl::OUString::createFromAscii( "/test_file" );
316*b1cdbd2cSJim Jagielski 			::osl::File testFile( aFileURL );
317*b1cdbd2cSJim Jagielski 			nError = testFile.open( OpenFlag_Create );
318*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#create failed. please manually clean-up directory and file under /tmp", nError == ::osl::FileBase::E_None );
319*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#This file is not exist, create failed. please manually clean-up directory and file under /tmp", ifFileExist( aFileURL ) == sal_True );
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 			//load the copied dll
322*b1cdbd2cSJim Jagielski 			::osl::Module aMod( aDLLURL );
323*b1cdbd2cSJim Jagielski 			::osl::Module aMod1;
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 			sal_Bool bOK = aMod1.load( aDLLURL );
326*b1cdbd2cSJim Jagielski 			bRes = oslModule(aMod) == oslModule(aMod1);
327*b1cdbd2cSJim Jagielski 			aMod.unload( );
328*b1cdbd2cSJim Jagielski 			aMod1.unload( );
329*b1cdbd2cSJim Jagielski 			deleteTestFile( aFileURL );
330*b1cdbd2cSJim Jagielski 			deleteTestFile( aDLLURL );
331*b1cdbd2cSJim Jagielski 			deleteTestDirectory( aMyDirURL );
332*b1cdbd2cSJim Jagielski 			deleteTestDirectory( aPidDirURL );
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: load lib which is under a CJK directory.",
335*b1cdbd2cSJim Jagielski 									sal_True == bRes && bOK == sal_True );
336*b1cdbd2cSJim Jagielski #endif
337*b1cdbd2cSJim Jagielski 		}
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( load );
340*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( load_001 );
341*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( load_002 );
342*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
343*b1cdbd2cSJim Jagielski 	}; // class load
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	/** testing the method:
347*b1cdbd2cSJim Jagielski 		void SAL_CALL unload()
348*b1cdbd2cSJim Jagielski 	*/
349*b1cdbd2cSJim Jagielski 	class unload : public CppUnit::TestFixture
350*b1cdbd2cSJim Jagielski 	{
351*b1cdbd2cSJim Jagielski 	public:
352*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
353*b1cdbd2cSJim Jagielski 
unload_001()354*b1cdbd2cSJim Jagielski 		void unload_001( )
355*b1cdbd2cSJim Jagielski 		{
356*b1cdbd2cSJim Jagielski 			::osl::Module aMod( getDllURL( ) );
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 			aMod.unload( );
359*b1cdbd2cSJim Jagielski 			bRes = oslModule(aMod) ==NULL;
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: unload function should do the same thing as destructor.",
362*b1cdbd2cSJim Jagielski 									sal_True == bRes  );
363*b1cdbd2cSJim Jagielski 		}
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( unload );
366*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( unload_001 );
367*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
368*b1cdbd2cSJim Jagielski 	}; // class unload
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 	/** testing the methods:
372*b1cdbd2cSJim Jagielski 		sal_Bool SAL_CALL is() const
373*b1cdbd2cSJim Jagielski 	*/
374*b1cdbd2cSJim Jagielski 	class is : public CppUnit::TestFixture
375*b1cdbd2cSJim Jagielski 	{
376*b1cdbd2cSJim Jagielski 	public:
377*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
378*b1cdbd2cSJim Jagielski 
is_001()379*b1cdbd2cSJim Jagielski 		void is_001( )
380*b1cdbd2cSJim Jagielski 		{
381*b1cdbd2cSJim Jagielski 			OUString aFileURL;
382*b1cdbd2cSJim Jagielski             bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL );
383*b1cdbd2cSJim Jagielski 			if ( !( bRes  ) )
384*b1cdbd2cSJim Jagielski 			{
385*b1cdbd2cSJim Jagielski 				CPPUNIT_ASSERT_MESSAGE("Cannot locate current module - using executable instead",  sal_False  );
386*b1cdbd2cSJim Jagielski 			}
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 			::osl::Module aMod;
389*b1cdbd2cSJim Jagielski 			bRes = aMod.is( );
390*b1cdbd2cSJim Jagielski 			aMod.load( aFileURL );
391*b1cdbd2cSJim Jagielski 			bRes1 = aMod.is( );
392*b1cdbd2cSJim Jagielski 			aMod.unload( );
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: test if a module is a loaded module.",
395*b1cdbd2cSJim Jagielski 									 sal_False == bRes && sal_True == bRes1);
396*b1cdbd2cSJim Jagielski 		}
397*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( is );
398*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( is_001 );
399*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
400*b1cdbd2cSJim Jagielski 	}; // class is
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 	/** testing the methods:
404*b1cdbd2cSJim Jagielski 		void* SAL_CALL getSymbol( const ::rtl::OUString& strSymbolName)
405*b1cdbd2cSJim Jagielski 	*/
406*b1cdbd2cSJim Jagielski 	class getSymbol : public CppUnit::TestFixture
407*b1cdbd2cSJim Jagielski 	{
408*b1cdbd2cSJim Jagielski 	public:
409*b1cdbd2cSJim Jagielski 		sal_Bool bRes;
410*b1cdbd2cSJim Jagielski 
getSymbol_001()411*b1cdbd2cSJim Jagielski 		void getSymbol_001( )
412*b1cdbd2cSJim Jagielski 		{
413*b1cdbd2cSJim Jagielski 			::osl::Module aMod( getDllURL( ) );
414*b1cdbd2cSJim Jagielski 			FuncPtr pFunc = ( FuncPtr ) aMod.getSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
415*b1cdbd2cSJim Jagielski 			bRes = sal_False;
416*b1cdbd2cSJim Jagielski 			if ( pFunc )
417*b1cdbd2cSJim Jagielski 				bRes = pFunc( bRes );
418*b1cdbd2cSJim Jagielski 			aMod.unload();
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and call one function in it.",
421*b1cdbd2cSJim Jagielski 									 sal_True == bRes );
422*b1cdbd2cSJim Jagielski 		}
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( getSymbol );
425*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( getSymbol_001 );
426*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
427*b1cdbd2cSJim Jagielski 	}; // class getSymbol
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski 	/** testing the methods:
431*b1cdbd2cSJim Jagielski 		operator oslModule() const
432*b1cdbd2cSJim Jagielski 	*/
433*b1cdbd2cSJim Jagielski 	class optr_oslModule : public CppUnit::TestFixture
434*b1cdbd2cSJim Jagielski 	{
435*b1cdbd2cSJim Jagielski 	public:
436*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
437*b1cdbd2cSJim Jagielski 
optr_oslModule_001()438*b1cdbd2cSJim Jagielski 		void optr_oslModule_001( )
439*b1cdbd2cSJim Jagielski 		{
440*b1cdbd2cSJim Jagielski 			::osl::Module aMod;
441*b1cdbd2cSJim Jagielski 			bRes = ( (oslModule)aMod == NULL );
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 			aMod.load( getDllURL( ) );
444*b1cdbd2cSJim Jagielski 			bRes1 = (oslModule)aMod != NULL;
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 			aMod.unload( );
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: the m_Module of a Module instance will be NULL when is not loaded, it will not be NULL after loaded.",
449*b1cdbd2cSJim Jagielski 									 sal_True == bRes && sal_True == bRes1);
450*b1cdbd2cSJim Jagielski 		}
451*b1cdbd2cSJim Jagielski 
optr_oslModule_002()452*b1cdbd2cSJim Jagielski 		void optr_oslModule_002( )
453*b1cdbd2cSJim Jagielski 		{
454*b1cdbd2cSJim Jagielski 			::osl::Module aMod( getDllURL( ) );
455*b1cdbd2cSJim Jagielski 			::rtl::OUString funcName(::rtl::OUString::createFromAscii( "firstfunc" ) );
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 			FuncPtr pFunc = ( FuncPtr ) osl_getSymbol( (oslModule)aMod, funcName.pData );
458*b1cdbd2cSJim Jagielski 			bRes = sal_False;
459*b1cdbd2cSJim Jagielski 			if ( pFunc )
460*b1cdbd2cSJim Jagielski 				bRes = pFunc( bRes );
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 			aMod.unload();
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: use m_Module to call osl_getSymbol() function.",
465*b1cdbd2cSJim Jagielski 									 sal_True == bRes  );
466*b1cdbd2cSJim Jagielski 		}
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( optr_oslModule );
469*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( optr_oslModule_001 );
470*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( optr_oslModule_002 );
471*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
472*b1cdbd2cSJim Jagielski 	}; // class optr_oslModule
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 	/** testing the methods:
475*b1cdbd2cSJim Jagielski 		oslGenericFunction SAL_CALL getFunctionSymbol( const ::rtl::OUString& ustrFunctionSymbolName )
476*b1cdbd2cSJim Jagielski 	*/
477*b1cdbd2cSJim Jagielski 	class getFunctionSymbol : public CppUnit::TestFixture
478*b1cdbd2cSJim Jagielski 	{
479*b1cdbd2cSJim Jagielski 	public:
480*b1cdbd2cSJim Jagielski 		sal_Bool bRes, bRes1;
481*b1cdbd2cSJim Jagielski 
getFunctionSymbol_001()482*b1cdbd2cSJim Jagielski 		void getFunctionSymbol_001( )
483*b1cdbd2cSJim Jagielski 		{
484*b1cdbd2cSJim Jagielski 			::osl::Module aMod( getDllURL( ) );
485*b1cdbd2cSJim Jagielski 			oslGenericFunction oslFunc = aMod.getFunctionSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
486*b1cdbd2cSJim Jagielski 			::rtl::OUString aLibraryURL;
487*b1cdbd2cSJim Jagielski 			bRes = ::osl::Module::getUrlFromAddress( oslFunc, aLibraryURL);
488*b1cdbd2cSJim Jagielski 			aMod.unload();
489*b1cdbd2cSJim Jagielski 			printFileName( aLibraryURL );
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski 			CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and get its function addr and get its URL.",
492*b1cdbd2cSJim Jagielski 				 sal_True == bRes && aLibraryURL.equalsIgnoreAsciiCase( getDllURL() ) );
493*b1cdbd2cSJim Jagielski 		}
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE( getFunctionSymbol );
496*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST( getFunctionSymbol_001 );
497*b1cdbd2cSJim Jagielski 		//CPPUNIT_TEST( getFunctionSymbol_002 );
498*b1cdbd2cSJim Jagielski 		CPPUNIT_TEST_SUITE_END( );
499*b1cdbd2cSJim Jagielski 	}; // class getFunctionSymbol
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
502*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::ctors, "osl_Module");
503*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::getUrlFromAddress, "osl_Module");
504*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::load, "osl_Module");
505*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::unload, "osl_Module");
506*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::is, "osl_Module");
507*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::getSymbol, "osl_Module");
508*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::optr_oslModule, "osl_Module");
509*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::getFunctionSymbol, "osl_Module");
510*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski } // namespace osl_Module
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski // this macro creates an empty function, which will called by the RegisterAllFunctions()
517*b1cdbd2cSJim Jagielski // to let the user the possibility to also register some functions by hand.
518*b1cdbd2cSJim Jagielski NOADDITIONAL;
519