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 |