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