xref: /trunk/main/io/test/testconnection.cxx (revision 3716f815)
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_io.hxx"
26 #include <stdio.h>
27 #include <osl/time.h>
28 
29 #include <osl/diagnose.h>
30 #include <osl/thread.hxx>
31 
32 #include <cppuhelper/servicefactory.hxx>
33 
34 #include <com/sun/star/lang/XComponent.hpp>
35 
36 #include <com/sun/star/registry/XImplementationRegistration.hpp>
37 
38 #include <com/sun/star/connection/XConnector.hpp>
39 #include <com/sun/star/connection/XAcceptor.hpp>
40 
41 using namespace ::osl;
42 using namespace ::rtl;
43 using namespace ::cppu;
44 using namespace ::com::sun::star::uno;
45 using namespace ::com::sun::star::io;
46 using namespace ::com::sun::star::lang;
47 using namespace ::com::sun::star::registry;
48 using namespace ::com::sun::star::connection;
49 
50 
51 class MyThread :
52 	public Thread
53 {
54 public:
MyThread(const Reference<XAcceptor> & r,const OUString & sConnectionDescription)55 	MyThread( const Reference< XAcceptor > &r , const OUString & sConnectionDescription) :
56 		m_rAcceptor( r ),
57 		m_sConnectionDescription( sConnectionDescription )
58 		{}
59 	virtual void SAL_CALL run();
60 
61 	Reference < XAcceptor > m_rAcceptor;
62 private:
63 	Reference < XConnection > m_rConnection;
64 	OUString m_sConnectionDescription;
65 };
66 
doWrite(const Reference<XConnection> & r)67 void doWrite( const Reference < XConnection > &r )
68 {
69 	Sequence < sal_Int8 > seq(10);
70 	for( sal_Int32 i = 0 ; i < 10 ; i ++ )
71 	{
72 		seq.getArray()[i] = i;
73 	}
74 
75 	r->write( seq );
76 }
77 
doRead(const Reference<XConnection> & r)78 void doRead( const Reference < XConnection > &r )
79 {
80 	Sequence < sal_Int8 > seq(10);
81 
82 	OSL_ASSERT( 10 == r->read( seq , 10 ) );
83 
84 	for( sal_Int32 i = 0 ; i < 10 ; i ++ )
85 	{
86 		OSL_ASSERT( seq.getConstArray()[i] == i );
87 	}
88 }
89 
90 
run()91 void MyThread::run()
92 {
93 	try
94 	{
95 		m_rConnection = m_rAcceptor->accept( m_sConnectionDescription );
96 	}
97 	catch ( Exception &e)
98 	{
99 		OString tmp= OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US );
100 		printf( "Exception was thrown by acceptor thread: %s\n", tmp.getStr() );
101 	}
102 
103 	if( m_rConnection.is() )
104 	{
105 		Sequence < sal_Int8 > seq(12);
106 		try
107 		{
108 			doWrite( m_rConnection );
109 			doRead( m_rConnection );
110 		}
111 		catch (... )
112 		{
113 			printf( "unknown exception was thrown\n" );
114 			throw;
115 		}
116 	}
117 
118 }
119 
120 
121 
122 
123 
testConnection(const OUString & sConnectionDescription,const Reference<XAcceptor> & rAcceptor,const Reference<XConnector> & rConnector)124 void testConnection( const OUString &sConnectionDescription  ,
125 					 const Reference < XAcceptor > &rAcceptor,
126 					 const Reference < XConnector > &rConnector )
127 {
128 	{
129 		MyThread thread( rAcceptor , sConnectionDescription );
130 		thread.create();
131 
132 		sal_Bool bGotit = sal_False;
133 		Reference < XConnection > r;
134 
135 		while( ! bGotit )
136 		{
137 			try
138 			{
139 				// Why is this wait necessary ????
140 				TimeValue value = {1,0};
141 				osl_waitThread( &value );
142 				r = rConnector->connect( sConnectionDescription );
143 				OSL_ASSERT( r.is() );
144 				doWrite( r );
145 				doRead( r );
146 				bGotit = sal_True;
147 			}
148 			catch( ... )
149 			{
150 				printf( "Couldn't connect, retrying ...\n" );
151 
152 			}
153 		}
154 
155 		r->close();
156 
157 		try
158 		{
159 			Sequence < sal_Int8 > seq(10);
160 			r->write( seq );
161 			OSL_ENSURE( 0 , "expected exception not thrown" );
162 		}
163 		catch ( IOException & )
164 		{
165 			// everything is ok
166 		}
167 		catch ( ... )
168 		{
169 			OSL_ENSURE( 0 , "wrong exception was thrown" );
170 		}
171 
172 		thread.join();
173 	}
174 }
175 
176 
177 #if (defined UNX) || (defined OS2)
main(int argc,char * argv[])178 int main( int argc, char * argv[] )
179 #else
180 int __cdecl main( int argc, char * argv[] )
181 #endif
182 {
183 	Reference< XMultiServiceFactory > xMgr(
184 		createRegistryServiceFactory( OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")) ) );
185 
186 	Reference< XImplementationRegistration > xImplReg(
187 		xMgr->createInstance( OUString::createFromAscii("com.sun.star.registry.ImplementationRegistration") ), UNO_QUERY );
188 	OSL_ENSURE( xImplReg.is(), "### no impl reg!" );
189 
190 	OUString aLibName =
191         OUString::createFromAscii( "connector.uno" SAL_DLLEXTENSION );
192 	xImplReg->registerImplementation(
193 		OUString::createFromAscii("com.sun.star.loader.SharedLibrary"), aLibName, Reference< XSimpleRegistry >() );
194 
195 	aLibName = OUString::createFromAscii( "acceptor.uno" SAL_DLLEXTENSION );
196 	xImplReg->registerImplementation(
197 		OUString::createFromAscii("com.sun.star.loader.SharedLibrary"), aLibName, Reference< XSimpleRegistry >() );
198 
199 	Reference < XAcceptor >  rAcceptor(
200 		xMgr->createInstance(
201 			OUString::createFromAscii("com.sun.star.connection.Acceptor" ) ) , UNO_QUERY );
202 
203 	Reference < XAcceptor >  rAcceptorPipe(
204 		xMgr->createInstance(
205 			OUString::createFromAscii("com.sun.star.connection.Acceptor" ) ) , UNO_QUERY );
206 
207 	Reference < XConnector >  rConnector(
208 		xMgr->createInstance( OUString::createFromAscii("com.sun.star.connection.Connector") ) , UNO_QUERY );
209 
210 
211 	printf( "Testing sockets" );
212 	fflush( stdout );
213 	testConnection( OUString::createFromAscii("socket,host=localhost,port=2001"), rAcceptor , rConnector );
214 	printf( " Done\n" );
215 
216 	printf( "Testing pipe" );
217 	fflush( stdout );
218 	testConnection( OUString::createFromAscii("pipe,name=bla") , rAcceptorPipe , rConnector );
219 	printf( " Done\n" );
220 
221 	// check, if errornous strings make any problem
222 	rAcceptor = Reference< XAcceptor > (
223 		xMgr->createInstance( OUString::createFromAscii( "com.sun.star.connection.Acceptor" ) ),
224 		UNO_QUERY );
225 
226 	try
227 	{
228 		rAcceptor->accept( OUString() );
229 		OSL_ENSURE( 0 , "empty connection string" );
230 	}
231 	catch( IllegalArgumentException & )
232 	{
233 		// everything is fine
234 	}
235 	catch( ... )
236 	{
237 		OSL_ENSURE( 0, "unexpected akexception with empty connection string" );
238 	}
239 
240 	try
241 	{
242 		rConnector->connect( OUString() );
243 		OSL_ENSURE( 0 , "empty connection string" );
244 	}
245 	catch( ConnectionSetupException & )
246 	{
247 		// everything is fine
248 	}
249 	catch( ... )
250 	{
251 		OSL_ENSURE( 0, "unexpected exception with empty connection string" );
252 	}
253 
254 
255 	MyThread thread( rAcceptor , OUString::createFromAscii("socket,host=localhost,port=2001") );
256 	thread.create();
257 
258 	TimeValue value = {0,1};
259 	osl_waitThread( &value );
260 	try
261 	{
262 		rAcceptor->accept( OUString::createFromAscii("socket,host=localhost,port=2001") );
263 		OSL_ENSURE( 0 , "already existing exception expected" );
264 	}
265 	catch( AlreadyAcceptingException & e)
266 	{
267 		// everything is fine
268 	}
269 	catch( ... )
270 	{
271 		OSL_ENSURE( 0, "unknown exception, already existing existing expected" );
272 	}
273 
274 	rAcceptor->stopAccepting();
275 	thread.join();
276 
277 	Reference < XComponent > rComp( xMgr , UNO_QUERY );
278 	if( rComp.is() )
279 	{
280 		rComp->dispose();
281 	}
282 }
283