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", ×tamp)); 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