Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: chrome/test/chromedriver/logging.cc

Issue 23467010: [chromedriver] Logging tweaks and fixes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/test/chromedriver/logging.h ('k') | chrome/test/chromedriver/logging_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/test/chromedriver/logging.h ('k') | chrome/test/chromedriver/logging_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698