Commit ef794a9d authored by kkania@chromium.org's avatar kkania@chromium.org

[chromedriver] Remove Logger and just use base LOG.

BUG=none
R=chrisgao@chromium.org

Review URL: https://codereview.chromium.org/23566018

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221521 0039d316-1c4b-4281-b951-d872f2087c98
parent a41592fc
...@@ -846,6 +846,8 @@ ...@@ -846,6 +846,8 @@
'test/chromedriver/chrome/status.h', 'test/chromedriver/chrome/status.h',
'test/chromedriver/chrome/ui_events.cc', 'test/chromedriver/chrome/ui_events.cc',
'test/chromedriver/chrome/ui_events.h', 'test/chromedriver/chrome/ui_events.h',
'test/chromedriver/chrome/util.cc',
'test/chromedriver/chrome/util.h',
'test/chromedriver/chrome/version.cc', 'test/chromedriver/chrome/version.cc',
'test/chromedriver/chrome/version.h', 'test/chromedriver/chrome/version.h',
'test/chromedriver/chrome/web_view.h', 'test/chromedriver/chrome/web_view.h',
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/json/string_escape.h" #include "base/json/string_escape.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h" #include "base/strings/string_split.h"
#include "base/strings/string_tokenizer.h" #include "base/strings/string_tokenizer.h"
...@@ -16,8 +17,8 @@ ...@@ -16,8 +17,8 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/logging.h"
#include "net/base/net_util.h" #include "net/base/net_util.h"
namespace { namespace {
...@@ -68,13 +69,10 @@ Status ParseDict(scoped_ptr<base::DictionaryValue>* to_set, ...@@ -68,13 +69,10 @@ Status ParseDict(scoped_ptr<base::DictionaryValue>* to_set,
} }
Status IgnoreDeprecatedOption( Status IgnoreDeprecatedOption(
Log* log,
const char* option_name, const char* option_name,
const base::Value& option, const base::Value& option,
Capabilities* capabilities) { Capabilities* capabilities) {
log->AddEntry(Log::kWarning, LOG(WARNING) << "Deprecated chrome option is ignored: " << option_name;
base::StringPrintf("deprecated chrome option is ignored: '%s'",
option_name));
return Status(kOk); return Status(kOk);
} }
...@@ -223,18 +221,25 @@ Status ParseUseExistingBrowser(const base::Value& option, ...@@ -223,18 +221,25 @@ Status ParseUseExistingBrowser(const base::Value& option,
Status ParseLoggingPrefs(const base::Value& option, Status ParseLoggingPrefs(const base::Value& option,
Capabilities* capabilities) { Capabilities* capabilities) {
const base::DictionaryValue* logging_prefs_dict = NULL; const base::DictionaryValue* logging_prefs = NULL;
if (!option.GetAsDictionary(&logging_prefs_dict)) if (!option.GetAsDictionary(&logging_prefs))
return Status(kUnknownError, "must be a dictionary"); return Status(kUnknownError, "must be a dictionary");
// TODO(klm): verify log types. for (base::DictionaryValue::Iterator pref(*logging_prefs);
// TODO(klm): verify log levels. !pref.IsAtEnd(); pref.Advance()) {
capabilities->logging_prefs.reset(logging_prefs_dict->DeepCopy()); std::string type = pref.key();
Log::Level level;
std::string level_name;
if (!pref.value().GetAsString(&level_name) ||
!WebDriverLog::NameToLevel(level_name, &level)) {
return Status(kUnknownError, "invalid log level for '" + type + "' log");
}
capabilities->logging_prefs.insert(std::make_pair(type, level));
}
return Status(kOk); return Status(kOk);
} }
Status ParseChromeOptions( Status ParseChromeOptions(
Log* log,
const base::Value& capability, const base::Value& capability,
Capabilities* capabilities) { Capabilities* capabilities) {
const base::DictionaryValue* chrome_options = NULL; const base::DictionaryValue* chrome_options = NULL;
...@@ -270,8 +275,7 @@ Status ParseChromeOptions( ...@@ -270,8 +275,7 @@ Status ParseChromeOptions(
parser_map["extensions"] = base::Bind(&ParseExtensions); parser_map["extensions"] = base::Bind(&ParseExtensions);
parser_map["forceDevToolsScreenshot"] = base::Bind( parser_map["forceDevToolsScreenshot"] = base::Bind(
&ParseBoolean, &capabilities->force_devtools_screenshot); &ParseBoolean, &capabilities->force_devtools_screenshot);
parser_map["loadAsync"] = parser_map["loadAsync"] = base::Bind(&IgnoreDeprecatedOption, "loadAsync");
base::Bind(&IgnoreDeprecatedOption, log, "loadAsync");
parser_map["localState"] = parser_map["localState"] =
base::Bind(&ParseDict, &capabilities->local_state); base::Bind(&ParseDict, &capabilities->local_state);
parser_map["logPath"] = base::Bind(&ParseLogPath); parser_map["logPath"] = base::Bind(&ParseLogPath);
...@@ -414,11 +418,9 @@ bool Capabilities::IsExistingBrowser() const { ...@@ -414,11 +418,9 @@ bool Capabilities::IsExistingBrowser() const {
return debugger_address.IsValid(); return debugger_address.IsValid();
} }
Status Capabilities::Parse( Status Capabilities::Parse(const base::DictionaryValue& desired_caps) {
const base::DictionaryValue& desired_caps,
Log* log) {
std::map<std::string, Parser> parser_map; std::map<std::string, Parser> parser_map;
parser_map["chromeOptions"] = base::Bind(&ParseChromeOptions, log); parser_map["chromeOptions"] = base::Bind(&ParseChromeOptions);
parser_map["loggingPrefs"] = base::Bind(&ParseLoggingPrefs); parser_map["loggingPrefs"] = base::Bind(&ParseLoggingPrefs);
parser_map["proxy"] = base::Bind(&ParseProxy); parser_map["proxy"] = base::Bind(&ParseProxy);
for (std::map<std::string, Parser>::iterator it = parser_map.begin(); for (std::map<std::string, Parser>::iterator it = parser_map.begin();
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/net/net_util.h" #include "chrome/test/chromedriver/net/net_util.h"
namespace base { namespace base {
...@@ -21,7 +22,6 @@ class DictionaryValue; ...@@ -21,7 +22,6 @@ class DictionaryValue;
} }
class CommandLine; class CommandLine;
class Log;
class Status; class Status;
class Switches { class Switches {
...@@ -57,6 +57,8 @@ class Switches { ...@@ -57,6 +57,8 @@ class Switches {
SwitchMap switch_map_; SwitchMap switch_map_;
}; };
typedef std::map<std::string, Log::Level> LoggingPrefs;
struct Capabilities { struct Capabilities {
Capabilities(); Capabilities();
~Capabilities(); ~Capabilities();
...@@ -67,7 +69,7 @@ struct Capabilities { ...@@ -67,7 +69,7 @@ struct Capabilities {
// Return true if android package is specified. // Return true if android package is specified.
bool IsAndroid() const; bool IsAndroid() const;
Status Parse(const base::DictionaryValue& desired_caps, Log* log); Status Parse(const base::DictionaryValue& desired_caps);
std::string android_activity; std::string android_activity;
...@@ -101,7 +103,7 @@ struct Capabilities { ...@@ -101,7 +103,7 @@ struct Capabilities {
std::string log_path; std::string log_path;
scoped_ptr<base::DictionaryValue> logging_prefs; LoggingPrefs logging_prefs;
scoped_ptr<base::DictionaryValue> prefs; scoped_ptr<base::DictionaryValue> prefs;
......
...@@ -101,8 +101,7 @@ TEST(ParseCapabilities, WithAndroidPackage) { ...@@ -101,8 +101,7 @@ TEST(ParseCapabilities, WithAndroidPackage) {
Capabilities capabilities; Capabilities capabilities;
base::DictionaryValue caps; base::DictionaryValue caps;
caps.SetString("chromeOptions.androidPackage", "abc"); caps.SetString("chromeOptions.androidPackage", "abc");
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_TRUE(capabilities.IsAndroid()); ASSERT_TRUE(capabilities.IsAndroid());
ASSERT_EQ("abc", capabilities.android_package); ASSERT_EQ("abc", capabilities.android_package);
...@@ -112,8 +111,7 @@ TEST(ParseCapabilities, EmptyAndroidPackage) { ...@@ -112,8 +111,7 @@ TEST(ParseCapabilities, EmptyAndroidPackage) {
Capabilities capabilities; Capabilities capabilities;
base::DictionaryValue caps; base::DictionaryValue caps;
caps.SetString("chromeOptions.androidPackage", std::string()); caps.SetString("chromeOptions.androidPackage", std::string());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -121,8 +119,7 @@ TEST(ParseCapabilities, IllegalAndroidPackage) { ...@@ -121,8 +119,7 @@ TEST(ParseCapabilities, IllegalAndroidPackage) {
Capabilities capabilities; Capabilities capabilities;
base::DictionaryValue caps; base::DictionaryValue caps;
caps.SetInteger("chromeOptions.androidPackage", 123); caps.SetInteger("chromeOptions.androidPackage", 123);
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -130,8 +127,7 @@ TEST(ParseCapabilities, LogPath) { ...@@ -130,8 +127,7 @@ TEST(ParseCapabilities, LogPath) {
Capabilities capabilities; Capabilities capabilities;
base::DictionaryValue caps; base::DictionaryValue caps;
caps.SetString("chromeOptions.logPath", "path/to/logfile"); caps.SetString("chromeOptions.logPath", "path/to/logfile");
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_STREQ("path/to/logfile", capabilities.log_path.c_str()); ASSERT_STREQ("path/to/logfile", capabilities.log_path.c_str());
} }
...@@ -144,8 +140,7 @@ TEST(ParseCapabilities, Args) { ...@@ -144,8 +140,7 @@ TEST(ParseCapabilities, Args) {
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("chromeOptions.args", args.DeepCopy()); caps.Set("chromeOptions.args", args.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(2u, capabilities.switches.GetSize()); ASSERT_EQ(2u, capabilities.switches.GetSize());
...@@ -162,8 +157,7 @@ TEST(ParseCapabilities, Prefs) { ...@@ -162,8 +157,7 @@ TEST(ParseCapabilities, Prefs) {
prefs.SetString("key2.k", "value2"); prefs.SetString("key2.k", "value2");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("chromeOptions.prefs", prefs.DeepCopy()); caps.Set("chromeOptions.prefs", prefs.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_TRUE(capabilities.prefs->Equals(&prefs)); ASSERT_TRUE(capabilities.prefs->Equals(&prefs));
} }
...@@ -175,8 +169,7 @@ TEST(ParseCapabilities, LocalState) { ...@@ -175,8 +169,7 @@ TEST(ParseCapabilities, LocalState) {
local_state.SetString("s2.s", "v2"); local_state.SetString("s2.s", "v2");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("chromeOptions.localState", local_state.DeepCopy()); caps.Set("chromeOptions.localState", local_state.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_TRUE(capabilities.local_state->Equals(&local_state)); ASSERT_TRUE(capabilities.local_state->Equals(&local_state));
} }
...@@ -188,8 +181,7 @@ TEST(ParseCapabilities, Extensions) { ...@@ -188,8 +181,7 @@ TEST(ParseCapabilities, Extensions) {
extensions.AppendString("ext2"); extensions.AppendString("ext2");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("chromeOptions.extensions", extensions.DeepCopy()); caps.Set("chromeOptions.extensions", extensions.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(2u, capabilities.extensions.size()); ASSERT_EQ(2u, capabilities.extensions.size());
ASSERT_EQ("ext1", capabilities.extensions[0]); ASSERT_EQ("ext1", capabilities.extensions[0]);
...@@ -202,8 +194,7 @@ TEST(ParseCapabilities, UnrecognizedProxyType) { ...@@ -202,8 +194,7 @@ TEST(ParseCapabilities, UnrecognizedProxyType) {
proxy.SetString("proxyType", "unknown proxy type"); proxy.SetString("proxyType", "unknown proxy type");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -213,8 +204,7 @@ TEST(ParseCapabilities, IllegalProxyType) { ...@@ -213,8 +204,7 @@ TEST(ParseCapabilities, IllegalProxyType) {
proxy.SetInteger("proxyType", 123); proxy.SetInteger("proxyType", 123);
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -224,8 +214,7 @@ TEST(ParseCapabilities, DirectProxy) { ...@@ -224,8 +214,7 @@ TEST(ParseCapabilities, DirectProxy) {
proxy.SetString("proxyType", "DIRECT"); proxy.SetString("proxyType", "DIRECT");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(1u, capabilities.switches.GetSize()); ASSERT_EQ(1u, capabilities.switches.GetSize());
ASSERT_TRUE(capabilities.switches.HasSwitch("no-proxy-server")); ASSERT_TRUE(capabilities.switches.HasSwitch("no-proxy-server"));
...@@ -237,8 +226,7 @@ TEST(ParseCapabilities, SystemProxy) { ...@@ -237,8 +226,7 @@ TEST(ParseCapabilities, SystemProxy) {
proxy.SetString("proxyType", "system"); proxy.SetString("proxyType", "system");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(0u, capabilities.switches.GetSize()); ASSERT_EQ(0u, capabilities.switches.GetSize());
} }
...@@ -250,8 +238,7 @@ TEST(ParseCapabilities, PacProxy) { ...@@ -250,8 +238,7 @@ TEST(ParseCapabilities, PacProxy) {
proxy.SetString("proxyAutoconfigUrl", "test.wpad"); proxy.SetString("proxyAutoconfigUrl", "test.wpad");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(1u, capabilities.switches.GetSize()); ASSERT_EQ(1u, capabilities.switches.GetSize());
ASSERT_EQ("test.wpad", capabilities.switches.GetSwitchValue("proxy-pac-url")); ASSERT_EQ("test.wpad", capabilities.switches.GetSwitchValue("proxy-pac-url"));
...@@ -264,8 +251,7 @@ TEST(ParseCapabilities, MissingProxyAutoconfigUrl) { ...@@ -264,8 +251,7 @@ TEST(ParseCapabilities, MissingProxyAutoconfigUrl) {
proxy.SetString("httpProxy", "http://localhost:8001"); proxy.SetString("httpProxy", "http://localhost:8001");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -275,8 +261,7 @@ TEST(ParseCapabilities, AutodetectProxy) { ...@@ -275,8 +261,7 @@ TEST(ParseCapabilities, AutodetectProxy) {
proxy.SetString("proxyType", "autodetect"); proxy.SetString("proxyType", "autodetect");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(1u, capabilities.switches.GetSize()); ASSERT_EQ(1u, capabilities.switches.GetSize());
ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-auto-detect")); ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-auto-detect"));
...@@ -292,8 +277,7 @@ TEST(ParseCapabilities, ManualProxy) { ...@@ -292,8 +277,7 @@ TEST(ParseCapabilities, ManualProxy) {
proxy.SetString("noProxy", "google.com, youtube.com"); proxy.SetString("noProxy", "google.com, youtube.com");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(2u, capabilities.switches.GetSize()); ASSERT_EQ(2u, capabilities.switches.GetSize());
ASSERT_EQ( ASSERT_EQ(
...@@ -310,8 +294,7 @@ TEST(ParseCapabilities, MissingSettingForManualProxy) { ...@@ -310,8 +294,7 @@ TEST(ParseCapabilities, MissingSettingForManualProxy) {
proxy.SetString("proxyType", "manual"); proxy.SetString("proxyType", "manual");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -324,8 +307,7 @@ TEST(ParseCapabilities, IgnoreNullValueForManualProxy) { ...@@ -324,8 +307,7 @@ TEST(ParseCapabilities, IgnoreNullValueForManualProxy) {
proxy.Set("noProxy", base::Value::CreateNullValue()); proxy.Set("noProxy", base::Value::CreateNullValue());
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("proxy", proxy.DeepCopy()); caps.Set("proxy", proxy.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(1u, capabilities.switches.GetSize()); ASSERT_EQ(1u, capabilities.switches.GetSize());
ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-server")); ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-server"));
...@@ -340,22 +322,17 @@ TEST(ParseCapabilities, LoggingPrefsOk) { ...@@ -340,22 +322,17 @@ TEST(ParseCapabilities, LoggingPrefsOk) {
logging_prefs.SetString("Network", "INFO"); logging_prefs.SetString("Network", "INFO");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("loggingPrefs", logging_prefs.DeepCopy()); caps.Set("loggingPrefs", logging_prefs.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_TRUE(capabilities.logging_prefs.get()); ASSERT_EQ(1u, capabilities.logging_prefs.size());
ASSERT_EQ(1u, capabilities.logging_prefs->size()); ASSERT_EQ(Log::kInfo, capabilities.logging_prefs["Network"]);
std::string log_level;
ASSERT_TRUE(capabilities.logging_prefs->GetString("Network", &log_level));
ASSERT_STREQ("INFO", log_level.c_str());
} }
TEST(ParseCapabilities, LoggingPrefsNotDict) { TEST(ParseCapabilities, LoggingPrefsNotDict) {
Capabilities capabilities; Capabilities capabilities;
base::DictionaryValue caps; base::DictionaryValue caps;
caps.SetString("loggingPrefs", "INFO"); caps.SetString("loggingPrefs", "INFO");
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_FALSE(status.IsOk()); ASSERT_FALSE(status.IsOk());
} }
...@@ -366,8 +343,7 @@ TEST(ParseCapabilities, ExcludeSwitches) { ...@@ -366,8 +343,7 @@ TEST(ParseCapabilities, ExcludeSwitches) {
exclude_switches.AppendString("switch2"); exclude_switches.AppendString("switch2");
base::DictionaryValue caps; base::DictionaryValue caps;
caps.Set("chromeOptions.excludeSwitches", exclude_switches.DeepCopy()); caps.Set("chromeOptions.excludeSwitches", exclude_switches.DeepCopy());
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(2u, capabilities.exclude_switches.size()); ASSERT_EQ(2u, capabilities.exclude_switches.size());
const std::set<std::string>& switches = capabilities.exclude_switches; const std::set<std::string>& switches = capabilities.exclude_switches;
...@@ -379,8 +355,7 @@ TEST(ParseCapabilities, UseExistingBrowser) { ...@@ -379,8 +355,7 @@ TEST(ParseCapabilities, UseExistingBrowser) {
Capabilities capabilities; Capabilities capabilities;
base::DictionaryValue caps; base::DictionaryValue caps;
caps.SetString("chromeOptions.debuggerAddress", "abc:123"); caps.SetString("chromeOptions.debuggerAddress", "abc:123");
Logger log(Log::kError); Status status = capabilities.Parse(caps);
Status status = capabilities.Parse(caps, &log);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_TRUE(capabilities.IsExistingBrowser()); ASSERT_TRUE(capabilities.IsExistingBrowser());
ASSERT_EQ("abc", capabilities.debugger_address.host()); ASSERT_EQ("abc", capabilities.debugger_address.host());
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/synchronization/waitable_event.h" #include "base/synchronization/waitable_event.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/net/adb_client_socket.h" #include "chrome/test/chromedriver/net/adb_client_socket.h"
...@@ -74,8 +73,8 @@ void ExecuteCommandOnIOThread( ...@@ -74,8 +73,8 @@ void ExecuteCommandOnIOThread(
AdbImpl::AdbImpl( AdbImpl::AdbImpl(
const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
Log* log, int port) int port)
: io_task_runner_(io_task_runner), log_(log), port_(port) { : io_task_runner_(io_task_runner), port_(port) {
CHECK(io_task_runner_.get()); CHECK(io_task_runner_.get());
} }
...@@ -219,14 +218,15 @@ Status AdbImpl::GetPidByName(const std::string& device_serial, ...@@ -219,14 +218,15 @@ Status AdbImpl::GetPidByName(const std::string& device_serial,
Status AdbImpl::ExecuteCommand( Status AdbImpl::ExecuteCommand(
const std::string& command, std::string* response) { const std::string& command, std::string* response) {
scoped_refptr<ResponseBuffer> response_buffer = new ResponseBuffer; scoped_refptr<ResponseBuffer> response_buffer = new ResponseBuffer;
log_->AddEntry(Log::kDebug, "Sending adb command: " + command); VLOG(1) << "Sending adb command: " << command;
io_task_runner_->PostTask( io_task_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::Bind(&ExecuteCommandOnIOThread, command, response_buffer, port_)); base::Bind(&ExecuteCommandOnIOThread, command, response_buffer, port_));
Status status = response_buffer->GetResponse( Status status = response_buffer->GetResponse(
response, base::TimeDelta::FromSeconds(30)); response, base::TimeDelta::FromSeconds(30));
if (status.IsOk()) if (status.IsOk()) {
log_->AddEntry(Log::kDebug, "Received adb response: " + *response); VLOG(1) << "Received adb response: " << *response;
}
return status; return status;
} }
......
...@@ -16,14 +16,13 @@ namespace base { ...@@ -16,14 +16,13 @@ namespace base {
class SingleThreadTaskRunner; class SingleThreadTaskRunner;
} }
class Log;
class Status; class Status;
class AdbImpl : public Adb { class AdbImpl : public Adb {
public: public:
explicit AdbImpl( explicit AdbImpl(
const scoped_refptr<base::SingleThreadTaskRunner>& io_message_loop_proxy, const scoped_refptr<base::SingleThreadTaskRunner>& io_message_loop_proxy,
Log* log, int port); int port);
virtual ~AdbImpl(); virtual ~AdbImpl();
// Overridden from Adb: // Overridden from Adb:
...@@ -60,7 +59,6 @@ class AdbImpl : public Adb { ...@@ -60,7 +59,6 @@ class AdbImpl : public Adb {
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
Log* log_;
int port_; int port_;
}; };
......
...@@ -11,9 +11,8 @@ ...@@ -11,9 +11,8 @@
ChromeAndroidImpl::ChromeAndroidImpl( ChromeAndroidImpl::ChromeAndroidImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
scoped_ptr<Device> device, scoped_ptr<Device> device)
Log* log) : ChromeImpl(client.Pass(), devtools_event_listeners),
: ChromeImpl(client.Pass(), devtools_event_listeners, log),
device_(device.Pass()) {} device_(device.Pass()) {}
ChromeAndroidImpl::~ChromeAndroidImpl() {} ChromeAndroidImpl::~ChromeAndroidImpl() {}
......
...@@ -19,8 +19,7 @@ class ChromeAndroidImpl : public ChromeImpl { ...@@ -19,8 +19,7 @@ class ChromeAndroidImpl : public ChromeImpl {
ChromeAndroidImpl( ChromeAndroidImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
scoped_ptr<Device> device, scoped_ptr<Device> device);
Log* log);
virtual ~ChromeAndroidImpl(); virtual ~ChromeAndroidImpl();
// Overridden from Chrome: // Overridden from Chrome:
......
...@@ -63,13 +63,11 @@ bool KillProcess(base::ProcessHandle process_id) { ...@@ -63,13 +63,11 @@ bool KillProcess(base::ProcessHandle process_id) {
ChromeDesktopImpl::ChromeDesktopImpl( ChromeDesktopImpl::ChromeDesktopImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
Log* log,
base::ProcessHandle process, base::ProcessHandle process,
base::ScopedTempDir* user_data_dir, base::ScopedTempDir* user_data_dir,
base::ScopedTempDir* extension_dir) base::ScopedTempDir* extension_dir)
: ChromeImpl(client.Pass(), : ChromeImpl(client.Pass(),
devtools_event_listeners, devtools_event_listeners),
log),
process_(process), process_(process),
quit_(false) { quit_(false) {
if (user_data_dir->IsValid()) if (user_data_dir->IsValid())
...@@ -113,7 +111,7 @@ Status ChromeDesktopImpl::WaitForPageToLoad(const std::string& url, ...@@ -113,7 +111,7 @@ Status ChromeDesktopImpl::WaitForPageToLoad(const std::string& url,
return Status(kUnknownError, "page could not be found: " + url); return Status(kUnknownError, "page could not be found: " + url);
scoped_ptr<WebView> web_view_tmp(new WebViewImpl( scoped_ptr<WebView> web_view_tmp(new WebViewImpl(
id, GetBuildNo(), devtools_http_client_->CreateClient(id), log_)); id, GetBuildNo(), devtools_http_client_->CreateClient(id)));
Status status = web_view_tmp->ConnectIfNecessary(); Status status = web_view_tmp->ConnectIfNecessary();
if (status.IsError()) if (status.IsError())
return status; return status;
......
...@@ -27,7 +27,6 @@ class ChromeDesktopImpl : public ChromeImpl { ...@@ -27,7 +27,6 @@ class ChromeDesktopImpl : public ChromeImpl {
ChromeDesktopImpl( ChromeDesktopImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
Log* log,
base::ProcessHandle process, base::ProcessHandle process,
base::ScopedTempDir* user_data_dir, base::ScopedTempDir* user_data_dir,
base::ScopedTempDir* extension_dir); base::ScopedTempDir* extension_dir);
......
...@@ -8,9 +8,8 @@ ...@@ -8,9 +8,8 @@
ChromeExistingImpl::ChromeExistingImpl( ChromeExistingImpl::ChromeExistingImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners)
Log* log) : ChromeImpl(client.Pass(), devtools_event_listeners) {}
: ChromeImpl(client.Pass(), devtools_event_listeners, log) {}
ChromeExistingImpl::~ChromeExistingImpl() {} ChromeExistingImpl::~ChromeExistingImpl() {}
......
...@@ -17,8 +17,7 @@ class ChromeExistingImpl : public ChromeImpl { ...@@ -17,8 +17,7 @@ class ChromeExistingImpl : public ChromeImpl {
public: public:
ChromeExistingImpl( ChromeExistingImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners);
Log* log);
virtual ~ChromeExistingImpl(); virtual ~ChromeExistingImpl();
// Overridden from Chrome. // Overridden from Chrome.
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "chrome/test/chromedriver/chrome/devtools_client.h" #include "chrome/test/chromedriver/chrome/devtools_client.h"
#include "chrome/test/chromedriver/chrome/devtools_event_listener.h" #include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
#include "chrome/test/chromedriver/chrome/devtools_http_client.h" #include "chrome/test/chromedriver/chrome/devtools_http_client.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/chrome/web_view_impl.h" #include "chrome/test/chromedriver/chrome/web_view_impl.h"
...@@ -61,7 +60,7 @@ Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) { ...@@ -61,7 +60,7 @@ Status ChromeImpl::GetWebViewIds(std::list<std::string>* web_view_ids) {
// OnConnected will fire when DevToolsClient connects later. // OnConnected will fire when DevToolsClient connects later.
} }
web_views_.push_back(make_linked_ptr(new WebViewImpl( web_views_.push_back(make_linked_ptr(new WebViewImpl(
view.id, GetBuildNo(), client.Pass(), log_))); view.id, GetBuildNo(), client.Pass())));
} }
} }
...@@ -109,9 +108,7 @@ Status ChromeImpl::GetAutomationExtension(AutomationExtension** extension) { ...@@ -109,9 +108,7 @@ Status ChromeImpl::GetAutomationExtension(AutomationExtension** extension) {
ChromeImpl::ChromeImpl( ChromeImpl::ChromeImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners)
Log* log) : devtools_http_client_(client.Pass()) {
: devtools_http_client_(client.Pass()),
log_(log) {
devtools_event_listeners_.swap(devtools_event_listeners); devtools_event_listeners_.swap(devtools_event_listeners);
} }
...@@ -18,7 +18,6 @@ class AutomationExtension; ...@@ -18,7 +18,6 @@ class AutomationExtension;
class DevToolsEventListener; class DevToolsEventListener;
class DevToolsHttpClient; class DevToolsHttpClient;
class JavaScriptDialogManager; class JavaScriptDialogManager;
class Log;
class Status; class Status;
class WebView; class WebView;
class WebViewImpl; class WebViewImpl;
...@@ -41,11 +40,9 @@ class ChromeImpl : public Chrome { ...@@ -41,11 +40,9 @@ class ChromeImpl : public Chrome {
protected: protected:
ChromeImpl( ChromeImpl(
scoped_ptr<DevToolsHttpClient> client, scoped_ptr<DevToolsHttpClient> client,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners);
Log* log);
scoped_ptr<DevToolsHttpClient> devtools_http_client_; scoped_ptr<DevToolsHttpClient> devtools_http_client_;
Log* log_;
private: private:
typedef std::list<linked_ptr<WebViewImpl> > WebViewList; typedef std::list<linked_ptr<WebViewImpl> > WebViewList;
......
...@@ -53,7 +53,7 @@ Status ConsoleLogger::OnEvent( ...@@ -53,7 +53,7 @@ Status ConsoleLogger::OnEvent(
if (params.GetDictionary("message", &message_dict)) { if (params.GetDictionary("message", &message_dict)) {
std::string text; std::string text;
std::string level_name; std::string level_name;
Log::Level level = Log::kLog; Log::Level level = Log::kInfo;
if (message_dict->GetString("text", &text) && !text.empty() && if (message_dict->GetString("text", &text) && !text.empty() &&
message_dict->GetString("level", &level_name) && message_dict->GetString("level", &level_name) &&
ConsoleLevelToLogLevel(level_name, &level)) { ConsoleLevelToLogLevel(level_name, &level)) {
......
...@@ -173,7 +173,7 @@ TEST(ConsoleLogger, ConsoleMessages) { ...@@ -173,7 +173,7 @@ TEST(ConsoleLogger, ConsoleMessages) {
ASSERT_EQ(8u, log.GetEntries().size()); ASSERT_EQ(8u, log.GetEntries().size());
ValidateLogEntry(log.GetEntries()[0], Log::kDebug, "url1 10:1 text1"); ValidateLogEntry(log.GetEntries()[0], Log::kDebug, "url1 10:1 text1");
ValidateLogEntry(log.GetEntries()[1], Log::kLog, "source2 - text2"); ValidateLogEntry(log.GetEntries()[1], Log::kInfo, "source2 - text2");
ValidateLogEntry(log.GetEntries()[2], Log::kWarning, "url3 30 text3"); ValidateLogEntry(log.GetEntries()[2], Log::kWarning, "url3 30 text3");
ValidateLogEntry(log.GetEntries()[3], Log::kError, "url4 - text4"); ValidateLogEntry(log.GetEntries()[3], Log::kError, "url4 - text4");
ValidateLogEntry( ValidateLogEntry(
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "chrome/test/chromedriver/chrome/devtools_event_listener.h" #include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
#include "chrome/test/chromedriver/chrome/log.h" #include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/chrome/util.h"
#include "chrome/test/chromedriver/net/sync_websocket.h" #include "chrome/test/chromedriver/net/sync_websocket.h"
#include "chrome/test/chromedriver/net/url_request_context_getter.h" #include "chrome/test/chromedriver/net/url_request_context_getter.h"
...@@ -70,13 +71,11 @@ DevToolsClientImpl::DevToolsClientImpl( ...@@ -70,13 +71,11 @@ DevToolsClientImpl::DevToolsClientImpl(
const SyncWebSocketFactory& factory, const SyncWebSocketFactory& factory,
const std::string& url, const std::string& url,
const std::string& id, const std::string& id,
const FrontendCloserFunc& frontend_closer_func, const FrontendCloserFunc& frontend_closer_func)
Log* log)
: socket_(factory.Run().Pass()), : socket_(factory.Run().Pass()),
url_(url), url_(url),
id_(id), id_(id),
frontend_closer_func_(frontend_closer_func), frontend_closer_func_(frontend_closer_func),
log_(log),
parser_func_(base::Bind(&internal::ParseInspectorMessage)), parser_func_(base::Bind(&internal::ParseInspectorMessage)),
unnotified_event_(NULL), unnotified_event_(NULL),
next_id_(1), next_id_(1),
...@@ -87,13 +86,11 @@ DevToolsClientImpl::DevToolsClientImpl( ...@@ -87,13 +86,11 @@ DevToolsClientImpl::DevToolsClientImpl(
const std::string& url, const std::string& url,
const std::string& id, const std::string& id,
const FrontendCloserFunc& frontend_closer_func, const FrontendCloserFunc& frontend_closer_func,
Log* log,
const ParserFunc& parser_func) const ParserFunc& parser_func)
: socket_(factory.Run().Pass()), : socket_(factory.Run().Pass()),
url_(url), url_(url),
id_(id), id_(id),
frontend_closer_func_(frontend_closer_func), frontend_closer_func_(frontend_closer_func),
log_(log),
parser_func_(parser_func), parser_func_(parser_func),
unnotified_event_(NULL), unnotified_event_(NULL),
next_id_(1), next_id_(1),
...@@ -207,9 +204,11 @@ Status DevToolsClientImpl::SendCommandInternal( ...@@ -207,9 +204,11 @@ Status DevToolsClientImpl::SendCommandInternal(
command.SetInteger("id", command_id); command.SetInteger("id", command_id);
command.SetString("method", method); command.SetString("method", method);
command.Set("params", params.DeepCopy()); command.Set("params", params.DeepCopy());
std::string message; std::string message = SerializeValue(&command);
base::JSONWriter::Write(&command, &message); if (IsVLogOn(1)) {
log_->AddEntry(Log::kDebug, "sending Inspector command " + message); VLOG(1) << "COMMAND " << method << " (id=" << command_id << ") "
<< FormatValueForDisplay(params);
}
if (!socket_->Send(message)) if (!socket_->Send(message))
return Status(kDisconnected, "unable to send message to renderer"); return Status(kDisconnected, "unable to send message to renderer");
...@@ -260,16 +259,19 @@ Status DevToolsClientImpl::ProcessNextMessage( ...@@ -260,16 +259,19 @@ Status DevToolsClientImpl::ProcessNextMessage(
std::string message; std::string message;
switch (socket_->ReceiveNextMessage(&message, timeout)) { switch (socket_->ReceiveNextMessage(&message, timeout)) {
case SyncWebSocket::kOk: case SyncWebSocket::kOk:
log_->AddEntry(Log::kDebug, "received Inspector response " + message);
break; break;
case SyncWebSocket::kDisconnected: case SyncWebSocket::kDisconnected: {
message = "unable to receive message from renderer"; std::string err = "Unable to receive message from renderer";
log_->AddEntry(Log::kDebug, message); LOG(ERROR) << err;
return Status(kDisconnected, message); return Status(kDisconnected, err);
case SyncWebSocket::kTimeout: }
message = "timed out receiving message from renderer"; case SyncWebSocket::kTimeout: {
log_->AddEntry(Log::kDebug, message); std::string err =
return Status(kTimeout, message); "Timed out receiving message from renderer: " +
base::StringPrintf("%.3lf", timeout.InSecondsF());
LOG(ERROR) << err;
return Status(kTimeout, err);
}
default: default:
NOTREACHED(); NOTREACHED();
break; break;
...@@ -278,8 +280,10 @@ Status DevToolsClientImpl::ProcessNextMessage( ...@@ -278,8 +280,10 @@ Status DevToolsClientImpl::ProcessNextMessage(
internal::InspectorMessageType type; internal::InspectorMessageType type;
internal::InspectorEvent event; internal::InspectorEvent event;
internal::InspectorCommandResponse response; internal::InspectorCommandResponse response;
if (!parser_func_.Run(message, expected_id, &type, &event, &response)) if (!parser_func_.Run(message, expected_id, &type, &event, &response)) {
LOG(ERROR) << "Bad inspector message: " << message;
return Status(kUnknownError, "bad inspector message: " + message); return Status(kUnknownError, "bad inspector message: " + message);
}
if (type == internal::kEventMessageType) if (type == internal::kEventMessageType)
return ProcessEvent(event); return ProcessEvent(event);
...@@ -288,6 +292,10 @@ Status DevToolsClientImpl::ProcessNextMessage( ...@@ -288,6 +292,10 @@ Status DevToolsClientImpl::ProcessNextMessage(
} }
Status DevToolsClientImpl::ProcessEvent(const internal::InspectorEvent& event) { Status DevToolsClientImpl::ProcessEvent(const internal::InspectorEvent& event) {
if (IsVLogOn(1)) {
VLOG(1) << "EVENT " << event.method << " "
<< FormatValueForDisplay(*event.params);
}
unnotified_event_listeners_ = listeners_; unnotified_event_listeners_ = listeners_;
unnotified_event_ = &event; unnotified_event_ = &event;
Status status = EnsureListenersNotifiedOfEvent(); Status status = EnsureListenersNotifiedOfEvent();
...@@ -327,7 +335,20 @@ Status DevToolsClientImpl::ProcessEvent(const internal::InspectorEvent& event) { ...@@ -327,7 +335,20 @@ Status DevToolsClientImpl::ProcessEvent(const internal::InspectorEvent& event) {
Status DevToolsClientImpl::ProcessCommandResponse( Status DevToolsClientImpl::ProcessCommandResponse(
const internal::InspectorCommandResponse& response) { const internal::InspectorCommandResponse& response) {
if (response_info_map_.count(response.id) == 0) ResponseInfoMap::iterator iter = response_info_map_.find(response.id);
if (IsVLogOn(1)) {
std::string method, result;
if (iter != response_info_map_.end())
method = iter->second->method;
if (response.result)
result = FormatValueForDisplay(*response.result);
else
result = response.error;
VLOG(1) << "RESPONSE " << method << " (id=" << response.id
<< ") " << result;
}
if (iter == response_info_map_.end())
return Status(kUnknownError, "unexpected command response"); return Status(kUnknownError, "unexpected command response");
linked_ptr<ResponseInfo> response_info = response_info_map_[response.id]; linked_ptr<ResponseInfo> response_info = response_info_map_[response.id];
......
...@@ -47,7 +47,6 @@ struct InspectorCommandResponse { ...@@ -47,7 +47,6 @@ struct InspectorCommandResponse {
} // namespace internal } // namespace internal
class DevToolsEventListener; class DevToolsEventListener;
class Log;
class Status; class Status;
class SyncWebSocket; class SyncWebSocket;
...@@ -57,8 +56,7 @@ class DevToolsClientImpl : public DevToolsClient { ...@@ -57,8 +56,7 @@ class DevToolsClientImpl : public DevToolsClient {
DevToolsClientImpl(const SyncWebSocketFactory& factory, DevToolsClientImpl(const SyncWebSocketFactory& factory,
const std::string& url, const std::string& url,
const std::string& id, const std::string& id,
const FrontendCloserFunc& frontend_closer_func, const FrontendCloserFunc& frontend_closer_func);
Log* log);
typedef base::Callback<bool( typedef base::Callback<bool(
const std::string&, const std::string&,
...@@ -70,7 +68,6 @@ class DevToolsClientImpl : public DevToolsClient { ...@@ -70,7 +68,6 @@ class DevToolsClientImpl : public DevToolsClient {
const std::string& url, const std::string& url,
const std::string& id, const std::string& id,
const FrontendCloserFunc& frontend_closer_func, const FrontendCloserFunc& frontend_closer_func,
Log* log,
const ParserFunc& parser_func); const ParserFunc& parser_func);
virtual ~DevToolsClientImpl(); virtual ~DevToolsClientImpl();
...@@ -130,7 +127,6 @@ class DevToolsClientImpl : public DevToolsClient { ...@@ -130,7 +127,6 @@ class DevToolsClientImpl : public DevToolsClient {
GURL url_; GURL url_;
const std::string id_; const std::string id_;
FrontendCloserFunc frontend_closer_func_; FrontendCloserFunc frontend_closer_func_;
Log* log_;
ParserFunc parser_func_; ParserFunc parser_func_;
std::list<DevToolsEventListener*> listeners_; std::list<DevToolsEventListener*> listeners_;
std::list<DevToolsEventListener*> unnotified_connect_listeners_; std::list<DevToolsEventListener*> unnotified_connect_listeners_;
......
...@@ -67,11 +67,9 @@ const WebViewInfo* WebViewsInfo::GetForId(const std::string& id) const { ...@@ -67,11 +67,9 @@ const WebViewInfo* WebViewsInfo::GetForId(const std::string& id) const {
DevToolsHttpClient::DevToolsHttpClient( DevToolsHttpClient::DevToolsHttpClient(
const NetAddress& address, const NetAddress& address,
scoped_refptr<URLRequestContextGetter> context_getter, scoped_refptr<URLRequestContextGetter> context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory)
Log* log)
: context_getter_(context_getter), : context_getter_(context_getter),
socket_factory_(socket_factory), socket_factory_(socket_factory),
log_(log),
server_url_("http://" + address.ToString()), server_url_("http://" + address.ToString()),
web_socket_url_prefix_(base::StringPrintf( web_socket_url_prefix_(base::StringPrintf(
"ws://%s/devtools/page/", address.ToString().c_str())) {} "ws://%s/devtools/page/", address.ToString().c_str())) {}
...@@ -141,8 +139,7 @@ scoped_ptr<DevToolsClient> DevToolsHttpClient::CreateClient( ...@@ -141,8 +139,7 @@ scoped_ptr<DevToolsClient> DevToolsHttpClient::CreateClient(
web_socket_url_prefix_ + id, web_socket_url_prefix_ + id,
id, id,
base::Bind( base::Bind(
&DevToolsHttpClient::CloseFrontends, base::Unretained(this), id), &DevToolsHttpClient::CloseFrontends, base::Unretained(this), id)));
log_));
} }
Status DevToolsHttpClient::CloseWebView(const std::string& id) { Status DevToolsHttpClient::CloseWebView(const std::string& id) {
...@@ -234,10 +231,9 @@ Status DevToolsHttpClient::CloseFrontends(const std::string& for_client_id) { ...@@ -234,10 +231,9 @@ Status DevToolsHttpClient::CloseFrontends(const std::string& for_client_id) {
socket_factory_, socket_factory_,
web_socket_url_prefix_ + *it, web_socket_url_prefix_ + *it,
*it, *it,
base::Bind(&FakeCloseFrontends), base::Bind(&FakeCloseFrontends)));
log_));
scoped_ptr<WebViewImpl> web_view( scoped_ptr<WebViewImpl> web_view(
new WebViewImpl(*it, build_no_, client.Pass(), log_)); new WebViewImpl(*it, build_no_, client.Pass()));
status = web_view->ConnectIfNecessary(); status = web_view->ConnectIfNecessary();
// Ignore disconnected error, because the debugger might have closed when // Ignore disconnected error, because the debugger might have closed when
...@@ -279,12 +275,13 @@ Status DevToolsHttpClient::CloseFrontends(const std::string& for_client_id) { ...@@ -279,12 +275,13 @@ Status DevToolsHttpClient::CloseFrontends(const std::string& for_client_id) {
bool DevToolsHttpClient::FetchUrlAndLog(const std::string& url, bool DevToolsHttpClient::FetchUrlAndLog(const std::string& url,
URLRequestContextGetter* getter, URLRequestContextGetter* getter,
std::string* response) { std::string* response) {
log_->AddEntry(Log::kDebug, "devtools request: " + url); VLOG(1) << "DevTools request: " << url;
bool ok = FetchUrl(url, getter, response); bool ok = FetchUrl(url, getter, response);
if (ok) if (ok) {
log_->AddEntry(Log::kDebug, "devtools response: " + *response); VLOG(1) << "DevTools response: " << *response;
else } else {
log_->AddEntry(Log::kDebug, "devtools request failed"); VLOG(1) << "DevTools request failed";
}
return ok; return ok;
} }
......
...@@ -17,7 +17,6 @@ class TimeDelta; ...@@ -17,7 +17,6 @@ class TimeDelta;
} }
class DevToolsClient; class DevToolsClient;
class Log;
class NetAddress; class NetAddress;
class Status; class Status;
class URLRequestContextGetter; class URLRequestContextGetter;
...@@ -61,8 +60,7 @@ class DevToolsHttpClient { ...@@ -61,8 +60,7 @@ class DevToolsHttpClient {
DevToolsHttpClient( DevToolsHttpClient(
const NetAddress& address, const NetAddress& address,
scoped_refptr<URLRequestContextGetter> context_getter, scoped_refptr<URLRequestContextGetter> context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory);
Log* log);
~DevToolsHttpClient(); ~DevToolsHttpClient();
Status Init(const base::TimeDelta& timeout); Status Init(const base::TimeDelta& timeout);
...@@ -87,7 +85,6 @@ class DevToolsHttpClient { ...@@ -87,7 +85,6 @@ class DevToolsHttpClient {
scoped_refptr<URLRequestContextGetter> context_getter_; scoped_refptr<URLRequestContextGetter> context_getter_;
SyncWebSocketFactory socket_factory_; SyncWebSocketFactory socket_factory_;
Log* log_;
std::string server_url_; std::string server_url_;
std::string web_socket_url_prefix_; std::string web_socket_url_prefix_;
std::string version_; std::string version_;
......
...@@ -4,18 +4,19 @@ ...@@ -4,18 +4,19 @@
#include "chrome/test/chromedriver/chrome/log.h" #include "chrome/test/chromedriver/chrome/log.h"
#include <stdio.h>
#include "base/json/json_reader.h" #include "base/json/json_reader.h"
#include "base/json/json_writer.h" #include "base/json/json_writer.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/values.h" #include "base/values.h"
void Log::AddEntry(Level level, const std::string& message) {
AddEntryTimestamped(base::Time::Now(), level, message);
}
namespace { namespace {
// Truncates the given string to 200 characters, adding an ellipsis if IsVLogOnFunc g_is_vlog_on_func = NULL;
// truncation was necessary.
void TruncateString(std::string* data) { void TruncateString(std::string* data) {
const size_t kMaxLength = 200; const size_t kMaxLength = 200;
if (data->length() > kMaxLength) { if (data->length() > kMaxLength) {
...@@ -24,8 +25,7 @@ void TruncateString(std::string* data) { ...@@ -24,8 +25,7 @@ void TruncateString(std::string* data) {
} }
} }
// Truncates all strings contained in the given value. base::Value* TruncateContainedStrings(base::Value* value) {
void TruncateContainedStrings(base::Value* value) {
base::ListValue* list = NULL; base::ListValue* list = NULL;
base::DictionaryValue* dict = NULL; base::DictionaryValue* dict = NULL;
if (value->GetAsDictionary(&dict)) { if (value->GetAsDictionary(&dict)) {
...@@ -55,80 +55,45 @@ void TruncateContainedStrings(base::Value* value) { ...@@ -55,80 +55,45 @@ void TruncateContainedStrings(base::Value* value) {
} }
} }
} }
return value;
} }
std::string ConvertForDisplayInternal(const std::string& input) { } // namespace
size_t left = input.find("{");
size_t right = input.rfind("}");
if (left == std::string::npos || right == std::string::npos)
return input.substr(0, 10 << 10);
scoped_ptr<base::Value> value( void InitLogging(IsVLogOnFunc is_vlog_on_func) {
base::JSONReader::Read(input.substr(left, right - left + 1))); g_is_vlog_on_func = is_vlog_on_func;
if (!value)
return input.substr(0, 10 << 10);
TruncateContainedStrings(value.get());
std::string json;
base::JSONWriter::WriteWithOptions(
value.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
std::string display = input.substr(0, left) + json;
if (input.length() > right)
display += input.substr(right + 1);
return display;
} }
// Pretty prints encapsulated JSON and truncates long strings for display. bool IsVLogOn(int vlog_level) {
std::string ConvertForDisplay(const std::string& input) { if (!g_is_vlog_on_func)
std::string display = ConvertForDisplayInternal(input); return false;
char remove_chars[] = {'\r', '\0'}; return g_is_vlog_on_func(vlog_level);
RemoveChars(display, remove_chars, &display);
return display;
} }
} // namespace std::string PrettyPrintValue(const base::Value& value) {
std::string json;
void Log::AddEntry(Level level, const std::string& message) { base::JSONWriter::WriteWithOptions(
AddEntryTimestamped(base::Time::Now(), level, message); &value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
#if defined(OS_WIN)
RemoveChars(json, "\r", &json);
#endif
// Remove the trailing newline.
if (json.length())
json.resize(json.length() - 1);
return json;
} }
Logger::Logger() : min_log_level_(kLog), start_(base::Time::Now()) {} std::string FormatValueForDisplay(const base::Value& value) {
scoped_ptr<base::Value> truncated(TruncateContainedStrings(value.DeepCopy()));
Logger::Logger(Level min_log_level) return PrettyPrintValue(*truncated);
: min_log_level_(min_log_level), start_(base::Time::Now()) {} }
Logger::~Logger() {}
void Logger::AddEntryTimestamped(const base::Time& timestamp,
Level level,
const std::string& message) {
if (level < min_log_level_)
return;
const char* level_name = "UNKNOWN"; std::string FormatJsonForDisplay(const std::string& json) {
switch (level) { scoped_ptr<base::Value> value(base::JSONReader::Read(json));
case kDebug: if (!value) {
level_name = "DEBUG"; std::string truncated = json;
break; TruncateString(&truncated);
case kLog: return truncated;
level_name = "INFO";
break;
case kWarning:
level_name = "WARNING";
break;
case kError:
level_name = "ERROR";
break;
default:
break;
} }
std::string entry = return PrettyPrintValue(*TruncateContainedStrings(value.get()));
base::StringPrintf("[%.3lf][%s]: %s",
base::TimeDelta(timestamp - start_).InSecondsF(),
level_name,
ConvertForDisplay(message).c_str());
const char* format = "%s\n";
if (entry[entry.length() - 1] == '\n')
format = "%s";
fprintf(stderr, format, entry.c_str());
fflush(stderr);
} }
...@@ -10,15 +10,21 @@ ...@@ -10,15 +10,21 @@
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/time/time.h" #include "base/time/time.h"
namespace base {
class Value;
}
// Abstract class for logging entries with a level, timestamp, string message. // Abstract class for logging entries with a level, timestamp, string message.
class Log { class Log {
public: public:
// Log entry severity level. // Log entry severity level.
enum Level { enum Level {
kAll,
kDebug, kDebug,
kLog, kInfo,
kWarning, kWarning,
kError kError,
kOff
}; };
virtual ~Log() {} virtual ~Log() {}
...@@ -32,21 +38,18 @@ class Log { ...@@ -32,21 +38,18 @@ class Log {
void AddEntry(Level level, const std::string& message); void AddEntry(Level level, const std::string& message);
}; };
// Writes log entries using printf. typedef bool (*IsVLogOnFunc)(int vlog_level);
class Logger : public Log { void InitLogging(IsVLogOnFunc is_vlog_on_func);
public:
// Creates a logger with a minimum level of |kDebug|.
Logger();
explicit Logger(Level min_log_level);
virtual ~Logger();
virtual void AddEntryTimestamped(const base::Time& timestamp, // Returns whether the given VLOG level is on.
Level level, bool IsVLogOn(int vlog_level);
const std::string& message) OVERRIDE;
private: std::string PrettyPrintValue(const base::Value& value);
Level min_log_level_;
base::Time start_; // Returns a pretty printed value, after truncating long strings.
}; std::string FormatValueForDisplay(const base::Value& value);
// Returns a pretty printed json string, after truncating long strings.
std::string FormatJsonForDisplay(const std::string& json);
#endif // CHROME_TEST_CHROMEDRIVER_CHROME_LOG_H_ #endif // CHROME_TEST_CHROMEDRIVER_CHROME_LOG_H_
...@@ -60,6 +60,6 @@ Status PerformanceLogger::OnEvent( ...@@ -60,6 +60,6 @@ Status PerformanceLogger::OnEvent(
// Look at where it is for Page, Network, Timeline events. // Look at where it is for Page, Network, Timeline events.
base::JSONWriter::Write(&log_message_dict, &log_message_json); base::JSONWriter::Write(&log_message_dict, &log_message_json);
log_->AddEntry(Log::kLog, log_message_json); log_->AddEntry(Log::kInfo, log_message_json);
return Status(kOk); return Status(kOk);
} }
...@@ -117,7 +117,7 @@ scoped_ptr<DictionaryValue> ParseDictionary(const std::string& json) { ...@@ -117,7 +117,7 @@ scoped_ptr<DictionaryValue> ParseDictionary(const std::string& json) {
void ValidateLogEntry(const LogEntry *entry, void ValidateLogEntry(const LogEntry *entry,
const std::string& expected_webview, const std::string& expected_webview,
const std::string& expected_method) { const std::string& expected_method) {
EXPECT_EQ(Log::kLog, entry->level); EXPECT_EQ(Log::kInfo, entry->level);
EXPECT_LT(0, entry->timestamp.ToTimeT()); EXPECT_LT(0, entry->timestamp.ToTimeT());
scoped_ptr<base::DictionaryValue> message(ParseDictionary(entry->message)); scoped_ptr<base::DictionaryValue> message(ParseDictionary(entry->message));
......
// Copyright (c) 2013 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/chromedriver/chrome/util.h"
#include "base/json/json_writer.h"
#include "base/values.h"
std::string SerializeValue(const base::Value* value) {
std::string json;
base::JSONWriter::Write(value, &json);
return json;
}
// Copyright (c) 2013 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.
#ifndef CHROME_TEST_CHROMEDRIVER_CHROME_UTIL_H_
#define CHROME_TEST_CHROMEDRIVER_CHROME_UTIL_H_
#include <string>
namespace base {
class Value;
}
std::string SerializeValue(const base::Value* value);
#endif // CHROME_TEST_CHROMEDRIVER_CHROME_UTIL_H_
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "chrome/test/chromedriver/chrome/geolocation_override_manager.h" #include "chrome/test/chromedriver/chrome/geolocation_override_manager.h"
#include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h" #include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h"
#include "chrome/test/chromedriver/chrome/js.h" #include "chrome/test/chromedriver/chrome/js.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/navigation_tracker.h" #include "chrome/test/chromedriver/chrome/navigation_tracker.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/chrome/ui_events.h" #include "chrome/test/chromedriver/chrome/ui_events.h"
...@@ -112,8 +111,7 @@ const char* GetAsString(KeyEventType type) { ...@@ -112,8 +111,7 @@ const char* GetAsString(KeyEventType type) {
WebViewImpl::WebViewImpl(const std::string& id, WebViewImpl::WebViewImpl(const std::string& id,
int build_no, int build_no,
scoped_ptr<DevToolsClient> client, scoped_ptr<DevToolsClient> client)
Log* log)
: id_(id), : id_(id),
build_no_(build_no), build_no_(build_no),
dom_tracker_(new DomTracker(client.get())), dom_tracker_(new DomTracker(client.get())),
...@@ -122,8 +120,7 @@ WebViewImpl::WebViewImpl(const std::string& id, ...@@ -122,8 +120,7 @@ WebViewImpl::WebViewImpl(const std::string& id,
dialog_manager_(new JavaScriptDialogManager(client.get())), dialog_manager_(new JavaScriptDialogManager(client.get())),
geolocation_override_manager_( geolocation_override_manager_(
new GeolocationOverrideManager(client.get())), new GeolocationOverrideManager(client.get())),
client_(client.release()), client_(client.release()) {}
log_(log) {}
WebViewImpl::~WebViewImpl() {} WebViewImpl::~WebViewImpl() {}
...@@ -322,14 +319,14 @@ Status WebViewImpl::DeleteCookie(const std::string& name, ...@@ -322,14 +319,14 @@ Status WebViewImpl::DeleteCookie(const std::string& name,
Status WebViewImpl::WaitForPendingNavigations(const std::string& frame_id, Status WebViewImpl::WaitForPendingNavigations(const std::string& frame_id,
const base::TimeDelta& timeout, const base::TimeDelta& timeout,
bool stop_load_on_timeout) { bool stop_load_on_timeout) {
log_->AddEntry(Log::kLog, "waiting for pending navigations..."); VLOG(0) << "Waiting for pending navigations...";
Status status = client_->HandleEventsUntil( Status status = client_->HandleEventsUntil(
base::Bind(&WebViewImpl::IsNotPendingNavigation, base::Bind(&WebViewImpl::IsNotPendingNavigation,
base::Unretained(this), base::Unretained(this),
frame_id), frame_id),
timeout); timeout);
if (status.code() == kTimeout && stop_load_on_timeout) { if (status.code() == kTimeout && stop_load_on_timeout) {
log_->AddEntry(Log::kLog, "timed out. stopping navigations..."); VLOG(0) << "Timed out. Stopping navigation...";
scoped_ptr<base::Value> unused_value; scoped_ptr<base::Value> unused_value;
EvaluateScript(std::string(), "window.stop();", &unused_value); EvaluateScript(std::string(), "window.stop();", &unused_value);
Status new_status = client_->HandleEventsUntil( Status new_status = client_->HandleEventsUntil(
...@@ -339,7 +336,7 @@ Status WebViewImpl::WaitForPendingNavigations(const std::string& frame_id, ...@@ -339,7 +336,7 @@ Status WebViewImpl::WaitForPendingNavigations(const std::string& frame_id,
if (new_status.IsError()) if (new_status.IsError())
status = new_status; status = new_status;
} }
log_->AddEntry(Log::kLog, "done waiting for pending navigations"); VLOG(0) << "Done waiting for pending navigations";
return status; return status;
} }
......
...@@ -24,7 +24,6 @@ class DomTracker; ...@@ -24,7 +24,6 @@ class DomTracker;
class FrameTracker; class FrameTracker;
class GeolocationOverrideManager; class GeolocationOverrideManager;
struct KeyEvent; struct KeyEvent;
class Log;
struct MouseEvent; struct MouseEvent;
class NavigationTracker; class NavigationTracker;
class Status; class Status;
...@@ -33,8 +32,7 @@ class WebViewImpl : public WebView { ...@@ -33,8 +32,7 @@ class WebViewImpl : public WebView {
public: public:
WebViewImpl(const std::string& id, WebViewImpl(const std::string& id,
int build_no, int build_no,
scoped_ptr<DevToolsClient> client, scoped_ptr<DevToolsClient> client);
Log* log);
virtual ~WebViewImpl(); virtual ~WebViewImpl();
// Overridden from WebView: // Overridden from WebView:
...@@ -103,7 +101,6 @@ class WebViewImpl : public WebView { ...@@ -103,7 +101,6 @@ class WebViewImpl : public WebView {
scoped_ptr<JavaScriptDialogManager> dialog_manager_; scoped_ptr<JavaScriptDialogManager> dialog_manager_;
scoped_ptr<GeolocationOverrideManager> geolocation_override_manager_; scoped_ptr<GeolocationOverrideManager> geolocation_override_manager_;
scoped_ptr<DevToolsClient> client_; scoped_ptr<DevToolsClient> client_;
Log* log_;
}; };
namespace internal { namespace internal {
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include "chrome/test/chromedriver/chrome/device_manager.h" #include "chrome/test/chromedriver/chrome/device_manager.h"
#include "chrome/test/chromedriver/chrome/devtools_http_client.h" #include "chrome/test/chromedriver/chrome/devtools_http_client.h"
#include "chrome/test/chromedriver/chrome/embedded_automation_extension.h" #include "chrome/test/chromedriver/chrome/embedded_automation_extension.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/chrome/user_data_dir.h" #include "chrome/test/chromedriver/chrome/user_data_dir.h"
#include "chrome/test/chromedriver/chrome/version.h" #include "chrome/test/chromedriver/chrome/version.h"
...@@ -147,10 +146,9 @@ Status WaitForDevToolsAndCheckVersion( ...@@ -147,10 +146,9 @@ Status WaitForDevToolsAndCheckVersion(
const NetAddress& address, const NetAddress& address,
URLRequestContextGetter* context_getter, URLRequestContextGetter* context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
Log* log,
scoped_ptr<DevToolsHttpClient>* user_client) { scoped_ptr<DevToolsHttpClient>* user_client) {
scoped_ptr<DevToolsHttpClient> client(new DevToolsHttpClient( scoped_ptr<DevToolsHttpClient> client(new DevToolsHttpClient(
address, context_getter, socket_factory, log)); address, context_getter, socket_factory));
base::TimeTicks deadline = base::TimeTicks deadline =
base::TimeTicks::Now() + base::TimeDelta::FromSeconds(20); base::TimeTicks::Now() + base::TimeDelta::FromSeconds(20);
Status status = client->Init(deadline - base::TimeTicks::Now()); Status status = client->Init(deadline - base::TimeTicks::Now());
...@@ -178,14 +176,13 @@ Status WaitForDevToolsAndCheckVersion( ...@@ -178,14 +176,13 @@ Status WaitForDevToolsAndCheckVersion(
Status LaunchExistingChromeSession( Status LaunchExistingChromeSession(
URLRequestContextGetter* context_getter, URLRequestContextGetter* context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
Log* log,
const Capabilities& capabilities, const Capabilities& capabilities,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
scoped_ptr<Chrome>* chrome) { scoped_ptr<Chrome>* chrome) {
Status status(kOk); Status status(kOk);
scoped_ptr<DevToolsHttpClient> devtools_client; scoped_ptr<DevToolsHttpClient> devtools_client;
status = WaitForDevToolsAndCheckVersion( status = WaitForDevToolsAndCheckVersion(
capabilities.debugger_address, context_getter, socket_factory, log, capabilities.debugger_address, context_getter, socket_factory,
&devtools_client); &devtools_client);
if (status.IsError()) { if (status.IsError()) {
return Status(kUnknownError, "cannot connect to chrome at " + return Status(kUnknownError, "cannot connect to chrome at " +
...@@ -193,8 +190,7 @@ Status LaunchExistingChromeSession( ...@@ -193,8 +190,7 @@ Status LaunchExistingChromeSession(
status); status);
} }
chrome->reset(new ChromeExistingImpl(devtools_client.Pass(), chrome->reset(new ChromeExistingImpl(devtools_client.Pass(),
devtools_event_listeners, devtools_event_listeners));
log));
return Status(kOk); return Status(kOk);
} }
...@@ -202,7 +198,6 @@ Status LaunchDesktopChrome( ...@@ -202,7 +198,6 @@ Status LaunchDesktopChrome(
URLRequestContextGetter* context_getter, URLRequestContextGetter* context_getter,
int port, int port,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
Log* log,
const Capabilities& capabilities, const Capabilities& capabilities,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
scoped_ptr<Chrome>* chrome) { scoped_ptr<Chrome>* chrome) {
...@@ -233,14 +228,14 @@ Status LaunchDesktopChrome( ...@@ -233,14 +228,14 @@ Status LaunchDesktopChrome(
#else #else
std::string command_string = command.GetCommandLineString(); std::string command_string = command.GetCommandLineString();
#endif #endif
log->AddEntry(Log::kLog, "Launching chrome: " + command_string); VLOG(0) << "Launching chrome: " << command_string;
base::ProcessHandle process; base::ProcessHandle process;
if (!base::LaunchProcess(command, options, &process)) if (!base::LaunchProcess(command, options, &process))
return Status(kUnknownError, "chrome failed to start"); return Status(kUnknownError, "chrome failed to start");
scoped_ptr<DevToolsHttpClient> devtools_client; scoped_ptr<DevToolsHttpClient> devtools_client;
status = WaitForDevToolsAndCheckVersion( status = WaitForDevToolsAndCheckVersion(
NetAddress(port), context_getter, socket_factory, log, &devtools_client); NetAddress(port), context_getter, socket_factory, &devtools_client);
if (status.IsError()) { if (status.IsError()) {
int exit_code; int exit_code;
...@@ -279,7 +274,6 @@ Status LaunchDesktopChrome( ...@@ -279,7 +274,6 @@ Status LaunchDesktopChrome(
scoped_ptr<ChromeDesktopImpl> chrome_desktop( scoped_ptr<ChromeDesktopImpl> chrome_desktop(
new ChromeDesktopImpl(devtools_client.Pass(), new ChromeDesktopImpl(devtools_client.Pass(),
devtools_event_listeners, devtools_event_listeners,
log,
process, process,
&user_data_dir, &user_data_dir,
&extension_dir)); &extension_dir));
...@@ -302,7 +296,6 @@ Status LaunchAndroidChrome( ...@@ -302,7 +296,6 @@ Status LaunchAndroidChrome(
URLRequestContextGetter* context_getter, URLRequestContextGetter* context_getter,
int port, int port,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
Log* log,
const Capabilities& capabilities, const Capabilities& capabilities,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
DeviceManager* device_manager, DeviceManager* device_manager,
...@@ -336,13 +329,12 @@ Status LaunchAndroidChrome( ...@@ -336,13 +329,12 @@ Status LaunchAndroidChrome(
status = WaitForDevToolsAndCheckVersion(NetAddress(port), status = WaitForDevToolsAndCheckVersion(NetAddress(port),
context_getter, context_getter,
socket_factory, socket_factory,
log,
&devtools_client); &devtools_client);
if (status.IsError()) if (status.IsError())
return status; return status;
chrome->reset(new ChromeAndroidImpl( chrome->reset(new ChromeAndroidImpl(
devtools_client.Pass(), devtools_event_listeners, device.Pass(), log)); devtools_client.Pass(), devtools_event_listeners, device.Pass()));
return Status(kOk); return Status(kOk);
} }
...@@ -351,7 +343,6 @@ Status LaunchAndroidChrome( ...@@ -351,7 +343,6 @@ Status LaunchAndroidChrome(
Status LaunchChrome( Status LaunchChrome(
URLRequestContextGetter* context_getter, URLRequestContextGetter* context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
Log* log,
DeviceManager* device_manager, DeviceManager* device_manager,
const Capabilities& capabilities, const Capabilities& capabilities,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
...@@ -359,7 +350,7 @@ Status LaunchChrome( ...@@ -359,7 +350,7 @@ Status LaunchChrome(
if (capabilities.IsExistingBrowser()) { if (capabilities.IsExistingBrowser()) {
return LaunchExistingChromeSession( return LaunchExistingChromeSession(
context_getter, socket_factory, context_getter, socket_factory,
log, capabilities, devtools_event_listeners, chrome); capabilities, devtools_event_listeners, chrome);
} }
int port; int port;
...@@ -368,11 +359,11 @@ Status LaunchChrome( ...@@ -368,11 +359,11 @@ Status LaunchChrome(
if (capabilities.IsAndroid()) { if (capabilities.IsAndroid()) {
return LaunchAndroidChrome( return LaunchAndroidChrome(
context_getter, port, socket_factory, log, capabilities, context_getter, port, socket_factory, capabilities,
devtools_event_listeners, device_manager, chrome); devtools_event_listeners, device_manager, chrome);
} else { } else {
return LaunchDesktopChrome( return LaunchDesktopChrome(
context_getter, port, socket_factory, log, capabilities, context_getter, port, socket_factory, capabilities,
devtools_event_listeners, chrome); devtools_event_listeners, chrome);
} }
} }
......
...@@ -24,14 +24,12 @@ class FilePath; ...@@ -24,14 +24,12 @@ class FilePath;
class Chrome; class Chrome;
class DeviceManager; class DeviceManager;
class Log;
class Status; class Status;
class URLRequestContextGetter; class URLRequestContextGetter;
Status LaunchChrome( Status LaunchChrome(
URLRequestContextGetter* context_getter, URLRequestContextGetter* context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
Log* log,
DeviceManager* device_manager, DeviceManager* device_manager,
const Capabilities& capabilities, const Capabilities& capabilities,
ScopedVector<DevToolsEventListener>& devtools_event_listeners, ScopedVector<DevToolsEventListener>& devtools_event_listeners,
......
...@@ -56,13 +56,11 @@ void ExecuteGetStatus( ...@@ -56,13 +56,11 @@ void ExecuteGetStatus(
} }
NewSessionParams::NewSessionParams( NewSessionParams::NewSessionParams(
Log* log,
SessionThreadMap* session_thread_map, SessionThreadMap* session_thread_map,
scoped_refptr<URLRequestContextGetter> context_getter, scoped_refptr<URLRequestContextGetter> context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
DeviceManager* device_manager) DeviceManager* device_manager)
: log(log), : session_thread_map(session_thread_map),
session_thread_map(session_thread_map),
context_getter(context_getter), context_getter(context_getter),
socket_factory(socket_factory), socket_factory(socket_factory),
device_manager(device_manager) {} device_manager(device_manager) {}
...@@ -84,22 +82,24 @@ Status CreateSessionOnSessionThreadHelper( ...@@ -84,22 +82,24 @@ Status CreateSessionOnSessionThreadHelper(
return Status(kUnknownError, "cannot find dict 'desiredCapabilities'"); return Status(kUnknownError, "cannot find dict 'desiredCapabilities'");
Capabilities capabilities; Capabilities capabilities;
Status status = capabilities.Parse(*desired_caps, bound_params.log); Status status = capabilities.Parse(*desired_caps);
if (status.IsError()) if (status.IsError())
return status; return status;
// Create Log's and DevToolsEventListener's for ones that are DevTools-based. // Create Log's and DevToolsEventListener's for ones that are DevTools-based.
// Session will own the Log's, Chrome will own the listeners. // Session will own the Log's, Chrome will own the listeners.
ScopedVector<WebDriverLog> devtools_logs; ScopedVector<WebDriverLog> devtools_logs;
// TODO(kkania): Save this log in the session.
scoped_ptr<WebDriverLog> driver_log;
ScopedVector<DevToolsEventListener> devtools_event_listeners; ScopedVector<DevToolsEventListener> devtools_event_listeners;
status = CreateLogs(capabilities, &devtools_logs, &devtools_event_listeners); status = CreateLogs(
capabilities, &devtools_logs, &driver_log, &devtools_event_listeners);
if (status.IsError()) if (status.IsError())
return status; return status;
scoped_ptr<Chrome> chrome; scoped_ptr<Chrome> chrome;
status = LaunchChrome(bound_params.context_getter.get(), status = LaunchChrome(bound_params.context_getter.get(),
bound_params.socket_factory, bound_params.socket_factory,
bound_params.log,
bound_params.device_manager, bound_params.device_manager,
capabilities, capabilities,
devtools_event_listeners, devtools_event_listeners,
......
...@@ -20,7 +20,6 @@ class Value; ...@@ -20,7 +20,6 @@ class Value;
} }
class DeviceManager; class DeviceManager;
class Log;
struct Session; struct Session;
class Status; class Status;
class URLRequestContextGetter; class URLRequestContextGetter;
...@@ -32,14 +31,12 @@ void ExecuteGetStatus( ...@@ -32,14 +31,12 @@ void ExecuteGetStatus(
const CommandCallback& callback); const CommandCallback& callback);
struct NewSessionParams { struct NewSessionParams {
NewSessionParams(Log* log, NewSessionParams(SessionThreadMap* session_thread_map,
SessionThreadMap* session_thread_map,
scoped_refptr<URLRequestContextGetter> context_getter, scoped_refptr<URLRequestContextGetter> context_getter,
const SyncWebSocketFactory& socket_factory, const SyncWebSocketFactory& socket_factory,
DeviceManager* device_manager); DeviceManager* device_manager);
~NewSessionParams(); ~NewSessionParams();
Log* log;
SessionThreadMap* session_thread_map; SessionThreadMap* session_thread_map;
scoped_refptr<URLRequestContextGetter> context_getter; scoped_refptr<URLRequestContextGetter> context_getter;
SyncWebSocketFactory socket_factory; SyncWebSocketFactory socket_factory;
......
This diff is collapsed.
...@@ -22,26 +22,13 @@ class Status; ...@@ -22,26 +22,13 @@ class Status;
// See https://code.google.com/p/selenium/wiki/Logging. // See https://code.google.com/p/selenium/wiki/Logging.
class WebDriverLog : public Log { class WebDriverLog : public Log {
public: public:
// Constants corresponding to log entry severity levels in the wire protocol. // Converts WD wire protocol level name -> Level, false on bad name.
enum WebDriverLevel { static bool NameToLevel(const std::string& name, Level* out_level);
kWdAll,
kWdDebug,
kWdInfo,
kWdWarning,
kWdSevere,
kWdOff
};
// Converts WD wire protocol level name -> WebDriverLevel, false on bad name.
static bool NameToLevel(const std::string& name, WebDriverLevel* out_level);
// Creates a WebDriverLog with the given type and minimum level. // Creates a WebDriverLog with the given type and minimum level.
WebDriverLog(const std::string& type, WebDriverLevel min_wd_level); WebDriverLog(const std::string& type, Level min_level);
virtual ~WebDriverLog(); virtual ~WebDriverLog();
// Returns this log's type, for the WD wire protocol "/log" and "/log/types".
const std::string& GetType();
// Returns entries accumulated so far, as a ListValue ready for serialization // Returns entries accumulated so far, as a ListValue ready for serialization
// into the wire protocol response to the "/log" command. // into the wire protocol response to the "/log" command.
// The caller assumes ownership of the ListValue, and the WebDriverLog // The caller assumes ownership of the ListValue, and the WebDriverLog
...@@ -53,17 +40,24 @@ class WebDriverLog : public Log { ...@@ -53,17 +40,24 @@ class WebDriverLog : public Log {
Level level, Level level,
const std::string& message) OVERRIDE; const std::string& message) OVERRIDE;
const std::string& type() const;
Level min_level() const;
private: private:
const std::string type_; // WebDriver log type. const std::string type_; // WebDriver log type.
const WebDriverLevel min_wd_level_; // Minimum level of entries to store. const Level min_level_; // Minimum level of entries to store.
scoped_ptr<base::ListValue> entries_; // Accumulated entries. scoped_ptr<base::ListValue> entries_; // Accumulated entries.
DISALLOW_COPY_AND_ASSIGN(WebDriverLog); DISALLOW_COPY_AND_ASSIGN(WebDriverLog);
}; };
// Creates Log's and DevToolsEventListener's for ones that are DevTools-based. // Initializes logging system for ChromeDriver. Returns true on success.
bool InitLogging();
// Creates Log's and DevToolsEventListener's based on logging preferences.
Status CreateLogs(const Capabilities& capabilities, Status CreateLogs(const Capabilities& capabilities,
ScopedVector<WebDriverLog>* out_devtools_logs, ScopedVector<WebDriverLog>* out_logs,
scoped_ptr<WebDriverLog>* out_driver_log,
ScopedVector<DevToolsEventListener>* out_listeners); ScopedVector<DevToolsEventListener>* out_listeners);
#endif // CHROME_TEST_CHROMEDRIVER_LOGGING_H_ #endif // CHROME_TEST_CHROMEDRIVER_LOGGING_H_
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/test/chromedriver/logging.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/test/chromedriver/capabilities.h" #include "chrome/test/chromedriver/capabilities.h"
#include "chrome/test/chromedriver/chrome/devtools_event_listener.h" #include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/logging.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace { namespace {
...@@ -21,17 +21,15 @@ const char* const kAllWdLevels[] = { ...@@ -21,17 +21,15 @@ const char* const kAllWdLevels[] = {
TEST(Logging, NameLevelConversionHappy) { TEST(Logging, NameLevelConversionHappy) {
// All names map to a valid enum value. // All names map to a valid enum value.
for (int i = 0; static_cast<size_t>(i) < arraysize(kAllWdLevels); ++i) { for (int i = 0; static_cast<size_t>(i) < arraysize(kAllWdLevels); ++i) {
WebDriverLog::WebDriverLevel level = Log::Level level = static_cast<Log::Level>(-1);
static_cast<WebDriverLog::WebDriverLevel>(-1);
EXPECT_TRUE(WebDriverLog::NameToLevel(kAllWdLevels[i], &level)); EXPECT_TRUE(WebDriverLog::NameToLevel(kAllWdLevels[i], &level));
EXPECT_LE(WebDriverLog::kWdAll, level); EXPECT_LE(Log::kAll, level);
EXPECT_GE(WebDriverLog::kWdOff, level); EXPECT_GE(Log::kOff, level);
} }
} }
TEST(Logging, NameToLevelErrors) { TEST(Logging, NameToLevelErrors) {
WebDriverLog::WebDriverLevel level = Log::Level level = static_cast<Log::Level>(-1);
static_cast<WebDriverLog::WebDriverLevel>(-1);
EXPECT_FALSE(WebDriverLog::NameToLevel("A", &level)); EXPECT_FALSE(WebDriverLog::NameToLevel("A", &level));
EXPECT_FALSE(WebDriverLog::NameToLevel("B", &level)); EXPECT_FALSE(WebDriverLog::NameToLevel("B", &level));
EXPECT_FALSE(WebDriverLog::NameToLevel("H", &level)); EXPECT_FALSE(WebDriverLog::NameToLevel("H", &level));
...@@ -39,7 +37,7 @@ TEST(Logging, NameToLevelErrors) { ...@@ -39,7 +37,7 @@ TEST(Logging, NameToLevelErrors) {
EXPECT_FALSE(WebDriverLog::NameToLevel("T", &level)); EXPECT_FALSE(WebDriverLog::NameToLevel("T", &level));
EXPECT_FALSE(WebDriverLog::NameToLevel("Z", &level)); EXPECT_FALSE(WebDriverLog::NameToLevel("Z", &level));
// The level variable was never modified. // The level variable was never modified.
EXPECT_EQ(static_cast<WebDriverLog::WebDriverLevel>(-1), level); EXPECT_EQ(static_cast<Log::Level>(-1), level);
} }
namespace { namespace {
...@@ -61,11 +59,11 @@ void ValidateLogEntry(base::ListValue *entries, ...@@ -61,11 +59,11 @@ void ValidateLogEntry(base::ListValue *entries,
EXPECT_LT(0, timestamp); EXPECT_LT(0, timestamp);
} }
} } // namespace
TEST(WebDriverLog, Levels) { TEST(WebDriverLog, Levels) {
WebDriverLog log("type", WebDriverLog::kWdInfo); WebDriverLog log("type", Log::kInfo);
log.AddEntry(Log::kLog, std::string("info message")); log.AddEntry(Log::kInfo, std::string("info message"));
log.AddEntry(Log::kError, "severe message"); log.AddEntry(Log::kError, "severe message");
log.AddEntry(Log::kDebug, "debug message"); // Must not log log.AddEntry(Log::kDebug, "debug message"); // Must not log
...@@ -77,7 +75,7 @@ TEST(WebDriverLog, Levels) { ...@@ -77,7 +75,7 @@ TEST(WebDriverLog, Levels) {
} }
TEST(WebDriverLog, Off) { TEST(WebDriverLog, Off) {
WebDriverLog log("type", WebDriverLog::kWdOff); WebDriverLog log("type", Log::kOff);
log.AddEntry(Log::kError, "severe message"); // Must not log log.AddEntry(Log::kError, "severe message"); // Must not log
log.AddEntry(Log::kDebug, "debug message"); // Must not log log.AddEntry(Log::kDebug, "debug message"); // Must not log
...@@ -87,7 +85,7 @@ TEST(WebDriverLog, Off) { ...@@ -87,7 +85,7 @@ TEST(WebDriverLog, Off) {
} }
TEST(WebDriverLog, All) { TEST(WebDriverLog, All) {
WebDriverLog log("type", WebDriverLog::kWdAll); WebDriverLog log("type", Log::kAll);
log.AddEntry(Log::kError, "severe message"); log.AddEntry(Log::kError, "severe message");
log.AddEntry(Log::kDebug, "debug message"); log.AddEntry(Log::kDebug, "debug message");
...@@ -100,67 +98,45 @@ TEST(WebDriverLog, All) { ...@@ -100,67 +98,45 @@ TEST(WebDriverLog, All) {
TEST(Logging, CreatePerformanceLog) { TEST(Logging, CreatePerformanceLog) {
Capabilities capabilities; Capabilities capabilities;
capabilities.logging_prefs.reset(new base::DictionaryValue()); capabilities.logging_prefs["performance"] = Log::kInfo;
capabilities.logging_prefs->SetString("performance", "INFO"); capabilities.logging_prefs["browser"] = Log::kInfo;
ScopedVector<DevToolsEventListener> listeners; ScopedVector<DevToolsEventListener> listeners;
ScopedVector<WebDriverLog> logs; ScopedVector<WebDriverLog> logs;
Status status = CreateLogs(capabilities, &logs, &listeners); scoped_ptr<WebDriverLog> driver_log;
Status status = CreateLogs(capabilities, &logs, &driver_log, &listeners);
ASSERT_TRUE(status.IsOk()); ASSERT_TRUE(status.IsOk());
ASSERT_EQ(2u, logs.size()); ASSERT_EQ(2u, logs.size());
ASSERT_EQ(2u, listeners.size()); ASSERT_EQ(2u, listeners.size());
ASSERT_EQ("performance", logs[0]->GetType()); ASSERT_EQ("performance", logs[0]->type());
ASSERT_EQ("browser", logs[1]->GetType()); // Always created. ASSERT_EQ("browser", logs[1]->type());
} ASSERT_EQ("driver", driver_log->type());
TEST(Logging, CreateBrowserLogOff) {
Capabilities capabilities;
capabilities.logging_prefs.reset(new base::DictionaryValue());
capabilities.logging_prefs->SetString("browser", "OFF");
ScopedVector<DevToolsEventListener> listeners;
ScopedVector<WebDriverLog> logs;
Status status = CreateLogs(capabilities, &logs, &listeners);
ASSERT_TRUE(status.IsOk());
ASSERT_EQ(1u, logs.size());
ASSERT_EQ(0u, listeners.size());
ASSERT_EQ("browser", logs[0]->GetType());
// Verify the created log is "OFF" -- drops all messages.
logs[0]->AddEntry(Log::kError, "drop even errors");
scoped_ptr<base::ListValue> entries(logs[0]->GetAndClearEntries());
ASSERT_EQ(0u, entries->GetSize());
} }
TEST(Logging, IgnoreUnknownLogType) { TEST(Logging, IgnoreUnknownLogType) {
Capabilities capabilities; Capabilities capabilities;
capabilities.logging_prefs.reset(new base::DictionaryValue()); capabilities.logging_prefs["gaga"] = Log::kInfo;
capabilities.logging_prefs->SetString("gaga", "INFO");
ScopedVector<DevToolsEventListener> listeners; ScopedVector<DevToolsEventListener> listeners;
ScopedVector<WebDriverLog> logs; ScopedVector<WebDriverLog> logs;
Status status = CreateLogs(capabilities, &logs, &listeners); scoped_ptr<WebDriverLog> driver_log;
Status status = CreateLogs(capabilities, &logs, &driver_log, &listeners);
EXPECT_TRUE(status.IsOk()); EXPECT_TRUE(status.IsOk());
ASSERT_EQ(1u, logs.size()); ASSERT_EQ(1u, logs.size());
ASSERT_EQ(1u, listeners.size()); ASSERT_EQ(0u, listeners.size());
ASSERT_EQ("browser", logs[0]->GetType()); ASSERT_EQ("browser", logs[0]->type());
} }
TEST(Logging, BrowserLogCreatedWithoutLoggingPrefs) { TEST(Logging, DefaultLogs) {
Capabilities capabilities; Capabilities capabilities;
ScopedVector<DevToolsEventListener> listeners; ScopedVector<DevToolsEventListener> listeners;
ScopedVector<WebDriverLog> logs; ScopedVector<WebDriverLog> logs;
Status status = CreateLogs(capabilities, &logs, &listeners); scoped_ptr<WebDriverLog> driver_log;
Status status = CreateLogs(capabilities, &logs, &driver_log, &listeners);
EXPECT_TRUE(status.IsOk()); EXPECT_TRUE(status.IsOk());
ASSERT_EQ(1u, logs.size()); ASSERT_EQ(1u, logs.size());
ASSERT_EQ(1u, listeners.size()); ASSERT_EQ(0u, listeners.size());
ASSERT_EQ("browser", logs[0]->GetType()); ASSERT_EQ("driver", driver_log->type());
ASSERT_EQ(Log::kWarning, driver_log->min_level());
// Verify the created "browser" log is "INFO" level.
logs[0]->AddEntry(Log::kLog, "info message");
logs[0]->AddEntry(Log::kDebug, "drop debug message");
scoped_ptr<base::ListValue> entries(logs[0]->GetAndClearEntries());
ASSERT_EQ(1u, entries->GetSize());
ValidateLogEntry(entries.get(), 0, "INFO", "info message");
} }
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
#include "base/synchronization/waitable_event.h" #include "base/synchronization/waitable_event.h"
#include "base/threading/thread.h" #include "base/threading/thread.h"
#include "base/threading/thread_local.h" #include "base/threading/thread_local.h"
#include "chrome/test/chromedriver/chrome/log.h"
#include "chrome/test/chromedriver/chrome/version.h" #include "chrome/test/chromedriver/chrome/version.h"
#include "chrome/test/chromedriver/logging.h"
#include "chrome/test/chromedriver/server/http_handler.h" #include "chrome/test/chromedriver/server/http_handler.h"
#include "net/base/ip_endpoint.h" #include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
...@@ -32,11 +32,6 @@ ...@@ -32,11 +32,6 @@
#include "net/server/http_server_response_info.h" #include "net/server/http_server_response_info.h"
#include "net/socket/tcp_listen_socket.h" #include "net/socket/tcp_listen_socket.h"
#if defined(OS_POSIX)
#include <fcntl.h>
#include <unistd.h>
#endif
namespace { namespace {
typedef base::Callback< typedef base::Callback<
...@@ -139,18 +134,15 @@ void StartServerOnIOThread(int port, ...@@ -139,18 +134,15 @@ void StartServerOnIOThread(int port,
lazy_tls_server.Pointer()->Set(temp_server.release()); lazy_tls_server.Pointer()->Set(temp_server.release());
} }
void RunServer(Log::Level log_level, int port, const std::string& url_base, void RunServer(int port, const std::string& url_base, int adb_port) {
int adb_port) {
base::Thread io_thread("ChromeDriver IO"); base::Thread io_thread("ChromeDriver IO");
CHECK(io_thread.StartWithOptions( CHECK(io_thread.StartWithOptions(
base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
base::MessageLoop cmd_loop; base::MessageLoop cmd_loop;
base::RunLoop cmd_run_loop; base::RunLoop cmd_run_loop;
Logger log(log_level);
HttpHandler handler(cmd_run_loop.QuitClosure(), HttpHandler handler(cmd_run_loop.QuitClosure(),
io_thread.message_loop_proxy(), io_thread.message_loop_proxy(),
&log,
url_base, url_base,
adb_port); adb_port);
HttpRequestHandlerFunc handle_request_func = HttpRequestHandlerFunc handle_request_func =
...@@ -185,8 +177,6 @@ int main(int argc, char *argv[]) { ...@@ -185,8 +177,6 @@ int main(int argc, char *argv[]) {
int port = 9515; int port = 9515;
int adb_port = 5037; int adb_port = 5037;
std::string url_base; std::string url_base;
base::FilePath log_path;
Log::Level log_level = Log::kError;
if (cmd_line->HasSwitch("h") || cmd_line->HasSwitch("help")) { if (cmd_line->HasSwitch("h") || cmd_line->HasSwitch("help")) {
std::string options; std::string options;
const char* kOptionAndDescriptions[] = { const char* kOptionAndDescriptions[] = {
...@@ -225,47 +215,17 @@ int main(int argc, char *argv[]) { ...@@ -225,47 +215,17 @@ int main(int argc, char *argv[]) {
url_base = "/" + url_base; url_base = "/" + url_base;
if (url_base[url_base.length() - 1] != '/') if (url_base[url_base.length() - 1] != '/')
url_base = url_base + "/"; url_base = url_base + "/";
if (cmd_line->HasSwitch("log-path")) {
log_level = Log::kLog;
log_path = cmd_line->GetSwitchValuePath("log-path");
#if defined(OS_WIN)
FILE* redir_stderr = _wfreopen(log_path.value().c_str(), L"w", stderr);
#else
FILE* redir_stderr = freopen(log_path.value().c_str(), "w", stderr);
#endif
if (!redir_stderr) {
printf("Failed to redirect stderr to log file. Exiting...\n");
return 1;
}
}
if (cmd_line->HasSwitch("verbose")) {
log_level = Log::kDebug;
} else {
#if defined(OS_POSIX)
// Close stderr on exec, so that Chrome log spew doesn't confuse users.
fcntl(STDERR_FILENO, F_SETFD, FD_CLOEXEC);
#endif
}
if (!cmd_line->HasSwitch("silent")) { if (!cmd_line->HasSwitch("silent")) {
printf( printf(
"Starting ChromeDriver (v%s) on port %d\n", kChromeDriverVersion, port); "Starting ChromeDriver (v%s) on port %d\n", kChromeDriverVersion, port);
fflush(stdout); fflush(stdout);
} }
if (!InitLogging()) {
logging::LoggingSettings settings; printf("Unable to initialize logging. Exiting...\n");
settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; return 1;
bool success = logging::InitLogging(settings);
if (!success) {
PLOG(ERROR) << "Unable to initialize logging";
} }
logging::SetLogItems(false, // enable_process_id
false, // enable_thread_id
false, // enable_timestamp
false); // enable_tickcount
if (!cmd_line->HasSwitch("verbose"))
logging::SetMinLogLevel(logging::LOG_FATAL);
RunServer(log_level, port, url_base, adb_port); RunServer(port, url_base, adb_port);
return 0; return 0;
} }
...@@ -56,9 +56,8 @@ CommandMapping::CommandMapping(HttpMethod method, ...@@ -56,9 +56,8 @@ CommandMapping::CommandMapping(HttpMethod method,
CommandMapping::~CommandMapping() {} CommandMapping::~CommandMapping() {}
HttpHandler::HttpHandler(Log* log, const std::string& url_base) HttpHandler::HttpHandler(const std::string& url_base)
: log_(log), : url_base_(url_base),
url_base_(url_base),
received_shutdown_(false), received_shutdown_(false),
command_map_(new CommandMap()), command_map_(new CommandMap()),
weak_ptr_factory_(this) {} weak_ptr_factory_(this) {}
...@@ -66,11 +65,9 @@ HttpHandler::HttpHandler(Log* log, const std::string& url_base) ...@@ -66,11 +65,9 @@ HttpHandler::HttpHandler(Log* log, const std::string& url_base)
HttpHandler::HttpHandler( HttpHandler::HttpHandler(
const base::Closure& quit_func, const base::Closure& quit_func,
const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
Log* log,
const std::string& url_base, const std::string& url_base,
int adb_port) int adb_port)
: quit_func_(quit_func), : quit_func_(quit_func),
log_(log),
url_base_(url_base), url_base_(url_base),
received_shutdown_(false), received_shutdown_(false),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
...@@ -79,15 +76,14 @@ HttpHandler::HttpHandler( ...@@ -79,15 +76,14 @@ HttpHandler::HttpHandler(
#endif #endif
context_getter_ = new URLRequestContextGetter(io_task_runner); context_getter_ = new URLRequestContextGetter(io_task_runner);
socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get()); socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get());
adb_.reset(new AdbImpl(io_task_runner, log_, adb_port)); adb_.reset(new AdbImpl(io_task_runner, adb_port));
device_manager_.reset(new DeviceManager(adb_.get())); device_manager_.reset(new DeviceManager(adb_.get()));
CommandMapping commands[] = { CommandMapping commands[] = {
CommandMapping(kPost, CommandMapping(kPost,
internal::kNewSessionPathPattern, internal::kNewSessionPathPattern,
base::Bind(&ExecuteNewSession, base::Bind(&ExecuteNewSession,
NewSessionParams(log_, NewSessionParams(&session_thread_map_,
&session_thread_map_,
context_getter_, context_getter_,
socket_factory_, socket_factory_,
device_manager_.get()))), device_manager_.get()))),
...@@ -491,11 +487,10 @@ void HttpHandler::HandleCommand( ...@@ -491,11 +487,10 @@ void HttpHandler::HandleCommand(
const net::HttpServerRequestInfo& request, const net::HttpServerRequestInfo& request,
const std::string& trimmed_path, const std::string& trimmed_path,
const HttpResponseSenderFunc& send_response_func) { const HttpResponseSenderFunc& send_response_func) {
log_->AddEntry(Log::kLog, if (IsVLogOn(0)) {
base::StringPrintf("handling command: %s %s %s", VLOG(0) << "Handling command: " << request.method << " " << trimmed_path
request.method.c_str(), << " " << FormatJsonForDisplay(request.data);
trimmed_path.c_str(), }
request.data.c_str()));
base::DictionaryValue params; base::DictionaryValue params;
std::string session_id; std::string session_id;
...@@ -545,10 +540,10 @@ void HttpHandler::PrepareResponse( ...@@ -545,10 +540,10 @@ void HttpHandler::PrepareResponse(
CHECK(thread_checker_.CalledOnValidThread()); CHECK(thread_checker_.CalledOnValidThread());
scoped_ptr<net::HttpServerResponseInfo> response = scoped_ptr<net::HttpServerResponseInfo> response =
PrepareResponseHelper(trimmed_path, status, value.Pass(), session_id); PrepareResponseHelper(trimmed_path, status, value.Pass(), session_id);
log_->AddEntry(Log::kLog, if (IsVLogOn(0)) {
base::StringPrintf("sending response: %d %s", VLOG(0) << "Sending response: " << response->status_code() << " "
response->status_code(), << FormatJsonForDisplay(response->body());
response->body().c_str())); }
send_response_func.Run(response.Pass()); send_response_func.Run(response.Pass());
if (trimmed_path == kShutdownPath) if (trimmed_path == kShutdownPath)
quit_func_.Run(); quit_func_.Run();
......
...@@ -35,7 +35,6 @@ class HttpServerResponseInfo; ...@@ -35,7 +35,6 @@ class HttpServerResponseInfo;
class Adb; class Adb;
class DeviceManager; class DeviceManager;
class Log;
class URLRequestContextGetter; class URLRequestContextGetter;
enum HttpMethod { enum HttpMethod {
...@@ -60,10 +59,9 @@ typedef base::Callback<void(scoped_ptr<net::HttpServerResponseInfo>)> ...@@ -60,10 +59,9 @@ typedef base::Callback<void(scoped_ptr<net::HttpServerResponseInfo>)>
class HttpHandler { class HttpHandler {
public: public:
HttpHandler(Log* log, const std::string& url_base); explicit HttpHandler(const std::string& url_base);
HttpHandler(const base::Closure& quit_func, HttpHandler(const base::Closure& quit_func,
const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
Log* log,
const std::string& url_base, const std::string& url_base,
int adb_port); int adb_port);
~HttpHandler(); ~HttpHandler();
...@@ -98,7 +96,6 @@ class HttpHandler { ...@@ -98,7 +96,6 @@ class HttpHandler {
base::ThreadChecker thread_checker_; base::ThreadChecker thread_checker_;
base::Closure quit_func_; base::Closure quit_func_;
Log* log_;
std::string url_base_; std::string url_base_;
bool received_shutdown_; bool received_shutdown_;
scoped_refptr<URLRequestContextGetter> context_getter_; scoped_refptr<URLRequestContextGetter> context_getter_;
......
...@@ -37,8 +37,7 @@ void OnResponse(net::HttpServerResponseInfo* response_to_set, ...@@ -37,8 +37,7 @@ void OnResponse(net::HttpServerResponseInfo* response_to_set,
} // namespace } // namespace
TEST(HttpHandlerTest, HandleOutsideOfBaseUrl) { TEST(HttpHandlerTest, HandleOutsideOfBaseUrl) {
Logger log; HttpHandler handler("base/url/");
HttpHandler handler(&log, "base/url/");
net::HttpServerRequestInfo request; net::HttpServerRequestInfo request;
request.method = "get"; request.method = "get";
request.path = "base/path"; request.path = "base/path";
...@@ -49,8 +48,7 @@ TEST(HttpHandlerTest, HandleOutsideOfBaseUrl) { ...@@ -49,8 +48,7 @@ TEST(HttpHandlerTest, HandleOutsideOfBaseUrl) {
} }
TEST(HttpHandlerTest, HandleUnknownCommand) { TEST(HttpHandlerTest, HandleUnknownCommand) {
Logger log; HttpHandler handler("/");
HttpHandler handler(&log, "/");
net::HttpServerRequestInfo request; net::HttpServerRequestInfo request;
request.method = "get"; request.method = "get";
request.path = "/path"; request.path = "/path";
...@@ -60,8 +58,7 @@ TEST(HttpHandlerTest, HandleUnknownCommand) { ...@@ -60,8 +58,7 @@ TEST(HttpHandlerTest, HandleUnknownCommand) {
} }
TEST(HttpHandlerTest, HandleNewSession) { TEST(HttpHandlerTest, HandleNewSession) {
Logger log; HttpHandler handler("/base/");
HttpHandler handler(&log, "/base/");
handler.command_map_.reset(new HttpHandler::CommandMap()); handler.command_map_.reset(new HttpHandler::CommandMap());
handler.command_map_->push_back( handler.command_map_->push_back(
CommandMapping(kPost, internal::kNewSessionPathPattern, CommandMapping(kPost, internal::kNewSessionPathPattern,
...@@ -78,8 +75,7 @@ TEST(HttpHandlerTest, HandleNewSession) { ...@@ -78,8 +75,7 @@ TEST(HttpHandlerTest, HandleNewSession) {
} }
TEST(HttpHandlerTest, HandleInvalidPost) { TEST(HttpHandlerTest, HandleInvalidPost) {
Logger log; HttpHandler handler("/");
HttpHandler handler(&log, "/");
handler.command_map_->push_back( handler.command_map_->push_back(
CommandMapping(kPost, "path", base::Bind(&DummyCommand, Status(kOk)))); CommandMapping(kPost, "path", base::Bind(&DummyCommand, Status(kOk))));
net::HttpServerRequestInfo request; net::HttpServerRequestInfo request;
...@@ -92,8 +88,7 @@ TEST(HttpHandlerTest, HandleInvalidPost) { ...@@ -92,8 +88,7 @@ TEST(HttpHandlerTest, HandleInvalidPost) {
} }
TEST(HttpHandlerTest, HandleUnimplementedCommand) { TEST(HttpHandlerTest, HandleUnimplementedCommand) {
Logger log; HttpHandler handler("/");
HttpHandler handler(&log, "/");
handler.command_map_->push_back( handler.command_map_->push_back(
CommandMapping(kPost, "path", CommandMapping(kPost, "path",
base::Bind(&DummyCommand, Status(kUnknownCommand)))); base::Bind(&DummyCommand, Status(kUnknownCommand))));
...@@ -106,8 +101,7 @@ TEST(HttpHandlerTest, HandleUnimplementedCommand) { ...@@ -106,8 +101,7 @@ TEST(HttpHandlerTest, HandleUnimplementedCommand) {
} }
TEST(HttpHandlerTest, HandleCommand) { TEST(HttpHandlerTest, HandleCommand) {
Logger log; HttpHandler handler("/");
HttpHandler handler(&log, "/");
handler.command_map_->push_back( handler.command_map_->push_back(
CommandMapping(kPost, "path", base::Bind(&DummyCommand, Status(kOk)))); CommandMapping(kPost, "path", base::Bind(&DummyCommand, Status(kOk))));
net::HttpServerRequestInfo request; net::HttpServerRequestInfo request;
......
...@@ -389,7 +389,7 @@ Status ExecuteGetAvailableLogTypes( ...@@ -389,7 +389,7 @@ Status ExecuteGetAvailableLogTypes(
for (ScopedVector<WebDriverLog>::const_iterator log for (ScopedVector<WebDriverLog>::const_iterator log
= session->devtools_logs.begin(); = session->devtools_logs.begin();
log != session->devtools_logs.end(); ++log) { log != session->devtools_logs.end(); ++log) {
types->AppendString((*log)->GetType()); types->AppendString((*log)->type());
} }
value->reset(types.release()); value->reset(types.release());
return Status(kOk); return Status(kOk);
...@@ -406,7 +406,7 @@ Status ExecuteGetLog( ...@@ -406,7 +406,7 @@ Status ExecuteGetLog(
for (ScopedVector<WebDriverLog>::const_iterator log for (ScopedVector<WebDriverLog>::const_iterator log
= session->devtools_logs.begin(); = session->devtools_logs.begin();
log != session->devtools_logs.end(); ++log) { log != session->devtools_logs.end(); ++log) {
if (log_type == (*log)->GetType()) { if (log_type == (*log)->type()) {
scoped_ptr<base::ListValue> log_entries = (*log)->GetAndClearEntries(); scoped_ptr<base::ListValue> log_entries = (*log)->GetAndClearEntries();
value->reset(log_entries.release()); value->reset(log_entries.release());
return Status(kOk); return Status(kOk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment