1*be9e621aSdamjan /************************************************************** 2*be9e621aSdamjan * 3*be9e621aSdamjan * Licensed to the Apache Software Foundation (ASF) under one 4*be9e621aSdamjan * or more contributor license agreements. See the NOTICE file 5*be9e621aSdamjan * distributed with this work for additional information 6*be9e621aSdamjan * regarding copyright ownership. The ASF licenses this file 7*be9e621aSdamjan * to you under the Apache License, Version 2.0 (the 8*be9e621aSdamjan * "License"); you may not use this file except in compliance 9*be9e621aSdamjan * with the License. You may obtain a copy of the License at 10*be9e621aSdamjan * 11*be9e621aSdamjan * http://www.apache.org/licenses/LICENSE-2.0 12*be9e621aSdamjan * 13*be9e621aSdamjan * Unless required by applicable law or agreed to in writing, 14*be9e621aSdamjan * software distributed under the License is distributed on an 15*be9e621aSdamjan * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*be9e621aSdamjan * KIND, either express or implied. See the License for the 17*be9e621aSdamjan * specific language governing permissions and limitations 18*be9e621aSdamjan * under the License. 19*be9e621aSdamjan * 20*be9e621aSdamjan *************************************************************/ 21*be9e621aSdamjan 22*be9e621aSdamjan 23*be9e621aSdamjan 24*be9e621aSdamjan #include "sal/config.h" 25*be9e621aSdamjan 26*be9e621aSdamjan #include "com/sun/star/bridge/UnoUrlResolver.hpp" 27*be9e621aSdamjan #include "com/sun/star/bridge/XUnoUrlResolver.hpp" 28*be9e621aSdamjan #include "com/sun/star/connection/NoConnectException.hpp" 29*be9e621aSdamjan #include "com/sun/star/frame/XDesktop.hpp" 30*be9e621aSdamjan #include "com/sun/star/lang/DisposedException.hpp" 31*be9e621aSdamjan #include "com/sun/star/uno/Reference.hxx" 32*be9e621aSdamjan #include "com/sun/star/uno/XComponentContext.hpp" 33*be9e621aSdamjan #include "cppuhelper/bootstrap.hxx" 34*be9e621aSdamjan #include <preextstl.h> 35*be9e621aSdamjan #include "cppunit/TestAssert.h" 36*be9e621aSdamjan #include <postextstl.h> 37*be9e621aSdamjan #include "osl/process.h" 38*be9e621aSdamjan #include "osl/time.h" 39*be9e621aSdamjan #include "sal/types.h" 40*be9e621aSdamjan #include "test/officeconnection.hxx" 41*be9e621aSdamjan #include "test/toabsolutefileurl.hxx" 42*be9e621aSdamjan #include "test/uniquepipename.hxx" 43*be9e621aSdamjan 44*be9e621aSdamjan #include "getargument.hxx" 45*be9e621aSdamjan 46*be9e621aSdamjan namespace { 47*be9e621aSdamjan 48*be9e621aSdamjan namespace css = com::sun::star; 49*be9e621aSdamjan 50*be9e621aSdamjan } 51*be9e621aSdamjan 52*be9e621aSdamjan namespace test { 53*be9e621aSdamjan 54*be9e621aSdamjan OfficeConnection::OfficeConnection(): process_(0) {} 55*be9e621aSdamjan 56*be9e621aSdamjan OfficeConnection::~OfficeConnection() {} 57*be9e621aSdamjan 58*be9e621aSdamjan void OfficeConnection::setUp() { 59*be9e621aSdamjan rtl::OUString desc; 60*be9e621aSdamjan rtl::OUString argSoffice; 61*be9e621aSdamjan CPPUNIT_ASSERT( 62*be9e621aSdamjan detail::getArgument( 63*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("soffice")), 64*be9e621aSdamjan &argSoffice)); 65*be9e621aSdamjan if (argSoffice.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("path:"))) { 66*be9e621aSdamjan desc = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("pipe,name=")) + 67*be9e621aSdamjan uniquePipeName( 68*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("oootest"))); 69*be9e621aSdamjan rtl::OUString noquickArg( 70*be9e621aSdamjan RTL_CONSTASCII_USTRINGPARAM("-quickstart=no")); 71*be9e621aSdamjan rtl::OUString nofirstArg( 72*be9e621aSdamjan RTL_CONSTASCII_USTRINGPARAM("-nofirststartwizard")); 73*be9e621aSdamjan rtl::OUString norestoreArg(RTL_CONSTASCII_USTRINGPARAM("-norestore")); 74*be9e621aSdamjan rtl::OUString acceptArg( 75*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-accept=")) + desc + 76*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(";urp"))); 77*be9e621aSdamjan rtl::OUString argUser; 78*be9e621aSdamjan CPPUNIT_ASSERT( 79*be9e621aSdamjan detail::getArgument( 80*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("user")), &argUser)); 81*be9e621aSdamjan rtl::OUString userArg( 82*be9e621aSdamjan rtl::OUString( 83*be9e621aSdamjan RTL_CONSTASCII_USTRINGPARAM("-env:UserInstallation=")) + 84*be9e621aSdamjan toAbsoluteFileUrl(argUser)); 85*be9e621aSdamjan rtl::OUString jreArg( 86*be9e621aSdamjan RTL_CONSTASCII_USTRINGPARAM("-env:UNO_JAVA_JFW_ENV_JREHOME=true")); 87*be9e621aSdamjan rtl_uString * args[] = { 88*be9e621aSdamjan noquickArg.pData, nofirstArg.pData, norestoreArg.pData, 89*be9e621aSdamjan acceptArg.pData, userArg.pData, jreArg.pData }; 90*be9e621aSdamjan rtl_uString ** envs = 0; 91*be9e621aSdamjan rtl::OUString argEnv; 92*be9e621aSdamjan if (detail::getArgument( 93*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("env")), &argEnv)) 94*be9e621aSdamjan { 95*be9e621aSdamjan envs = &argEnv.pData; 96*be9e621aSdamjan } 97*be9e621aSdamjan CPPUNIT_ASSERT_EQUAL( 98*be9e621aSdamjan osl_Process_E_None, 99*be9e621aSdamjan osl_executeProcess( 100*be9e621aSdamjan toAbsoluteFileUrl( 101*be9e621aSdamjan argSoffice.copy(RTL_CONSTASCII_LENGTH("path:"))).pData, 102*be9e621aSdamjan args, sizeof args / sizeof args[0], 0, 0, 0, envs, 103*be9e621aSdamjan envs == 0 ? 0 : 1, &process_)); 104*be9e621aSdamjan } else if (argSoffice.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("connect:"))) { 105*be9e621aSdamjan desc = argSoffice.copy(RTL_CONSTASCII_LENGTH("connect:")); 106*be9e621aSdamjan } else { 107*be9e621aSdamjan CPPUNIT_FAIL( 108*be9e621aSdamjan "\"soffice\" argument starts with neither \"path:\" nor" 109*be9e621aSdamjan " \"connect:\""); 110*be9e621aSdamjan } 111*be9e621aSdamjan css::uno::Reference< css::bridge::XUnoUrlResolver > resolver( 112*be9e621aSdamjan css::bridge::UnoUrlResolver::create( 113*be9e621aSdamjan cppu::defaultBootstrap_InitialComponentContext())); 114*be9e621aSdamjan for (;;) { 115*be9e621aSdamjan try { 116*be9e621aSdamjan context_ = 117*be9e621aSdamjan css::uno::Reference< css::uno::XComponentContext >( 118*be9e621aSdamjan resolver->resolve( 119*be9e621aSdamjan rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("uno:")) + 120*be9e621aSdamjan desc + 121*be9e621aSdamjan rtl::OUString( 122*be9e621aSdamjan RTL_CONSTASCII_USTRINGPARAM( 123*be9e621aSdamjan ";urp;StarOffice.ComponentContext"))), 124*be9e621aSdamjan css::uno::UNO_QUERY_THROW); 125*be9e621aSdamjan break; 126*be9e621aSdamjan } catch (css::connection::NoConnectException &) {} 127*be9e621aSdamjan if (process_ != 0) { 128*be9e621aSdamjan TimeValue delay = { 1, 0 }; // 1 sec 129*be9e621aSdamjan CPPUNIT_ASSERT_EQUAL( 130*be9e621aSdamjan osl_Process_E_TimedOut, 131*be9e621aSdamjan osl_joinProcessWithTimeout(process_, &delay)); 132*be9e621aSdamjan } 133*be9e621aSdamjan } 134*be9e621aSdamjan } 135*be9e621aSdamjan 136*be9e621aSdamjan void OfficeConnection::tearDown() { 137*be9e621aSdamjan if (process_ != 0) { 138*be9e621aSdamjan if (context_.is()) { 139*be9e621aSdamjan css::uno::Reference< css::frame::XDesktop > desktop( 140*be9e621aSdamjan context_->getServiceManager()->createInstanceWithContext( 141*be9e621aSdamjan rtl::OUString( 142*be9e621aSdamjan RTL_CONSTASCII_USTRINGPARAM( 143*be9e621aSdamjan "com.sun.star.frame.Desktop")), 144*be9e621aSdamjan context_), 145*be9e621aSdamjan css::uno::UNO_QUERY_THROW); 146*be9e621aSdamjan context_.clear(); 147*be9e621aSdamjan try { 148*be9e621aSdamjan CPPUNIT_ASSERT(desktop->terminate()); 149*be9e621aSdamjan desktop.clear(); 150*be9e621aSdamjan } catch (css::lang::DisposedException &) {} 151*be9e621aSdamjan // it appears that DisposedExceptions can already happen while 152*be9e621aSdamjan // receiving the response of the terminate call 153*be9e621aSdamjan } 154*be9e621aSdamjan CPPUNIT_ASSERT_EQUAL(osl_Process_E_None, osl_joinProcess(process_)); 155*be9e621aSdamjan oslProcessInfo info; 156*be9e621aSdamjan info.Size = sizeof info; 157*be9e621aSdamjan CPPUNIT_ASSERT_EQUAL( 158*be9e621aSdamjan osl_Process_E_None, 159*be9e621aSdamjan osl_getProcessInfo(process_, osl_Process_EXITCODE, &info)); 160*be9e621aSdamjan CPPUNIT_ASSERT_EQUAL(oslProcessExitCode(0), info.Code); 161*be9e621aSdamjan osl_freeProcessHandle(process_); 162*be9e621aSdamjan } 163*be9e621aSdamjan } 164*be9e621aSdamjan 165*be9e621aSdamjan css::uno::Reference< css::uno::XComponentContext > 166*be9e621aSdamjan OfficeConnection::getComponentContext() const { 167*be9e621aSdamjan return context_; 168*be9e621aSdamjan } 169*be9e621aSdamjan 170*be9e621aSdamjan } 171