More specific
Change-Id: I7e6490c5b50a236a5f070e98d4501e7dd5a90307
This commit is contained in:
@@ -38,7 +38,9 @@
|
|||||||
#include <sal/macros.h>
|
#include <sal/macros.h>
|
||||||
|
|
||||||
#if defined HAVE_VALGRIND_HEADERS
|
#if defined HAVE_VALGRIND_HEADERS
|
||||||
#include <valgrind/memcheck.h>
|
#include <valgrind/valgrind.h>
|
||||||
|
#else
|
||||||
|
#define RUNNING_ON_VALGRIND false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ( defined WNT ) // Windows
|
#if ( defined WNT ) // Windows
|
||||||
@@ -90,11 +92,11 @@ inline ::rtl::OUString getExecutablePath( void )
|
|||||||
|
|
||||||
//rtl::OUString CWD = getExecutablePath();
|
//rtl::OUString CWD = getExecutablePath();
|
||||||
|
|
||||||
typedef std::vector<std::string> string_container_t;
|
typedef std::vector<OString> string_container_t;
|
||||||
typedef string_container_t::const_iterator string_container_const_iter_t;
|
typedef string_container_t::const_iterator string_container_const_iter_t;
|
||||||
typedef string_container_t::iterator string_container_iter_t;
|
typedef string_container_t::iterator string_container_iter_t;
|
||||||
|
|
||||||
class exclude : public std::unary_function<std::string, bool>
|
class exclude : public std::unary_function<OString, bool>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -106,7 +108,7 @@ public:
|
|||||||
exclude_list_.push_back(env_var_name(*iter));
|
exclude_list_.push_back(env_var_name(*iter));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator() (const std::string& env_var) const
|
bool operator() (const OString& env_var) const
|
||||||
{
|
{
|
||||||
return (exclude_list_.end() !=
|
return (exclude_list_.end() !=
|
||||||
std::find(
|
std::find(
|
||||||
@@ -119,15 +121,15 @@ private:
|
|||||||
|
|
||||||
// extract the name from an environment variable
|
// extract the name from an environment variable
|
||||||
// that is given in the form "NAME=VALUE"
|
// that is given in the form "NAME=VALUE"
|
||||||
std::string env_var_name(const std::string& env_var) const
|
OString env_var_name(const OString& env_var) const
|
||||||
{
|
{
|
||||||
std::string::size_type pos_equal_sign =
|
sal_Int32 pos_equal_sign =
|
||||||
env_var.find_first_of("=");
|
env_var.indexOf('=');
|
||||||
|
|
||||||
if (std::string::npos != pos_equal_sign)
|
if (-1 != pos_equal_sign)
|
||||||
return std::string(env_var, 0, pos_equal_sign);
|
return env_var.copy(0, pos_equal_sign);
|
||||||
|
|
||||||
return std::string();
|
return OString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -136,27 +138,20 @@ private:
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
class starts_with
|
|
||||||
: public std::unary_function<const std::string&, bool>
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
const std::string m_rString;
|
|
||||||
public:
|
|
||||||
starts_with(const char *pString) : m_rString(pString) {}
|
|
||||||
bool operator()(const std::string &rEntry) const
|
|
||||||
{
|
|
||||||
return rEntry.find(m_rString) == 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void tidy_container(string_container_t &env_container)
|
void tidy_container(string_container_t &env_container)
|
||||||
{
|
{
|
||||||
//sort them because there are no guarantees to ordering
|
//sort them because there are no guarantees to ordering
|
||||||
std::sort(env_container.begin(), env_container.end());
|
std::sort(env_container.begin(), env_container.end());
|
||||||
//remove LD_PRELOAD because valgrind injects that into the
|
if (RUNNING_ON_VALGRIND)
|
||||||
//parent process
|
{
|
||||||
env_container.erase(std::remove_if(env_container.begin(), env_container.end(),
|
env_container.erase(
|
||||||
starts_with("LD_PRELOAD=")), env_container.end());
|
std::remove_if(
|
||||||
|
env_container.begin(), env_container.end(),
|
||||||
|
[](OString const & s) {
|
||||||
|
return s.startsWith("LD_PRELOAD=")
|
||||||
|
|| s.startsWith("VALGRIND_LIB="); }),
|
||||||
|
env_container.end());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +163,7 @@ namespace
|
|||||||
|
|
||||||
while (size_t l = _tcslen(p))
|
while (size_t l = _tcslen(p))
|
||||||
{
|
{
|
||||||
env_container->push_back(std::string(p));
|
env_container->push_back(OString(p));
|
||||||
p += l + 1;
|
p += l + 1;
|
||||||
}
|
}
|
||||||
FreeEnvironmentStrings(env);
|
FreeEnvironmentStrings(env);
|
||||||
@@ -178,7 +173,7 @@ namespace
|
|||||||
void read_parent_environment(string_container_t* env_container)
|
void read_parent_environment(string_container_t* env_container)
|
||||||
{
|
{
|
||||||
for (int i = 0; NULL != environ[i]; i++)
|
for (int i = 0; NULL != environ[i]; i++)
|
||||||
env_container->push_back(std::string(environ[i]));
|
env_container->push_back(OString(environ[i]));
|
||||||
tidy_container(*env_container);
|
tidy_container(*env_container);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -246,14 +241,14 @@ public:
|
|||||||
std::string line;
|
std::string line;
|
||||||
line.reserve(1024);
|
line.reserve(1024);
|
||||||
while (std::getline(file, line, '\0'))
|
while (std::getline(file, line, '\0'))
|
||||||
env_container->push_back(line);
|
env_container->push_back(OString(line.c_str()));
|
||||||
tidy_container(*env_container);
|
tidy_container(*env_container);
|
||||||
}
|
}
|
||||||
|
|
||||||
// environment of the child process that was
|
// environment of the child process that was
|
||||||
// started. The child process writes his
|
// started. The child process writes his
|
||||||
// environment into a file
|
// environment into a file
|
||||||
bool compare_environments()
|
void compare_environments()
|
||||||
{
|
{
|
||||||
string_container_t parent_env;
|
string_container_t parent_env;
|
||||||
read_parent_environment(&parent_env);
|
read_parent_environment(&parent_env);
|
||||||
@@ -261,8 +256,20 @@ public:
|
|||||||
string_container_t child_env;
|
string_container_t child_env;
|
||||||
read_child_environment(&child_env);
|
read_child_environment(&child_env);
|
||||||
|
|
||||||
return ((parent_env.size() == child_env.size()) &&
|
OString msg(
|
||||||
(std::equal(child_env.begin(), child_env.end(), parent_env.begin())));
|
OString::number(parent_env.size()) + "/"
|
||||||
|
+ OString::number(child_env.size()));
|
||||||
|
auto min = std::min(parent_env.size(), child_env.size());
|
||||||
|
for (decltype(min) i = 0; i != min; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL_MESSAGE(
|
||||||
|
msg.getStr(), parent_env[i], child_env[i]);
|
||||||
|
}
|
||||||
|
if (parent_env.size() != child_env.size()) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL_MESSAGE(
|
||||||
|
(parent_env.size() >= child_env.size()
|
||||||
|
? parent_env.back() : child_env.back()).getStr(),
|
||||||
|
parent_env.size(), child_env.size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// compare the equal environment parts and the
|
// compare the equal environment parts and the
|
||||||
@@ -367,17 +374,7 @@ public:
|
|||||||
|
|
||||||
osl_freeProcessHandle(process);
|
osl_freeProcessHandle(process);
|
||||||
|
|
||||||
#if defined HAVE_VALGRIND_HEADERS
|
compare_environments();
|
||||||
//valgrind makes these not match
|
|
||||||
if (RUNNING_ON_VALGRIND)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CPPUNIT_ASSERT_MESSAGE
|
|
||||||
(
|
|
||||||
"Parent and child environment not equal",
|
|
||||||
compare_environments()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ENV1 "PAT=a:\\"
|
#define ENV1 "PAT=a:\\"
|
||||||
@@ -431,12 +428,6 @@ public:
|
|||||||
different_child_env_vars.push_back(ENV2);
|
different_child_env_vars.push_back(ENV2);
|
||||||
different_child_env_vars.push_back(ENV4);
|
different_child_env_vars.push_back(ENV4);
|
||||||
|
|
||||||
#if defined HAVE_VALGRIND_HEADERS
|
|
||||||
//valgrind makes these not match
|
|
||||||
if (RUNNING_ON_VALGRIND)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CPPUNIT_ASSERT_MESSAGE
|
CPPUNIT_ASSERT_MESSAGE
|
||||||
(
|
(
|
||||||
"osl_execProc_merged_child_environment",
|
"osl_execProc_merged_child_environment",
|
||||||
|
Reference in New Issue
Block a user