xref: /trunk/main/bridges/test/testcomp.cxx (revision a79a404b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_bridges.hxx"
26 #include <string.h>
27 #include <stdlib.h>
28 #include <osl/time.h>
29 
30 #include <uno/threadpool.h>
31 
32 #include <osl/mutex.hxx>
33 #include <osl/diagnose.h>
34 
35 #include <test/XTestFactory.hpp>
36 #include <cppuhelper/servicefactory.hxx>
37 
38 #include <com/sun/star/bridge/XInstanceProvider.hpp>
39 
40 #include <com/sun/star/registry/XImplementationRegistration.hpp>
41 
42 #include <com/sun/star/test/performance/XPerformanceTest.hpp>
43 #include <com/sun/star/lang/XServiceInfo.hpp>
44 
45 #include <cppuhelper/weak.hxx>
46 
47 using namespace ::test;
48 using namespace ::rtl;
49 using namespace ::test;
50 using namespace ::com::sun::star::uno;
51 using namespace ::com::sun::star::bridge;
52 using namespace ::com::sun::star::lang;
53 using namespace ::com::sun::star::registry;
54 using namespace ::com::sun::star::test::performance;
55 
56 #include "testcomp.h"
57 
58 
parseCommandLine(char * argv[],::rtl::OUString * pConnection,::rtl::OUString * pProtocol,sal_Bool * pbLatency,sal_Bool * pbReverse)59 void parseCommandLine( char *argv[] ,
60 					   ::rtl::OUString *pConnection , ::rtl::OUString *pProtocol ,
61 					   sal_Bool *pbLatency , sal_Bool *pbReverse)
62 {
63 	sal_Int32 nArgIndex = 1;
64 	if( ! strcmp( argv[1] , "-r" ) )
65 	{
66 		nArgIndex = 2;
67 		*pbReverse = sal_True;
68 	}
69 	else if( ! strcmp( argv[1] , "-latency" ) )
70 	{
71 		*pbLatency = sal_True;
72 		nArgIndex = 2;
73 	}
74 
75 	OUString sTemp = OUString::createFromAscii( argv[nArgIndex] );
76 	sal_Int32 nIndex = sTemp.indexOf( ';' );
77 	if( -1 == nIndex )
78 	{
79 		*pConnection = sTemp;
80 		*pProtocol = OUString( RTL_CONSTASCII_USTRINGPARAM( "iiop" ) );
81 	}
82 	else
83 	{
84 		*pConnection = sTemp.copy( 0 , nIndex );
85 		*pProtocol = sTemp.copy( nIndex+1, sTemp.getLength() - (nIndex+1) );
86 	}
87 }
88 
queryInterface(const Type & aType)89 Any OInstanceProvider::queryInterface( const Type & aType ) throw ( RuntimeException )
90 {
91 	Any a = ::cppu::queryInterface( aType ,
92 			SAL_STATIC_CAST( XInstanceProvider * , this ) );
93 	if( a.hasValue() )
94 	{
95 		return a;
96 	}
97 	return OWeakObject::queryInterface( aType );
98 }
99 
100 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
getInstance(const::rtl::OUString & sObjectName)101 	OInstanceProvider::getInstance( const ::rtl::OUString& sObjectName )
102 		throw(::com::sun::star::container::NoSuchElementException,
103 			  ::com::sun::star::uno::RuntimeException)
104 {
105 	// Tries to get the PerformanceTestObject
106 	if( sObjectName == OUString( RTL_CONSTASCII_USTRINGPARAM( "TestRemoteObject" ) ) )
107 	{
108 		return m_rSMgr->createInstance(
109 			OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.test.performance.PerformanceTestObject") ) );
110 	}
111 	return Reference < XInterface > ( (::cppu::OWeakObject * ) new OTestFactory() );
112 }
113 
114 class ServiceImpl
115 	: public XServiceInfo
116 	, public XPerformanceTest
117 {
118 	OUString _aDummyString;
119 	Any _aDummyAny;
120 	Sequence< Reference< XInterface > > _aDummySequence;
121 	ComplexTypes _aDummyStruct;
122 	RuntimeException _aDummyRE;
123 
124 	sal_Int32 _nRef;
125 
126 public:
ServiceImpl()127 	ServiceImpl()
128 		: _nRef( 0 )
129 		{}
ServiceImpl(const Reference<XMultiServiceFactory> &)130 	ServiceImpl( const Reference< XMultiServiceFactory > & /* xMgr */)
131 		: _nRef( 0 )
132 		{}
133 
134 	// XInterface
queryInterface(const::com::sun::star::uno::Type & aType)135 	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw(::com::sun::star::uno::RuntimeException)
136 	{
137 		// execution time remains appr. constant any time
138 		Any aRet;
139 		if (aType == ::getCppuType( (const Reference< XInterface > *)0 ))
140 		{
141 			void * p = (XInterface *)(XPerformanceTest *)this;
142 			aRet.setValue( &p, ::getCppuType( (const Reference< XInterface > *)0 ) );
143 		}
144 		if (aType == ::getCppuType( (const Reference< XPerformanceTest > *)0 ))
145 		{
146 			void * p = (XPerformanceTest *)this;
147 			aRet.setValue( &p, ::getCppuType( (const Reference< XPerformanceTest > *)0 ) );
148 		}
149 		if (! aRet.hasValue())
150 		{
151 			void * p = (XPerformanceTest *)this;
152 			Any aDummy( &p, ::getCppuType( (const Reference< XPerformanceTest > *)0 ) );
153 		}
154 		return aRet;
155 	}
acquire()156 	virtual void SAL_CALL acquire() throw()
157 		{ osl_incrementInterlockedCount( &_nRef ); }
release()158 	virtual void SAL_CALL release() throw()
159 		{ if (! osl_decrementInterlockedCount( &_nRef )) delete this; }
160 
161 	// XServiceInfo
162 	virtual OUString SAL_CALL getImplementationName() throw (RuntimeException);
163 	virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName ) throw (RuntimeException);
164 	virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw (RuntimeException);
165 
166 	// Attributes
getLong_attr()167 	virtual sal_Int32 SAL_CALL getLong_attr() throw(::com::sun::star::uno::RuntimeException)
168 		{ return 0; }
setLong_attr(sal_Int32)169 	virtual void SAL_CALL setLong_attr( sal_Int32 /* _attributelong */) throw(::com::sun::star::uno::RuntimeException)
170 		{}
getHyper_attr()171 	virtual sal_Int64 SAL_CALL getHyper_attr() throw(::com::sun::star::uno::RuntimeException)
172 		{ return 0; }
setHyper_attr(sal_Int64)173 	virtual void SAL_CALL setHyper_attr( sal_Int64 /* _attributehyper */) throw(::com::sun::star::uno::RuntimeException)
174 		{}
getFloat_attr()175 	virtual float SAL_CALL getFloat_attr() throw(::com::sun::star::uno::RuntimeException)
176 		{ return 0.0; }
setFloat_attr(float)177 	virtual void SAL_CALL setFloat_attr( float /* _attributefloat */) throw(::com::sun::star::uno::RuntimeException)
178 		{}
getDouble_attr()179 	virtual double SAL_CALL getDouble_attr() throw(::com::sun::star::uno::RuntimeException)
180 		{ return 0.0; }
setDouble_attr(double)181 	virtual void SAL_CALL setDouble_attr( double /* _attributedouble */) throw(::com::sun::star::uno::RuntimeException)
182 		{}
getString_attr()183 	virtual OUString SAL_CALL getString_attr() throw(::com::sun::star::uno::RuntimeException)
184 		{ return _aDummyString; }
setString_attr(const::rtl::OUString &)185 	virtual void SAL_CALL setString_attr( const ::rtl::OUString& /* _attributestring */) throw(::com::sun::star::uno::RuntimeException)
186 		{}
getInterface_attr()187 	virtual Reference< XInterface > SAL_CALL getInterface_attr() throw(::com::sun::star::uno::RuntimeException)
188 		{ return Reference< XInterface >(); }
setInterface_attr(const Reference<XInterface> &)189 	virtual void SAL_CALL setInterface_attr( const Reference< XInterface >& /* _attributeinterface */) throw(::com::sun::star::uno::RuntimeException)
190 		{}
getAny_attr()191 	virtual Any SAL_CALL getAny_attr() throw(::com::sun::star::uno::RuntimeException)
192 		{ return _aDummyAny; }
setAny_attr(const Any &)193 	virtual void SAL_CALL setAny_attr( const Any& /* _attributeany */) throw(::com::sun::star::uno::RuntimeException)
194 		{}
getSequence_attr()195 	virtual Sequence< Reference< XInterface > > SAL_CALL getSequence_attr() throw(::com::sun::star::uno::RuntimeException)
196 		{ return _aDummySequence; }
setSequence_attr(const Sequence<Reference<XInterface>> &)197 	virtual void SAL_CALL setSequence_attr( const Sequence< Reference< XInterface > >& /* _attributesequence */) throw(::com::sun::star::uno::RuntimeException)
198 		{}
getStruct_attr()199 	virtual ComplexTypes SAL_CALL getStruct_attr() throw(::com::sun::star::uno::RuntimeException)
200 		{ return _aDummyStruct; }
setStruct_attr(const::com::sun::star::test::performance::ComplexTypes &)201 	virtual void SAL_CALL setStruct_attr( const ::com::sun::star::test::performance::ComplexTypes& /* _attributestruct */) throw(::com::sun::star::uno::RuntimeException)
202 		{}
203 
204 	// Methods
getLong()205 	virtual sal_Int32 SAL_CALL getLong() throw(::com::sun::star::uno::RuntimeException)
206 		{ return 0; }
setLong(sal_Int32)207 	virtual void SAL_CALL setLong( sal_Int32 /* _long */) throw(::com::sun::star::uno::RuntimeException)
208 		{}
getHyper()209 	virtual sal_Int64 SAL_CALL getHyper() throw(::com::sun::star::uno::RuntimeException)
210 		{ return 0; }
setHyper(sal_Int64)211 	virtual void SAL_CALL setHyper( sal_Int64 /* _hyper */) throw(::com::sun::star::uno::RuntimeException)
212 		{}
getFloat()213 	virtual float SAL_CALL getFloat() throw(::com::sun::star::uno::RuntimeException)
214 		{ return 0; }
setFloat(float)215 	virtual void SAL_CALL setFloat( float /* _float */) throw(::com::sun::star::uno::RuntimeException)
216 		{}
getDouble()217 	virtual double SAL_CALL getDouble() throw(::com::sun::star::uno::RuntimeException)
218 		{ return 0; }
setDouble(double)219 	virtual void SAL_CALL setDouble( double /* _double */) throw(::com::sun::star::uno::RuntimeException)
220 		{}
getString()221 	virtual OUString SAL_CALL getString() throw(::com::sun::star::uno::RuntimeException)
222 		{ return _aDummyString; }
setString(const::rtl::OUString &)223 	virtual void SAL_CALL setString( const ::rtl::OUString& /* _string */) throw(::com::sun::star::uno::RuntimeException)
224 		{}
getInterface()225 	virtual Reference< XInterface > SAL_CALL getInterface() throw(::com::sun::star::uno::RuntimeException)
226 		{ return Reference< XInterface >(); }
setInterface(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> &)227 	virtual void SAL_CALL setInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& /* _interface */) throw(::com::sun::star::uno::RuntimeException)
228 		{}
getAny()229 	virtual Any SAL_CALL getAny() throw(::com::sun::star::uno::RuntimeException)
230 		{ return _aDummyAny; }
setAny(const::com::sun::star::uno::Any &)231 	virtual void SAL_CALL setAny( const ::com::sun::star::uno::Any& /* _any */) throw(::com::sun::star::uno::RuntimeException)
232 		{}
getSequence()233 	virtual Sequence< Reference< XInterface > > SAL_CALL getSequence() throw(::com::sun::star::uno::RuntimeException)
234 		{ return _aDummySequence; }
setSequence(const Sequence<Reference<XInterface>> &)235 	virtual void SAL_CALL setSequence( const Sequence< Reference< XInterface > >& /*_sequence */) throw(::com::sun::star::uno::RuntimeException)
236 		{}
getStruct()237 	virtual ComplexTypes SAL_CALL getStruct() throw(::com::sun::star::uno::RuntimeException)
238 		{ return _aDummyStruct; }
setStruct(const::com::sun::star::test::performance::ComplexTypes &)239 	virtual void SAL_CALL setStruct( const ::com::sun::star::test::performance::ComplexTypes& /* c */) throw(::com::sun::star::uno::RuntimeException)
240 		{}
241 
242 	virtual void SAL_CALL async() throw(::com::sun::star::uno::RuntimeException);
243 
sync()244 	virtual void SAL_CALL sync() throw(::com::sun::star::uno::RuntimeException)
245 		{}
complex_in(const::com::sun::star::test::performance::ComplexTypes & aVal)246 	virtual ComplexTypes SAL_CALL complex_in( const ::com::sun::star::test::performance::ComplexTypes& aVal ) throw(::com::sun::star::uno::RuntimeException)
247 		{ return aVal; }
complex_inout(::com::sun::star::test::performance::ComplexTypes & aVal)248 	virtual ComplexTypes SAL_CALL complex_inout( ::com::sun::star::test::performance::ComplexTypes& aVal ) throw(::com::sun::star::uno::RuntimeException)
249 		{ return aVal; }
complex_oneway(const::com::sun::star::test::performance::ComplexTypes &)250 	virtual void SAL_CALL complex_oneway( const ::com::sun::star::test::performance::ComplexTypes& /* aVal */) throw(::com::sun::star::uno::RuntimeException)
251 		{}
complex_noreturn(const::com::sun::star::test::performance::ComplexTypes &)252 	virtual void SAL_CALL complex_noreturn( const ::com::sun::star::test::performance::ComplexTypes& /* aVal */) throw(::com::sun::star::uno::RuntimeException)
253 		{}
createObject()254 	virtual Reference< XPerformanceTest > SAL_CALL createObject() throw(::com::sun::star::uno::RuntimeException)
255 		{ return new ServiceImpl(); }
raiseRuntimeException()256 	virtual void SAL_CALL raiseRuntimeException(  ) throw(::com::sun::star::uno::RuntimeException)
257 		{ throw _aDummyRE; }
258 };
259 
260 
async()261 void ServiceImpl::async() throw(::com::sun::star::uno::RuntimeException)
262 {}
263 
264 // XServiceInfo
265 //__________________________________________________________________________________________________
getImplementationName()266 OUString ServiceImpl::getImplementationName()
267 	throw (RuntimeException)
268 {
269 	return OUString( );
270 }
271 //__________________________________________________________________________________________________
supportsService(const OUString &)272 sal_Bool ServiceImpl::supportsService( const OUString & /* rServiceName */)
273 	throw (RuntimeException)
274 {
275 	return sal_False;
276 }
277 //__________________________________________________________________________________________________
getSupportedServiceNames()278 Sequence< OUString > ServiceImpl::getSupportedServiceNames()
279 	throw (RuntimeException)
280 {
281 	return Sequence< OUString > ();
282 }
283 
284 /******************
285  * OCallMe
286  *
287  *****************/
288 
queryInterface(const Type & aType)289 Any OCallMe::queryInterface( const Type & aType ) throw ( RuntimeException )
290 {
291 	Any a = ::cppu::queryInterface( aType,
292 			SAL_STATIC_CAST( XCallMe * , this ) );
293 
294 	if( a.hasValue() )
295 	{
296 		return a;
297 	}
298 
299 	return OWeakObject::queryInterface( aType );
300 }
301 
call(const::rtl::OUString & s,sal_Int32 nToDo)302 void OCallMe::call( const ::rtl::OUString& s, sal_Int32 nToDo )
303 	throw( RuntimeException, ::test::TestBridgeException)
304 {
305 	if( nToDo < 0 )
306 	{
307 		throw TestBridgeException();
308 	}
309 
310 	OUString sDummy;
311 	if( ! nToDo ) {
312 		OString o = OUStringToOString( s,RTL_TEXTENCODING_ASCII_US);
313 		printf( "%s\n" , o.pData->buffer );
314 	}
315 	for( sal_Int32 i = 0 ; i < nToDo ; i ++ )
316 	{
317 		sDummy += s;
318 	}
319 }
320 
drawLine(sal_Int32,sal_Int32,sal_Int32,sal_Int32)321 void SAL_CALL OCallMe::drawLine( sal_Int32 /* x1 */, sal_Int32 /* y1 */, sal_Int32 /* x2 */, sal_Int32 /* y2 */)
322 		throw(::com::sun::star::uno::RuntimeException)
323 {
324 	// do nothings
325 }
326 
callOneway(const::rtl::OUString &,sal_Int32 nToDo)327 void OCallMe::callOneway( const ::rtl::OUString& /* s */, sal_Int32 nToDo )
328 	throw(RuntimeException)
329 {
330 	OUString sDummy;
331 	m_nLastToDos = nToDo;
332 
333 
334 	if( nToDo )
335 	{
336 		printf( "+" );
337 		fflush( stdout );
338 
339 		TimeValue val = { nToDo , 0 };
340 		osl_waitThread( &val );
341 		printf( "-\n" );
342 	}
343 
344 }
345 
transport(const::test::TestTypes & types)346 ::test::TestTypes SAL_CALL OCallMe::transport( const ::test::TestTypes& types )
347 		throw(::com::sun::star::uno::RuntimeException)
348 {
349 	return types;
350 }
351 
getsAttribute()352 ::rtl::OUString OCallMe::getsAttribute() throw(RuntimeException)
353 {
354 	return m_sAttribute;
355 }
setsAttribute(const::rtl::OUString & _sattribute)356 void OCallMe::setsAttribute( const ::rtl::OUString& _sattribute )
357 	 throw(RuntimeException)
358 {
359 	m_sAttribute = _sattribute;
360 }
callAgain(const Reference<::test::XCallMe> & callAgainArg,sal_Int32 nToCall)361 void OCallMe::callAgain( const Reference< ::test::XCallMe >& callAgainArg,
362 						 sal_Int32 nToCall ) throw(RuntimeException)
363 {
364 	::osl::MutexGuard guard( m_mutex );
365 	if( nToCall %2 )
366 	{
367 		printf( "Deadlocktest pong %" SAL_PRIdINT32 "\n", nToCall );
368 	}
369 	else
370 	{
371 		printf( "Deadlocktest ping %" SAL_PRIdINT32 "\n", nToCall );
372 	}
373 	if( nToCall )
374 	{
375 		callAgainArg->callAgain( Reference< XCallMe > ( (XCallMe *) this ) , nToCall -1 );
376 	}
377 }
378 
379 /********************
380  * OInterfaceTest
381  *
382  *******************/
queryInterface(const Type & aType)383 Any OInterfaceTest::queryInterface( const Type & aType ) throw ( RuntimeException )
384 {
385 	Any a = ::cppu::queryInterface( aType,
386 			SAL_STATIC_CAST( XInterfaceTest * , this ) );
387 	if( a.hasValue() )
388 	{
389 		return a;
390 	}
391 	return OWeakObject::queryInterface( aType );
392 }
393 
394 
setIn(const Reference<::test::XCallMe> & callback)395 void OInterfaceTest::setIn(
396 	const Reference< ::test::XCallMe >& callback )
397 	        throw(RuntimeException)
398 {
399 	m_rCallMe = callback;
400 	call();
401 }
402 
setInOut(Reference<::test::XCallMe> & callback)403 void OInterfaceTest::setInOut( Reference< ::test::XCallMe >& callback )
404 	throw(RuntimeException)
405 {
406 	Reference< XCallMe > r = m_rCallMe;
407 	m_rCallMe = callback;
408 	callback = r;
409 	call();
410 }
411 
412 
getOut(Reference<::test::XCallMe> & callback)413 void OInterfaceTest::getOut( Reference< ::test::XCallMe >& callback )
414 	throw(RuntimeException)
415 {
416 	callback = m_rCallMe;
417 }
418 
get()419 Reference< ::test::XCallMe > OInterfaceTest::get(  )
420 	throw(RuntimeException)
421 {
422 	call();
423 	return m_rCallMe;
424 }
425 
call()426 void OInterfaceTest::call()
427 {
428 	if( m_rCallMe.is() )
429 	{
430 		m_rCallMe->call( OUString( RTL_CONSTASCII_USTRINGPARAM("This is my String during a callback!")) , 5);
431 	}
432 }
433 
434 
queryInterface(const Type & aType)435 Any OTestFactory::queryInterface( const Type & aType ) throw ( RuntimeException )
436 {
437 	Any a = ::cppu::queryInterface( aType,
438 			SAL_STATIC_CAST( XTestFactory * , this ) );
439 
440 	if( a.hasValue() )
441 	{
442 		return a;
443 	}
444 
445 	return OWeakObject::queryInterface( aType );
446 }
447 
createCallMe()448 Reference< ::test::XCallMe > OTestFactory::createCallMe(  )
449 		throw(RuntimeException)
450 {
451 	return Reference< XCallMe > ( (XCallMe * ) new OCallMe() );
452 }
453 
createInterfaceTest()454 Reference< ::test::XInterfaceTest > SAL_CALL OTestFactory::createInterfaceTest(  )
455 		throw(RuntimeException)
456 {
457 	return Reference < XInterfaceTest > ( (XInterfaceTest * ) new OInterfaceTest() );
458 }
459 
460 
461 
462 
463 //  class OInstanceProvider :
464 //  	public ::cppu::OWeakObject,
465 //  	public XInstanceProvider
466 //  {
467 //  public:
468 //  	OInstanceProvider( ){}
469 //  	~OInstanceProvider(){ printf( "instance provider dies\n" );}
470 //  public:
471 //  	// XInterface
472 //  	Any	        SAL_CALL queryInterface( const Type & aType);
473 //  	void 		SAL_CALL acquire() 						 { OWeakObject::acquire(); }
474 //  	void 		SAL_CALL release() 						 { OWeakObject::release(); }
475 
476 //  public:
477 //      virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL
478 //  	       getInstance( const ::rtl::OUString& sObjectName )
479 //  		         throw( ::com::sun::star::container::NoSuchElementException,
480 //  			            ::com::sun::star::uno::RuntimeException);
481 //  };
482 
483 
484 
485 
486 
487 
488 
489 
getCallsPerSec(const Reference<XCallMe> & rCall,int nLoops,int nToDo)490 double getCallsPerSec( const Reference < XCallMe > &rCall , int nLoops, int nToDo )
491 {
492 	TimeValue aStartTime, aEndTime;
493 	osl_getSystemTime( &aStartTime );
494 	for( sal_Int32 i = 0; i < nLoops; i ++ )
495 	{
496 		rCall->call( OUString( RTL_CONSTASCII_USTRINGPARAM("Performance test string")) , nToDo );
497 	}
498 	osl_getSystemTime( &aEndTime );
499 
500 	double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0);
501 	double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0);
502 	return fEnd-fStart;
503 }
504 
getCallsPerSecOneway(const Reference<XCallMe> & rCall,int nLoops,int nToDo,double * pdAfterExecution)505 double getCallsPerSecOneway( const Reference < XCallMe > &rCall ,
506 							 int nLoops,
507 							 int nToDo,
508 							 double *pdAfterExecution
509 							 )
510 {
511 	TimeValue aStartTime, aEndTime, aAfterExecution;
512 	osl_getSystemTime( &aStartTime );
513 	for( sal_Int32 i = 0; i < nLoops; i ++ )
514 	{
515 //		rCall->callOneway( OUString( RTL_CONSTASCII_USTRINGPARAM("Performance test string" )), 0 );
516 		rCall->drawLine( 0 , 0 , 500 , 123 );
517 	}
518 	osl_getSystemTime( &aEndTime );
519 
520 	rCall->call( OUString( RTL_CONSTASCII_USTRINGPARAM("Performance test string")) , nToDo );
521 	osl_getSystemTime( &aAfterExecution );
522 
523 	double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0);
524 	double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0);
525 	*pdAfterExecution = (double)aAfterExecution.Seconds +
526 						((double)aAfterExecution.Nanosec / 1000000000.0) - fStart;
527 	return fEnd-fStart;
528 }
529 
testOnewayPerformanceOnTwoInterfaces(const Reference<XCallMe> & rRemote1,const Reference<XCallMe> & rRemote2)530 void testOnewayPerformanceOnTwoInterfaces(
531 	const Reference < XCallMe > &rRemote1, const Reference < XCallMe > &rRemote2 )
532 {
533 	printf( "Doing one way performance test on two interfaces ...\n" );
534 	const sal_Int32 nLoops = 10000;
535 	TimeValue aStartTime, aEndTime;
536 	osl_getSystemTime( &aStartTime );
537 	for( sal_Int32 i = 0; i < nLoops ; i ++ )
538 	{
539 		rRemote1->drawLine( 0 , 0 , 500 , 123 );
540 		rRemote2->drawLine( 0 , 0 , 500 , 123 );
541 	}
542 	osl_getSystemTime( &aEndTime );
543 	double fStart = (double)aStartTime.Seconds + ((double)aStartTime.Nanosec / 1000000000.0);
544 	double fEnd = (double)aEndTime.Seconds + ((double)aEndTime.Nanosec / 1000000000.0);
545 
546 	printf( "Overhead per Call [ms] %g\n" , ((fEnd-fStart)/((double)nLoops/1000 ))/2. );
547 }
548 
testPerformance(const Reference<XCallMe> & rRemote,const Reference<XCallMe> & rLocal)549 void testPerformance( const Reference < XCallMe > &rRemote,
550 					  const Reference < XCallMe > &rLocal )
551 {
552 	OUString aTestString;
553 
554 	sal_Int32 nDoSomething = 1;
555 	sal_Int32 nCalls = 80000;
556 	double dRemote, dLocal,dAfterExecution;
557 
558 	printf( "performance test oneway...\n" );
559 	dLocal  = getCallsPerSecOneway( rLocal  , nCalls , nDoSomething , &dAfterExecution);
560 	dRemote = getCallsPerSecOneway( rRemote , nCalls , nDoSomething , &dAfterExecution);
561 	printf( "Local=%g s,"
562 			"Remote : %g s\n" , dLocal, dRemote );
563 	if( dLocal > 0. )
564 	{
565 		printf( "Remote/Local : %g\n", dRemote/dLocal );
566 	}
567 
568 	printf( "Overhead per Call [ms] %g\n" , (dRemote - dLocal)/((double)nCalls/1000 ) );
569 	printf( "Overhead per Call after completion [ms] %g\n" , (dAfterExecution - dLocal)/((double)nCalls/1000 ) );
570 
571 	nCalls = 2000;
572 
573 	printf( "Doing performance test ...\n" );
574 	dRemote = getCallsPerSec( rRemote , nCalls , nDoSomething );
575 	dLocal  = getCallsPerSec( rLocal  , nCalls , nDoSomething );
576 	printf( "Local=%g s,\n"
577 			"Remote=%g s\n" , dLocal, dRemote );
578 	if( dLocal > 0. )
579 	{
580 		printf( "Remote/Local : %g\n", dRemote/dLocal );
581 	}
582 	printf( "Overhead per synchron Call [ms] %g\n" , ((dRemote - dLocal)/((double)nCalls/1000 )) );
583 }
584 
testException(const Reference<XCallMe> & r)585 void testException( const Reference < XCallMe > &r )
586 {
587 	try {
588 		r->call( OUString( RTL_CONSTASCII_USTRINGPARAM("dummy")) , -1 );
589 		OSL_ASSERT( ! "no exception flown!" );
590 	}
591 	catch( TestBridgeException & e )
592 	{
593 		// Exception flew successfully !
594 	}
595 	catch( Exception & e )
596 	{
597 		OSL_ASSERT( ! "only base class of exception could be caught!" );
598 	}
599 	catch(...)
600 	{
601 		OSL_ASSERT(! "wrong unknown exception!" );
602 	}
603 }
604 
testSequenceOfCalls(const Reference<XCallMe> & rRCallMe)605 void testSequenceOfCalls( const Reference< XCallMe > & rRCallMe )
606 {
607 	printf( "Testing sequence of calls\n" );
608 	for( sal_Int32 i = 0 ; i < 800 ; i ++ )
609 	{
610 		rRCallMe->callOneway( OUString( RTL_CONSTASCII_USTRINGPARAM("hifuj" )), 0 );
611 	}
612 }
613 
testAllTypes(const Reference<XCallMe> & rRCallMe)614 void testAllTypes( const Reference < XCallMe > & rRCallMe )
615 {
616 	printf( "Testing all types\n" );
617 
618 	for( sal_Int32 i = 0; i < 32 ; i ++ )
619 	{
620 
621 		TestTypes types;
622 		types.Bool = sal_True;
623 		types.Char = L'i';
624 		types.Byte = -12;
625 		types.Short = -32000;
626 		types.UShort = (sal_uInt16 ) (1 << i);
627 		types.Long = -123;
628 		types.ULong = 1 << i;
629 		types.Hyper = 50;
630 		types.UHyper = 1 << i*2;
631 		types.Float = (float)123.239;
632 		types.Double = 1279.12490012;
633 		types.String = OUString( RTL_CONSTASCII_USTRINGPARAM("abcdefghijklmnopqrstuvwxyz"));
634 		types.Interface = Reference< XInterface >( rRCallMe , UNO_QUERY);
635 		types.Any <<= types.Double;
636 
637 		TestTypes retTypes = rRCallMe->transport( types );
638 
639 		OSL_ASSERT( ( types.Bool && retTypes.Bool ) || ( ! types.Bool && ! retTypes.Bool ) );
640 		OSL_ASSERT( types.Char == retTypes.Char );
641 		OSL_ASSERT( types.Byte == retTypes.Byte );
642 		OSL_ASSERT( types.Short == retTypes.Short );
643 		OSL_ASSERT( types.UShort == retTypes.UShort );
644 		OSL_ASSERT( types.Long == retTypes.Long );
645 		OSL_ASSERT( types.ULong == retTypes.ULong );
646 		OSL_ASSERT( types.Hyper == retTypes.Hyper );
647 		OSL_ASSERT( types.UHyper == retTypes.UHyper );
648 		OSL_ASSERT( types.Float == retTypes.Float );
649 		OSL_ASSERT( types.Double == retTypes.Double );
650 		OSL_ASSERT( types.String == retTypes.String );
651 		OSL_ASSERT( types.Interface == retTypes.Interface );
652 		OSL_ASSERT( types.Any == retTypes.Any );
653 	}
654 
655 }
656 
testRemote(const Reference<XInterface> & rRemote)657 void testRemote( const Reference< XInterface > &rRemote )
658 {
659 	char a;
660 	getCppuType( (sal_Int8*)&a );
661 
662 	Reference< XTestFactory > rRFact( rRemote , UNO_QUERY );
663 	if( ! rRFact.is() )
664 	{
665 		printf( "remote object doesn't support XTestFactory\n" );
666 		return;
667 	}
668 	OSL_ASSERT( rRFact.is() );
669 	Reference< XCallMe > rLCallMe = (XCallMe * ) new OCallMe();
670 	Reference< XCallMe > rRCallMe = rRFact->createCallMe();
671 
672 	testAllTypes( rLCallMe );
673 	testAllTypes( rRCallMe );
674 
675 	printf( "Testing exception local ...\n" );
676 	testException( rLCallMe );
677 	printf( "Testing exception remote ...\n" );
678 	testException( rRCallMe );
679 
680 	//--------------------
681 	// Test attributes
682 	//----------------------
683 	OUString ow = OUString::createFromAscii( "dum didel dum dideldei" );
684 	rLCallMe->setsAttribute( ow );
685 	OSL_ASSERT( rLCallMe->getsAttribute() == ow );
686 
687 		rRCallMe->setsAttribute( ow );
688 		OSL_ASSERT( rRCallMe->getsAttribute() == ow );
689 
690 	//-------------------
691 	// Performance test
692 	//-------------------
693 	testPerformance( rRCallMe , rLCallMe );
694  	testOnewayPerformanceOnTwoInterfaces( rRFact->createCallMe(), rRCallMe );
695 
696  	//----------------
697  	// Test sequence
698  	//----------------
699 	testSequenceOfCalls( rRCallMe );
700 
701 
702  	// test triple to check if transporting the same interface multiple
703  	// times causes any problems
704 	Reference< XInterfaceTest > rRTest = rRFact->createInterfaceTest();
705 	Reference< XInterfaceTest > rRTest2 = rRFact->createInterfaceTest();
706 	Reference< XInterfaceTest > rRTest3 = rRFact->createInterfaceTest();
707 
708  	rRTest->setIn( rRCallMe );
709  	rRTest2->setIn( rRCallMe );
710  	rRTest3->setIn( rRCallMe );
711 
712  	OSL_ASSERT( rRTest->get() == rRCallMe );
713  	OSL_ASSERT( rRTest2->get() == rRCallMe );
714  	OSL_ASSERT( rRTest3->get() == rRCallMe );
715 
716 	rRTest->setIn( rLCallMe );
717 	rRTest2->setIn( rLCallMe );
718 	rRTest3->setIn( rLCallMe );
719 
720  	{
721  		Reference< XCallMe > rLCallMe1 = (XCallMe * ) new OCallMe();
722  		Reference< XCallMe > rLCallMe2 = (XCallMe * ) new OCallMe();
723  		Reference< XCallMe > rLCallMe3 = (XCallMe * ) new OCallMe();
724  		rRTest->setIn( rLCallMe1 );
725  		rRTest2->setIn( rLCallMe2 );
726  		rRTest3->setIn( rLCallMe3 );
727  		OSL_ASSERT( rRTest->get() == rLCallMe1 );
728  		OSL_ASSERT( rRTest2->get() == rLCallMe2 );
729  		OSL_ASSERT( rRTest3->get() == rLCallMe3 );
730 
731  		rRTest->setIn( rLCallMe );
732  		rRTest2->setIn( rLCallMe );
733  		rRTest3->setIn( rLCallMe );
734 
735  		OSL_ASSERT( rRTest->get() == rLCallMe );
736  		OSL_ASSERT( rRTest2->get() == rLCallMe );
737  		OSL_ASSERT( rRTest3->get() == rLCallMe );
738  	}
739 
740  	Reference < XCallMe > r = rRCallMe;
741  	rRTest->setInOut( r );
742  	OSL_ASSERT( r == rLCallMe );
743  	OSL_ASSERT( ! ( r == rRCallMe ) );
744 
745  	// test empty references
746  	rRTest->setIn( Reference < XCallMe > () );
747 
748 	//--------------------------------
749 	// test thread deadlocking
750 	//--------------------------------
751 	rLCallMe->callAgain( rRCallMe, 20 );
752 
753 }
754 
755 
756 
757 
758 
759 
createComponent(const::rtl::OUString & sService,const::rtl::OUString & sDllName,const Reference<XMultiServiceFactory> & rSMgr)760 Reference <XInterface > createComponent( const ::rtl::OUString &sService ,
761 										 const ::rtl::OUString &sDllName,
762 										 const Reference < XMultiServiceFactory > &rSMgr )
763 {
764 	Reference< XInterface > rInterface;
765 	rInterface = rSMgr->createInstance( sService );
766 
767 	if( ! rInterface.is() )
768 	{
769 		// register first
770 		Reference < XImplementationRegistration > rReg (
771 			rSMgr->createInstance(
772 				OUString::createFromAscii( "com.sun.star.registry.ImplementationRegistration" )),
773 			UNO_QUERY );
774 
775 		OSL_ASSERT( rReg.is() );
776 		OUString aDllName = sDllName;
777 
778 		try
779 		{
780 			rReg->registerImplementation(
781 				OUString::createFromAscii( "com.sun.star.loader.SharedLibrary" ),
782 				aDllName,
783 				Reference< XSimpleRegistry > () );
784 			rInterface = rSMgr->createInstance( sService );
785 		}
786 		catch( Exception & )
787 		{
788 			printf( "couldn't register dll %s\n" ,
789 					OUStringToOString( aDllName, RTL_TEXTENCODING_ASCII_US ).getStr() );
790 		}
791 	}
792 	return rInterface;
793 }
794 
795