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/file_util.h" 10#include "base/files/file_path.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(file_util::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