xref: /trunk/main/sal/qa/osl/module/osl_Module.cxx (revision 99ad85ff)
187d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
387d2adbcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
487d2adbcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
587d2adbcSAndrew Rist  * distributed with this work for additional information
687d2adbcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
787d2adbcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
887d2adbcSAndrew Rist  * "License"); you may not use this file except in compliance
987d2adbcSAndrew Rist  * with the License.  You may obtain a copy of the License at
1087d2adbcSAndrew Rist  *
1187d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1287d2adbcSAndrew Rist  *
1387d2adbcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1487d2adbcSAndrew Rist  * software distributed under the License is distributed on an
1587d2adbcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1687d2adbcSAndrew Rist  * KIND, either express or implied.  See the License for the
1787d2adbcSAndrew Rist  * specific language governing permissions and limitations
1887d2adbcSAndrew Rist  * under the License.
1987d2adbcSAndrew Rist  *
2087d2adbcSAndrew Rist  *************************************************************/
2187d2adbcSAndrew Rist 
2287d2adbcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sal.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //------------------------------------------------------------------------
28cdf0e10cSrcweir // include files
29cdf0e10cSrcweir //------------------------------------------------------------------------
3085328e2aSDamjan Jovanovic #include <osl_Module_Const.h>
3185328e2aSDamjan Jovanovic #include "gtest/gtest.h"
32cdf0e10cSrcweir 
33cdf0e10cSrcweir using namespace	osl;
34cdf0e10cSrcweir using namespace	rtl;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir 
37cdf0e10cSrcweir //------------------------------------------------------------------------
38cdf0e10cSrcweir // helper functions and classes
39cdf0e10cSrcweir //------------------------------------------------------------------------
40cdf0e10cSrcweir 
41cdf0e10cSrcweir /** print Boolean value.
42cdf0e10cSrcweir */
printBool(sal_Bool bOk)43cdf0e10cSrcweir inline void printBool( sal_Bool bOk )
44cdf0e10cSrcweir {
4585328e2aSDamjan Jovanovic 	printf("#printBool# " );
4685328e2aSDamjan Jovanovic 	( sal_True == bOk ) ? printf("TRUE!\n" ): printf("FALSE!\n" );
47cdf0e10cSrcweir }
48cdf0e10cSrcweir 
49cdf0e10cSrcweir /** print a UNI_CODE String.
50cdf0e10cSrcweir */
printUString(const::rtl::OUString & str)51cdf0e10cSrcweir inline void printUString( const ::rtl::OUString & str )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir 	rtl::OString aString;
54cdf0e10cSrcweir 
5585328e2aSDamjan Jovanovic 	printf("#printUString_u# " );
56cdf0e10cSrcweir 	aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
5785328e2aSDamjan Jovanovic 	printf("%s\n", aString.getStr( ) );
58cdf0e10cSrcweir }
59cdf0e10cSrcweir 
60cdf0e10cSrcweir /** get dll file URL.
61cdf0e10cSrcweir */
getDllURL(void)62cdf0e10cSrcweir inline ::rtl::OUString getDllURL( void )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir #if ( defined WNT )	       // lib in Unix and lib in Windows are not same in file name.
65cdf0e10cSrcweir 	::rtl::OUString libPath( rtl::OUString::createFromAscii( "Module_DLL.dll" ) );
66cdf0e10cSrcweir #else
67cdf0e10cSrcweir 	::rtl::OUString libPath( rtl::OUString::createFromAscii( "libModule_DLL.so" ) );
68cdf0e10cSrcweir #endif
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 	::rtl::OUString dirPath, dllPath;
71cdf0e10cSrcweir 	osl::Module::getUrlFromAddress( ( void* ) &getDllURL, dirPath );
7285328e2aSDamjan Jovanovic 	// file:///aoo/main/sal/unx/bin/osl_Module
7385328e2aSDamjan Jovanovic 	dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/'));
7485328e2aSDamjan Jovanovic 	// file:///aoo/main/sal/unx/bin
75cdf0e10cSrcweir 	dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
7685328e2aSDamjan Jovanovic 	// file:///aoo/main/sal/unx/
7785328e2aSDamjan Jovanovic 	dirPath = dirPath + rtl::OUString::createFromAscii( "lib/" );
7885328e2aSDamjan Jovanovic 	// file:///aoo/main/sal/unx/lib/
79cdf0e10cSrcweir 	osl::FileBase::getAbsoluteFileURL( dirPath, libPath, dllPath );
80cdf0e10cSrcweir 
8185328e2aSDamjan Jovanovic rtl::OString aOString = ::rtl::OUStringToOString (dllPath, RTL_TEXTENCODING_UTF8);
8285328e2aSDamjan Jovanovic printf("getDllURL() returning %s\n", aOString.getStr());
83cdf0e10cSrcweir 	return dllPath;
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
86cdf0e10cSrcweir /** print a UNI_CODE file name.
87cdf0e10cSrcweir */
printFileName(const::rtl::OUString & str)88cdf0e10cSrcweir inline void printFileName( const ::rtl::OUString & str )
89cdf0e10cSrcweir {
90cdf0e10cSrcweir 	rtl::OString aString;
91cdf0e10cSrcweir 
9285328e2aSDamjan Jovanovic 	printf("#printFileName_u# " );
93cdf0e10cSrcweir 	aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
9485328e2aSDamjan Jovanovic 	printf("%s\n", aString.getStr( ) );
95cdf0e10cSrcweir }
96cdf0e10cSrcweir 
isURL(const::rtl::OUString pathname)97cdf0e10cSrcweir inline sal_Bool isURL( const ::rtl::OUString pathname )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir 	::rtl::OUString aPreURL( rtl::OUString::createFromAscii( "file:///" ) );
100cdf0e10cSrcweir 	return ( ( pathname.indexOf( aPreURL ) == 0 ) ? sal_True : sal_False );
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir /** create a temp test directory using OUString name of full qualified URL or system path.
104cdf0e10cSrcweir */
createTestDirectory(const::rtl::OUString dirname)105cdf0e10cSrcweir inline void createTestDirectory( const ::rtl::OUString dirname )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	::rtl::OUString     aPathURL   = dirname.copy( 0 );
108cdf0e10cSrcweir 	::osl::FileBase::RC	nError;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 	if ( !isURL( dirname ) )
111cdf0e10cSrcweir 		::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
112cdf0e10cSrcweir 	nError = ::osl::Directory::create( aPathURL );
11385328e2aSDamjan Jovanovic 	ASSERT_TRUE(( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_EXIST )) << "In createTestDirectory Function: creation: ";
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir /** delete a temp test directory using OUString name of full qualified URL or system path.
117cdf0e10cSrcweir */
deleteTestDirectory(const::rtl::OUString dirname)118cdf0e10cSrcweir inline void deleteTestDirectory( const ::rtl::OUString dirname )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 	::rtl::OUString     aPathURL   = dirname.copy( 0 );
121cdf0e10cSrcweir 	::osl::FileBase::RC	nError;
122cdf0e10cSrcweir 	if ( !isURL( dirname ) )
123cdf0e10cSrcweir 		::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	::osl::Directory testDir( aPathURL );
126cdf0e10cSrcweir 	if ( testDir.isOpen( ) == sal_True )
127cdf0e10cSrcweir 	{
128cdf0e10cSrcweir         	testDir.close( );  //close if still open.
129cdf0e10cSrcweir     	}
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	nError = ::osl::Directory::remove( aPathURL );
13285328e2aSDamjan Jovanovic  	ASSERT_TRUE(( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT )) << "In deleteTestDirectory function: remove ";
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir //check if the file exist
ifFileExist(const::rtl::OUString & str)136cdf0e10cSrcweir inline sal_Bool ifFileExist( const ::rtl::OUString & str )
137cdf0e10cSrcweir {
138cdf0e10cSrcweir 	::rtl::OUString 	aUStr;
139cdf0e10cSrcweir 	if ( isURL( str ) )
140cdf0e10cSrcweir 		::osl::FileBase::getSystemPathFromFileURL( str, aUStr );
141cdf0e10cSrcweir 	else
142cdf0e10cSrcweir 		return sal_False;
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	::osl::File strFile( aUStr );
145cdf0e10cSrcweir 	::osl::FileBase::RC	nError = strFile.open( OpenFlag_Read );
146cdf0e10cSrcweir 	if ( ::File::E_NOENT == nError )
147cdf0e10cSrcweir 		return sal_False;
148cdf0e10cSrcweir 	else{
149cdf0e10cSrcweir 		strFile.close( );
150cdf0e10cSrcweir 		return sal_True;
151cdf0e10cSrcweir 	}
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
154*99ad85ffSJohn Bampton /** delete a temp test file using OUString name.
155cdf0e10cSrcweir */
deleteTestFile(const::rtl::OUString filename)156cdf0e10cSrcweir inline void deleteTestFile( const ::rtl::OUString filename )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir 	::rtl::OUString	aPathURL   = filename.copy( 0 );
159cdf0e10cSrcweir 	::osl::FileBase::RC	nError;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 	if ( !isURL( filename ) )
162cdf0e10cSrcweir 		::osl::FileBase::getFileURLFromSystemPath( filename, aPathURL ); //convert if not full qualified URL
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	nError = ::osl::File::setAttributes( aPathURL, Attribute_GrpWrite| Attribute_OwnWrite| Attribute_OthWrite ); // if readonly, make writtenable.
16585328e2aSDamjan Jovanovic 	ASSERT_TRUE(( ::osl::FileBase::E_None == nError ) || ( ::osl::FileBase::E_NOENT == nError )) << "In deleteTestFile Function: set writtenable ";
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 	nError = ::osl::File::remove( aPathURL );
16885328e2aSDamjan Jovanovic 	ASSERT_TRUE(( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT )) << "In deleteTestFile Function: remove ";
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 
172cdf0e10cSrcweir //------------------------------------------------------------------------
173cdf0e10cSrcweir // test code start here
174cdf0e10cSrcweir //------------------------------------------------------------------------
175cdf0e10cSrcweir 
176cdf0e10cSrcweir namespace osl_Module
177cdf0e10cSrcweir {
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 	/** class and member function that is available for module test :
180cdf0e10cSrcweir 	*/
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	class testClass
183cdf0e10cSrcweir 	{
184cdf0e10cSrcweir 	public:
myFunc()185cdf0e10cSrcweir 		static void myFunc()
186cdf0e10cSrcweir 		{
18785328e2aSDamjan Jovanovic 			printf("#Sun Microsystem\n");
188cdf0e10cSrcweir 		};
189cdf0e10cSrcweir 	};
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 	/** testing the methods:
193cdf0e10cSrcweir 		Module();
194cdf0e10cSrcweir 		Module( const ::rtl::OUString& strModuleName, sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT);
195cdf0e10cSrcweir 	*/
19685328e2aSDamjan Jovanovic 	class ctors : public ::testing::Test
197cdf0e10cSrcweir 	{
198cdf0e10cSrcweir 	public:
199cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
200cdf0e10cSrcweir 	}; // class ctors
201cdf0e10cSrcweir 
20285328e2aSDamjan Jovanovic 
TEST_F(ctors,ctors_none)20385328e2aSDamjan Jovanovic     TEST_F(ctors, ctors_none)
20485328e2aSDamjan Jovanovic     {
20585328e2aSDamjan Jovanovic         ::osl::Module aMod;
20685328e2aSDamjan Jovanovic         bRes = aMod.is();
20785328e2aSDamjan Jovanovic 
20885328e2aSDamjan Jovanovic         ASSERT_TRUE( sal_False == bRes ) << "#test comment#: test constructor without parameter.";
20985328e2aSDamjan Jovanovic     }
21085328e2aSDamjan Jovanovic 
TEST_F(ctors,ctors_name_mode)21185328e2aSDamjan Jovanovic     TEST_F(ctors, ctors_name_mode)
21285328e2aSDamjan Jovanovic     {
21385328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
21485328e2aSDamjan Jovanovic         bRes = aMod.is( );
21585328e2aSDamjan Jovanovic         aMod.unload( );
21685328e2aSDamjan Jovanovic 
21785328e2aSDamjan Jovanovic         ASSERT_TRUE( sal_True == bRes ) << "#test comment#: test constructor with load action.";
21885328e2aSDamjan Jovanovic     }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 	/** testing the methods:
221cdf0e10cSrcweir 		static sal_Bool getUrlFromAddress(void * addr, ::rtl::OUString & libraryUrl)
222cdf0e10cSrcweir 	*/
22385328e2aSDamjan Jovanovic 	class getUrlFromAddress : public ::testing::Test
224cdf0e10cSrcweir 	{
225cdf0e10cSrcweir 	public:
226cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
227cdf0e10cSrcweir 	}; // class getUrlFromAddress
22885328e2aSDamjan Jovanovic 
22985328e2aSDamjan Jovanovic     /* tester comments: another case is getFunctionSymbol_001*/
23085328e2aSDamjan Jovanovic 
TEST_F(getUrlFromAddress,getUrlFromAddress_001)23185328e2aSDamjan Jovanovic     TEST_F(getUrlFromAddress, getUrlFromAddress_001 )
23285328e2aSDamjan Jovanovic     {
23385328e2aSDamjan Jovanovic         OUString aFileURL;
23485328e2aSDamjan Jovanovic         bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL ) ;
23585328e2aSDamjan Jovanovic         if ( !( bRes ) )
23685328e2aSDamjan Jovanovic         {
23785328e2aSDamjan Jovanovic             ASSERT_TRUE(sal_False) << "Cannot locate current module.";
23885328e2aSDamjan Jovanovic         }
23985328e2aSDamjan Jovanovic 
24085328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes && 0 < aFileURL.lastIndexOf('/')) << "#test comment#: test get Module URL from address.";
24185328e2aSDamjan Jovanovic     }
24285328e2aSDamjan Jovanovic 
TEST_F(getUrlFromAddress,getUrlFromAddress_002)24385328e2aSDamjan Jovanovic     TEST_F(getUrlFromAddress, getUrlFromAddress_002 )
24485328e2aSDamjan Jovanovic     {
24585328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
24685328e2aSDamjan Jovanovic         FuncPtr pFunc = ( FuncPtr ) aMod.getSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
24785328e2aSDamjan Jovanovic 
24885328e2aSDamjan Jovanovic         OUString aFileURL;
24985328e2aSDamjan Jovanovic         bRes = osl::Module::getUrlFromAddress( ( void* )pFunc, aFileURL );
25085328e2aSDamjan Jovanovic         if ( !( bRes  ) )
25185328e2aSDamjan Jovanovic         {
25285328e2aSDamjan Jovanovic             ASSERT_TRUE(sal_False) << "Cannot locate current module.";
25385328e2aSDamjan Jovanovic         }
25485328e2aSDamjan Jovanovic         aMod.unload( );
25585328e2aSDamjan Jovanovic 
25685328e2aSDamjan Jovanovic         ASSERT_TRUE( sal_True == bRes && 0 < aFileURL.lastIndexOf('/') && aFileURL.equalsIgnoreAsciiCase( getDllURL( ) ) )
25785328e2aSDamjan Jovanovic             << "#test comment#: load an external library, get its function address and get its URL.";
25885328e2aSDamjan Jovanovic     }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	/** testing the method:
261cdf0e10cSrcweir 		sal_Bool SAL_CALL load( const ::rtl::OUString& strModuleName,
262cdf0e10cSrcweir         	                                     sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT)
263cdf0e10cSrcweir 	*/
26485328e2aSDamjan Jovanovic 	class load : public ::testing::Test
265cdf0e10cSrcweir 	{
266cdf0e10cSrcweir 	public:
267cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
268cdf0e10cSrcweir 	}; // class load
269cdf0e10cSrcweir 
TEST_F(load,load_001)27085328e2aSDamjan Jovanovic     TEST_F(load, load_001 )
27185328e2aSDamjan Jovanovic     {
27285328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
27385328e2aSDamjan Jovanovic         ::osl::Module aMod1;
27485328e2aSDamjan Jovanovic 
27585328e2aSDamjan Jovanovic         aMod1.load( getDllURL( ) );
27685328e2aSDamjan Jovanovic         bRes = oslModule(aMod) == oslModule(aMod1);
27785328e2aSDamjan Jovanovic         aMod.unload( );
27885328e2aSDamjan Jovanovic         aMod1.unload( );
27985328e2aSDamjan Jovanovic 
28085328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes) << "#test comment#: load function should do the same thing as constructor with library name.";
28185328e2aSDamjan Jovanovic     }
28285328e2aSDamjan Jovanovic     // load lib which is under a CJK directory
TEST_F(load,load_002)28385328e2aSDamjan Jovanovic     TEST_F(load, load_002 )
28485328e2aSDamjan Jovanovic     {
28585328e2aSDamjan Jovanovic #ifdef UNX
28685328e2aSDamjan Jovanovic         //Can not get a CJK directory already exist, so here create one. Perhaps reason is encoding problem.
28785328e2aSDamjan Jovanovic         ::rtl::OUString aPidDirURL = rtl::OUString::createFromAscii( "file:///tmp/" ) + ::rtl::OUString::valueOf( ( long )getpid( ) );
28885328e2aSDamjan Jovanovic         ::rtl::OUString aMyDirURL = aPidDirURL + aKname;
28985328e2aSDamjan Jovanovic         createTestDirectory( aPidDirURL );
29085328e2aSDamjan Jovanovic         createTestDirectory( aMyDirURL );
29185328e2aSDamjan Jovanovic 
29285328e2aSDamjan Jovanovic         ::rtl::OUString aDLLURL = aMyDirURL + rtl::OUString::createFromAscii( "/libModule_DLL.so" );
29385328e2aSDamjan Jovanovic         //check if the lib exist.
29485328e2aSDamjan Jovanovic         //FIXME: if assert condition is false, the case will return, so the directory will not be clean-up
29585328e2aSDamjan Jovanovic         ASSERT_TRUE(ifFileExist( getDllURL( ) ) == sal_True) << "#Source file is not exist. please manually clean-up directory and file under /tmp";
29685328e2aSDamjan Jovanovic         ::osl::FileBase::RC nError = ::osl::File::copy( getDllURL( ), aDLLURL );
29785328e2aSDamjan Jovanovic         ASSERT_TRUE(nError == ::osl::FileBase::E_None) << "#copy failed. please manually clean-up directory and file under /tmp";
29885328e2aSDamjan Jovanovic         //ifFileExist returned false but the file exist
29985328e2aSDamjan Jovanovic         ASSERT_TRUE( ifFileExist( aDLLURL ) == sal_True )
30085328e2aSDamjan Jovanovic             << "#This file is not exist, copy failed. please manually clean-up directory and file under /tmp";
30185328e2aSDamjan Jovanovic 
30285328e2aSDamjan Jovanovic         //test if can create a normal file
30385328e2aSDamjan Jovanovic         ::rtl::OUString aFileURL = aMyDirURL + rtl::OUString::createFromAscii( "/test_file" );
30485328e2aSDamjan Jovanovic         ::osl::File testFile( aFileURL );
30585328e2aSDamjan Jovanovic         nError = testFile.open( OpenFlag_Create );
30685328e2aSDamjan Jovanovic         ASSERT_TRUE(nError == ::osl::FileBase::E_None) << "#create failed. please manually clean-up directory and file under /tmp";
30785328e2aSDamjan Jovanovic         ASSERT_TRUE( ifFileExist( aFileURL ) == sal_True )
30885328e2aSDamjan Jovanovic             << "#This file is not exist, create failed. please manually clean-up directory and file under /tmp";
30985328e2aSDamjan Jovanovic 
31085328e2aSDamjan Jovanovic         //load the copied dll
31185328e2aSDamjan Jovanovic         ::osl::Module aMod( aDLLURL );
31285328e2aSDamjan Jovanovic         ::osl::Module aMod1;
31385328e2aSDamjan Jovanovic 
31485328e2aSDamjan Jovanovic         sal_Bool bOK = aMod1.load( aDLLURL );
31585328e2aSDamjan Jovanovic         bRes = oslModule(aMod) == oslModule(aMod1);
31685328e2aSDamjan Jovanovic         aMod.unload( );
31785328e2aSDamjan Jovanovic         aMod1.unload( );
31885328e2aSDamjan Jovanovic         deleteTestFile( aFileURL );
31985328e2aSDamjan Jovanovic         deleteTestFile( aDLLURL );
32085328e2aSDamjan Jovanovic         deleteTestDirectory( aMyDirURL );
32185328e2aSDamjan Jovanovic         deleteTestDirectory( aPidDirURL );
32285328e2aSDamjan Jovanovic 
32385328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes && bOK == sal_True) << "#test comment#: load lib which is under a CJK directory.";
32485328e2aSDamjan Jovanovic #endif
32585328e2aSDamjan Jovanovic     }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 	/** testing the method:
328cdf0e10cSrcweir 		void SAL_CALL unload()
329cdf0e10cSrcweir 	*/
33085328e2aSDamjan Jovanovic 	class unload : public ::testing::Test
331cdf0e10cSrcweir 	{
332cdf0e10cSrcweir 	public:
333cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
33485328e2aSDamjan Jovanovic 	}; // class unload
335cdf0e10cSrcweir 
TEST_F(unload,unload_001)33685328e2aSDamjan Jovanovic     TEST_F(unload, unload_001)
33785328e2aSDamjan Jovanovic     {
33885328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
339cdf0e10cSrcweir 
34085328e2aSDamjan Jovanovic         aMod.unload( );
34185328e2aSDamjan Jovanovic         bRes = oslModule(aMod) ==NULL;
342cdf0e10cSrcweir 
34385328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes) << "#test comment#: unload function should do the same thing as destructor.";
34485328e2aSDamjan Jovanovic     }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 	/** testing the methods:
347cdf0e10cSrcweir 		sal_Bool SAL_CALL is() const
348cdf0e10cSrcweir 	*/
34985328e2aSDamjan Jovanovic 	class is : public ::testing::Test
350cdf0e10cSrcweir 	{
351cdf0e10cSrcweir 	public:
352cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
353cdf0e10cSrcweir 	}; // class is
354cdf0e10cSrcweir 
TEST_F(is,is_001)35585328e2aSDamjan Jovanovic     TEST_F(is, is_001)
35685328e2aSDamjan Jovanovic     {
35785328e2aSDamjan Jovanovic         ::osl::Module aMod;
35885328e2aSDamjan Jovanovic         bRes = aMod.is( );
35985328e2aSDamjan Jovanovic         aMod.load( getDllURL( ) );
36085328e2aSDamjan Jovanovic         bRes1 = aMod.is( );
36185328e2aSDamjan Jovanovic         aMod.unload( );
36285328e2aSDamjan Jovanovic 
36385328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_False == bRes && sal_True == bRes1) << "#test comment#: test if a module is a loaded module.";
36485328e2aSDamjan Jovanovic     }
365cdf0e10cSrcweir 
366cdf0e10cSrcweir 	/** testing the methods:
367cdf0e10cSrcweir 		void* SAL_CALL getSymbol( const ::rtl::OUString& strSymbolName)
368cdf0e10cSrcweir 	*/
36985328e2aSDamjan Jovanovic 	class getSymbol : public ::testing::Test
370cdf0e10cSrcweir 	{
371cdf0e10cSrcweir 	public:
372cdf0e10cSrcweir 		sal_Bool bRes;
373cdf0e10cSrcweir 	}; // class getSymbol
37485328e2aSDamjan Jovanovic 
TEST_F(getSymbol,getSymbol_001)37585328e2aSDamjan Jovanovic     TEST_F(getSymbol, getSymbol_001)
37685328e2aSDamjan Jovanovic     {
37785328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
37885328e2aSDamjan Jovanovic         FuncPtr pFunc = ( FuncPtr ) aMod.getSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
37985328e2aSDamjan Jovanovic         bRes = sal_False;
38085328e2aSDamjan Jovanovic         if ( pFunc )
38185328e2aSDamjan Jovanovic             bRes = pFunc( bRes );
38285328e2aSDamjan Jovanovic         aMod.unload();
38385328e2aSDamjan Jovanovic 
38485328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes) << "#test comment#: load a dll and call one function in it.";
38585328e2aSDamjan Jovanovic     }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir 	/** testing the methods:
388cdf0e10cSrcweir 		operator oslModule() const
389cdf0e10cSrcweir 	*/
39085328e2aSDamjan Jovanovic 	class optr_oslModule : public ::testing::Test
391cdf0e10cSrcweir 	{
392cdf0e10cSrcweir 	public:
393cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
394cdf0e10cSrcweir 	}; // class optr_oslModule
39585328e2aSDamjan Jovanovic 
TEST_F(optr_oslModule,optr_oslModule_001)39685328e2aSDamjan Jovanovic     TEST_F(optr_oslModule, optr_oslModule_001 )
39785328e2aSDamjan Jovanovic     {
39885328e2aSDamjan Jovanovic         ::osl::Module aMod;
39985328e2aSDamjan Jovanovic         bRes = ( (oslModule)aMod == NULL );
40085328e2aSDamjan Jovanovic 
40185328e2aSDamjan Jovanovic         aMod.load( getDllURL( ) );
40285328e2aSDamjan Jovanovic         bRes1 = (oslModule)aMod != NULL;
40385328e2aSDamjan Jovanovic 
40485328e2aSDamjan Jovanovic         aMod.unload( );
40585328e2aSDamjan Jovanovic 
40685328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes && sal_True == bRes1)
40785328e2aSDamjan Jovanovic             << "#test comment#: the m_Module of a Module instance will be NULL when is not loaded, it will not be NULL after loaded.";
40885328e2aSDamjan Jovanovic     }
40985328e2aSDamjan Jovanovic 
TEST_F(optr_oslModule,optr_oslModule_002)41085328e2aSDamjan Jovanovic     TEST_F(optr_oslModule, optr_oslModule_002 )
41185328e2aSDamjan Jovanovic     {
41285328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
41385328e2aSDamjan Jovanovic         ::rtl::OUString funcName(::rtl::OUString::createFromAscii( "firstfunc" ) );
41485328e2aSDamjan Jovanovic 
41585328e2aSDamjan Jovanovic         FuncPtr pFunc = ( FuncPtr ) osl_getSymbol( (oslModule)aMod, funcName.pData );
41685328e2aSDamjan Jovanovic         bRes = sal_False;
41785328e2aSDamjan Jovanovic         if ( pFunc )
41885328e2aSDamjan Jovanovic             bRes = pFunc( bRes );
41985328e2aSDamjan Jovanovic 
42085328e2aSDamjan Jovanovic         aMod.unload();
42185328e2aSDamjan Jovanovic 
42285328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes) << "#test comment#: use m_Module to call osl_getSymbol() function.";
42385328e2aSDamjan Jovanovic     }
42485328e2aSDamjan Jovanovic 
425cdf0e10cSrcweir 	/** testing the methods:
426cdf0e10cSrcweir 		oslGenericFunction SAL_CALL getFunctionSymbol( const ::rtl::OUString& ustrFunctionSymbolName )
427cdf0e10cSrcweir 	*/
42885328e2aSDamjan Jovanovic 	class getFunctionSymbol : public ::testing::Test
429cdf0e10cSrcweir 	{
430cdf0e10cSrcweir 	public:
431cdf0e10cSrcweir 		sal_Bool bRes, bRes1;
432cdf0e10cSrcweir 	}; // class getFunctionSymbol
43385328e2aSDamjan Jovanovic 
TEST_F(getFunctionSymbol,getFunctionSymbol_001)43485328e2aSDamjan Jovanovic     TEST_F(getFunctionSymbol, getFunctionSymbol_001)
43585328e2aSDamjan Jovanovic     {
43685328e2aSDamjan Jovanovic         ::osl::Module aMod( getDllURL( ) );
43785328e2aSDamjan Jovanovic         oslGenericFunction oslFunc = aMod.getFunctionSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
43885328e2aSDamjan Jovanovic         ::rtl::OUString aLibraryURL;
43985328e2aSDamjan Jovanovic         bRes = ::osl::Module::getUrlFromAddress( oslFunc, aLibraryURL);
44085328e2aSDamjan Jovanovic         aMod.unload();
44185328e2aSDamjan Jovanovic         printFileName( aLibraryURL );
44285328e2aSDamjan Jovanovic 
44385328e2aSDamjan Jovanovic         ASSERT_TRUE(sal_True == bRes && aLibraryURL.equalsIgnoreAsciiCase( getDllURL() )) << "#test comment#: load a dll and get its function addr and get its URL.";
44485328e2aSDamjan Jovanovic     }
445cdf0e10cSrcweir 
446cdf0e10cSrcweir } // namespace osl_Module
447cdf0e10cSrcweir 
main(int argc,char ** argv)44885328e2aSDamjan Jovanovic int main(int argc, char **argv)
44985328e2aSDamjan Jovanovic {
45085328e2aSDamjan Jovanovic     ::testing::InitGoogleTest(&argc, argv);
45185328e2aSDamjan Jovanovic     return RUN_ALL_TESTS();
45285328e2aSDamjan Jovanovic }
453