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)#include "base/values.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/chromedriver/capabilities.h"
7b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/log.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/test/chromedriver/command_listener.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/chromedriver/logging.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/chromedriver/session.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace {
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char* const kAllWdLevels[] = {
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  "ALL", "DEBUG", "INFO", "WARNING", "SEVERE", "OFF"
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
21b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(Logging, NameLevelConversionHappy) {
24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // All names map to a valid enum value.
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  for (int i = 0; static_cast<size_t>(i) < arraysize(kAllWdLevels); ++i) {
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Log::Level level = static_cast<Log::Level>(-1);
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EXPECT_TRUE(WebDriverLog::NameToLevel(kAllWdLevels[i], &level));
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_LE(Log::kAll, level);
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_GE(Log::kOff, level);
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(Logging, NameToLevelErrors) {
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Log::Level level = static_cast<Log::Level>(-1);
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(WebDriverLog::NameToLevel("A", &level));
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(WebDriverLog::NameToLevel("B", &level));
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(WebDriverLog::NameToLevel("H", &level));
38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(WebDriverLog::NameToLevel("R", &level));
39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(WebDriverLog::NameToLevel("T", &level));
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(WebDriverLog::NameToLevel("Z", &level));
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The level variable was never modified.
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(static_cast<Log::Level>(-1), level);
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace {
46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void ValidateLogEntry(base::ListValue *entries,
48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                      int index,
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      const std::string& expected_level,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      const std::string& expected_message) {
51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const base::DictionaryValue *entry;
52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(entries->GetDictionary(index, &entry));
53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string level;
54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(entry->GetString("level", &level));
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(expected_level, level);
56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::string message;
57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(entry->GetString("message", &message));
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(expected_message, message);
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  double timestamp = 0;
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(entry->GetDouble("timestamp", &timestamp));
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_LT(0, timestamp);
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(WebDriverLog, Levels) {
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebDriverLog log("type", Log::kInfo);
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  log.AddEntry(Log::kInfo, std::string("info message"));
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  log.AddEntry(Log::kError, "severe message");
70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  log.AddEntry(Log::kDebug, "debug message");  // Must not log
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<base::ListValue> entries(log.GetAndClearEntries());
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
74b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(2u, entries->GetSize());
75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ValidateLogEntry(entries.get(), 0, "INFO", "info message");
76b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ValidateLogEntry(entries.get(), 1, "SEVERE", "severe message");
77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
78b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(WebDriverLog, Off) {
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebDriverLog log("type", Log::kOff);
81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  log.AddEntry(Log::kError, "severe message");  // Must not log
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  log.AddEntry(Log::kDebug, "debug message");  // Must not log
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<base::ListValue> entries(log.GetAndClearEntries());
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(0u, entries->GetSize());
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(WebDriverLog, All) {
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebDriverLog log("type", Log::kAll);
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  log.AddEntry(Log::kError, "severe message");
92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  log.AddEntry(Log::kDebug, "debug message");
93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_ptr<base::ListValue> entries(log.GetAndClearEntries());
95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(2u, entries->GetSize());
97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ValidateLogEntry(entries.get(), 0, "SEVERE", "severe message");
98b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ValidateLogEntry(entries.get(), 1, "DEBUG", "debug message");
99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(Logging, CreatePerformanceLog) {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Session session("test");
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  capabilities.logging_prefs["performance"] = Log::kInfo;
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  capabilities.logging_prefs["browser"] = Log::kInfo;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<DevToolsEventListener> devtools_listeners;
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedVector<WebDriverLog> logs;
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<CommandListener> command_listeners;
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status status = CreateLogs(capabilities, &session, &logs, &devtools_listeners,
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             &command_listeners);
112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(2u, logs.size());
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(2u, devtools_listeners.size());
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, command_listeners.size());
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("performance", logs[0]->type());
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("browser", logs[1]->type());
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST(Logging, IgnoreUnknownLogType) {
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Session session("test");
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  capabilities.logging_prefs["gaga"] = Log::kInfo;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<DevToolsEventListener> devtools_listeners;
126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedVector<WebDriverLog> logs;
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<CommandListener> command_listeners;
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status status = CreateLogs(capabilities, &session, &logs, &devtools_listeners,
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             &command_listeners);
130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(status.IsOk());
131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(1u, logs.size());
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, devtools_listeners.size());
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(0u, command_listeners.size());
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("browser", logs[0]->type());
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Logging, DefaultLogs) {
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Capabilities capabilities;
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Session session("test");
140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<DevToolsEventListener> devtools_listeners;
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedVector<WebDriverLog> logs;
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScopedVector<CommandListener> command_listeners;
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status status = CreateLogs(capabilities, &session, &logs, &devtools_listeners,
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             &command_listeners);
146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(status.IsOk());
147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(1u, logs.size());
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, devtools_listeners.size());
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(0u, command_listeners.size());
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ("browser", logs[0]->type());
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(Logging, GetFirstErrorMessage) {
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebDriverLog log(WebDriverLog::kBrowserType, Log::kAll);
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string entry;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry = log.GetFirstErrorMessage();
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(entry.empty());
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  log.AddEntry(Log::kInfo, "info message");
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  log.AddEntry(Log::kError, "first error message");
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  log.AddEntry(Log::kDebug, "debug message");
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  log.AddEntry(Log::kError, "second error message");
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry = log.GetFirstErrorMessage();
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ("first error message", entry);
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
168