187d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
387d2adbcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
487d2adbcSAndrew Rist * or more contributor license agreements. See the NOTICE file
587d2adbcSAndrew Rist * distributed with this work for additional information
687d2adbcSAndrew Rist * regarding copyright ownership. The ASF licenses this file
787d2adbcSAndrew Rist * to you under the Apache License, Version 2.0 (the
887d2adbcSAndrew Rist * "License"); you may not use this file except in compliance
987d2adbcSAndrew Rist * with the License. You may obtain a copy of the License at
1087d2adbcSAndrew Rist *
1187d2adbcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
1287d2adbcSAndrew Rist *
1387d2adbcSAndrew Rist * Unless required by applicable law or agreed to in writing,
1487d2adbcSAndrew Rist * software distributed under the License is distributed on an
1587d2adbcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1687d2adbcSAndrew Rist * KIND, either express or implied. See the License for the
1787d2adbcSAndrew Rist * specific language governing permissions and limitations
1887d2adbcSAndrew Rist * under the License.
1987d2adbcSAndrew Rist *
2087d2adbcSAndrew Rist *************************************************************/
2187d2adbcSAndrew Rist
2287d2adbcSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sal.hxx"
26cdf0e10cSrcweir
2744e8df1fSDamjan Jovanovic #include "gtest/gtest.h"
28cdf0e10cSrcweir #include <osl/process.h>
29cdf0e10cSrcweir #include <osl/file.hxx>
30cdf0e10cSrcweir #include <osl/thread.h>
31cdf0e10cSrcweir #include <rtl/ustring.hxx>
32cdf0e10cSrcweir #include <unistd.h>
33cdf0e10cSrcweir #include <signal.h>
34cdf0e10cSrcweir
35cdf0e10cSrcweir #include <stdio.h>
36cdf0e10cSrcweir #include <stdlib.h>
37cdf0e10cSrcweir #include <osl/module.hxx>
38cdf0e10cSrcweir
39*e6348c9cSDamjan Jovanovic #ifdef WNT // Windows
40*e6348c9cSDamjan Jovanovic #define WIN32_LEAN_AND_MEAN
41*e6348c9cSDamjan Jovanovic #include <tchar.h>
42cdf0e10cSrcweir #endif
43cdf0e10cSrcweir
44cdf0e10cSrcweir #include <iostream>
45cdf0e10cSrcweir #include <fstream>
46cdf0e10cSrcweir #include <vector>
47cdf0e10cSrcweir #include <algorithm>
48cdf0e10cSrcweir #include <iterator>
49cdf0e10cSrcweir #include <string>
50cdf0e10cSrcweir
51cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
52cdf0e10cSrcweir const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("osl_process_child.exe");
53cdf0e10cSrcweir #else
54cdf0e10cSrcweir const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("osl_process_child");
55cdf0e10cSrcweir #endif
56cdf0e10cSrcweir
57cdf0e10cSrcweir
58cdf0e10cSrcweir //########################################
OUString_to_std_string(const rtl::OUString & oustr)59cdf0e10cSrcweir std::string OUString_to_std_string(const rtl::OUString& oustr)
60cdf0e10cSrcweir {
61cdf0e10cSrcweir rtl::OString ostr = rtl::OUStringToOString(oustr, osl_getThreadTextEncoding());
62cdf0e10cSrcweir return std::string(ostr.getStr());
63cdf0e10cSrcweir }
64cdf0e10cSrcweir
65cdf0e10cSrcweir //########################################
66cdf0e10cSrcweir using namespace osl;
67cdf0e10cSrcweir using namespace rtl;
68cdf0e10cSrcweir
69cdf0e10cSrcweir /** print a UNI_CODE String.
70cdf0e10cSrcweir */
printUString(const::rtl::OUString & str)71cdf0e10cSrcweir inline void printUString( const ::rtl::OUString & str )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir rtl::OString aString;
74cdf0e10cSrcweir
7544e8df1fSDamjan Jovanovic printf("#printUString_u# " );
76cdf0e10cSrcweir aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
7744e8df1fSDamjan Jovanovic printf("%s\n", aString.getStr( ) );
78cdf0e10cSrcweir }
79cdf0e10cSrcweir
80cdf0e10cSrcweir /** get binary Path.
81cdf0e10cSrcweir */
getExecutablePath(void)82cdf0e10cSrcweir inline ::rtl::OUString getExecutablePath( void )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir ::rtl::OUString dirPath;
85cdf0e10cSrcweir osl::Module::getUrlFromAddress( ( void* ) &getExecutablePath, dirPath );
86cdf0e10cSrcweir dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') );
87cdf0e10cSrcweir dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
88cdf0e10cSrcweir dirPath += rtl::OUString::createFromAscii("bin");
89cdf0e10cSrcweir return dirPath;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir //rtl::OUString CWD = getExecutablePath();
93cdf0e10cSrcweir
94cdf0e10cSrcweir //########################################
9544e8df1fSDamjan Jovanovic class Test_osl_joinProcess : public ::testing::Test
96cdf0e10cSrcweir {
9744e8df1fSDamjan Jovanovic protected:
98cdf0e10cSrcweir const OUString join_param_;
99cdf0e10cSrcweir const OUString wait_time_;
100cdf0e10cSrcweir OUString suCWD;
101cdf0e10cSrcweir OUString suExecutableFileURL;
102cdf0e10cSrcweir
103cdf0e10cSrcweir rtl_uString* parameters_[2];
104cdf0e10cSrcweir int parameters_count_;
105cdf0e10cSrcweir
106cdf0e10cSrcweir public:
107cdf0e10cSrcweir
Test_osl_joinProcess()108cdf0e10cSrcweir Test_osl_joinProcess() :
109cdf0e10cSrcweir join_param_(OUString::createFromAscii("-join")),
110cdf0e10cSrcweir wait_time_(OUString::createFromAscii("1")),
111cdf0e10cSrcweir parameters_count_(2)
112cdf0e10cSrcweir {
113cdf0e10cSrcweir parameters_[0] = join_param_.pData;
114cdf0e10cSrcweir parameters_[1] = wait_time_.pData;
115cdf0e10cSrcweir suCWD = getExecutablePath();
116cdf0e10cSrcweir suExecutableFileURL = suCWD;
117cdf0e10cSrcweir suExecutableFileURL += rtl::OUString::createFromAscii("/");
118cdf0e10cSrcweir suExecutableFileURL += EXECUTABLE_NAME;
119cdf0e10cSrcweir }
12044e8df1fSDamjan Jovanovic };
121cdf0e10cSrcweir
12244e8df1fSDamjan Jovanovic /*-------------------------------------
12344e8df1fSDamjan Jovanovic Start a process and join with this
12444e8df1fSDamjan Jovanovic process specify a timeout so that
12544e8df1fSDamjan Jovanovic osl_joinProcessWithTimeout returns
12644e8df1fSDamjan Jovanovic osl_Process_E_TimedOut
12744e8df1fSDamjan Jovanovic -------------------------------------*/
128cdf0e10cSrcweir
TEST_F(Test_osl_joinProcess,osl_joinProcessWithTimeout_timeout_failure)12944e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcessWithTimeout_timeout_failure)
13044e8df1fSDamjan Jovanovic {
13144e8df1fSDamjan Jovanovic oslProcess process;
13244e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
13344e8df1fSDamjan Jovanovic suExecutableFileURL.pData,
13444e8df1fSDamjan Jovanovic parameters_,
13544e8df1fSDamjan Jovanovic parameters_count_,
13644e8df1fSDamjan Jovanovic osl_Process_NORMAL,
13744e8df1fSDamjan Jovanovic osl_getCurrentSecurity(),
13844e8df1fSDamjan Jovanovic suCWD.pData,
13944e8df1fSDamjan Jovanovic NULL,
14044e8df1fSDamjan Jovanovic 0,
14144e8df1fSDamjan Jovanovic &process);
142cdf0e10cSrcweir
14344e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
144cdf0e10cSrcweir
14544e8df1fSDamjan Jovanovic TimeValue timeout;
14644e8df1fSDamjan Jovanovic timeout.Seconds = 1;
14744e8df1fSDamjan Jovanovic timeout.Nanosec = 0;
148cdf0e10cSrcweir
14944e8df1fSDamjan Jovanovic osl_error = osl_joinProcessWithTimeout(process, &timeout);
150cdf0e10cSrcweir
15144e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_TimedOut == osl_error) << "osl_joinProcessWithTimeout returned without timeout failure";
152cdf0e10cSrcweir
15344e8df1fSDamjan Jovanovic osl_error = osl_terminateProcess(process);
154cdf0e10cSrcweir
15544e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_terminateProcess failed";
15644e8df1fSDamjan Jovanovic
15744e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
15844e8df1fSDamjan Jovanovic }
15944e8df1fSDamjan Jovanovic
16044e8df1fSDamjan Jovanovic /*-------------------------------------
16144e8df1fSDamjan Jovanovic Start a process and join with this
16244e8df1fSDamjan Jovanovic process specify a timeout so that
16344e8df1fSDamjan Jovanovic osl_joinProcessWithTimeout returns
16444e8df1fSDamjan Jovanovic osl_Process_E_None
16544e8df1fSDamjan Jovanovic -------------------------------------*/
16644e8df1fSDamjan Jovanovic
TEST_F(Test_osl_joinProcess,osl_joinProcessWithTimeout_without_timeout_failure)16744e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcessWithTimeout_without_timeout_failure)
16844e8df1fSDamjan Jovanovic {
16944e8df1fSDamjan Jovanovic oslProcess process;
17044e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
17144e8df1fSDamjan Jovanovic suExecutableFileURL.pData,
17244e8df1fSDamjan Jovanovic parameters_,
17344e8df1fSDamjan Jovanovic parameters_count_,
17444e8df1fSDamjan Jovanovic osl_Process_NORMAL,
17544e8df1fSDamjan Jovanovic osl_getCurrentSecurity(),
17644e8df1fSDamjan Jovanovic suCWD.pData,
17744e8df1fSDamjan Jovanovic NULL,
17844e8df1fSDamjan Jovanovic 0,
17944e8df1fSDamjan Jovanovic &process);
18044e8df1fSDamjan Jovanovic
18144e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
18244e8df1fSDamjan Jovanovic
18344e8df1fSDamjan Jovanovic TimeValue timeout;
18444e8df1fSDamjan Jovanovic timeout.Seconds = 10;
18544e8df1fSDamjan Jovanovic timeout.Nanosec = 0;
18644e8df1fSDamjan Jovanovic
18744e8df1fSDamjan Jovanovic osl_error = osl_joinProcessWithTimeout(process, &timeout);
18844e8df1fSDamjan Jovanovic
18944e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcessWithTimeout returned with failure";
19044e8df1fSDamjan Jovanovic
19144e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
19244e8df1fSDamjan Jovanovic }
19344e8df1fSDamjan Jovanovic
19444e8df1fSDamjan Jovanovic /*-------------------------------------
19544e8df1fSDamjan Jovanovic Start a process and join with this
19644e8df1fSDamjan Jovanovic process specify an infinite timeout
19744e8df1fSDamjan Jovanovic -------------------------------------*/
19844e8df1fSDamjan Jovanovic
TEST_F(Test_osl_joinProcess,osl_joinProcessWithTimeout_infinite)19944e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcessWithTimeout_infinite)
20044e8df1fSDamjan Jovanovic {
20144e8df1fSDamjan Jovanovic oslProcess process;
20244e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
20344e8df1fSDamjan Jovanovic suExecutableFileURL.pData,
20444e8df1fSDamjan Jovanovic parameters_,
20544e8df1fSDamjan Jovanovic parameters_count_,
20644e8df1fSDamjan Jovanovic osl_Process_NORMAL,
20744e8df1fSDamjan Jovanovic osl_getCurrentSecurity(),
20844e8df1fSDamjan Jovanovic suCWD.pData,
20944e8df1fSDamjan Jovanovic NULL,
21044e8df1fSDamjan Jovanovic 0,
21144e8df1fSDamjan Jovanovic &process);
21244e8df1fSDamjan Jovanovic
21344e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
21444e8df1fSDamjan Jovanovic
21544e8df1fSDamjan Jovanovic osl_error = osl_joinProcessWithTimeout(process, NULL);
21644e8df1fSDamjan Jovanovic
21744e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcessWithTimeout returned with failure";
21844e8df1fSDamjan Jovanovic
21944e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
22044e8df1fSDamjan Jovanovic }
22144e8df1fSDamjan Jovanovic
22244e8df1fSDamjan Jovanovic /*-------------------------------------
22344e8df1fSDamjan Jovanovic Start a process and join with this
22444e8df1fSDamjan Jovanovic process using osl_joinProcess
22544e8df1fSDamjan Jovanovic -------------------------------------*/
22644e8df1fSDamjan Jovanovic
TEST_F(Test_osl_joinProcess,osl_joinProcess)22744e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcess)
22844e8df1fSDamjan Jovanovic {
22944e8df1fSDamjan Jovanovic oslProcess process;
23044e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
23144e8df1fSDamjan Jovanovic suExecutableFileURL.pData,
23244e8df1fSDamjan Jovanovic parameters_,
23344e8df1fSDamjan Jovanovic parameters_count_,
23444e8df1fSDamjan Jovanovic osl_Process_NORMAL,
23544e8df1fSDamjan Jovanovic osl_getCurrentSecurity(),
23644e8df1fSDamjan Jovanovic suCWD.pData,
23744e8df1fSDamjan Jovanovic NULL,
23844e8df1fSDamjan Jovanovic 0,
23944e8df1fSDamjan Jovanovic &process);
24044e8df1fSDamjan Jovanovic
24144e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
24244e8df1fSDamjan Jovanovic
24344e8df1fSDamjan Jovanovic osl_error = ::osl_joinProcess(process);
24444e8df1fSDamjan Jovanovic
24544e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
24644e8df1fSDamjan Jovanovic
24744e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
24844e8df1fSDamjan Jovanovic }
249cdf0e10cSrcweir
250cdf0e10cSrcweir
251cdf0e10cSrcweir //#########################################################
252cdf0e10cSrcweir
25322076bf1SHerbert Dürr typedef std::vector<std::string> string_container_t;
254cdf0e10cSrcweir typedef string_container_t::const_iterator string_container_const_iter_t;
255cdf0e10cSrcweir typedef string_container_t::iterator string_container_iter_t;
256cdf0e10cSrcweir
257cdf0e10cSrcweir //#########################################################
258cdf0e10cSrcweir class exclude : public std::unary_function<std::string, bool>
259cdf0e10cSrcweir {
260cdf0e10cSrcweir public:
261cdf0e10cSrcweir //------------------------------------------------
exclude(const string_container_t & exclude_list)262cdf0e10cSrcweir exclude(const string_container_t& exclude_list)
263cdf0e10cSrcweir {
264cdf0e10cSrcweir string_container_const_iter_t iter = exclude_list.begin();
265cdf0e10cSrcweir string_container_const_iter_t iter_end = exclude_list.end();
266cdf0e10cSrcweir for (/**/; iter != iter_end; ++iter)
267cdf0e10cSrcweir exclude_list_.push_back(env_var_name(*iter));
268cdf0e10cSrcweir }
269cdf0e10cSrcweir
270cdf0e10cSrcweir //------------------------------------------------
operator ()(const std::string & env_var) const271cdf0e10cSrcweir bool operator() (const std::string& env_var) const
272cdf0e10cSrcweir {
273cdf0e10cSrcweir return (exclude_list_.end() !=
274cdf0e10cSrcweir std::find(
275cdf0e10cSrcweir exclude_list_.begin(),
276cdf0e10cSrcweir exclude_list_.end(),
277cdf0e10cSrcweir env_var_name(env_var)));
278cdf0e10cSrcweir }
279cdf0e10cSrcweir
280cdf0e10cSrcweir private:
281cdf0e10cSrcweir //-------------------------------------------------
282cdf0e10cSrcweir // extract the name from an environment variable
283cdf0e10cSrcweir // that is given in the form "NAME=VALUE"
env_var_name(const std::string & env_var) const284cdf0e10cSrcweir std::string env_var_name(const std::string& env_var) const
285cdf0e10cSrcweir {
286cdf0e10cSrcweir std::string::size_type pos_equal_sign =
287cdf0e10cSrcweir env_var.find_first_of("=");
288cdf0e10cSrcweir
289cdf0e10cSrcweir if (std::string::npos != pos_equal_sign)
290cdf0e10cSrcweir return std::string(env_var, 0, pos_equal_sign);
291cdf0e10cSrcweir
292cdf0e10cSrcweir return std::string();
293cdf0e10cSrcweir }
294cdf0e10cSrcweir
295cdf0e10cSrcweir private:
296cdf0e10cSrcweir string_container_t exclude_list_;
297cdf0e10cSrcweir };
298cdf0e10cSrcweir
299cdf0e10cSrcweir #ifdef WNT
read_parent_environment(string_container_t * env_container)300cdf0e10cSrcweir void read_parent_environment(string_container_t* env_container)
301cdf0e10cSrcweir {
302cdf0e10cSrcweir LPTSTR env = reinterpret_cast<LPTSTR>(GetEnvironmentStrings());
303cdf0e10cSrcweir LPTSTR p = env;
304cdf0e10cSrcweir
305cdf0e10cSrcweir while (size_t l = _tcslen(p))
306cdf0e10cSrcweir {
307cdf0e10cSrcweir env_container->push_back(std::string(p));
308cdf0e10cSrcweir p += l + 1;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir FreeEnvironmentStrings(env);
311cdf0e10cSrcweir }
312cdf0e10cSrcweir #else
313cdf0e10cSrcweir extern char** environ;
read_parent_environment(string_container_t * env_container)314cdf0e10cSrcweir void read_parent_environment(string_container_t* env_container)
315cdf0e10cSrcweir {
316cdf0e10cSrcweir for (int i = 0; NULL != environ[i]; i++)
317cdf0e10cSrcweir env_container->push_back(std::string(environ[i]));
318cdf0e10cSrcweir }
319cdf0e10cSrcweir #endif
320cdf0e10cSrcweir
321cdf0e10cSrcweir //#########################################################
32244e8df1fSDamjan Jovanovic class Test_osl_executeProcess : public ::testing::Test
323cdf0e10cSrcweir {
32444e8df1fSDamjan Jovanovic protected:
325cdf0e10cSrcweir const OUString env_param_;
326cdf0e10cSrcweir
327cdf0e10cSrcweir OUString temp_file_path_;
328cdf0e10cSrcweir rtl_uString* parameters_[2];
329cdf0e10cSrcweir int parameters_count_;
330cdf0e10cSrcweir OUString suCWD;
331cdf0e10cSrcweir OUString suExecutableFileURL;
332cdf0e10cSrcweir
333cdf0e10cSrcweir public:
334cdf0e10cSrcweir
335cdf0e10cSrcweir //------------------------------------------------
336cdf0e10cSrcweir // ctor
Test_osl_executeProcess()337cdf0e10cSrcweir Test_osl_executeProcess() :
338cdf0e10cSrcweir env_param_(OUString::createFromAscii("-env")),
339cdf0e10cSrcweir parameters_count_(2)
340cdf0e10cSrcweir {
341cdf0e10cSrcweir parameters_[0] = env_param_.pData;
342cdf0e10cSrcweir suCWD = getExecutablePath();
343cdf0e10cSrcweir suExecutableFileURL = suCWD;
344cdf0e10cSrcweir suExecutableFileURL += rtl::OUString::createFromAscii("/");
345cdf0e10cSrcweir suExecutableFileURL += EXECUTABLE_NAME;
346cdf0e10cSrcweir }
347cdf0e10cSrcweir
348cdf0e10cSrcweir //------------------------------------------------
SetUp()34944e8df1fSDamjan Jovanovic virtual void SetUp()
350cdf0e10cSrcweir {
351cdf0e10cSrcweir temp_file_path_ = create_temp_file();
352cdf0e10cSrcweir parameters_[1] = temp_file_path_.pData;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir
355cdf0e10cSrcweir //------------------------------------------------
create_temp_file()356cdf0e10cSrcweir OUString create_temp_file()
357cdf0e10cSrcweir {
358cdf0e10cSrcweir OUString temp_file_url;
359cdf0e10cSrcweir FileBase::RC rc = FileBase::createTempFile(0, 0, &temp_file_url);
36044e8df1fSDamjan Jovanovic EXPECT_TRUE(FileBase::E_None == rc) << "createTempFile failed";
361cdf0e10cSrcweir
362cdf0e10cSrcweir OUString temp_file_path;
363cdf0e10cSrcweir rc = FileBase::getSystemPathFromFileURL(temp_file_url, temp_file_path);
36444e8df1fSDamjan Jovanovic EXPECT_TRUE(FileBase::E_None == rc) << "getSystemPathFromFileURL failed";
365cdf0e10cSrcweir
366cdf0e10cSrcweir return temp_file_path;
367cdf0e10cSrcweir }
368cdf0e10cSrcweir
369cdf0e10cSrcweir //------------------------------------------------
read_child_environment(string_container_t * env_container)370cdf0e10cSrcweir void read_child_environment(string_container_t* env_container)
371cdf0e10cSrcweir {
372cdf0e10cSrcweir OString temp_file_name = OUStringToOString(OUString(
373cdf0e10cSrcweir parameters_[1]), osl_getThreadTextEncoding());
374cdf0e10cSrcweir std::ifstream file(temp_file_name.getStr());
375cdf0e10cSrcweir
37644e8df1fSDamjan Jovanovic ASSERT_TRUE(file.is_open()) << "I/O error, cannot open child environment file";
377cdf0e10cSrcweir
378cdf0e10cSrcweir std::string line;
379cdf0e10cSrcweir while (std::getline(file, line))
380cdf0e10cSrcweir env_container->push_back(line);
381cdf0e10cSrcweir }
382cdf0e10cSrcweir
383cdf0e10cSrcweir //------------------------------------------------
dump_env(const string_container_t & env,OUString file_name)384cdf0e10cSrcweir void dump_env(const string_container_t& env, OUString file_name)
385cdf0e10cSrcweir {
386cdf0e10cSrcweir OString fname = OUStringToOString(file_name, osl_getThreadTextEncoding());
387cdf0e10cSrcweir std::ofstream file(fname.getStr());
388cdf0e10cSrcweir std::ostream_iterator<std::string> oi(file, "\n");
389cdf0e10cSrcweir std::copy(env.begin(), env.end(), oi);
390cdf0e10cSrcweir }
391cdf0e10cSrcweir
392cdf0e10cSrcweir //------------------------------------------------
393cdf0e10cSrcweir // environment of the child process that was
394cdf0e10cSrcweir // started. The child process writes his
395cdf0e10cSrcweir // environment into a file
compare_environments()396cdf0e10cSrcweir bool compare_environments()
397cdf0e10cSrcweir {
398cdf0e10cSrcweir string_container_t parent_env;
399cdf0e10cSrcweir read_parent_environment(&parent_env);
400cdf0e10cSrcweir
401cdf0e10cSrcweir string_container_t child_env;
402cdf0e10cSrcweir read_child_environment(&child_env);
403cdf0e10cSrcweir
404cdf0e10cSrcweir return ((parent_env.size() == child_env.size()) &&
405cdf0e10cSrcweir (std::equal(child_env.begin(), child_env.end(), parent_env.begin())));
406cdf0e10cSrcweir }
407cdf0e10cSrcweir
408cdf0e10cSrcweir //------------------------------------------------
409cdf0e10cSrcweir // compare the equal environment parts and the
410cdf0e10cSrcweir // different part of the child environment
compare_merged_environments(const string_container_t & different_env_vars)411cdf0e10cSrcweir bool compare_merged_environments(const string_container_t& different_env_vars)
412cdf0e10cSrcweir {
413cdf0e10cSrcweir string_container_t parent_env;
414cdf0e10cSrcweir read_parent_environment(&parent_env);
415cdf0e10cSrcweir
416cdf0e10cSrcweir //remove the environment variables that we have changed
417cdf0e10cSrcweir //in the child environment from the read parent environment
418cdf0e10cSrcweir parent_env.erase(
419cdf0e10cSrcweir std::remove_if(parent_env.begin(), parent_env.end(), exclude(different_env_vars)),
420cdf0e10cSrcweir parent_env.end());
421cdf0e10cSrcweir
422cdf0e10cSrcweir //read the child environment and exclude the variables that
423cdf0e10cSrcweir //are different
424cdf0e10cSrcweir string_container_t child_env;
425cdf0e10cSrcweir read_child_environment(&child_env);
426cdf0e10cSrcweir
427cdf0e10cSrcweir //partition the child environment into the variables that
428cdf0e10cSrcweir //are different to the parent environment (they come first)
429cdf0e10cSrcweir //and the variables that should be equal between parent
430cdf0e10cSrcweir //and child environment
431cdf0e10cSrcweir string_container_iter_t iter_logical_end =
432cdf0e10cSrcweir std::stable_partition(child_env.begin(), child_env.end(), exclude(different_env_vars));
433cdf0e10cSrcweir
434cdf0e10cSrcweir string_container_t different_child_env_vars(child_env.begin(), iter_logical_end);
435cdf0e10cSrcweir child_env.erase(child_env.begin(), iter_logical_end);
436cdf0e10cSrcweir
437cdf0e10cSrcweir bool common_env_size_equals = (parent_env.size() == child_env.size());
438cdf0e10cSrcweir bool common_env_content_equals = std::equal(child_env.begin(), child_env.end(), parent_env.begin());
439cdf0e10cSrcweir
440cdf0e10cSrcweir bool different_env_size_equals = (different_child_env_vars.size() == different_env_vars.size());
441cdf0e10cSrcweir bool different_env_content_equals =
442cdf0e10cSrcweir std::equal(different_env_vars.begin(), different_env_vars.end(), different_child_env_vars.begin());
443cdf0e10cSrcweir
444cdf0e10cSrcweir return (common_env_size_equals && common_env_content_equals &&
445cdf0e10cSrcweir different_env_size_equals && different_env_content_equals);
446cdf0e10cSrcweir }
44744e8df1fSDamjan Jovanovic };
448cdf0e10cSrcweir
44944e8df1fSDamjan Jovanovic //------------------------------------------------
45044e8df1fSDamjan Jovanovic // test that parent and child process have the
45144e8df1fSDamjan Jovanovic // same environment when osl_executeProcess will
45244e8df1fSDamjan Jovanovic // be called with out setting new environment
45344e8df1fSDamjan Jovanovic // variables
TEST_F(Test_osl_executeProcess,osl_execProc_parent_equals_child_environment)45444e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_parent_equals_child_environment)
45544e8df1fSDamjan Jovanovic {
45644e8df1fSDamjan Jovanovic oslProcess process;
45744e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
45844e8df1fSDamjan Jovanovic suExecutableFileURL.pData,
45944e8df1fSDamjan Jovanovic parameters_,
46044e8df1fSDamjan Jovanovic parameters_count_,
46144e8df1fSDamjan Jovanovic osl_Process_NORMAL,
46244e8df1fSDamjan Jovanovic NULL,
46344e8df1fSDamjan Jovanovic suCWD.pData,
46444e8df1fSDamjan Jovanovic NULL,
46544e8df1fSDamjan Jovanovic 0,
46644e8df1fSDamjan Jovanovic &process);
467cdf0e10cSrcweir
46844e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
469cdf0e10cSrcweir
47044e8df1fSDamjan Jovanovic osl_error = ::osl_joinProcess(process);
471cdf0e10cSrcweir
47244e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
473cdf0e10cSrcweir
47444e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
475cdf0e10cSrcweir
47644e8df1fSDamjan Jovanovic ASSERT_TRUE(compare_environments()) << "Parent an child environment not equal";
47744e8df1fSDamjan Jovanovic }
478cdf0e10cSrcweir
47944e8df1fSDamjan Jovanovic //------------------------------------------------
48044e8df1fSDamjan Jovanovic #define ENV1 "PAT=a:\\"
48144e8df1fSDamjan Jovanovic #define ENV2 "PATHb=b:\\"
48244e8df1fSDamjan Jovanovic #define ENV3 "Patha=c:\\"
48344e8df1fSDamjan Jovanovic #define ENV4 "Patha=d:\\"
484cdf0e10cSrcweir
TEST_F(Test_osl_executeProcess,osl_execProc_merged_child_environment)48544e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_merged_child_environment)
48644e8df1fSDamjan Jovanovic {
48744e8df1fSDamjan Jovanovic rtl_uString* child_env[4];
48844e8df1fSDamjan Jovanovic OUString env1 = OUString::createFromAscii(ENV1);
48944e8df1fSDamjan Jovanovic OUString env2 = OUString::createFromAscii(ENV2);
49044e8df1fSDamjan Jovanovic OUString env3 = OUString::createFromAscii(ENV3);
49144e8df1fSDamjan Jovanovic OUString env4 = OUString::createFromAscii(ENV4);
49244e8df1fSDamjan Jovanovic
49344e8df1fSDamjan Jovanovic child_env[0] = env1.pData;
49444e8df1fSDamjan Jovanovic child_env[1] = env2.pData;
49544e8df1fSDamjan Jovanovic child_env[2] = env3.pData;
49644e8df1fSDamjan Jovanovic child_env[3] = env4.pData;
49744e8df1fSDamjan Jovanovic
49844e8df1fSDamjan Jovanovic oslProcess process;
49944e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
50044e8df1fSDamjan Jovanovic suExecutableFileURL.pData,
50144e8df1fSDamjan Jovanovic parameters_,
50244e8df1fSDamjan Jovanovic parameters_count_,
50344e8df1fSDamjan Jovanovic osl_Process_NORMAL,
50444e8df1fSDamjan Jovanovic NULL,
50544e8df1fSDamjan Jovanovic suCWD.pData,
50644e8df1fSDamjan Jovanovic child_env,
50744e8df1fSDamjan Jovanovic sizeof(child_env)/sizeof(child_env[0]),
50844e8df1fSDamjan Jovanovic &process);
50944e8df1fSDamjan Jovanovic
51044e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
51144e8df1fSDamjan Jovanovic
51244e8df1fSDamjan Jovanovic osl_error = ::osl_joinProcess(process);
51344e8df1fSDamjan Jovanovic
51444e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
51544e8df1fSDamjan Jovanovic
51644e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
51744e8df1fSDamjan Jovanovic
51844e8df1fSDamjan Jovanovic string_container_t different_child_env_vars;
51944e8df1fSDamjan Jovanovic different_child_env_vars.push_back(ENV1);
52044e8df1fSDamjan Jovanovic different_child_env_vars.push_back(ENV2);
52144e8df1fSDamjan Jovanovic different_child_env_vars.push_back(ENV4);
52244e8df1fSDamjan Jovanovic
52344e8df1fSDamjan Jovanovic ASSERT_TRUE(compare_merged_environments(different_child_env_vars)) << "osl_execProc_merged_child_environment";
52444e8df1fSDamjan Jovanovic }
525cdf0e10cSrcweir
TEST_F(Test_osl_executeProcess,osl_execProc_test_batch)52644e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_test_batch)
52744e8df1fSDamjan Jovanovic {
52844e8df1fSDamjan Jovanovic oslProcess process;
52944e8df1fSDamjan Jovanovic rtl::OUString suBatch = suCWD + rtl::OUString::createFromAscii("/") + rtl::OUString::createFromAscii("batch.bat");
53044e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
53144e8df1fSDamjan Jovanovic suBatch.pData,
53244e8df1fSDamjan Jovanovic NULL,
53344e8df1fSDamjan Jovanovic 0,
53444e8df1fSDamjan Jovanovic osl_Process_NORMAL,
53544e8df1fSDamjan Jovanovic NULL,
53644e8df1fSDamjan Jovanovic suCWD.pData,
53744e8df1fSDamjan Jovanovic NULL,
53844e8df1fSDamjan Jovanovic 0,
53944e8df1fSDamjan Jovanovic &process);
54044e8df1fSDamjan Jovanovic
54144e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
54244e8df1fSDamjan Jovanovic
54344e8df1fSDamjan Jovanovic osl_error = ::osl_joinProcess(process);
54444e8df1fSDamjan Jovanovic
54544e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
54644e8df1fSDamjan Jovanovic
54744e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
54844e8df1fSDamjan Jovanovic }
54944e8df1fSDamjan Jovanovic
TEST_F(Test_osl_executeProcess,osl_execProc_exe_name_in_argument_list)55044e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_exe_name_in_argument_list)
55144e8df1fSDamjan Jovanovic {
55244e8df1fSDamjan Jovanovic rtl_uString* params[3];
55344e8df1fSDamjan Jovanovic
55444e8df1fSDamjan Jovanovic params[0] = suExecutableFileURL.pData;
55544e8df1fSDamjan Jovanovic params[1] = env_param_.pData;
55644e8df1fSDamjan Jovanovic params[2] = temp_file_path_.pData;
55744e8df1fSDamjan Jovanovic oslProcess process;
55844e8df1fSDamjan Jovanovic oslProcessError osl_error = osl_executeProcess(
55944e8df1fSDamjan Jovanovic NULL,
56044e8df1fSDamjan Jovanovic params,
56144e8df1fSDamjan Jovanovic 3,
56244e8df1fSDamjan Jovanovic osl_Process_NORMAL,
56344e8df1fSDamjan Jovanovic NULL,
56444e8df1fSDamjan Jovanovic suCWD.pData,
56544e8df1fSDamjan Jovanovic NULL,
56644e8df1fSDamjan Jovanovic 0,
56744e8df1fSDamjan Jovanovic &process);
56844e8df1fSDamjan Jovanovic
56944e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
57044e8df1fSDamjan Jovanovic
57144e8df1fSDamjan Jovanovic osl_error = ::osl_joinProcess(process);
57244e8df1fSDamjan Jovanovic
57344e8df1fSDamjan Jovanovic ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
57444e8df1fSDamjan Jovanovic
57544e8df1fSDamjan Jovanovic osl_freeProcessHandle(process);
57644e8df1fSDamjan Jovanovic }
57744e8df1fSDamjan Jovanovic
main(int argc,char ** argv)57844e8df1fSDamjan Jovanovic int main(int argc, char **argv)
57944e8df1fSDamjan Jovanovic {
58044e8df1fSDamjan Jovanovic ::testing::InitGoogleTest(&argc, argv);
58144e8df1fSDamjan Jovanovic return RUN_ALL_TESTS();
58244e8df1fSDamjan Jovanovic }
583