xref: /aoo42x/main/sal/qa/osl/process/osl_process.cxx (revision 44e8df1f)
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 
27*44e8df1fSDamjan 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 
39cdf0e10cSrcweir #if ( defined WNT )                     // Windows
40cdf0e10cSrcweir #include <tools/prewin.h>
41cdf0e10cSrcweir #	define WIN32_LEAN_AND_MEAN
42cdf0e10cSrcweir // #	include <windows.h>
43cdf0e10cSrcweir #   include <tchar.h>
44cdf0e10cSrcweir #include <tools/postwin.h>
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #include <iostream>
48cdf0e10cSrcweir #include <fstream>
49cdf0e10cSrcweir #include <vector>
50cdf0e10cSrcweir #include <algorithm>
51cdf0e10cSrcweir #include <iterator>
52cdf0e10cSrcweir #include <string>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir #if defined(WNT) || defined(OS2)
55cdf0e10cSrcweir 	const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("osl_process_child.exe");
56cdf0e10cSrcweir #else
57cdf0e10cSrcweir 	const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("osl_process_child");
58cdf0e10cSrcweir #endif
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 
61cdf0e10cSrcweir //########################################
62cdf0e10cSrcweir std::string OUString_to_std_string(const rtl::OUString& oustr)
63cdf0e10cSrcweir {
64cdf0e10cSrcweir     rtl::OString ostr = rtl::OUStringToOString(oustr, osl_getThreadTextEncoding());
65cdf0e10cSrcweir     return std::string(ostr.getStr());
66cdf0e10cSrcweir }
67cdf0e10cSrcweir 
68cdf0e10cSrcweir //########################################
69cdf0e10cSrcweir using namespace osl;
70cdf0e10cSrcweir using namespace rtl;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir /** print a UNI_CODE String.
73cdf0e10cSrcweir */
74cdf0e10cSrcweir inline void printUString( const ::rtl::OUString & str )
75cdf0e10cSrcweir {
76cdf0e10cSrcweir 	rtl::OString aString;
77cdf0e10cSrcweir 
78*44e8df1fSDamjan Jovanovic 	printf("#printUString_u# " );
79cdf0e10cSrcweir 	aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
80*44e8df1fSDamjan Jovanovic 	printf("%s\n", aString.getStr( ) );
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir /** get binary Path.
84cdf0e10cSrcweir */
85cdf0e10cSrcweir inline ::rtl::OUString getExecutablePath( void )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir 	::rtl::OUString dirPath;
88cdf0e10cSrcweir 	osl::Module::getUrlFromAddress( ( void* ) &getExecutablePath, dirPath );
89cdf0e10cSrcweir 	dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') );
90cdf0e10cSrcweir 	dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
91cdf0e10cSrcweir 	dirPath += rtl::OUString::createFromAscii("bin");
92cdf0e10cSrcweir 	return dirPath;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir //rtl::OUString CWD = getExecutablePath();
96cdf0e10cSrcweir 
97cdf0e10cSrcweir //########################################
98*44e8df1fSDamjan Jovanovic class Test_osl_joinProcess : public ::testing::Test
99cdf0e10cSrcweir {
100*44e8df1fSDamjan Jovanovic protected:
101cdf0e10cSrcweir     const OUString join_param_;
102cdf0e10cSrcweir     const OUString wait_time_;
103cdf0e10cSrcweir     OUString suCWD;
104cdf0e10cSrcweir     OUString suExecutableFileURL;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     rtl_uString* parameters_[2];
107cdf0e10cSrcweir     int          parameters_count_;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir public:
110cdf0e10cSrcweir 
111cdf0e10cSrcweir     Test_osl_joinProcess() :
112cdf0e10cSrcweir         join_param_(OUString::createFromAscii("-join")),
113cdf0e10cSrcweir         wait_time_(OUString::createFromAscii("1")),
114cdf0e10cSrcweir         parameters_count_(2)
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         parameters_[0] = join_param_.pData;
117cdf0e10cSrcweir         parameters_[1] = wait_time_.pData;
118cdf0e10cSrcweir         suCWD = getExecutablePath();
119cdf0e10cSrcweir         suExecutableFileURL = suCWD;
120cdf0e10cSrcweir         suExecutableFileURL += rtl::OUString::createFromAscii("/");
121cdf0e10cSrcweir         suExecutableFileURL += EXECUTABLE_NAME;
122cdf0e10cSrcweir     }
123*44e8df1fSDamjan Jovanovic };
124cdf0e10cSrcweir 
125*44e8df1fSDamjan Jovanovic /*-------------------------------------
126*44e8df1fSDamjan Jovanovic     Start a process and join with this
127*44e8df1fSDamjan Jovanovic     process specify a timeout so that
128*44e8df1fSDamjan Jovanovic     osl_joinProcessWithTimeout returns
129*44e8df1fSDamjan Jovanovic     osl_Process_E_TimedOut
130*44e8df1fSDamjan Jovanovic  -------------------------------------*/
131cdf0e10cSrcweir 
132*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcessWithTimeout_timeout_failure)
133*44e8df1fSDamjan Jovanovic {
134*44e8df1fSDamjan Jovanovic     oslProcess process;
135*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
136*44e8df1fSDamjan Jovanovic         suExecutableFileURL.pData,
137*44e8df1fSDamjan Jovanovic         parameters_,
138*44e8df1fSDamjan Jovanovic         parameters_count_,
139*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
140*44e8df1fSDamjan Jovanovic         osl_getCurrentSecurity(),
141*44e8df1fSDamjan Jovanovic         suCWD.pData,
142*44e8df1fSDamjan Jovanovic         NULL,
143*44e8df1fSDamjan Jovanovic         0,
144*44e8df1fSDamjan Jovanovic         &process);
145cdf0e10cSrcweir 
146*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
147cdf0e10cSrcweir 
148*44e8df1fSDamjan Jovanovic     TimeValue timeout;
149*44e8df1fSDamjan Jovanovic     timeout.Seconds = 1;
150*44e8df1fSDamjan Jovanovic     timeout.Nanosec = 0;
151cdf0e10cSrcweir 
152*44e8df1fSDamjan Jovanovic     osl_error = osl_joinProcessWithTimeout(process, &timeout);
153cdf0e10cSrcweir 
154*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_TimedOut == osl_error) << "osl_joinProcessWithTimeout returned without timeout failure";
155cdf0e10cSrcweir 
156*44e8df1fSDamjan Jovanovic     osl_error = osl_terminateProcess(process);
157cdf0e10cSrcweir 
158*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_terminateProcess failed";
159*44e8df1fSDamjan Jovanovic 
160*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
161*44e8df1fSDamjan Jovanovic }
162*44e8df1fSDamjan Jovanovic 
163*44e8df1fSDamjan Jovanovic /*-------------------------------------
164*44e8df1fSDamjan Jovanovic     Start a process and join with this
165*44e8df1fSDamjan Jovanovic     process specify a timeout so that
166*44e8df1fSDamjan Jovanovic     osl_joinProcessWithTimeout returns
167*44e8df1fSDamjan Jovanovic     osl_Process_E_None
168*44e8df1fSDamjan Jovanovic  -------------------------------------*/
169*44e8df1fSDamjan Jovanovic 
170*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcessWithTimeout_without_timeout_failure)
171*44e8df1fSDamjan Jovanovic {
172*44e8df1fSDamjan Jovanovic     oslProcess process;
173*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
174*44e8df1fSDamjan Jovanovic         suExecutableFileURL.pData,
175*44e8df1fSDamjan Jovanovic         parameters_,
176*44e8df1fSDamjan Jovanovic         parameters_count_,
177*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
178*44e8df1fSDamjan Jovanovic         osl_getCurrentSecurity(),
179*44e8df1fSDamjan Jovanovic         suCWD.pData,
180*44e8df1fSDamjan Jovanovic         NULL,
181*44e8df1fSDamjan Jovanovic         0,
182*44e8df1fSDamjan Jovanovic         &process);
183*44e8df1fSDamjan Jovanovic 
184*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
185*44e8df1fSDamjan Jovanovic 
186*44e8df1fSDamjan Jovanovic     TimeValue timeout;
187*44e8df1fSDamjan Jovanovic     timeout.Seconds = 10;
188*44e8df1fSDamjan Jovanovic     timeout.Nanosec = 0;
189*44e8df1fSDamjan Jovanovic 
190*44e8df1fSDamjan Jovanovic     osl_error = osl_joinProcessWithTimeout(process, &timeout);
191*44e8df1fSDamjan Jovanovic 
192*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcessWithTimeout returned with failure";
193*44e8df1fSDamjan Jovanovic 
194*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
195*44e8df1fSDamjan Jovanovic }
196*44e8df1fSDamjan Jovanovic 
197*44e8df1fSDamjan Jovanovic  /*-------------------------------------
198*44e8df1fSDamjan Jovanovic     Start a process and join with this
199*44e8df1fSDamjan Jovanovic     process specify an infinite timeout
200*44e8df1fSDamjan Jovanovic  -------------------------------------*/
201*44e8df1fSDamjan Jovanovic 
202*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcessWithTimeout_infinite)
203*44e8df1fSDamjan Jovanovic {
204*44e8df1fSDamjan Jovanovic     oslProcess process;
205*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
206*44e8df1fSDamjan Jovanovic         suExecutableFileURL.pData,
207*44e8df1fSDamjan Jovanovic         parameters_,
208*44e8df1fSDamjan Jovanovic         parameters_count_,
209*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
210*44e8df1fSDamjan Jovanovic         osl_getCurrentSecurity(),
211*44e8df1fSDamjan Jovanovic         suCWD.pData,
212*44e8df1fSDamjan Jovanovic         NULL,
213*44e8df1fSDamjan Jovanovic         0,
214*44e8df1fSDamjan Jovanovic         &process);
215*44e8df1fSDamjan Jovanovic 
216*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
217*44e8df1fSDamjan Jovanovic 
218*44e8df1fSDamjan Jovanovic     osl_error = osl_joinProcessWithTimeout(process, NULL);
219*44e8df1fSDamjan Jovanovic 
220*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcessWithTimeout returned with failure";
221*44e8df1fSDamjan Jovanovic 
222*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
223*44e8df1fSDamjan Jovanovic }
224*44e8df1fSDamjan Jovanovic 
225*44e8df1fSDamjan Jovanovic  /*-------------------------------------
226*44e8df1fSDamjan Jovanovic     Start a process and join with this
227*44e8df1fSDamjan Jovanovic     process using osl_joinProcess
228*44e8df1fSDamjan Jovanovic  -------------------------------------*/
229*44e8df1fSDamjan Jovanovic 
230*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_joinProcess, osl_joinProcess)
231*44e8df1fSDamjan Jovanovic {
232*44e8df1fSDamjan Jovanovic     oslProcess process;
233*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
234*44e8df1fSDamjan Jovanovic         suExecutableFileURL.pData,
235*44e8df1fSDamjan Jovanovic         parameters_,
236*44e8df1fSDamjan Jovanovic         parameters_count_,
237*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
238*44e8df1fSDamjan Jovanovic         osl_getCurrentSecurity(),
239*44e8df1fSDamjan Jovanovic         suCWD.pData,
240*44e8df1fSDamjan Jovanovic         NULL,
241*44e8df1fSDamjan Jovanovic         0,
242*44e8df1fSDamjan Jovanovic         &process);
243*44e8df1fSDamjan Jovanovic 
244*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
245*44e8df1fSDamjan Jovanovic 
246*44e8df1fSDamjan Jovanovic     osl_error = ::osl_joinProcess(process);
247*44e8df1fSDamjan Jovanovic 
248*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
249*44e8df1fSDamjan Jovanovic 
250*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
251*44e8df1fSDamjan Jovanovic }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 
254cdf0e10cSrcweir //#########################################################
255cdf0e10cSrcweir 
25622076bf1SHerbert Dürr typedef std::vector<std::string>  string_container_t;
257cdf0e10cSrcweir typedef string_container_t::const_iterator string_container_const_iter_t;
258cdf0e10cSrcweir typedef string_container_t::iterator       string_container_iter_t;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir //#########################################################
261cdf0e10cSrcweir class exclude : public std::unary_function<std::string, bool>
262cdf0e10cSrcweir {
263cdf0e10cSrcweir public:
264cdf0e10cSrcweir     //------------------------------------------------
265cdf0e10cSrcweir     exclude(const string_container_t& exclude_list)
266cdf0e10cSrcweir     {
267cdf0e10cSrcweir         string_container_const_iter_t iter     = exclude_list.begin();
268cdf0e10cSrcweir         string_container_const_iter_t iter_end = exclude_list.end();
269cdf0e10cSrcweir         for (/**/; iter != iter_end; ++iter)
270cdf0e10cSrcweir             exclude_list_.push_back(env_var_name(*iter));
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     //------------------------------------------------
274cdf0e10cSrcweir     bool operator() (const std::string& env_var) const
275cdf0e10cSrcweir     {
276cdf0e10cSrcweir         return (exclude_list_.end() !=
277cdf0e10cSrcweir                 std::find(
278cdf0e10cSrcweir                     exclude_list_.begin(),
279cdf0e10cSrcweir                     exclude_list_.end(),
280cdf0e10cSrcweir                     env_var_name(env_var)));
281cdf0e10cSrcweir     }
282cdf0e10cSrcweir 
283cdf0e10cSrcweir private:
284cdf0e10cSrcweir     //-------------------------------------------------
285cdf0e10cSrcweir     // extract the name from an environment variable
286cdf0e10cSrcweir     // that is given in the form "NAME=VALUE"
287cdf0e10cSrcweir     std::string env_var_name(const std::string& env_var) const
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         std::string::size_type pos_equal_sign =
290cdf0e10cSrcweir             env_var.find_first_of("=");
291cdf0e10cSrcweir 
292cdf0e10cSrcweir         if (std::string::npos != pos_equal_sign)
293cdf0e10cSrcweir             return std::string(env_var, 0, pos_equal_sign);
294cdf0e10cSrcweir 
295cdf0e10cSrcweir         return std::string();
296cdf0e10cSrcweir     }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir private:
299cdf0e10cSrcweir     string_container_t exclude_list_;
300cdf0e10cSrcweir };
301cdf0e10cSrcweir 
302cdf0e10cSrcweir #ifdef WNT
303cdf0e10cSrcweir     void read_parent_environment(string_container_t* env_container)
304cdf0e10cSrcweir     {
305cdf0e10cSrcweir         LPTSTR env = reinterpret_cast<LPTSTR>(GetEnvironmentStrings());
306cdf0e10cSrcweir         LPTSTR p   = env;
307cdf0e10cSrcweir 
308cdf0e10cSrcweir         while (size_t l = _tcslen(p))
309cdf0e10cSrcweir         {
310cdf0e10cSrcweir             env_container->push_back(std::string(p));
311cdf0e10cSrcweir             p += l + 1;
312cdf0e10cSrcweir         }
313cdf0e10cSrcweir         FreeEnvironmentStrings(env);
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir #else
316cdf0e10cSrcweir     extern char** environ;
317cdf0e10cSrcweir     void read_parent_environment(string_container_t* env_container)
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         for (int i = 0; NULL != environ[i]; i++)
320cdf0e10cSrcweir             env_container->push_back(std::string(environ[i]));
321cdf0e10cSrcweir     }
322cdf0e10cSrcweir #endif
323cdf0e10cSrcweir 
324cdf0e10cSrcweir //#########################################################
325*44e8df1fSDamjan Jovanovic class Test_osl_executeProcess : public ::testing::Test
326cdf0e10cSrcweir {
327*44e8df1fSDamjan Jovanovic protected:
328cdf0e10cSrcweir     const OUString env_param_;
329cdf0e10cSrcweir 
330cdf0e10cSrcweir     OUString     temp_file_path_;
331cdf0e10cSrcweir     rtl_uString* parameters_[2];
332cdf0e10cSrcweir     int          parameters_count_;
333cdf0e10cSrcweir     OUString	suCWD;
334cdf0e10cSrcweir     OUString	suExecutableFileURL;
335cdf0e10cSrcweir 
336cdf0e10cSrcweir public:
337cdf0e10cSrcweir 
338cdf0e10cSrcweir     //------------------------------------------------
339cdf0e10cSrcweir     // ctor
340cdf0e10cSrcweir     Test_osl_executeProcess() :
341cdf0e10cSrcweir         env_param_(OUString::createFromAscii("-env")),
342cdf0e10cSrcweir         parameters_count_(2)
343cdf0e10cSrcweir     {
344cdf0e10cSrcweir         parameters_[0] = env_param_.pData;
345cdf0e10cSrcweir         suCWD = getExecutablePath();
346cdf0e10cSrcweir         suExecutableFileURL = suCWD;
347cdf0e10cSrcweir         suExecutableFileURL += rtl::OUString::createFromAscii("/");
348cdf0e10cSrcweir         suExecutableFileURL += EXECUTABLE_NAME;
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     //------------------------------------------------
352*44e8df1fSDamjan Jovanovic     virtual void SetUp()
353cdf0e10cSrcweir     {
354cdf0e10cSrcweir         temp_file_path_ = create_temp_file();
355cdf0e10cSrcweir         parameters_[1]  = temp_file_path_.pData;
356cdf0e10cSrcweir     }
357cdf0e10cSrcweir 
358cdf0e10cSrcweir     //------------------------------------------------
359cdf0e10cSrcweir     OUString create_temp_file()
360cdf0e10cSrcweir     {
361cdf0e10cSrcweir         OUString temp_file_url;
362cdf0e10cSrcweir         FileBase::RC rc = FileBase::createTempFile(0, 0, &temp_file_url);
363*44e8df1fSDamjan Jovanovic         EXPECT_TRUE(FileBase::E_None == rc) << "createTempFile failed";
364cdf0e10cSrcweir 
365cdf0e10cSrcweir         OUString temp_file_path;
366cdf0e10cSrcweir         rc = FileBase::getSystemPathFromFileURL(temp_file_url, temp_file_path);
367*44e8df1fSDamjan Jovanovic         EXPECT_TRUE(FileBase::E_None == rc) << "getSystemPathFromFileURL failed";
368cdf0e10cSrcweir 
369cdf0e10cSrcweir         return temp_file_path;
370cdf0e10cSrcweir     }
371cdf0e10cSrcweir 
372cdf0e10cSrcweir    //------------------------------------------------
373cdf0e10cSrcweir     void read_child_environment(string_container_t* env_container)
374cdf0e10cSrcweir     {
375cdf0e10cSrcweir         OString temp_file_name = OUStringToOString(OUString(
376cdf0e10cSrcweir             parameters_[1]), osl_getThreadTextEncoding());
377cdf0e10cSrcweir         std::ifstream file(temp_file_name.getStr());
378cdf0e10cSrcweir 
379*44e8df1fSDamjan Jovanovic         ASSERT_TRUE(file.is_open()) << "I/O error, cannot open child environment file";
380cdf0e10cSrcweir 
381cdf0e10cSrcweir         std::string line;
382cdf0e10cSrcweir         while (std::getline(file, line))
383cdf0e10cSrcweir             env_container->push_back(line);
384cdf0e10cSrcweir     }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir     //------------------------------------------------
387cdf0e10cSrcweir     void dump_env(const string_container_t& env, OUString file_name)
388cdf0e10cSrcweir     {
389cdf0e10cSrcweir         OString fname = OUStringToOString(file_name, osl_getThreadTextEncoding());
390cdf0e10cSrcweir         std::ofstream file(fname.getStr());
391cdf0e10cSrcweir         std::ostream_iterator<std::string> oi(file, "\n");
392cdf0e10cSrcweir 		std::copy(env.begin(), env.end(), oi);
393cdf0e10cSrcweir     }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir     //------------------------------------------------
396cdf0e10cSrcweir     // environment of the child process that was
397cdf0e10cSrcweir     // started. The child process writes his
398cdf0e10cSrcweir     // environment into a file
399cdf0e10cSrcweir     bool compare_environments()
400cdf0e10cSrcweir     {
401cdf0e10cSrcweir         string_container_t parent_env;
402cdf0e10cSrcweir         read_parent_environment(&parent_env);
403cdf0e10cSrcweir 
404cdf0e10cSrcweir         string_container_t child_env;
405cdf0e10cSrcweir 		read_child_environment(&child_env);
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 		return ((parent_env.size() == child_env.size()) &&
408cdf0e10cSrcweir 		        (std::equal(child_env.begin(), child_env.end(), parent_env.begin())));
409cdf0e10cSrcweir     }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir     //------------------------------------------------
412cdf0e10cSrcweir     // compare the equal environment parts and the
413cdf0e10cSrcweir     // different part of the child environment
414cdf0e10cSrcweir     bool compare_merged_environments(const string_container_t& different_env_vars)
415cdf0e10cSrcweir     {
416cdf0e10cSrcweir         string_container_t parent_env;
417cdf0e10cSrcweir         read_parent_environment(&parent_env);
418cdf0e10cSrcweir 
419cdf0e10cSrcweir         //remove the environment variables that we have changed
420cdf0e10cSrcweir         //in the child environment from the read parent environment
421cdf0e10cSrcweir         parent_env.erase(
422cdf0e10cSrcweir             std::remove_if(parent_env.begin(), parent_env.end(), exclude(different_env_vars)),
423cdf0e10cSrcweir             parent_env.end());
424cdf0e10cSrcweir 
425cdf0e10cSrcweir         //read the child environment and exclude the variables that
426cdf0e10cSrcweir         //are different
427cdf0e10cSrcweir         string_container_t child_env;
428cdf0e10cSrcweir         read_child_environment(&child_env);
429cdf0e10cSrcweir 
430cdf0e10cSrcweir         //partition the child environment into the variables that
431cdf0e10cSrcweir         //are different to the parent environment (they come first)
432cdf0e10cSrcweir         //and the variables that should be equal between parent
433cdf0e10cSrcweir         //and child environment
434cdf0e10cSrcweir         string_container_iter_t iter_logical_end =
435cdf0e10cSrcweir             std::stable_partition(child_env.begin(), child_env.end(), exclude(different_env_vars));
436cdf0e10cSrcweir 
437cdf0e10cSrcweir         string_container_t different_child_env_vars(child_env.begin(), iter_logical_end);
438cdf0e10cSrcweir         child_env.erase(child_env.begin(), iter_logical_end);
439cdf0e10cSrcweir 
440cdf0e10cSrcweir         bool common_env_size_equals    = (parent_env.size() == child_env.size());
441cdf0e10cSrcweir         bool common_env_content_equals = std::equal(child_env.begin(), child_env.end(), parent_env.begin());
442cdf0e10cSrcweir 
443cdf0e10cSrcweir 		bool different_env_size_equals    = (different_child_env_vars.size() == different_env_vars.size());
444cdf0e10cSrcweir 		bool different_env_content_equals =
445cdf0e10cSrcweir 		    std::equal(different_env_vars.begin(), different_env_vars.end(), different_child_env_vars.begin());
446cdf0e10cSrcweir 
447cdf0e10cSrcweir         return (common_env_size_equals && common_env_content_equals &&
448cdf0e10cSrcweir                 different_env_size_equals && different_env_content_equals);
449cdf0e10cSrcweir     }
450*44e8df1fSDamjan Jovanovic };
451cdf0e10cSrcweir 
452*44e8df1fSDamjan Jovanovic //------------------------------------------------
453*44e8df1fSDamjan Jovanovic // test that parent and child process have the
454*44e8df1fSDamjan Jovanovic // same environment when osl_executeProcess will
455*44e8df1fSDamjan Jovanovic // be called with out setting new environment
456*44e8df1fSDamjan Jovanovic // variables
457*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_parent_equals_child_environment)
458*44e8df1fSDamjan Jovanovic {
459*44e8df1fSDamjan Jovanovic     oslProcess process;
460*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
461*44e8df1fSDamjan Jovanovic         suExecutableFileURL.pData,
462*44e8df1fSDamjan Jovanovic         parameters_,
463*44e8df1fSDamjan Jovanovic         parameters_count_,
464*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
465*44e8df1fSDamjan Jovanovic         NULL,
466*44e8df1fSDamjan Jovanovic         suCWD.pData,
467*44e8df1fSDamjan Jovanovic         NULL,
468*44e8df1fSDamjan Jovanovic         0,
469*44e8df1fSDamjan Jovanovic         &process);
470cdf0e10cSrcweir 
471*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
472cdf0e10cSrcweir 
473*44e8df1fSDamjan Jovanovic     osl_error = ::osl_joinProcess(process);
474cdf0e10cSrcweir 
475*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
476cdf0e10cSrcweir 
477*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
478cdf0e10cSrcweir 
479*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(compare_environments()) << "Parent an child environment not equal";
480*44e8df1fSDamjan Jovanovic }
481cdf0e10cSrcweir 
482*44e8df1fSDamjan Jovanovic //------------------------------------------------
483*44e8df1fSDamjan Jovanovic #define ENV1 "PAT=a:\\"
484*44e8df1fSDamjan Jovanovic #define ENV2 "PATHb=b:\\"
485*44e8df1fSDamjan Jovanovic #define ENV3 "Patha=c:\\"
486*44e8df1fSDamjan Jovanovic #define ENV4 "Patha=d:\\"
487cdf0e10cSrcweir 
488*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_merged_child_environment)
489*44e8df1fSDamjan Jovanovic {
490*44e8df1fSDamjan Jovanovic     rtl_uString* child_env[4];
491*44e8df1fSDamjan Jovanovic     OUString env1 = OUString::createFromAscii(ENV1);
492*44e8df1fSDamjan Jovanovic     OUString env2 = OUString::createFromAscii(ENV2);
493*44e8df1fSDamjan Jovanovic     OUString env3 = OUString::createFromAscii(ENV3);
494*44e8df1fSDamjan Jovanovic     OUString env4 = OUString::createFromAscii(ENV4);
495*44e8df1fSDamjan Jovanovic 
496*44e8df1fSDamjan Jovanovic     child_env[0] = env1.pData;
497*44e8df1fSDamjan Jovanovic     child_env[1] = env2.pData;
498*44e8df1fSDamjan Jovanovic     child_env[2] = env3.pData;
499*44e8df1fSDamjan Jovanovic     child_env[3] = env4.pData;
500*44e8df1fSDamjan Jovanovic 
501*44e8df1fSDamjan Jovanovic     oslProcess process;
502*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
503*44e8df1fSDamjan Jovanovic         suExecutableFileURL.pData,
504*44e8df1fSDamjan Jovanovic         parameters_,
505*44e8df1fSDamjan Jovanovic         parameters_count_,
506*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
507*44e8df1fSDamjan Jovanovic         NULL,
508*44e8df1fSDamjan Jovanovic         suCWD.pData,
509*44e8df1fSDamjan Jovanovic         child_env,
510*44e8df1fSDamjan Jovanovic         sizeof(child_env)/sizeof(child_env[0]),
511*44e8df1fSDamjan Jovanovic         &process);
512*44e8df1fSDamjan Jovanovic 
513*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
514*44e8df1fSDamjan Jovanovic 
515*44e8df1fSDamjan Jovanovic     osl_error = ::osl_joinProcess(process);
516*44e8df1fSDamjan Jovanovic 
517*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
518*44e8df1fSDamjan Jovanovic 
519*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
520*44e8df1fSDamjan Jovanovic 
521*44e8df1fSDamjan Jovanovic     string_container_t different_child_env_vars;
522*44e8df1fSDamjan Jovanovic     different_child_env_vars.push_back(ENV1);
523*44e8df1fSDamjan Jovanovic     different_child_env_vars.push_back(ENV2);
524*44e8df1fSDamjan Jovanovic     different_child_env_vars.push_back(ENV4);
525*44e8df1fSDamjan Jovanovic 
526*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(compare_merged_environments(different_child_env_vars)) << "osl_execProc_merged_child_environment";
527*44e8df1fSDamjan Jovanovic }
528cdf0e10cSrcweir 
529*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_test_batch)
530*44e8df1fSDamjan Jovanovic {
531*44e8df1fSDamjan Jovanovic     oslProcess process;
532*44e8df1fSDamjan Jovanovic     rtl::OUString suBatch = suCWD + rtl::OUString::createFromAscii("/") + rtl::OUString::createFromAscii("batch.bat");
533*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
534*44e8df1fSDamjan Jovanovic         suBatch.pData,
535*44e8df1fSDamjan Jovanovic         NULL,
536*44e8df1fSDamjan Jovanovic         0,
537*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
538*44e8df1fSDamjan Jovanovic         NULL,
539*44e8df1fSDamjan Jovanovic         suCWD.pData,
540*44e8df1fSDamjan Jovanovic         NULL,
541*44e8df1fSDamjan Jovanovic         0,
542*44e8df1fSDamjan Jovanovic         &process);
543*44e8df1fSDamjan Jovanovic 
544*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
545*44e8df1fSDamjan Jovanovic 
546*44e8df1fSDamjan Jovanovic     osl_error = ::osl_joinProcess(process);
547*44e8df1fSDamjan Jovanovic 
548*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
549*44e8df1fSDamjan Jovanovic 
550*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
551*44e8df1fSDamjan Jovanovic }
552*44e8df1fSDamjan Jovanovic 
553*44e8df1fSDamjan Jovanovic TEST_F(Test_osl_executeProcess, osl_execProc_exe_name_in_argument_list)
554*44e8df1fSDamjan Jovanovic {
555*44e8df1fSDamjan Jovanovic     rtl_uString* params[3];
556*44e8df1fSDamjan Jovanovic 
557*44e8df1fSDamjan Jovanovic     params[0] = suExecutableFileURL.pData;
558*44e8df1fSDamjan Jovanovic     params[1] = env_param_.pData;
559*44e8df1fSDamjan Jovanovic     params[2] = temp_file_path_.pData;
560*44e8df1fSDamjan Jovanovic     oslProcess process;
561*44e8df1fSDamjan Jovanovic     oslProcessError osl_error = osl_executeProcess(
562*44e8df1fSDamjan Jovanovic         NULL,
563*44e8df1fSDamjan Jovanovic         params,
564*44e8df1fSDamjan Jovanovic         3,
565*44e8df1fSDamjan Jovanovic         osl_Process_NORMAL,
566*44e8df1fSDamjan Jovanovic         NULL,
567*44e8df1fSDamjan Jovanovic         suCWD.pData,
568*44e8df1fSDamjan Jovanovic         NULL,
569*44e8df1fSDamjan Jovanovic         0,
570*44e8df1fSDamjan Jovanovic         &process);
571*44e8df1fSDamjan Jovanovic 
572*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_error == osl_Process_E_None) << "osl_createProcess failed";
573*44e8df1fSDamjan Jovanovic 
574*44e8df1fSDamjan Jovanovic     osl_error = ::osl_joinProcess(process);
575*44e8df1fSDamjan Jovanovic 
576*44e8df1fSDamjan Jovanovic     ASSERT_TRUE(osl_Process_E_None == osl_error) << "osl_joinProcess returned with failure";
577*44e8df1fSDamjan Jovanovic 
578*44e8df1fSDamjan Jovanovic     osl_freeProcessHandle(process);
579*44e8df1fSDamjan Jovanovic }
580*44e8df1fSDamjan Jovanovic 
581*44e8df1fSDamjan Jovanovic int main(int argc, char **argv)
582*44e8df1fSDamjan Jovanovic {
583*44e8df1fSDamjan Jovanovic     ::testing::InitGoogleTest(&argc, argv);
584*44e8df1fSDamjan Jovanovic     return RUN_ALL_TESTS();
585*44e8df1fSDamjan Jovanovic }
586