xref: /aoo41x/main/sal/test/unloading/unloadTest.cxx (revision 87d2adbc)
1*87d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*87d2adbcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*87d2adbcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*87d2adbcSAndrew Rist  * distributed with this work for additional information
6*87d2adbcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*87d2adbcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*87d2adbcSAndrew Rist  * "License"); you may not use this file except in compliance
9*87d2adbcSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*87d2adbcSAndrew Rist  *
11*87d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*87d2adbcSAndrew Rist  *
13*87d2adbcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*87d2adbcSAndrew Rist  * software distributed under the License is distributed on an
15*87d2adbcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*87d2adbcSAndrew Rist  * KIND, either express or implied.  See the License for the
17*87d2adbcSAndrew Rist  * specific language governing permissions and limitations
18*87d2adbcSAndrew Rist  * under the License.
19*87d2adbcSAndrew Rist  *
20*87d2adbcSAndrew Rist  *************************************************************/
21*87d2adbcSAndrew Rist 
22*87d2adbcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_sal.hxx"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include<osl/module.hxx>
29cdf0e10cSrcweir #include <osl/time.h>
30cdf0e10cSrcweir #include <rtl/ustring.hxx>
31cdf0e10cSrcweir #include <stdio.h>
32cdf0e10cSrcweir #include <cppuhelper/factory.hxx>
33cdf0e10cSrcweir #include <cppuhelper/servicefactory.hxx>
34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp>
36cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
37cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
38cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
39cdf0e10cSrcweir #include <com/sun/star/uno/XComponentContext.hpp>
40cdf0e10cSrcweir #include <com/sun/star/uno/XUnloadingPreference.hpp>
41cdf0e10cSrcweir #include <com/sun/star/lang/XTypeProvider.hpp>
42cdf0e10cSrcweir #include <com/sun/star/container/XContentEnumerationAccess.hpp>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <stdio.h>
45cdf0e10cSrcweir using namespace ::rtl;
46cdf0e10cSrcweir using namespace ::osl;
47cdf0e10cSrcweir using namespace ::com::sun::star::uno;
48cdf0e10cSrcweir using namespace ::com::sun::star::lang;
49cdf0e10cSrcweir using namespace ::cppu;
50cdf0e10cSrcweir using namespace ::com::sun::star::beans;
51cdf0e10cSrcweir using namespace ::com::sun::star::container;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1"
54cdf0e10cSrcweir #define SERVICENAME1 "com.sun.star.UnloadingTest1"
55cdf0e10cSrcweir #define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2"
56cdf0e10cSrcweir #define SERVICENAME2 "com.sun.star.UnloadingTest2"
57cdf0e10cSrcweir #define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3"
58cdf0e10cSrcweir #define SERVICENAME3 "com.sun.star.UnloadingTest3"
59cdf0e10cSrcweir #define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest"
60cdf0e10cSrcweir #define SERVICENAME4 "com.sun.star.OneInstanceTest"
61cdf0e10cSrcweir 
62cdf0e10cSrcweir #define IMPLNAME21 "com.sun.star.comp.sal.UnloadingTest21"
63cdf0e10cSrcweir #define SERVICENAME21 "com.sun.star.UnloadingTest21"
64cdf0e10cSrcweir #define IMPLNAME22 "com.sun.star.comp.sal.UnloadingTest22"
65cdf0e10cSrcweir #define SERVICENAME22 "com.sun.star.UnloadingTest22"
66cdf0e10cSrcweir #define IMPLNAME23 "com.sun.star.comp.sal.UnloadingTest23"
67cdf0e10cSrcweir #define SERVICENAME23 "com.sun.star.UnloadingTest23"
68cdf0e10cSrcweir 
69cdf0e10cSrcweir #ifdef UNX
70cdf0e10cSrcweir #define LIBRARY1 "libsamplelib1.so"
71cdf0e10cSrcweir #define LIBRARY2 "libsamplelib2.so"
72cdf0e10cSrcweir #elif defined WNT
73cdf0e10cSrcweir #define LIBRARY1 "samplelib1"
74cdf0e10cSrcweir #define LIBRARY2 "samplelib2"
75cdf0e10cSrcweir #endif
76cdf0e10cSrcweir /*
77cdf0e10cSrcweir Tested: rtl_registerModuleForUnloading, rtl_unregisterModuleForUnloading, rtl_unloadUnusedLibraries
78cdf0e10cSrcweir 		1 component.
79cdf0e10cSrcweir 
80cdf0e10cSrcweir next: Test with multiple components
81cdf0e10cSrcweir 		Listener mechanism.
82cdf0e10cSrcweir */
83cdf0e10cSrcweir 
84cdf0e10cSrcweir sal_Bool test1();
85cdf0e10cSrcweir sal_Bool test2();
86cdf0e10cSrcweir sal_Bool test3();
87cdf0e10cSrcweir sal_Bool test4();
88cdf0e10cSrcweir sal_Bool test5();
89cdf0e10cSrcweir sal_Bool test6();
90cdf0e10cSrcweir sal_Bool test7();
91cdf0e10cSrcweir sal_Bool test8();
92cdf0e10cSrcweir sal_Bool test9();
93cdf0e10cSrcweir void SAL_CALL listenerCallback( void* id);
94cdf0e10cSrcweir 
main(int argc,char * argv[])95cdf0e10cSrcweir int main(int argc, char* argv[])
96cdf0e10cSrcweir {
97cdf0e10cSrcweir   // Test if the servicemanager can be created and if the sample libs
98cdf0e10cSrcweir   // can be loaded
99cdf0e10cSrcweir //  Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
100cdf0e10cSrcweir //     OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
101cdf0e10cSrcweir //    if( !serviceManager.is())
102cdf0e10cSrcweir //    {
103cdf0e10cSrcweir //      printf("\n ####################################################\n"
104cdf0e10cSrcweir //  	   "Error: could not create service manager. \n"
105cdf0e10cSrcweir //  	   "Is the executable in the office program directory?\n");
106cdf0e10cSrcweir //      return -1;
107cdf0e10cSrcweir //    }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir //    Reference<XInterface> xint1=	serviceManager->createInstance( OUString(
110cdf0e10cSrcweir //  				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
111cdf0e10cSrcweir 
112cdf0e10cSrcweir //    if( !xint1.is())
113cdf0e10cSrcweir //    {
114cdf0e10cSrcweir //        printf("\n ###################################################\n"
115cdf0e10cSrcweir //  	     "Error: could not create service from samplelib1\n"
116cdf0e10cSrcweir //  	     "Is samplelib1 in the office program directory and is it "
117cdf0e10cSrcweir //  	     "registered?\n");
118cdf0e10cSrcweir //        return -1;
119cdf0e10cSrcweir //    }
120cdf0e10cSrcweir //    Reference<XInterface> xint2=	serviceManager->createInstance( OUString(
121cdf0e10cSrcweir //  				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
122cdf0e10cSrcweir //    if( !xint2.is())
123cdf0e10cSrcweir //      {
124cdf0e10cSrcweir //        printf("\n ###################################################"
125cdf0e10cSrcweir //  	     "Error: could not create service from samplelib2\n"
126cdf0e10cSrcweir //  	     "Is samplelib2 in the office program directory and is it "
127cdf0e10cSrcweir //  	     "registered?\n");
128cdf0e10cSrcweir //        return -1;
129cdf0e10cSrcweir //      }
130cdf0e10cSrcweir //        //destroy servicemanager
131cdf0e10cSrcweir //        Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
132cdf0e10cSrcweir //        Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
133cdf0e10cSrcweir //        Reference<XComponentContext> xContext;
134cdf0e10cSrcweir //        any_prop >>= xContext;
135cdf0e10cSrcweir //        Reference<XComponent> xComponent( xContext, UNO_QUERY);
136cdf0e10cSrcweir //        xComponent->dispose();
137cdf0e10cSrcweir 
138cdf0e10cSrcweir //  	  //unload samplelib1 and samplelib2. We need the handles, therefore load
139cdf0e10cSrcweir //  	  // the libs
140cdf0e10cSrcweir //  	  OUString libname1( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
141cdf0e10cSrcweir //    	  OUString libname2( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
142cdf0e10cSrcweir //  	  oslModule m1= osl_loadModule(libname1.pData, 0);
143cdf0e10cSrcweir //  	  oslModule m2= osl_loadModule(libname2.pData, 0);
144cdf0e10cSrcweir //  	  osl_unloadModule( m1);
145cdf0e10cSrcweir //  	  osl_unloadModule( m1);
146cdf0e10cSrcweir //  	  osl_unloadModule( m2);
147cdf0e10cSrcweir //  	  osl_unloadModule( m2);
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
150cdf0e10cSrcweir   sal_Bool ret1= test1();
151cdf0e10cSrcweir   if( ret1) printf( "\n Test 1 successful \n");
152cdf0e10cSrcweir 	else printf("\n !!!!!! Test 1 failed\n");
153cdf0e10cSrcweir 	sal_Bool ret2= test2();
154cdf0e10cSrcweir 	if( ret2) printf( "\n Test 2 successful \n");
155cdf0e10cSrcweir 	else printf("\n !!!!!! Test 2 failed\n");
156cdf0e10cSrcweir 	sal_Bool ret3= test3();
157cdf0e10cSrcweir 	if( ret3) printf( "\n Test 3 successful \n");
158cdf0e10cSrcweir 	else printf("\n !!!!!! Test 3 failed\n");
159cdf0e10cSrcweir 	sal_Bool ret4= test4();
160cdf0e10cSrcweir 	if( ret4) printf( "\n Test 4 successful \n");
161cdf0e10cSrcweir 	else printf("\n !!!!!! Test 4 failed\n");
162cdf0e10cSrcweir 	sal_Bool ret5= test5();
163cdf0e10cSrcweir 	if( ret5) printf( "\n Test 5 successful \n");
164cdf0e10cSrcweir 	else printf("\n !!!!!! Test 5 failed\n");
165cdf0e10cSrcweir 	// takes some time (10s)
166cdf0e10cSrcweir 	sal_Bool ret6= test6();
167cdf0e10cSrcweir 	sal_Bool ret7= test7(); // prints message itself
168cdf0e10cSrcweir 	sal_Bool ret8= test8();
169cdf0e10cSrcweir 	if( ret8) printf( "\n Test 8 successful \n");
170cdf0e10cSrcweir 	else printf("\n !!!!!! Test 8 failed\n");
171cdf0e10cSrcweir 	sal_Bool ret9= test9();
172cdf0e10cSrcweir 	if( ret9) printf( "\n Test 9 successful: service manager is unloading listener\n");
173cdf0e10cSrcweir 	else printf("\n !!!!! Test 9 failed\n");
174cdf0e10cSrcweir 
175cdf0e10cSrcweir 	return 0;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir /* Create an instance of SERVICENAME1, call a function and unload module.
179cdf0e10cSrcweir    This tests the loader and basic functionality.
180cdf0e10cSrcweir    The library will be loaded once manually and the handle will be stored.
181cdf0e10cSrcweir    Then the library will be unloaded. After rtl_unloadUnusedLibraries we try to
182cdf0e10cSrcweir    get a symbol of the unloaded lib. If this fails then the test is successful.
183cdf0e10cSrcweir */
test1()184cdf0e10cSrcweir sal_Bool test1()
185cdf0e10cSrcweir {
186cdf0e10cSrcweir 	printf("Test 1 ####################################################\n");
187cdf0e10cSrcweir 	oslModule handleMod=0;
188cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
189cdf0e10cSrcweir 	{
190cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
191cdf0e10cSrcweir 		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
192cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
193cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	// get the handle
196cdf0e10cSrcweir 	handleMod=	osl_loadModule( lib1Name.pData, 0);
197cdf0e10cSrcweir 	osl_unloadModule( handleMod);
198cdf0e10cSrcweir 	xint=0;
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
201cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
202cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
203cdf0e10cSrcweir 	any_prop >>= xContext;
204cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
205cdf0e10cSrcweir 	xComponent->dispose();
206cdf0e10cSrcweir 	}
207cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 	// Try to get a symbol, must fail
210cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
211cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod, sSymbol.pData);
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 	if( !pSymbol)
214cdf0e10cSrcweir 		return sal_True;
215cdf0e10cSrcweir 	return sal_False;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir /* Multipe loadModule + rtl_registerModuleForUnloading.
219cdf0e10cSrcweir The module will be registered as often as it has been loaded.
220cdf0e10cSrcweir */
test2()221cdf0e10cSrcweir sal_Bool test2()
222cdf0e10cSrcweir {
223cdf0e10cSrcweir 	printf("Test 2 ####################################################\n");
224cdf0e10cSrcweir 	oslModule handleMod=0;
225cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
226cdf0e10cSrcweir 	{
227cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
228cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
231cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 	handleMod=	osl_loadModule( lib1Name.pData, 0);
234cdf0e10cSrcweir 	osl_unloadModule( handleMod);
235cdf0e10cSrcweir 	//-----------------------------------------------------------
236cdf0e10cSrcweir 	oslModule mod1= osl_loadModule( lib1Name.pData, 0);
237cdf0e10cSrcweir 	oslModule mod2= osl_loadModule( lib1Name.pData, 0);
238cdf0e10cSrcweir 	oslModule mod3= osl_loadModule( lib1Name.pData, 0);
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 	rtl_registerModuleForUnloading(mod1);
241cdf0e10cSrcweir 	rtl_registerModuleForUnloading(mod2);
242cdf0e10cSrcweir 	rtl_registerModuleForUnloading(mod3);
243cdf0e10cSrcweir 	// ----------------------------------------------------------
244cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
245cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
246cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
247cdf0e10cSrcweir 	any_prop >>= xContext;
248cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
249cdf0e10cSrcweir 	xComponent->dispose();
250cdf0e10cSrcweir 	}
251cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 	// Try to get a symbol, must fail
254cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
255cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod, sSymbol.pData);
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	if( !pSymbol)
258cdf0e10cSrcweir 		return sal_True;
259cdf0e10cSrcweir 	return sal_False;
260cdf0e10cSrcweir }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir /* Multipe loadModule + rtl_registerModuleForUnloading.
263cdf0e10cSrcweir The module will be registered one time less as it has been loaded.
264cdf0e10cSrcweir */
test3()265cdf0e10cSrcweir sal_Bool test3()
266cdf0e10cSrcweir {
267cdf0e10cSrcweir 	printf("Test 3 ####################################################\n");
268cdf0e10cSrcweir 	oslModule handleMod=0;
269cdf0e10cSrcweir 	sal_Bool retval=sal_False;
270cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
271cdf0e10cSrcweir 	{
272cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
273cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
274cdf0e10cSrcweir 
275cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
276cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 	handleMod=	osl_loadModule( lib1Name.pData, 0);
279cdf0e10cSrcweir 	osl_unloadModule( handleMod);
280cdf0e10cSrcweir 	//-----------------------------------------------------------
281cdf0e10cSrcweir 	oslModule mod1= osl_loadModule( lib1Name.pData, 0);
282cdf0e10cSrcweir 	oslModule mod2= osl_loadModule( lib1Name.pData, 0);
283cdf0e10cSrcweir 	oslModule mod3= osl_loadModule( lib1Name.pData, 0);
284cdf0e10cSrcweir 
285cdf0e10cSrcweir 	rtl_registerModuleForUnloading(mod1);
286cdf0e10cSrcweir 	rtl_registerModuleForUnloading(mod2);
287cdf0e10cSrcweir 	// ----------------------------------------------------------
288cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
289cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
290cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
291cdf0e10cSrcweir 	any_prop >>= xContext;
292cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
293cdf0e10cSrcweir 	xComponent->dispose();
294cdf0e10cSrcweir 	}
295cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 	// Try to get a symbol, must succeed
298cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
299cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod, sSymbol.pData);
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 	if( pSymbol)
302cdf0e10cSrcweir 	{
303cdf0e10cSrcweir 		retval= sal_True;
304cdf0e10cSrcweir 		osl_unloadModule( handleMod);
305cdf0e10cSrcweir 		pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
306cdf0e10cSrcweir 	}
307cdf0e10cSrcweir 	return retval;
308cdf0e10cSrcweir }
309cdf0e10cSrcweir /* 2 Modules
310cdf0e10cSrcweir 
311cdf0e10cSrcweir */
test4()312cdf0e10cSrcweir sal_Bool test4()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir 	printf("Test 4 ####################################################\n");
315cdf0e10cSrcweir 	oslModule handleMod1=0;
316cdf0e10cSrcweir 	oslModule handleMod2=0;
317cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
318cdf0e10cSrcweir 	OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
319cdf0e10cSrcweir 	{
320cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
321cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
324cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 	handleMod1=	osl_loadModule( lib1Name.pData, 0);
327cdf0e10cSrcweir 	osl_unloadModule( handleMod1);
328cdf0e10cSrcweir 	Reference<XInterface> xint2=	serviceManager->createInstance( OUString(
329cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 	handleMod2=	osl_loadModule( lib2Name.pData, 0);
332cdf0e10cSrcweir 	osl_unloadModule( handleMod2);
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 	//-----------------------------------------------------------
335cdf0e10cSrcweir 	// ----------------------------------------------------------
336cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
337cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
338cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
339cdf0e10cSrcweir 	any_prop >>= xContext;
340cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
341cdf0e10cSrcweir 	xComponent->dispose();
342cdf0e10cSrcweir 	}
343cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 	// Try to get a symbol, must fail
346cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
347cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod1, sSymbol.pData);
348cdf0e10cSrcweir 
349cdf0e10cSrcweir 	void* pSymbol2= osl_getSymbol(  handleMod2, sSymbol.pData);
350cdf0e10cSrcweir 	if( ! pSymbol && !pSymbol2)
351cdf0e10cSrcweir 		return sal_True;
352cdf0e10cSrcweir 	return sal_False;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir /* 2 Modules and 6 services
356cdf0e10cSrcweir 
357cdf0e10cSrcweir */
test5()358cdf0e10cSrcweir sal_Bool test5()
359cdf0e10cSrcweir {
360cdf0e10cSrcweir 	printf("test5 ####################################################\n");
361cdf0e10cSrcweir 	oslModule handleMod1=0;
362cdf0e10cSrcweir 	oslModule handleMod2=0;
363cdf0e10cSrcweir 	sal_Bool btest1= sal_False;
364cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
365cdf0e10cSrcweir 	OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
366cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
367cdf0e10cSrcweir 	{
368cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
369cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 	//-----------------------------------------------------------
372cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
373cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
374cdf0e10cSrcweir 	Reference<XInterface> xint2=	serviceManager->createInstance( OUString(
375cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME2)));
376cdf0e10cSrcweir 	Reference<XInterface> xint3=	serviceManager->createInstance( OUString(
377cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME3)));
378cdf0e10cSrcweir 	Reference<XInterface> xint4=	serviceManager->createInstance( OUString(
379cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
380cdf0e10cSrcweir 	Reference<XInterface> xint5=	serviceManager->createInstance( OUString(
381cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME22)));
382cdf0e10cSrcweir 	Reference<XInterface> xint6=	serviceManager->createInstance( OUString(
383cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME23)));
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 	// ----------------------------------------------------------
386cdf0e10cSrcweir 	handleMod1=	osl_loadModule( lib1Name.pData, 0);
387cdf0e10cSrcweir 	osl_unloadModule( handleMod1);
388cdf0e10cSrcweir 	handleMod2=	osl_loadModule( lib2Name.pData, 0);
389cdf0e10cSrcweir 	osl_unloadModule( handleMod2);
390cdf0e10cSrcweir 
391cdf0e10cSrcweir 	// get rid of the service manager
392cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
393cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
394cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
395cdf0e10cSrcweir 	any_prop >>= xContext;
396cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
397cdf0e10cSrcweir 	xComponent->dispose();
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 	// try unloading, must fail
400cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
401cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod1, sSymbol.pData);
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 	void* pSymbol2= osl_getSymbol(  handleMod2, sSymbol.pData);
404cdf0e10cSrcweir 	if(  pSymbol && pSymbol2)
405cdf0e10cSrcweir 		btest1= sal_True;
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 	}
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 	// Try to get a symbol, must succeed
410cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod1, sSymbol.pData);
413cdf0e10cSrcweir 	void* pSymbol2= osl_getSymbol(  handleMod2, sSymbol.pData);
414cdf0e10cSrcweir 	if( ! pSymbol && !pSymbol2 && btest1)
415cdf0e10cSrcweir 		return sal_True;
416cdf0e10cSrcweir 	return sal_False;
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir /*
420cdf0e10cSrcweir TimeValue Test
421cdf0e10cSrcweir rtl_unloadUnusedModules takes a TimeValue which determines a timespan
422cdf0e10cSrcweir a module must have been constantly unused in order to be unloaded.
423cdf0e10cSrcweir This is only a rough test. To make accurate tests, one should directly
424cdf0e10cSrcweir write code in the unload.cxx file.
425cdf0e10cSrcweir The function will not return (loop) when the test fails or the result value
426cdf0e10cSrcweir is far off the 10 seconds value.
427cdf0e10cSrcweir */
test6()428cdf0e10cSrcweir sal_Bool test6()
429cdf0e10cSrcweir {
430cdf0e10cSrcweir 	printf("test6 ####################################################\n");
431cdf0e10cSrcweir 	oslModule handleMod1=0;
432cdf0e10cSrcweir 	oslModule handleMod2=0;
433cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
434cdf0e10cSrcweir 	OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
435cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
436cdf0e10cSrcweir 	{
437cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
438cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
439cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
440cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
441cdf0e10cSrcweir 
442cdf0e10cSrcweir 	// ----------------------------------------------------------
443cdf0e10cSrcweir 	handleMod1=	osl_loadModule( lib1Name.pData, 0);
444cdf0e10cSrcweir 	osl_unloadModule( handleMod1);
445cdf0e10cSrcweir 
446cdf0e10cSrcweir 	// get rid of the service manager
447cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
448cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
449cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
450cdf0e10cSrcweir 	any_prop >>= xContext;
451cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
452cdf0e10cSrcweir 	xComponent->dispose();
453cdf0e10cSrcweir 	}
454cdf0e10cSrcweir 
455cdf0e10cSrcweir 	// Enter a loop and try unloading. At least after 10 seconds
456cdf0e10cSrcweir 	// this should be successful.
457cdf0e10cSrcweir 	TimeValue time={10,0};
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 	TimeValue beforeTime={0,0};
460cdf0e10cSrcweir 	printf("\n unloading should take about 10 seconds\n");
461cdf0e10cSrcweir 	osl_getSystemTime( &beforeTime);
462cdf0e10cSrcweir 	for(;;)
463cdf0e10cSrcweir 	{
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 		rtl_unloadUnusedModules( &time);
466cdf0e10cSrcweir 		void* pSymbol= osl_getSymbol(  handleMod1, sSymbol.pData);
467cdf0e10cSrcweir 		if( ! pSymbol)
468cdf0e10cSrcweir 			break;
469cdf0e10cSrcweir 	}
470cdf0e10cSrcweir 	TimeValue afterTime={0,0};
471cdf0e10cSrcweir 	osl_getSystemTime( &afterTime);
472cdf0e10cSrcweir 
473cdf0e10cSrcweir 	printf("\n it took about %i seconds \n Check the value!!!", afterTime.Seconds - beforeTime.Seconds);
474cdf0e10cSrcweir 	printf(" hit return to continue\n");
475cdf0e10cSrcweir 	getchar();
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	return sal_True;
478cdf0e10cSrcweir }
479cdf0e10cSrcweir 
480cdf0e10cSrcweir /*
481cdf0e10cSrcweir */
test7()482cdf0e10cSrcweir sal_Bool test7()
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	printf("Test 7 ####################################################"
485cdf0e10cSrcweir 			"\nThe callback function should be called 3 times\n");
486cdf0e10cSrcweir 	sal_Int32 id1=1;
487cdf0e10cSrcweir 	sal_Int32 id2=2;
488cdf0e10cSrcweir 	sal_Int32 id3=3;
489cdf0e10cSrcweir 	sal_Int32 cookie1= rtl_addUnloadingListener( listenerCallback, &id1);
490cdf0e10cSrcweir 	sal_Int32 cookie2= rtl_addUnloadingListener( listenerCallback, &id2);
491cdf0e10cSrcweir 	sal_Int32 cookie3= rtl_addUnloadingListener( listenerCallback, &id3);
492cdf0e10cSrcweir 
493cdf0e10cSrcweir 	printf("\nTest 7 \nThe listener should be called 3 times\n");
494cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 	rtl_removeUnloadingListener( cookie1);
497cdf0e10cSrcweir 	rtl_removeUnloadingListener( cookie2);
498cdf0e10cSrcweir 	rtl_removeUnloadingListener( cookie3);
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 	sal_Int32 cookie4= rtl_addUnloadingListener( listenerCallback, &id1);
501cdf0e10cSrcweir 	sal_Int32 cookie5= rtl_addUnloadingListener( listenerCallback, &id2);
502cdf0e10cSrcweir 	sal_Int32 cookie6= rtl_addUnloadingListener( listenerCallback, &id3);
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 	if( cookie1 == cookie4 &&
505cdf0e10cSrcweir 		cookie2 == cookie5 )
506cdf0e10cSrcweir 	{
507cdf0e10cSrcweir 		printf("\n###cookie recycling works\n");
508cdf0e10cSrcweir 		printf("hit return to continue\n");
509cdf0e10cSrcweir 		getchar();
510cdf0e10cSrcweir 	}
511cdf0e10cSrcweir 	else
512cdf0e10cSrcweir 	{
513cdf0e10cSrcweir 		printf("\n###cookie recycling failed!!!\n");
514cdf0e10cSrcweir 		printf("hit return to continue\n");
515cdf0e10cSrcweir 		getchar();
516cdf0e10cSrcweir 	}
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 	rtl_removeUnloadingListener( cookie1);
519cdf0e10cSrcweir 	rtl_removeUnloadingListener( cookie2);
520cdf0e10cSrcweir 	rtl_removeUnloadingListener( cookie3);
521cdf0e10cSrcweir 	return sal_True;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir /* Test one-instance-service default factory (XUnloadingPreference)
525cdf0e10cSrcweir 	cppuhelper/source/factory.cxx
526cdf0e10cSrcweir */
test8()527cdf0e10cSrcweir sal_Bool test8()
528cdf0e10cSrcweir {
529cdf0e10cSrcweir 	printf("Test 8 ####################################################\n");
530cdf0e10cSrcweir 	oslModule handleMod1=0;
531cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
532cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
533cdf0e10cSrcweir 
534cdf0e10cSrcweir 	sal_Bool b_ifaceSupported=sal_False;
535cdf0e10cSrcweir 	sal_Bool b_instances_identical= sal_False;
536cdf0e10cSrcweir 	sal_Bool b_releaseBeforeLoading= sal_False;
537cdf0e10cSrcweir 	sal_Bool b_releaseAfterLoading= sal_False;
538cdf0e10cSrcweir 	sal_Bool b_unloaded= sal_False;
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 	{
541cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
542cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
543cdf0e10cSrcweir 	Reference<XContentEnumerationAccess> xContent( serviceManager, UNO_QUERY);
544cdf0e10cSrcweir 	Reference<XEnumeration> xenum=	xContent->createContentEnumeration(
545cdf0e10cSrcweir 		OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)));
546cdf0e10cSrcweir 
547cdf0e10cSrcweir 	Any any_elem;
548cdf0e10cSrcweir 	if( xenum->hasMoreElements())
549cdf0e10cSrcweir 		any_elem= xenum->nextElement();
550cdf0e10cSrcweir 	Reference<XInterface> xinterfaceFact;
551cdf0e10cSrcweir 	any_elem>>=xinterfaceFact;
552cdf0e10cSrcweir 	Reference<XTypeProvider> xprov( xinterfaceFact, UNO_QUERY);
553cdf0e10cSrcweir 
554cdf0e10cSrcweir 	Sequence<Type> seqTypes= xprov->getTypes();
555cdf0e10cSrcweir 
556cdf0e10cSrcweir 	//  XTypeProvider test
557cdf0e10cSrcweir 	for( sal_Int32 i=0; i<seqTypes.getLength(); i++)
558cdf0e10cSrcweir 	{
559cdf0e10cSrcweir 		OUString name= seqTypes[i].getTypeName();
560cdf0e10cSrcweir 		if( name == OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XUnloadingPreference")))
561cdf0e10cSrcweir 			b_ifaceSupported= sal_True;
562cdf0e10cSrcweir 	}
563cdf0e10cSrcweir 
564cdf0e10cSrcweir 	// XUnloadingPreference::releaseOnNotification should return true now because we haven't
565cdf0e10cSrcweir 	// created an instance yet
566cdf0e10cSrcweir 	Reference<XUnloadingPreference> xreject( xinterfaceFact, UNO_QUERY);
567cdf0e10cSrcweir 	b_releaseBeforeLoading= xreject->releaseOnNotification();
568cdf0e10cSrcweir 
569cdf0e10cSrcweir 	// Create instance. Afterwards releaseOnNotification should return false.
570cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
571cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4)));
572cdf0e10cSrcweir 	b_releaseAfterLoading= xreject->releaseOnNotification();
573cdf0e10cSrcweir 	b_releaseAfterLoading= b_releaseAfterLoading? sal_False : sal_True;
574cdf0e10cSrcweir 
575cdf0e10cSrcweir 	// safe the handle of the module
576cdf0e10cSrcweir 	handleMod1=	osl_loadModule( lib1Name.pData, 0);
577cdf0e10cSrcweir 	osl_unloadModule( handleMod1);
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 	// ----------------------------------------------------------
580cdf0e10cSrcweir 	// for debugging
581cdf0e10cSrcweir 	Reference<XServiceInfo> info( xint, UNO_QUERY);
582cdf0e10cSrcweir 	OUString s= info->getImplementationName();
583cdf0e10cSrcweir 
584cdf0e10cSrcweir 	// get another instance which must be the same
585cdf0e10cSrcweir 	Reference<XInterface> xint2=	serviceManager->createInstance( OUString(
586cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4)));
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 	b_instances_identical= xint == xint2;
589cdf0e10cSrcweir 
590cdf0e10cSrcweir 	// get rid of the service manager
591cdf0e10cSrcweir 	Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
592cdf0e10cSrcweir 	Any any_prop=	xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
593cdf0e10cSrcweir 	Reference<XComponentContext> xContext;
594cdf0e10cSrcweir 	any_prop >>= xContext;
595cdf0e10cSrcweir 	Reference<XComponent> xComponent( xContext, UNO_QUERY);
596cdf0e10cSrcweir 	xComponent->dispose();
597cdf0e10cSrcweir 	}
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 	// The library must be unloaded now
602cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod1, sSymbol.pData);
603cdf0e10cSrcweir 	if( ! pSymbol )
604cdf0e10cSrcweir 		b_unloaded= sal_True;
605cdf0e10cSrcweir 
606cdf0e10cSrcweir 	if( b_ifaceSupported && b_instances_identical && b_releaseBeforeLoading &&
607cdf0e10cSrcweir 		b_releaseAfterLoading && b_unloaded)
608cdf0e10cSrcweir 		return sal_True;
609cdf0e10cSrcweir 	return sal_False;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir 
listenerCallback(void * id)612cdf0e10cSrcweir void SAL_CALL listenerCallback( void* id)
613cdf0e10cSrcweir {
614cdf0e10cSrcweir 	printf(" listener called with id= %i\n", *(sal_Int32*)id);
615cdf0e10cSrcweir }
616cdf0e10cSrcweir 
617cdf0e10cSrcweir /*
618cdf0e10cSrcweir 
619cdf0e10cSrcweir   */
test9()620cdf0e10cSrcweir sal_Bool test9()
621cdf0e10cSrcweir {
622cdf0e10cSrcweir 	printf("Test 9 ####################################################\n");
623cdf0e10cSrcweir 	oslModule handleMod=0;
624cdf0e10cSrcweir 	sal_Bool retval=sal_False;
625cdf0e10cSrcweir 	OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
626cdf0e10cSrcweir 
627cdf0e10cSrcweir 	Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
628cdf0e10cSrcweir  		OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 	Reference<XInterface> xint=	serviceManager->createInstance( OUString(
631cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
632cdf0e10cSrcweir 	// Release the service. The library refcount should be 1
633cdf0e10cSrcweir 	xint=0;
634cdf0e10cSrcweir 
635cdf0e10cSrcweir 	handleMod=	osl_loadModule( lib1Name.pData, 0);
636cdf0e10cSrcweir 	osl_unloadModule( handleMod);
637cdf0e10cSrcweir 	//-----------------------------------------------------------
638cdf0e10cSrcweir 
639cdf0e10cSrcweir 	// the service manager is still alive
640cdf0e10cSrcweir 	rtl_unloadUnusedModules( NULL);
641cdf0e10cSrcweir 	// Try to get a symbol, must fail
642cdf0e10cSrcweir 	OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
643cdf0e10cSrcweir 	void* pSymbol= osl_getSymbol(  handleMod, sSymbol.pData);
644cdf0e10cSrcweir 
645cdf0e10cSrcweir 	if( pSymbol)
646cdf0e10cSrcweir 	{
647cdf0e10cSrcweir 		retval= sal_False;
648cdf0e10cSrcweir 	}
649cdf0e10cSrcweir 	else
650cdf0e10cSrcweir 		retval= sal_True;
651cdf0e10cSrcweir 	return retval;
652cdf0e10cSrcweir }
653