diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-11 15:25:54 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-11 15:25:54 +0000 |
commit | ef73044e42948214832dd11dd3326b738f816eb6 (patch) | |
tree | 1105589709517fab2cc2ed5d745d82299d510f77 /base/process_util_unittest.cc | |
parent | 6e240d7084c1cecc7fdedabe83f860659888dd2f (diff) | |
download | chromium_src-ef73044e42948214832dd11dd3326b738f816eb6.zip chromium_src-ef73044e42948214832dd11dd3326b738f816eb6.tar.gz chromium_src-ef73044e42948214832dd11dd3326b738f816eb6.tar.bz2 |
POSIX: don't allocate memory after forking.
Previously we would allocate memory in the child process. However, the
allocation might have happened while the malloc lock was held,
resulting in a deadlock.
This patch removes allocation from the child but probably makes Mac's
startup time slower until a Mac person can implement
dir_reader_posix.h.
TEST=Unittest for new code
BUG=36678
http://codereview.chromium.org/672003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41275 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/process_util_unittest.cc')
-rw-r--r-- | base/process_util_unittest.cc | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/base/process_util_unittest.cc b/base/process_util_unittest.cc index 3170b6a..7b9a7af 100644 --- a/base/process_util_unittest.cc +++ b/base/process_util_unittest.cc @@ -294,6 +294,107 @@ TEST_F(ProcessUtilTest, FDRemapping) { DPCHECK(ret == 0); } +static std::string TestLaunchApp(const base::environment_vector& env_changes) { + std::vector<std::string> args; + base::file_handle_mapping_vector fds_to_remap; + ProcessHandle handle; + + args.push_back("bash"); + args.push_back("-c"); + args.push_back("echo $BASE_TEST"); + + int fds[2]; + PCHECK(pipe(fds) == 0); + + fds_to_remap.push_back(std::make_pair(fds[1], 1)); + EXPECT_TRUE(LaunchApp(args, env_changes, fds_to_remap, + true /* wait for exit */, &handle)); + PCHECK(close(fds[1]) == 0); + + char buf[512]; + const ssize_t n = HANDLE_EINTR(read(fds[0], buf, sizeof(buf))); + PCHECK(n > 0); + return std::string(buf, n); +} + +static const char kLargeString[] = + "0123456789012345678901234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789012345678901234567890123456789"; + +TEST_F(ProcessUtilTest, LaunchApp) { + base::environment_vector env_changes; + + env_changes.push_back(std::make_pair(std::string("BASE_TEST"), + std::string("bar"))); + EXPECT_EQ("bar\n", TestLaunchApp(env_changes)); + env_changes.clear(); + + EXPECT_EQ(0, setenv("BASE_TEST", "testing", 1 /* override */)); + EXPECT_EQ("testing\n", TestLaunchApp(env_changes)); + + env_changes.push_back(std::make_pair(std::string("BASE_TEST"), + std::string(""))); + EXPECT_EQ("\n", TestLaunchApp(env_changes)); + + env_changes[0].second = "foo"; + EXPECT_EQ("foo\n", TestLaunchApp(env_changes)); + + env_changes.clear(); + EXPECT_EQ(0, setenv("BASE_TEST", kLargeString, 1 /* override */)); + EXPECT_EQ(std::string(kLargeString) + "\n", TestLaunchApp(env_changes)); + + env_changes.push_back(std::make_pair(std::string("BASE_TEST"), + std::string("wibble"))); + EXPECT_EQ("wibble\n", TestLaunchApp(env_changes)); +} + +TEST_F(ProcessUtilTest, AlterEnvironment) { + static const char* empty[] = { NULL }; + static const char* a2[] = { "A=2", NULL }; + base::environment_vector changes; + char** e; + + e = AlterEnvironment(changes, empty); + EXPECT_TRUE(e[0] == NULL); + delete[] e; + + changes.push_back(std::make_pair(std::string("A"), std::string("1"))); + e = AlterEnvironment(changes, empty); + EXPECT_EQ(std::string("A=1"), e[0]); + EXPECT_TRUE(e[1] == NULL); + delete[] e; + + changes.clear(); + changes.push_back(std::make_pair(std::string("A"), std::string(""))); + e = AlterEnvironment(changes, empty); + EXPECT_TRUE(e[0] == NULL); + delete[] e; + + changes.clear(); + e = AlterEnvironment(changes, a2); + EXPECT_EQ(std::string("A=2"), e[0]); + EXPECT_TRUE(e[1] == NULL); + delete[] e; + + changes.clear(); + changes.push_back(std::make_pair(std::string("A"), std::string("1"))); + e = AlterEnvironment(changes, a2); + EXPECT_EQ(std::string("A=1"), e[0]); + EXPECT_TRUE(e[1] == NULL); + delete[] e; + + changes.clear(); + changes.push_back(std::make_pair(std::string("A"), std::string(""))); + e = AlterEnvironment(changes, a2); + EXPECT_TRUE(e[0] == NULL); + delete[] e; +} + TEST_F(ProcessUtilTest, GetAppOutput) { std::string output; EXPECT_TRUE(GetAppOutput(CommandLine(FilePath("true")), &output)); |