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 package ifc.connection; 25 26 import lib.MultiMethodTest; 27 import lib.StatusException; 28 29 import com.sun.star.connection.XAcceptor; 30 import com.sun.star.connection.XConnection; 31 import com.sun.star.connection.XConnector; 32 import com.sun.star.lang.XMultiServiceFactory; 33 import com.sun.star.uno.UnoRuntime; 34 import com.sun.star.uno.XInterface; 35 36 /** 37 * Tests methods of <code>XConnector</code> interface. <p> 38 * Required relations : 39 * <ul> 40 * <li> <code>'XConnector.connectStr'</code> : String variable. Has 41 * the following format : 42 * <code>'socket,host=<SOHost>,port=<UniquePort>' where <SOHost> is 43 * the host where StarOffice is started. This string must be passed 44 * as parameter to <code>accept()</code> method. </li> 45 * <ul> <p> 46 * This test <b>can not</b> be run in multiply threads. 47 */ 48 public class _XConnector extends MultiMethodTest { 49 50 /** 51 * Calls <code>accept()</code> method in a separate thread. 52 * Then stores exception thrown by call if it occured, or 53 * return value. 54 */ 55 protected class AcceptorThread extends Thread { 56 /** 57 * the acceptor 58 */ 59 private XAcceptor acc = null ; 60 /** 61 * If exception occured during method call it is 62 * stored in this field. 63 */ 64 public Exception ex = null ; 65 /** 66 * If method call returns some value it stores in this field. 67 */ 68 public XConnection acceptedCall = null ; 69 70 /** 71 * Gets an object which can call <code>accept</code> method. 72 */ 73 public AcceptorThread(XAcceptor acc) { 74 this.acc = acc ; 75 } 76 77 /** 78 * Call <code>accept()</code> method. 79 */ 80 public void run() { 81 try { 82 acceptedCall = acc.accept(connectString) ; 83 } catch (com.sun.star.lang.IllegalArgumentException e) { 84 ex = e ; 85 } catch (com.sun.star.connection.ConnectionSetupException e) { 86 ex = e ; 87 } catch (com.sun.star.connection.AlreadyAcceptingException e) { 88 ex = e ; 89 } 90 } 91 } 92 93 public XConnector oObj = null; 94 protected String connectString = null ; 95 96 /** 97 * Retrieves object relation. 98 */ 99 public void before() throws StatusException { 100 connectString = (String) 101 tEnv.getObjRelation("XConnector.connectStr") ; 102 if (connectString == null) 103 throw new StatusException("No object relation found", 104 new NullPointerException()) ; 105 } 106 107 /** 108 * Thread with acceptor is created, and it starts listening. 109 * The main thread tries to connect to acceptor. Acception thread must 110 * return and a valid connection must be returned by Acceptor. <p> 111 * 112 */ 113 public void _connect() { 114 boolean result = true ; 115 AcceptorThread acceptorThread = null; 116 XAcceptor xAcceptor = null ; 117 XConnection aCon = null; 118 XInterface x = null; 119 120 // create the acceptor 121 try { 122 x = (XInterface) ( 123 (XMultiServiceFactory)tParam.getMSF()).createInstance 124 ("com.sun.star.connection.Acceptor") ; 125 } catch (com.sun.star.uno.Exception e) { 126 e.printStackTrace(log) ; 127 throw new StatusException("Can't create service", e) ; 128 } 129 130 xAcceptor = (XAcceptor)UnoRuntime.queryInterface(XAcceptor.class, x); 131 132 acceptorThread = new AcceptorThread(xAcceptor) ; 133 acceptorThread.start() ; 134 135 try { 136 Thread.sleep(500); 137 } 138 catch (java.lang.InterruptedException e) {} 139 140 // connect to acceptor 141 try { 142 aCon = oObj.connect(connectString); 143 144 if (aCon == null) 145 log.println("Connector returned: null") ; 146 else 147 log.println("Connector returned: " + aCon.getDescription()) ; 148 149 try { 150 acceptorThread.join(30 * 1000) ; 151 } catch(InterruptedException e) {} 152 153 // connection not established 154 if (acceptorThread.isAlive()) { 155 156 result = false ; 157 log.println("Method call hasn't returned") ; 158 159 if (acceptorThread.acceptedCall == null) 160 log.println("Acceptor returned : null") ; 161 else 162 log.println("Acceptor returned : " + 163 acceptorThread.acceptedCall.getDescription()) ; 164 } else { 165 if (acceptorThread.ex != null) { 166 log.println("Exception occured in accept() thread :") ; 167 acceptorThread.ex.printStackTrace(log) ; 168 } 169 170 if (acceptorThread.acceptedCall == null) 171 log.println("Method returned : null") ; 172 else 173 log.println("Method returned : " + 174 acceptorThread.acceptedCall.getDescription()) ; 175 176 result &= acceptorThread.acceptedCall != null ; 177 } 178 } catch (com.sun.star.connection.ConnectionSetupException e) { 179 e.printStackTrace(log) ; 180 result = false ; 181 } catch (com.sun.star.connection.NoConnectException e) { 182 e.printStackTrace(log) ; 183 result = false ; 184 } finally { 185 acceptorThread.acc.stopAccepting(); 186 if (acceptorThread.isAlive()) { 187 acceptorThread.interrupt(); 188 } 189 } 190 191 tRes.tested("connect()", result) ; 192 } 193 } 194 195