1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/chromedriver/capabilities.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h"
8c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/test/chromedriver/chrome/log.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/test/chromedriver/logging.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Empty) {
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(0u, cmd.GetSwitches().size());
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("", switches.ToString());
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, NoValue) {
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello");
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(switches.HasSwitch("hello"));
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("", switches.GetSwitchValue("hello"));
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("hello"));
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL(""), cmd.GetSwitchValueNative("hello"));
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello", switches.ToString());
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Value) {
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello", "there");
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(switches.HasSwitch("hello"));
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("there", switches.GetSwitchValue("hello"));
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("hello"));
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL("there"), cmd.GetSwitchValueNative("hello"));
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello=there", switches.ToString());
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, FromOther) {
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("a", "1");
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("b", "1");
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches2;
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches2.SetSwitch("b", "2");
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches2.SetSwitch("c", "2");
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetFromSwitches(switches2);
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--a=1 --b=2 --c=2", switches.ToString());
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Remove) {
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("a", "1");
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.RemoveSwitch("a");
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_FALSE(switches.HasSwitch("a"));
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Quoting) {
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello", "a  b");
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello2", "  '\"  ");
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello=\"a  b\" --hello2=\"  '\\\"  \"", switches.ToString());
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Multiple) {
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("switch");
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello", "there");
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("switch"));
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("hello"));
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL("there"), cmd.GetSwitchValueNative("hello"));
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello=there --switch", switches.ToString());
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Unparsed) {
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("a");
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("--b");
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("--c=1");
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("d=1");
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("-e=--1=1");
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("---e=--1=1 --a --b --c=1 --d=1", switches.ToString());
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, WithAndroidPackage) {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("chromeOptions.androidPackage", "abc");
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(capabilities.IsAndroid());
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("abc", capabilities.android_package);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, EmptyAndroidPackage) {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("chromeOptions.androidPackage", std::string());
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, IllegalAndroidPackage) {
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetInteger("chromeOptions.androidPackage", 123);
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LogPath) {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("chromeOptions.logPath", "path/to/logfile");
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_STREQ("path/to/logfile", capabilities.log_path.c_str());
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(ParseCapabilities, Args) {
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue args;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  args.AppendString("arg1");
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  args.AppendString("arg2=val");
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.args", args.DeepCopy());
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2u, capabilities.switches.GetSize());
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("arg1"));
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("arg2"));
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("", capabilities.switches.GetSwitchValue("arg1"));
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("val", capabilities.switches.GetSwitchValue("arg2"));
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, Prefs) {
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue prefs;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.SetString("key1", "value1");
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.SetString("key2.k", "value2");
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.prefs", prefs.DeepCopy());
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(capabilities.prefs->Equals(&prefs));
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LocalState) {
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue local_state;
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  local_state.SetString("s1", "v1");
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  local_state.SetString("s2.s", "v2");
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.localState", local_state.DeepCopy());
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(capabilities.local_state->Equals(&local_state));
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, Extensions) {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue extensions;
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions.AppendString("ext1");
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions.AppendString("ext2");
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.extensions", extensions.DeepCopy());
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2u, capabilities.extensions.size());
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("ext1", capabilities.extensions[0]);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("ext2", capabilities.extensions[1]);
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, UnrecognizedProxyType) {
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "unknown proxy type");
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, IllegalProxyType) {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetInteger("proxyType", 123);
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, DirectProxy) {
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "DIRECT");
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("no-proxy-server"));
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, SystemProxy) {
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "system");
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(0u, capabilities.switches.GetSize());
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, PacProxy) {
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "PAC");
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyAutoconfigUrl", "test.wpad");
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("test.wpad", capabilities.switches.GetSwitchValue("proxy-pac-url"));
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, MissingProxyAutoconfigUrl) {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "PAC");
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("httpProxy", "http://localhost:8001");
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, AutodetectProxy) {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "autodetect");
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-auto-detect"));
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, ManualProxy) {
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "manual");
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("ftpProxy", "localhost:9001");
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("httpProxy", "localhost:8001");
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("sslProxy", "localhost:10001");
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("noProxy", "google.com, youtube.com");
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2u, capabilities.switches.GetSize());
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "ftp=localhost:9001;http=localhost:8001;https=localhost:10001",
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capabilities.switches.GetSwitchValue("proxy-server"));
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "google.com, youtube.com",
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capabilities.switches.GetSwitchValue("proxy-bypass-list"));
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, MissingSettingForManualProxy) {
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "manual");
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, IgnoreNullValueForManualProxy) {
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "manual");
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("ftpProxy", "localhost:9001");
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.Set("sslProxy", base::Value::CreateNullValue());
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.Set("noProxy", base::Value::CreateNullValue());
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-server"));
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "ftp=localhost:9001",
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capabilities.switches.GetSwitchValue("proxy-server"));
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LoggingPrefsOk) {
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue logging_prefs;
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging_prefs.SetString("Network", "INFO");
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("loggingPrefs", logging_prefs.DeepCopy());
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.logging_prefs.size());
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(Log::kInfo, capabilities.logging_prefs["Network"]);
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LoggingPrefsNotDict) {
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("loggingPrefs", "INFO");
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(ParseCapabilities, PerfLoggingPrefsInspectorDomainStatus) {
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Capabilities capabilities;
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Perf log must be enabled if performance log preferences are specified.
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue logging_prefs;
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  logging_prefs.SetString(WebDriverLog::kPerformanceType, "INFO");
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue desired_caps;
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("loggingPrefs", logging_prefs.DeepCopy());
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(PerfLoggingPrefs::InspectorDomainStatus::kDefaultEnabled,
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.network);
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(PerfLoggingPrefs::InspectorDomainStatus::kDefaultEnabled,
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.page);
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(PerfLoggingPrefs::InspectorDomainStatus::kDefaultEnabled,
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.timeline);
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue perf_logging_prefs;
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  perf_logging_prefs.SetBoolean("enableNetwork", true);
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  perf_logging_prefs.SetBoolean("enablePage", false);
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("chromeOptions.perfLoggingPrefs",
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   perf_logging_prefs.DeepCopy());
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Status status = capabilities.Parse(desired_caps);
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(PerfLoggingPrefs::InspectorDomainStatus::kExplicitlyEnabled,
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.network);
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(PerfLoggingPrefs::InspectorDomainStatus::kExplicitlyDisabled,
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.page);
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(PerfLoggingPrefs::InspectorDomainStatus::kDefaultEnabled,
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.timeline);
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(ParseCapabilities, PerfLoggingPrefsTracing) {
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Capabilities capabilities;
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Perf log must be enabled if performance log preferences are specified.
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue logging_prefs;
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  logging_prefs.SetString(WebDriverLog::kPerformanceType, "INFO");
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue desired_caps;
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("loggingPrefs", logging_prefs.DeepCopy());
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ("", capabilities.perf_logging_prefs.trace_categories);
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue perf_logging_prefs;
37703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  perf_logging_prefs.SetString("traceCategories", "benchmark,blink.console");
37803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  perf_logging_prefs.SetInteger("bufferUsageReportingInterval", 1234);
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("chromeOptions.perfLoggingPrefs",
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   perf_logging_prefs.DeepCopy());
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Status status = capabilities.Parse(desired_caps);
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ("benchmark,blink.console",
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            capabilities.perf_logging_prefs.trace_categories);
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(1234,
38603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            capabilities.perf_logging_prefs.buffer_usage_reporting_interval);
38703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(ParseCapabilities, PerfLoggingPrefsInvalidInterval) {
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Capabilities capabilities;
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Perf log must be enabled if performance log preferences are specified.
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::DictionaryValue logging_prefs;
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  logging_prefs.SetString(WebDriverLog::kPerformanceType, "INFO");
39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::DictionaryValue desired_caps;
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  desired_caps.Set("loggingPrefs", logging_prefs.DeepCopy());
39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::DictionaryValue perf_logging_prefs;
39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // A bufferUsageReportingInterval interval <= 0 will cause DevTools errors.
39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  perf_logging_prefs.SetInteger("bufferUsageReportingInterval", 0);
39903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  desired_caps.Set("chromeOptions.perfLoggingPrefs",
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                   perf_logging_prefs.DeepCopy());
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Status status = capabilities.Parse(desired_caps);
40203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_FALSE(status.IsOk());
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(ParseCapabilities, PerfLoggingPrefsNotDict) {
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Capabilities capabilities;
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Perf log must be enabled if performance log preferences are specified.
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue logging_prefs;
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  logging_prefs.SetString(WebDriverLog::kPerformanceType, "INFO");
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue desired_caps;
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("loggingPrefs", logging_prefs.DeepCopy());
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.SetString("chromeOptions.perfLoggingPrefs", "traceCategories");
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Status status = capabilities.Parse(desired_caps);
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(ParseCapabilities, PerfLoggingPrefsNoPerfLogLevel) {
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Capabilities capabilities;
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue desired_caps;
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue perf_logging_prefs;
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  perf_logging_prefs.SetBoolean("enableNetwork", true);
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("chromeOptions.perfLoggingPrefs",
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   perf_logging_prefs.DeepCopy());
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Should fail because perf log must be enabled if perf log prefs specified.
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Status status = capabilities.Parse(desired_caps);
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(ParseCapabilities, PerfLoggingPrefsPerfLogOff) {
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Capabilities capabilities;
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue logging_prefs;
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Disable performance log by setting logging level to OFF.
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  logging_prefs.SetString(WebDriverLog::kPerformanceType, "OFF");
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue desired_caps;
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("loggingPrefs", logging_prefs.DeepCopy());
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::DictionaryValue perf_logging_prefs;
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  perf_logging_prefs.SetBoolean("enableNetwork", true);
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  desired_caps.Set("chromeOptions.perfLoggingPrefs",
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   perf_logging_prefs.DeepCopy());
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Should fail because perf log must be enabled if perf log prefs specified.
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Status status = capabilities.Parse(desired_caps);
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(ParseCapabilities, ExcludeSwitches) {
4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Capabilities capabilities;
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::ListValue exclude_switches;
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  exclude_switches.AppendString("switch1");
4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  exclude_switches.AppendString("switch2");
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue caps;
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  caps.Set("chromeOptions.excludeSwitches", exclude_switches.DeepCopy());
45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
4533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(2u, capabilities.exclude_switches.size());
4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const std::set<std::string>& switches = capabilities.exclude_switches;
4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(switches.find("switch1") != switches.end());
4573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(switches.find("switch2") != switches.end());
4583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
459424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, UseRemoteBrowser) {
461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Capabilities capabilities;
462424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::DictionaryValue caps;
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caps.SetString("chromeOptions.debuggerAddress", "abc:123");
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
465424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(capabilities.IsRemoteBrowser());
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("abc", capabilities.debugger_address.host());
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(123, capabilities.debugger_address.port());
469424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationUserAgent) {
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue mobile_emulation;
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetString("userAgent", "Agent Smith");
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.Set("chromeOptions.mobileEmulation", mobile_emulation.DeepCopy());
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("user-agent"));
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ("Agent Smith", capabilities.switches.GetSwitchValue("user-agent"));
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationDeviceMetrics) {
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue mobile_emulation;
488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetInteger("deviceMetrics.width", 360);
489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetInteger("deviceMetrics.height", 640);
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetDouble("deviceMetrics.pixelRatio", 3.0);
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.Set("chromeOptions.mobileEmulation", mobile_emulation.DeepCopy());
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(360, capabilities.device_metrics->width);
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(640, capabilities.device_metrics->height);
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(3.0, capabilities.device_metrics->device_scale_factor);
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationDeviceName) {
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue mobile_emulation;
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetString("deviceName", "Google Nexus 5");
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.Set("chromeOptions.mobileEmulation", mobile_emulation.DeepCopy());
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("user-agent"));
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) "
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 "
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "Mobile Safari/535.19",
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      capabilities.switches.GetSwitchValue("user-agent"));
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(360, capabilities.device_metrics->width);
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(640, capabilities.device_metrics->height);
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(3.0, capabilities.device_metrics->device_scale_factor);
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationNotDict) {
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.SetString("chromeOptions.mobileEmulation", "Google Nexus 5");
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(status.IsOk());
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationDeviceMetricsNotDict) {
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue mobile_emulation;
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetInteger("deviceMetrics", 360);
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.Set("chromeOptions.mobileEmulation", mobile_emulation.DeepCopy());
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(status.IsOk());
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationDeviceMetricsNotNumbers) {
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue mobile_emulation;
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetString("deviceMetrics.width", "360");
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetString("deviceMetrics.height", "640");
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetString("deviceMetrics.pixelRatio", "3.0");
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.Set("chromeOptions.mobileEmulation", mobile_emulation.DeepCopy());
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(status.IsOk());
551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(ParseCapabilities, MobileEmulationBadDict) {
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Capabilities capabilities;
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue mobile_emulation;
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetString("deviceName", "Google Nexus 5");
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetInteger("deviceMetrics.width", 360);
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetInteger("deviceMetrics.height", 640);
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  mobile_emulation.SetDouble("deviceMetrics.pixelRatio", 3.0);
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::DictionaryValue caps;
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  caps.Set("chromeOptions.mobileEmulation", mobile_emulation.DeepCopy());
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Status status = capabilities.Parse(caps);
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(status.IsOk());
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
565