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
OfficeConnection()54be9e621aSdamjan OfficeConnection::OfficeConnection(): process_(0) {}
55be9e621aSdamjan
~OfficeConnection()56be9e621aSdamjan OfficeConnection::~OfficeConnection() {}
57be9e621aSdamjan
setUp()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
tearDown()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 >
getComponentContext() const166be9e621aSdamjan OfficeConnection::getComponentContext() const {
167be9e621aSdamjan return context_;
168be9e621aSdamjan }
169be9e621aSdamjan
170be9e621aSdamjan }
171