xref: /trunk/main/sal/test/unloading/unloadTest.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
11*87d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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