blob: cac126a7c45681f5cea6ae8439d87ecc2bbf9e68 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/test/layout_test_http_server.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/process_util.h"
#include "base/string_number_conversions.h"
#if defined(OS_WIN)
#include "base/win/windows_version.h"
#endif
namespace {
bool PrepareCommandLine(CommandLine* cmd_line) {
FilePath src_path;
if (!PathService::Get(base::DIR_SOURCE_ROOT, &src_path))
return false;
cmd_line->SetProgram(FilePath(FILE_PATH_LITERAL("python")));
FilePath script_path(src_path);
script_path = script_path.AppendASCII("third_party");
script_path = script_path.AppendASCII("WebKit");
script_path = script_path.AppendASCII("Tools");
script_path = script_path.AppendASCII("Scripts");
script_path = script_path.AppendASCII("new-run-webkit-httpd");
cmd_line->AppendArgPath(script_path);
return true;
}
} // namespace
LayoutTestHttpServer::LayoutTestHttpServer(const FilePath& root_directory,
int port)
: root_directory_(root_directory),
port_(port),
running_(false) {
}
LayoutTestHttpServer::~LayoutTestHttpServer() {
if (running_ && !Stop())
LOG(ERROR) << "LayoutTestHttpServer failed to stop.";
}
bool LayoutTestHttpServer::Start() {
if (running_) {
LOG(ERROR) << "LayoutTestHttpServer already running.";
return false;
}
CommandLine cmd_line(CommandLine::NO_PROGRAM);
if (!PrepareCommandLine(&cmd_line))
return false;
cmd_line.AppendArg("--server=start");
cmd_line.AppendArg("--register_cygwin");
cmd_line.AppendArgNative(FILE_PATH_LITERAL("--root=") +
root_directory_.value());
cmd_line.AppendArg("--port=" + base::IntToString(port_));
FilePath layout_tests_dir;
if (!PathService::Get(base::DIR_SOURCE_ROOT, &layout_tests_dir))
return false;
layout_tests_dir = layout_tests_dir.AppendASCII("chrome")
.AppendASCII("test")
.AppendASCII("data")
.AppendASCII("layout_tests")
.AppendASCII("LayoutTests");
cmd_line.AppendArgNative(FILE_PATH_LITERAL("--layout_tests_dir=") +
layout_tests_dir.value());
// For Windows 7, if we start the lighttpd server on the foreground mode,
// it will mess up with the command window and cause conhost.exe to crash. To
// work around this, we start the http server on the background mode.
#if defined(OS_WIN)
if (base::win::GetVersion() >= base::win::VERSION_WIN7)
cmd_line.AppendArg("--run_background");
#endif
running_ = base::LaunchApp(cmd_line, true, false, NULL);
return running_;
}
bool LayoutTestHttpServer::Stop() {
if (!running_) {
LOG(ERROR) << "LayoutTestHttpServer not running.";
return false;
}
CommandLine cmd_line(CommandLine::NO_PROGRAM);
if (!PrepareCommandLine(&cmd_line))
return false;
cmd_line.AppendArg("--server=stop");
bool stopped = base::LaunchApp(cmd_line, true, false, NULL);
running_ = !stopped;
return stopped;
}