| Index: net/test/spawned_test_server/local_test_server_win.cc
|
| diff --git a/net/test/spawned_test_server/local_test_server_win.cc b/net/test/spawned_test_server/local_test_server_win.cc
|
| index fd26483ed477b37698538f1f2b609e7d79b343f2..7a36c489300ac719270ae5112e4a7031c89ee397 100644
|
| --- a/net/test/spawned_test_server/local_test_server_win.cc
|
| +++ b/net/test/spawned_test_server/local_test_server_win.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/base_paths.h"
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| +#include "base/environment.h"
|
| #include "base/files/file_path.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/path_service.h"
|
| @@ -81,6 +82,60 @@ bool ReadData(HANDLE read_fd, HANDLE write_fd,
|
| return true;
|
| }
|
|
|
| +// Class that sets up a temporary path that includes the supplied path
|
| +// at the end.
|
| +//
|
| +// TODO(bratell): By making this more generic we can possibly reuse
|
| +// it at other places such as
|
| +// chrome/common/multi_process_lock_unittest.cc.
|
| +class ScopedPath {
|
| + public:
|
| + // Constructor which sets up the environment to include the path to
|
| + // |path_to_add|.
|
| + explicit ScopedPath(const base::FilePath& path_to_add);
|
| +
|
| + // Destructor that restores the path that were active when the
|
| + // object was constructed.
|
| + ~ScopedPath();
|
| +
|
| + private:
|
| + // The PATH environment variable before it was changed or an empty
|
| + // string if there was no PATH environment variable.
|
| + std::string old_path_;
|
| +
|
| + // The helper object that allows us to read and set environment
|
| + // variables more easily.
|
| + scoped_ptr<base::Environment> environment_;
|
| +
|
| + // A flag saying if we have actually modified the environment.
|
| + bool path_modified_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedPath);
|
| +};
|
| +
|
| +ScopedPath::ScopedPath(const base::FilePath& path_to_add)
|
| + : environment_(base::Environment::Create()),
|
| + path_modified_(false) {
|
| + environment_->GetVar("PATH", &old_path_);
|
| +
|
| + std::string new_value = old_path_;
|
| + if (!new_value.empty())
|
| + new_value += ";";
|
| +
|
| + new_value += WideToUTF8(path_to_add.value());
|
| +
|
| + path_modified_ = environment_->SetVar("PATH", new_value);
|
| +}
|
| +
|
| +ScopedPath::~ScopedPath() {
|
| + if (!path_modified_)
|
| + return;
|
| + if (old_path_.empty())
|
| + environment_->UnSetVar("PATH");
|
| + else
|
| + environment_->SetVar("PATH", old_path_);
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace net {
|
| @@ -134,6 +189,15 @@ bool LocalTestServer::LaunchPython(const base::FilePath& testserver_path) {
|
| return false;
|
| }
|
|
|
| + // Add our internal python to the path so it can be used if there is
|
| + // no system python.
|
| + base::FilePath python_dir;
|
| + if (!PathService::Get(base::DIR_SOURCE_ROOT, &python_dir)) {
|
| + LOG(ERROR) << "Could not locate source root directory.";
|
| + return false;
|
| + }
|
| + python_dir = python_dir.AppendASCII("third_party").AppendASCII("python_26");
|
| + ScopedPath python_path(python_dir);
|
| base::LaunchOptions launch_options;
|
| launch_options.inherit_handles = true;
|
| launch_options.job_handle = job_handle_.Get();
|
|
|