| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/test/chromedriver/logging.h" | 5 #include "chrome/test/chromedriver/logging.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 case logging::LOG_WARNING: | 70 case logging::LOG_WARNING: |
| 71 return Log::kWarning; | 71 return Log::kWarning; |
| 72 case logging::LOG_INFO: | 72 case logging::LOG_INFO: |
| 73 return Log::kInfo; | 73 return Log::kInfo; |
| 74 case logging::LOG_VERBOSE: | 74 case logging::LOG_VERBOSE: |
| 75 default: | 75 default: |
| 76 return Log::kDebug; | 76 return Log::kDebug; |
| 77 } | 77 } |
| 78 } | 78 } |
| 79 | 79 |
| 80 WebDriverLog* GetSessionLog() { |
| 81 Session* session = GetThreadLocalSession(); |
| 82 if (!session) |
| 83 return NULL; |
| 84 return session->driver_log.get(); |
| 85 } |
| 86 |
| 80 bool InternalIsVLogOn(int vlog_level) { | 87 bool InternalIsVLogOn(int vlog_level) { |
| 81 return GetLevelFromSeverity(vlog_level * -1) >= g_log_level; | 88 WebDriverLog* session_log = GetSessionLog(); |
| 89 Log::Level session_level = session_log ? session_log->min_level() : Log::kOff; |
| 90 Log::Level level = g_log_level < session_level ? g_log_level : session_level; |
| 91 return GetLevelFromSeverity(vlog_level * -1) >= level; |
| 82 } | 92 } |
| 83 | 93 |
| 84 bool HandleLogMessage(int severity, | 94 bool HandleLogMessage(int severity, |
| 85 const char* file, | 95 const char* file, |
| 86 int line, | 96 int line, |
| 87 size_t message_start, | 97 size_t message_start, |
| 88 const std::string& str) { | 98 const std::string& str) { |
| 89 Log::Level level = GetLevelFromSeverity(severity); | 99 Log::Level level = GetLevelFromSeverity(severity); |
| 90 if (level < g_log_level) | 100 std::string message = str.substr(message_start); |
| 91 return true; | |
| 92 | 101 |
| 93 std::string message = str.substr(message_start); | 102 if (level >= g_log_level) { |
| 94 const char* level_name = "UNKNOWN"; | 103 const char* level_name = LevelToName(level); |
| 95 switch (level) { | 104 std::string entry = base::StringPrintf( |
| 96 case Log::kDebug: | 105 "[%.3lf][%s]: %s", |
| 97 level_name = "DEBUG"; | 106 base::TimeDelta(base::TimeTicks::Now() - |
| 98 break; | 107 base::TimeTicks::FromInternalValue(g_start_time)) |
| 99 case Log::kInfo: | 108 .InSecondsF(), |
| 100 level_name = "INFO"; | 109 level_name, |
| 101 break; | 110 message.c_str()); |
| 102 case Log::kWarning: | 111 fprintf(stderr, "%s", entry.c_str()); |
| 103 level_name = "WARNING"; | 112 fflush(stderr); |
| 104 break; | |
| 105 case Log::kError: | |
| 106 level_name = "ERROR"; | |
| 107 break; | |
| 108 default: | |
| 109 break; | |
| 110 } | 113 } |
| 111 std::string entry = base::StringPrintf( | |
| 112 "[%.3lf][%s]: %s", | |
| 113 base::TimeDelta(base::TimeTicks::Now() - | |
| 114 base::TimeTicks::FromInternalValue(g_start_time)) | |
| 115 .InSecondsF(), | |
| 116 level_name, | |
| 117 message.c_str()); | |
| 118 | 114 |
| 119 fprintf(stderr, "%s", entry.c_str()); | 115 WebDriverLog* session_log = GetSessionLog(); |
| 120 fflush(stderr); | 116 if (session_log) |
| 117 session_log->AddEntry(level, message); |
| 118 |
| 121 return true; | 119 return true; |
| 122 } | 120 } |
| 123 | 121 |
| 124 } // namespace | 122 } // namespace |
| 125 | 123 |
| 124 const char WebDriverLog::kBrowserType[] = "browser"; |
| 125 const char WebDriverLog::kDriverType[] = "driver"; |
| 126 const char WebDriverLog::kPerformanceType[] = "performance"; |
| 127 |
| 126 bool WebDriverLog::NameToLevel(const std::string& name, Log::Level* out_level) { | 128 bool WebDriverLog::NameToLevel(const std::string& name, Log::Level* out_level) { |
| 127 for (size_t i = 0; i < arraysize(kNameToLevel); ++i) { | 129 for (size_t i = 0; i < arraysize(kNameToLevel); ++i) { |
| 128 if (name == kNameToLevel[i].name) { | 130 if (name == kNameToLevel[i].name) { |
| 129 *out_level = kNameToLevel[i].level; | 131 *out_level = kNameToLevel[i].level; |
| 130 return true; | 132 return true; |
| 131 } | 133 } |
| 132 } | 134 } |
| 133 return false; | 135 return false; |
| 134 } | 136 } |
| 135 | 137 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 159 static_cast<int64>(timestamp.ToJsTime())); | 161 static_cast<int64>(timestamp.ToJsTime())); |
| 160 log_entry_dict->SetString("level", LevelToName(level)); | 162 log_entry_dict->SetString("level", LevelToName(level)); |
| 161 log_entry_dict->SetString("message", message); | 163 log_entry_dict->SetString("message", message); |
| 162 entries_->Append(log_entry_dict.release()); | 164 entries_->Append(log_entry_dict.release()); |
| 163 } | 165 } |
| 164 | 166 |
| 165 const std::string& WebDriverLog::type() const { | 167 const std::string& WebDriverLog::type() const { |
| 166 return type_; | 168 return type_; |
| 167 } | 169 } |
| 168 | 170 |
| 171 void WebDriverLog::set_min_level(Level min_level) { |
| 172 min_level_ = min_level; |
| 173 } |
| 174 |
| 169 Log::Level WebDriverLog::min_level() const { | 175 Log::Level WebDriverLog::min_level() const { |
| 170 return min_level_; | 176 return min_level_; |
| 171 } | 177 } |
| 172 | 178 |
| 173 bool InitLogging() { | 179 bool InitLogging() { |
| 174 InitLogging(&InternalIsVLogOn); | 180 InitLogging(&InternalIsVLogOn); |
| 175 g_start_time = base::TimeTicks::Now().ToInternalValue(); | 181 g_start_time = base::TimeTicks::Now().ToInternalValue(); |
| 176 | 182 |
| 177 CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 183 CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
| 178 if (cmd_line->HasSwitch("log-path")) { | 184 if (cmd_line->HasSwitch("log-path")) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 false); // enable_tickcount | 216 false); // enable_tickcount |
| 211 logging::SetLogMessageHandler(&HandleLogMessage); | 217 logging::SetLogMessageHandler(&HandleLogMessage); |
| 212 | 218 |
| 213 logging::LoggingSettings logging_settings; | 219 logging::LoggingSettings logging_settings; |
| 214 logging_settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; | 220 logging_settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; |
| 215 return logging::InitLogging(logging_settings); | 221 return logging::InitLogging(logging_settings); |
| 216 } | 222 } |
| 217 | 223 |
| 218 Status CreateLogs(const Capabilities& capabilities, | 224 Status CreateLogs(const Capabilities& capabilities, |
| 219 ScopedVector<WebDriverLog>* out_logs, | 225 ScopedVector<WebDriverLog>* out_logs, |
| 220 scoped_ptr<WebDriverLog>* out_driver_log, | |
| 221 ScopedVector<DevToolsEventListener>* out_listeners) { | 226 ScopedVector<DevToolsEventListener>* out_listeners) { |
| 222 ScopedVector<WebDriverLog> logs; | 227 ScopedVector<WebDriverLog> logs; |
| 223 ScopedVector<DevToolsEventListener> listeners; | 228 ScopedVector<DevToolsEventListener> listeners; |
| 224 Log::Level browser_log_level = Log::kOff; | 229 Log::Level browser_log_level = Log::kOff; |
| 225 Log::Level driver_log_level = Log::kWarning; | |
| 226 const LoggingPrefs& prefs = capabilities.logging_prefs; | 230 const LoggingPrefs& prefs = capabilities.logging_prefs; |
| 227 | 231 |
| 228 const char kBrowserLogType[] = "browser"; | |
| 229 const char kDriverLogType[] = "driver"; | |
| 230 for (LoggingPrefs::const_iterator iter = prefs.begin(); | 232 for (LoggingPrefs::const_iterator iter = prefs.begin(); |
| 231 iter != prefs.end(); | 233 iter != prefs.end(); |
| 232 ++iter) { | 234 ++iter) { |
| 233 std::string type = iter->first; | 235 std::string type = iter->first; |
| 234 Log::Level level = iter->second; | 236 Log::Level level = iter->second; |
| 235 if (type == "performance") { | 237 if (type == WebDriverLog::kPerformanceType) { |
| 236 if (level != Log::kOff) { | 238 if (level != Log::kOff) { |
| 237 WebDriverLog* log = new WebDriverLog(type, Log::kAll); | 239 WebDriverLog* log = new WebDriverLog(type, Log::kAll); |
| 238 logs.push_back(log); | 240 logs.push_back(log); |
| 239 listeners.push_back(new PerformanceLogger(log)); | 241 listeners.push_back(new PerformanceLogger(log)); |
| 240 } | 242 } |
| 241 } else if (type == kBrowserLogType) { | 243 } else if (type == WebDriverLog::kBrowserType) { |
| 242 browser_log_level = level; | 244 browser_log_level = level; |
| 243 } else if (type == kDriverLogType) { | 245 } else if (type != WebDriverLog::kDriverType) { |
| 244 driver_log_level = level; | |
| 245 } else { | |
| 246 // Driver "should" ignore unrecognized log types, per Selenium tests. | 246 // Driver "should" ignore unrecognized log types, per Selenium tests. |
| 247 // For example the Java client passes the "client" log type in the caps, | 247 // For example the Java client passes the "client" log type in the caps, |
| 248 // which the server should never provide. | 248 // which the server should never provide. |
| 249 LOG(WARNING) << "Ignoring unrecognized log type: " << type; | 249 LOG(WARNING) << "Ignoring unrecognized log type: " << type; |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 // Create "browser" log -- should always exist. | 252 // Create "browser" log -- should always exist. |
| 253 WebDriverLog* browser_log = | 253 WebDriverLog* browser_log = |
| 254 new WebDriverLog(kBrowserLogType, browser_log_level); | 254 new WebDriverLog(WebDriverLog::kBrowserType, browser_log_level); |
| 255 logs.push_back(browser_log); | 255 logs.push_back(browser_log); |
| 256 // If the level is OFF, don't even bother listening for DevTools events. | 256 // If the level is OFF, don't even bother listening for DevTools events. |
| 257 if (browser_log_level != Log::kOff) | 257 if (browser_log_level != Log::kOff) |
| 258 listeners.push_back(new ConsoleLogger(browser_log)); | 258 listeners.push_back(new ConsoleLogger(browser_log)); |
| 259 | 259 |
| 260 // Create "driver" log -- should always exist. | |
| 261 scoped_ptr<WebDriverLog> driver_log( | |
| 262 new WebDriverLog(kDriverLogType, driver_log_level)); | |
| 263 | |
| 264 out_logs->swap(logs); | 260 out_logs->swap(logs); |
| 265 *out_driver_log = driver_log.Pass(); | |
| 266 out_listeners->swap(listeners); | 261 out_listeners->swap(listeners); |
| 267 return Status(kOk); | 262 return Status(kOk); |
| 268 } | 263 } |
| OLD | NEW |