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