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