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/callback.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/values.h"
10#include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h"
11#include "chrome/test/chromedriver/chrome/status.h"
12#include "chrome/test/chromedriver/chrome/stub_devtools_client.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15TEST(JavaScriptDialogManager, NoDialog) {
16  StubDevToolsClient client;
17  JavaScriptDialogManager manager(&client);
18  std::string message("HI");
19  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
20  ASSERT_FALSE(manager.IsDialogOpen());
21  ASSERT_STREQ("HI", message.c_str());
22  ASSERT_EQ(kNoAlertOpen, manager.HandleDialog(false, NULL).code());
23}
24
25namespace {
26
27class RecorderDevToolsClient : public StubDevToolsClient {
28 public:
29  RecorderDevToolsClient() {}
30  virtual ~RecorderDevToolsClient() {}
31
32  // Overridden from StubDevToolsClient:
33  virtual Status SendCommandAndGetResult(
34      const std::string& method,
35      const base::DictionaryValue& params,
36      scoped_ptr<base::DictionaryValue>* result) OVERRIDE {
37    method_ = method;
38    params_.Clear();
39    params_.MergeDictionary(&params);
40    return Status(kOk);
41  }
42
43  std::string method_;
44  base::DictionaryValue params_;
45};
46
47}  // namespace
48
49TEST(JavaScriptDialogManager, HandleDialogPassesParams) {
50  RecorderDevToolsClient client;
51  JavaScriptDialogManager manager(&client);
52  base::DictionaryValue params;
53  params.SetString("message", "hi");
54  ASSERT_EQ(
55      kOk,
56      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
57  std::string given_text("text");
58  ASSERT_EQ(kOk, manager.HandleDialog(false, &given_text).code());
59  std::string text;
60  client.params_.GetString("promptText", &text);
61  ASSERT_EQ(given_text, text);
62  ASSERT_TRUE(client.params_.HasKey("accept"));
63}
64
65TEST(JavaScriptDialogManager, HandleDialogNullPrompt) {
66  RecorderDevToolsClient client;
67  JavaScriptDialogManager manager(&client);
68  base::DictionaryValue params;
69  params.SetString("message", "hi");
70  ASSERT_EQ(
71      kOk,
72      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
73  ASSERT_EQ(kOk, manager.HandleDialog(false, NULL).code());
74  ASSERT_FALSE(client.params_.HasKey("promptText"));
75  ASSERT_TRUE(client.params_.HasKey("accept"));
76}
77
78TEST(JavaScriptDialogManager, ReconnectClearsStateAndSendsEnable) {
79  RecorderDevToolsClient client;
80  JavaScriptDialogManager manager(&client);
81  base::DictionaryValue params;
82  params.SetString("message", "hi");
83  ASSERT_EQ(
84      kOk,
85      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
86  ASSERT_TRUE(manager.IsDialogOpen());
87  std::string message;
88  ASSERT_EQ(kOk, manager.GetDialogMessage(&message).code());
89
90  ASSERT_TRUE(manager.OnConnected(&client).IsOk());
91  ASSERT_EQ("Page.enable", client.method_);
92  ASSERT_FALSE(manager.IsDialogOpen());
93  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
94  ASSERT_EQ(kNoAlertOpen, manager.HandleDialog(false, NULL).code());
95}
96
97namespace {
98
99class FakeDevToolsClient : public StubDevToolsClient {
100 public:
101  FakeDevToolsClient() : listener_(NULL), closing_count_(0) {}
102  virtual ~FakeDevToolsClient() {}
103
104  void set_closing_count(int closing_count) {
105    closing_count_ = closing_count;
106  }
107
108  // Overridden from StubDevToolsClient:
109  virtual Status SendCommandAndGetResult(
110      const std::string& method,
111      const base::DictionaryValue& params,
112      scoped_ptr<base::DictionaryValue>* result) OVERRIDE {
113    while (closing_count_ > 0) {
114      base::DictionaryValue empty;
115      Status status =
116          listener_->OnEvent(this, "Page.javascriptDialogClosing", empty);
117      if (status.IsError())
118        return status;
119      closing_count_--;
120    }
121    return Status(kOk);
122  }
123  virtual void AddListener(DevToolsEventListener* listener) OVERRIDE {
124    listener_ = listener;
125  }
126
127 private:
128  DevToolsEventListener* listener_;
129  int closing_count_;
130};
131
132}  // namespace
133
134TEST(JavaScriptDialogManager, OneDialog) {
135  FakeDevToolsClient client;
136  JavaScriptDialogManager manager(&client);
137  base::DictionaryValue params;
138  params.SetString("message", "hi");
139  ASSERT_FALSE(manager.IsDialogOpen());
140  std::string message;
141  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
142
143  ASSERT_EQ(
144      kOk,
145      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
146  ASSERT_TRUE(manager.IsDialogOpen());
147  ASSERT_EQ(kOk, manager.GetDialogMessage(&message).code());
148  ASSERT_EQ("hi", message);
149
150  client.set_closing_count(1);
151  ASSERT_EQ(kOk, manager.HandleDialog(false, NULL).code());
152  ASSERT_FALSE(manager.IsDialogOpen());
153  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
154  ASSERT_EQ(kNoAlertOpen, manager.HandleDialog(false, NULL).code());
155}
156
157TEST(JavaScriptDialogManager, TwoDialogs) {
158  FakeDevToolsClient client;
159  JavaScriptDialogManager manager(&client);
160  base::DictionaryValue params;
161  params.SetString("message", "1");
162  ASSERT_EQ(
163      kOk,
164      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
165  params.SetString("message", "2");
166  ASSERT_EQ(
167      kOk,
168      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
169
170  std::string message;
171  ASSERT_EQ(kOk, manager.GetDialogMessage(&message).code());
172  ASSERT_TRUE(manager.IsDialogOpen());
173  ASSERT_EQ("1", message);
174
175  ASSERT_EQ(kOk, manager.HandleDialog(false, NULL).code());
176  ASSERT_TRUE(manager.IsDialogOpen());
177  ASSERT_EQ(kOk, manager.GetDialogMessage(&message).code());
178  ASSERT_EQ("2", message);
179
180  client.set_closing_count(2);
181  ASSERT_EQ(kOk, manager.HandleDialog(false, NULL).code());
182  ASSERT_FALSE(manager.IsDialogOpen());
183  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
184  ASSERT_EQ(kNoAlertOpen, manager.HandleDialog(false, NULL).code());
185}
186
187TEST(JavaScriptDialogManager, OneDialogManualClose) {
188  StubDevToolsClient client;
189  JavaScriptDialogManager manager(&client);
190  base::DictionaryValue params;
191  params.SetString("message", "hi");
192  ASSERT_FALSE(manager.IsDialogOpen());
193  std::string message;
194  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
195
196  ASSERT_EQ(
197      kOk,
198      manager.OnEvent(&client, "Page.javascriptDialogOpening", params).code());
199  ASSERT_TRUE(manager.IsDialogOpen());
200  ASSERT_EQ(kOk, manager.GetDialogMessage(&message).code());
201  ASSERT_EQ("hi", message);
202
203  ASSERT_EQ(
204      kOk,
205      manager.OnEvent(&client, "Page.javascriptDialogClosing", params).code());
206  ASSERT_FALSE(manager.IsDialogOpen());
207  ASSERT_EQ(kNoAlertOpen, manager.GetDialogMessage(&message).code());
208  ASSERT_EQ(kNoAlertOpen, manager.HandleDialog(false, NULL).code());
209}
210