1// Copyright 2014 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#include <vector>
7
8#include "base/compiler_specific.h"
9#include "base/values.h"
10#include "chrome/test/chromedriver/chrome/browser_info.h"
11#include "chrome/test/chromedriver/chrome/device_metrics.h"
12#include "chrome/test/chromedriver/chrome/mobile_emulation_override_manager.h"
13#include "chrome/test/chromedriver/chrome/status.h"
14#include "chrome/test/chromedriver/chrome/stub_devtools_client.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17namespace {
18
19struct Command {
20  Command() {}
21  Command(const std::string& method, const base::DictionaryValue& params)
22      : method(method) {
23    this->params.MergeDictionary(&params);
24  }
25  Command(const Command& command) {
26    *this = command;
27  }
28  Command& operator=(const Command& command) {
29    method = command.method;
30    params.Clear();
31    params.MergeDictionary(&command.params);
32    return *this;
33  }
34  ~Command() {}
35
36  std::string method;
37  base::DictionaryValue params;
38};
39
40class RecorderDevToolsClient : public StubDevToolsClient {
41 public:
42  RecorderDevToolsClient() {}
43  virtual ~RecorderDevToolsClient() {}
44
45  // Overridden from StubDevToolsClient:
46  virtual Status SendCommandAndGetResult(
47      const std::string& method,
48      const base::DictionaryValue& params,
49      scoped_ptr<base::DictionaryValue>* result) OVERRIDE {
50    commands_.push_back(Command(method, params));
51    return Status(kOk);
52  }
53
54  std::vector<Command> commands_;
55};
56
57void AssertDeviceMetricsCommand(const Command& command,
58                              const DeviceMetrics& device_metrics) {
59  ASSERT_EQ("Page.setDeviceMetricsOverride", command.method);
60  int width, height;
61  double device_scale_factor, font_scale_factor;
62  bool mobile, fit_window, text_autosizing;
63  ASSERT_TRUE(command.params.GetInteger("width", &width));
64  ASSERT_TRUE(command.params.GetInteger("height", &height));
65  ASSERT_TRUE(command.params.GetDouble("deviceScaleFactor",
66                                       &device_scale_factor));
67  ASSERT_TRUE(command.params.GetBoolean("mobile", &mobile));
68  ASSERT_TRUE(command.params.GetBoolean("fitWindow", &fit_window));
69  ASSERT_TRUE(command.params.GetBoolean("textAutosizing", &text_autosizing));
70  ASSERT_TRUE(command.params.GetDouble("fontScaleFactor", &font_scale_factor));
71  ASSERT_EQ(device_metrics.width, width);
72  ASSERT_EQ(device_metrics.height, height);
73  ASSERT_EQ(device_metrics.device_scale_factor, device_scale_factor);
74  ASSERT_EQ(device_metrics.mobile, mobile);
75  ASSERT_EQ(device_metrics.fit_window, fit_window);
76  ASSERT_EQ(device_metrics.text_autosizing, text_autosizing);
77  ASSERT_EQ(device_metrics.font_scale_factor, font_scale_factor);
78}
79
80}  // namespace
81
82TEST(MobileEmulationOverrideManager, SendsCommandOnConnect) {
83  RecorderDevToolsClient client;
84  DeviceMetrics device_metrics(1, 2, 3.0);
85  BrowserInfo browser_info;
86  MobileEmulationOverrideManager manager(&client,
87                                         &device_metrics,
88                                         &browser_info);
89  ASSERT_EQ(0u, client.commands_.size());
90  ASSERT_EQ(kOk, manager.OnConnected(&client).code());
91
92  ASSERT_EQ(1u, client.commands_.size());
93  ASSERT_EQ(kOk, manager.OnConnected(&client).code());
94  ASSERT_EQ(2u, client.commands_.size());
95  ASSERT_NO_FATAL_FAILURE(
96      AssertDeviceMetricsCommand(client.commands_[1], device_metrics));
97}
98
99TEST(MobileEmulationOverrideManager, SendsCommandOnNavigation) {
100  RecorderDevToolsClient client;
101  DeviceMetrics device_metrics(1, 2, 3.0);
102  BrowserInfo browser_info;
103  MobileEmulationOverrideManager manager(&client,
104                                         &device_metrics,
105                                         &browser_info);
106  base::DictionaryValue main_frame_params;
107  ASSERT_EQ(kOk,
108            manager.OnEvent(&client, "Page.frameNavigated", main_frame_params)
109                .code());
110  ASSERT_EQ(1u, client.commands_.size());
111  ASSERT_EQ(kOk,
112            manager.OnEvent(&client, "Page.frameNavigated", main_frame_params)
113                .code());
114  ASSERT_EQ(2u, client.commands_.size());
115  ASSERT_NO_FATAL_FAILURE(
116      AssertDeviceMetricsCommand(client.commands_[1], device_metrics));
117
118  base::DictionaryValue sub_frame_params;
119  sub_frame_params.SetString("frame.parentId", "id");
120  ASSERT_EQ(
121      kOk,
122      manager.OnEvent(&client, "Page.frameNavigated", sub_frame_params).code());
123  ASSERT_EQ(2u, client.commands_.size());
124}
125