summaryrefslogtreecommitdiffstats
path: root/base/process_util_unittest.cc
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-11 15:25:54 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-11 15:25:54 +0000
commitef73044e42948214832dd11dd3326b738f816eb6 (patch)
tree1105589709517fab2cc2ed5d745d82299d510f77 /base/process_util_unittest.cc
parent6e240d7084c1cecc7fdedabe83f860659888dd2f (diff)
downloadchromium_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.cc101
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));