1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <string> 6 7#include "base/bind.h" 8#include "base/callback.h" 9#include "base/files/file_path.h" 10#include "base/files/file_util.h" 11#include "base/memory/linked_ptr.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/message_loop/message_loop.h" 14#include "base/run_loop.h" 15#include "base/threading/thread.h" 16#include "base/values.h" 17#include "chrome/test/chromedriver/chrome/status.h" 18#include "chrome/test/chromedriver/chrome/stub_chrome.h" 19#include "chrome/test/chromedriver/commands.h" 20#include "chrome/test/chromedriver/session.h" 21#include "chrome/test/chromedriver/session_commands.h" 22#include "testing/gtest/include/gtest/gtest.h" 23 24TEST(SessionCommandTest, FileUpload) { 25 Session session("id"); 26 base::DictionaryValue params; 27 scoped_ptr<base::Value> value; 28 // Zip file entry that contains a single file with contents 'COW\n', base64 29 // encoded following RFC 1521. 30 const char* kBase64ZipEntry = 31 "UEsDBBQAAAAAAMROi0K/wAzGBAAAAAQAAAADAAAAbW9vQ09XClBLAQIUAxQAAAAAAMROi0K/" 32 "wAzG\nBAAAAAQAAAADAAAAAAAAAAAAAACggQAAAABtb29QSwUGAAAAAAEAAQAxAAAAJQAAAA" 33 "AA\n"; 34 params.SetString("file", kBase64ZipEntry); 35 Status status = ExecuteUploadFile(&session, params, &value); 36 ASSERT_EQ(kOk, status.code()) << status.message(); 37 base::FilePath::StringType path; 38 ASSERT_TRUE(value->GetAsString(&path)); 39 ASSERT_TRUE(base::PathExists(base::FilePath(path))); 40 std::string data; 41 ASSERT_TRUE(base::ReadFileToString(base::FilePath(path), &data)); 42 ASSERT_STREQ("COW\n", data.c_str()); 43} 44 45namespace { 46 47class DetachChrome : public StubChrome { 48 public: 49 DetachChrome() : quit_called_(false) {} 50 virtual ~DetachChrome() {} 51 52 // Overridden from Chrome: 53 virtual Status Quit() OVERRIDE { 54 quit_called_ = true; 55 return Status(kOk); 56 } 57 58 bool quit_called_; 59}; 60 61} // namespace 62 63TEST(SessionCommandsTest, Quit) { 64 DetachChrome* chrome = new DetachChrome(); 65 Session session("id", scoped_ptr<Chrome>(chrome)); 66 67 base::DictionaryValue params; 68 scoped_ptr<base::Value> value; 69 70 ASSERT_EQ(kOk, ExecuteQuit(false, &session, params, &value).code()); 71 ASSERT_TRUE(chrome->quit_called_); 72 73 chrome->quit_called_ = false; 74 ASSERT_EQ(kOk, ExecuteQuit(true, &session, params, &value).code()); 75 ASSERT_TRUE(chrome->quit_called_); 76} 77 78TEST(SessionCommandsTest, QuitWithDetach) { 79 DetachChrome* chrome = new DetachChrome(); 80 Session session("id", scoped_ptr<Chrome>(chrome)); 81 session.detach = true; 82 83 base::DictionaryValue params; 84 scoped_ptr<base::Value> value; 85 86 ASSERT_EQ(kOk, ExecuteQuit(true, &session, params, &value).code()); 87 ASSERT_FALSE(chrome->quit_called_); 88 89 ASSERT_EQ(kOk, ExecuteQuit(false, &session, params, &value).code()); 90 ASSERT_TRUE(chrome->quit_called_); 91} 92 93namespace { 94 95class FailsToQuitChrome : public StubChrome { 96 public: 97 FailsToQuitChrome() {} 98 virtual ~FailsToQuitChrome() {} 99 100 // Overridden from Chrome: 101 virtual Status Quit() OVERRIDE { 102 return Status(kUnknownError); 103 } 104}; 105 106} // namespace 107 108TEST(SessionCommandsTest, QuitFails) { 109 Session session("id", scoped_ptr<Chrome>(new FailsToQuitChrome())); 110 base::DictionaryValue params; 111 scoped_ptr<base::Value> value; 112 ASSERT_EQ(kUnknownError, ExecuteQuit(false, &session, params, &value).code()); 113} 114 115TEST(SessionCommandsTest, AutoReporting) { 116 DetachChrome* chrome = new DetachChrome(); 117 Session session("id", scoped_ptr<Chrome>(chrome)); 118 base::DictionaryValue params; 119 scoped_ptr<base::Value> value; 120 StatusCode status_code; 121 bool enabled; 122 123 // autoreporting should be disabled by default 124 status_code = ExecuteIsAutoReporting(&session, params, &value).code(); 125 ASSERT_EQ(kOk, status_code); 126 ASSERT_FALSE(session.auto_reporting_enabled); 127 ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); 128 ASSERT_FALSE(enabled); 129 130 // an error should be given if the |enabled| parameter is not set 131 status_code = ExecuteSetAutoReporting(&session, params, &value).code(); 132 ASSERT_EQ(kUnknownError, status_code); 133 134 // try to enable autoreporting 135 params.SetBoolean("enabled", true); 136 status_code = ExecuteSetAutoReporting(&session, params, &value).code(); 137 ASSERT_EQ(kOk, status_code); 138 ASSERT_TRUE(session.auto_reporting_enabled); 139 140 // check that autoreporting was enabled successfully 141 status_code = ExecuteIsAutoReporting(&session, params, &value).code(); 142 ASSERT_EQ(kOk, status_code); 143 ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); 144 ASSERT_TRUE(enabled); 145 146 // try to disable autoreporting 147 params.SetBoolean("enabled", false); 148 status_code = ExecuteSetAutoReporting(&session, params, &value).code(); 149 ASSERT_EQ(kOk, status_code); 150 ASSERT_FALSE(session.auto_reporting_enabled); 151 152 // check that autoreporting was disabled successfully 153 status_code = ExecuteIsAutoReporting(&session, params, &value).code(); 154 ASSERT_EQ(kOk, status_code); 155 ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); 156 ASSERT_FALSE(enabled); 157} 158