12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// found in the LICENSE file. 42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi#include <string> 62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/bind.h" 82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/callback.h" 92228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/files/file_path.h" 102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/files/file_util.h" 112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/memory/linked_ptr.h" 122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/memory/scoped_ptr.h" 132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/message_loop/message_loop.h" 142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/run_loop.h" 152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/threading/thread.h" 162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "base/values.h" 172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "chrome/test/chromedriver/chrome/status.h" 182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "chrome/test/chromedriver/chrome/stub_chrome.h" 192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "chrome/test/chromedriver/commands.h" 202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "chrome/test/chromedriver/session.h" 212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "chrome/test/chromedriver/session_commands.h" 222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "testing/gtest/include/gtest/gtest.h" 232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 242228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTEST(SessionCommandTest, FileUpload) { 252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Session session("id"); 262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project base::DictionaryValue params; 272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scoped_ptr<base::Value> value; 282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // Zip file entry that contains a single file with contents 'COW\n', base64 292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // encoded following RFC 1521. 302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const char* kBase64ZipEntry = 312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project "UEsDBBQAAAAAAMROi0K/wAzGBAAAAAQAAAADAAAAbW9vQ09XClBLAQIUAxQAAAAAAMROi0K/" 322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project "wAzG\nBAAAAAQAAAADAAAAAAAAAAAAAACggQAAAABtb29QSwUGAAAAAAEAAQAxAAAAJQAAAA" 332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project "AA\n"; 342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project params.SetString("file", kBase64ZipEntry); 352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Status status = ExecuteUploadFile(&session, params, &value); 362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, status.code()) << status.message(); 372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project base::FilePath::StringType path; 382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(value->GetAsString(&path)); 392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(base::PathExists(base::FilePath(path))); 402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project std::string data; 412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(base::ReadFileToString(base::FilePath(path), &data)); 422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_STREQ("COW\n", data.c_str()); 432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectnamespace { 462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectclass DetachChrome : public StubChrome { 482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project public: 492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project DetachChrome() : quit_called_(false) {} 502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project virtual ~DetachChrome() {} 512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // Overridden from Chrome: 532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project virtual Status Quit() OVERRIDE { 542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project quit_called_ = true; 552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return Status(kOk); 562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bool quit_called_; 592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} // namespace 622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 632228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTEST(SessionCommandsTest, Quit) { 642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project DetachChrome* chrome = new DetachChrome(); 652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Session session("id", scoped_ptr<Chrome>(chrome)); 662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project base::DictionaryValue params; 682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scoped_ptr<base::Value> value; 692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, ExecuteQuit(false, &session, params, &value).code()); 712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(chrome->quit_called_); 722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project chrome->quit_called_ = false; 742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, ExecuteQuit(true, &session, params, &value).code()); 752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(chrome->quit_called_); 762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 782228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTEST(SessionCommandsTest, QuitWithDetach) { 792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project DetachChrome* chrome = new DetachChrome(); 802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Session session("id", scoped_ptr<Chrome>(chrome)); 812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project session.detach = true; 822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project base::DictionaryValue params; 842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scoped_ptr<base::Value> value; 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 867ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi ASSERT_EQ(kOk, ExecuteQuit(true, &session, params, &value).code()); 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_FALSE(chrome->quit_called_); 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, ExecuteQuit(false, &session, params, &value).code()); 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(chrome->quit_called_); 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectnamespace { 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectclass FailsToQuitChrome : public StubChrome { 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project public: 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FailsToQuitChrome() {} 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project virtual ~FailsToQuitChrome() {} 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // Overridden from Chrome: 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project virtual Status Quit() OVERRIDE { 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return Status(kUnknownError); 1037ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi } 1047ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi}; 1057ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi 1067ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi} // namespace 1077ad97579f8ccb843afdb5b184c4b209253839fe3Jean-Michel Trivi 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTEST(SessionCommandsTest, QuitFails) { 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Session session("id", scoped_ptr<Chrome>(new FailsToQuitChrome())); 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project base::DictionaryValue params; 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scoped_ptr<base::Value> value; 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kUnknownError, ExecuteQuit(false, &session, params, &value).code()); 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectTEST(SessionCommandsTest, AutoReporting) { 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project DetachChrome* chrome = new DetachChrome(); 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Session session("id", scoped_ptr<Chrome>(chrome)); 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project base::DictionaryValue params; 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project scoped_ptr<base::Value> value; 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project StatusCode status_code; 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bool enabled; 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // autoreporting should be disabled by default 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project status_code = ExecuteIsAutoReporting(&session, params, &value).code(); 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, status_code); 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_FALSE(session.auto_reporting_enabled); 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_FALSE(enabled); 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // an error should be given if the |enabled| parameter is not set 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project status_code = ExecuteSetAutoReporting(&session, params, &value).code(); 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kUnknownError, status_code); 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // try to enable autoreporting 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project params.SetBoolean("enabled", true); 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project status_code = ExecuteSetAutoReporting(&session, params, &value).code(); 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, status_code); 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(session.auto_reporting_enabled); 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // check that autoreporting was enabled successfully 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project status_code = ExecuteIsAutoReporting(&session, params, &value).code(); 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, status_code); 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(enabled); 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // try to disable autoreporting 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project params.SetBoolean("enabled", false); 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project status_code = ExecuteSetAutoReporting(&session, params, &value).code(); 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, status_code); 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_FALSE(session.auto_reporting_enabled); 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // check that autoreporting was disabled successfully 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project status_code = ExecuteIsAutoReporting(&session, params, &value).code(); 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_EQ(kOk, status_code); 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ASSERT_FALSE(enabled); 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project