1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_TEST_CHROMEDRIVER_LOGGING_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_TEST_CHROMEDRIVER_LOGGING_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include <string>
9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/basictypes.h"
11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_vector.h"
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/values.h"
14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/log.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct Capabilities;
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CommandListener;
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class DevToolsEventListener;
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class ListValue;
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct Session;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Status;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Accumulates WebDriver Logging API entries of a given type and minimum level.
24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// See https://code.google.com/p/selenium/wiki/Logging.
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class WebDriverLog : public Log {
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kBrowserType[];
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kDriverType[];
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kPerformanceType[];
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Converts WD wire protocol level name -> Level, false on bad name.
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static bool NameToLevel(const std::string& name, Level* out_level);
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Creates a WebDriverLog with the given type and minimum level.
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebDriverLog(const std::string& type, Level min_level);
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual ~WebDriverLog();
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Returns entries accumulated so far, as a ListValue ready for serialization
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // into the wire protocol response to the "/log" command.
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The caller assumes ownership of the ListValue, and the WebDriverLog
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // creates and owns a new empty ListValue for further accumulation.
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<base::ListValue> GetAndClearEntries();
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Finds the first error message in the log and returns it. If none exist,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // returns an empty string. Does not clear entries.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string GetFirstErrorMessage() const;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Translates a Log entry level into a WebDriver level and stores the entry.
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void AddEntryTimestamped(const base::Time& timestamp,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   Level level,
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   const std::string& source,
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   const std::string& message) OVERRIDE;
53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string& type() const;
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void set_min_level(Level min_level);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Level min_level() const;
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string type_;  // WebDriver log type.
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Level min_level_;  // Minimum level of entries to store.
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<base::ListValue> entries_;  // Accumulated entries.
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDriverLog);
64b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Initializes logging system for ChromeDriver. Returns true on success.
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool InitLogging();
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Creates |Log|s, |DevToolsEventListener|s, and |CommandListener|s based on
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// logging preferences.
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)Status CreateLogs(const Capabilities& capabilities,
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                  const Session* session,
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  ScopedVector<WebDriverLog>* out_logs,
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  ScopedVector<DevToolsEventListener>* out_devtools_listeners,
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  ScopedVector<CommandListener>* out_command_listeners);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_TEST_CHROMEDRIVER_LOGGING_H_
78