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"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Empty) {
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(0u, cmd.GetSwitches().size());
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("", switches.ToString());
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, NoValue) {
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello");
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(switches.HasSwitch("hello"));
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("", switches.GetSwitchValue("hello"));
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("hello"));
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL(""), cmd.GetSwitchValueNative("hello"));
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello", switches.ToString());
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Value) {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello", "there");
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(switches.HasSwitch("hello"));
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("there", switches.GetSwitchValue("hello"));
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("hello"));
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL("there"), cmd.GetSwitchValueNative("hello"));
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello=there", switches.ToString());
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, FromOther) {
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("a", "1");
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("b", "1");
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches2;
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches2.SetSwitch("b", "2");
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches2.SetSwitch("c", "2");
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetFromSwitches(switches2);
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--a=1 --b=2 --c=2", switches.ToString());
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Remove) {
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("a", "1");
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.RemoveSwitch("a");
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_FALSE(switches.HasSwitch("a"));
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Quoting) {
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello", "a  b");
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello2", "  '\"  ");
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello=\"a  b\" --hello2=\"  '\\\"  \"", switches.ToString());
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Multiple) {
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("switch");
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetSwitch("hello", "there");
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CommandLine cmd(CommandLine::NO_PROGRAM);
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.AppendToCommandLine(&cmd);
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("switch"));
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(cmd.HasSwitch("hello"));
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(FILE_PATH_LITERAL("there"), cmd.GetSwitchValueNative("hello"));
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("--hello=there --switch", switches.ToString());
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(Switches, Unparsed) {
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Switches switches;
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("a");
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("--b");
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("--c=1");
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("d=1");
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switches.SetUnparsedSwitch("-e=--1=1");
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("---e=--1=1 --a --b --c=1 --d=1", switches.ToString());
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, WithAndroidPackage) {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("chromeOptions.androidPackage", "abc");
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(capabilities.IsAndroid());
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("abc", capabilities.android_package);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, EmptyAndroidPackage) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("chromeOptions.androidPackage", std::string());
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, IllegalAndroidPackage) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetInteger("chromeOptions.androidPackage", 123);
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LogPath) {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("chromeOptions.logPath", "path/to/logfile");
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_STREQ("path/to/logfile", capabilities.log_path.c_str());
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(ParseCapabilities, Args) {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue args;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  args.AppendString("arg1");
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  args.AppendString("arg2=val");
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.args", args.DeepCopy());
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2u, capabilities.switches.GetSize());
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("arg1"));
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("arg2"));
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("", capabilities.switches.GetSwitchValue("arg1"));
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("val", capabilities.switches.GetSwitchValue("arg2"));
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, Prefs) {
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue prefs;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.SetString("key1", "value1");
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.SetString("key2.k", "value2");
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.prefs", prefs.DeepCopy());
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(capabilities.prefs->Equals(&prefs));
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LocalState) {
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue local_state;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  local_state.SetString("s1", "v1");
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  local_state.SetString("s2.s", "v2");
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.localState", local_state.DeepCopy());
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(capabilities.local_state->Equals(&local_state));
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, Extensions) {
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue extensions;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions.AppendString("ext1");
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions.AppendString("ext2");
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("chromeOptions.extensions", extensions.DeepCopy());
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2u, capabilities.extensions.size());
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("ext1", capabilities.extensions[0]);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("ext2", capabilities.extensions[1]);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, UnrecognizedProxyType) {
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "unknown proxy type");
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, IllegalProxyType) {
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetInteger("proxyType", 123);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, DirectProxy) {
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "DIRECT");
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("no-proxy-server"));
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, SystemProxy) {
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "system");
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(0u, capabilities.switches.GetSize());
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, PacProxy) {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "PAC");
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyAutoconfigUrl", "test.wpad");
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("test.wpad", capabilities.switches.GetSwitchValue("proxy-pac-url"));
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, MissingProxyAutoconfigUrl) {
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "PAC");
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("httpProxy", "http://localhost:8001");
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, AutodetectProxy) {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "autodetect");
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-auto-detect"));
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, ManualProxy) {
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "manual");
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("ftpProxy", "localhost:9001");
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("httpProxy", "localhost:8001");
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("sslProxy", "localhost:10001");
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("noProxy", "google.com, youtube.com");
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(2u, capabilities.switches.GetSize());
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "ftp=localhost:9001;http=localhost:8001;https=localhost:10001",
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capabilities.switches.GetSwitchValue("proxy-server"));
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "google.com, youtube.com",
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capabilities.switches.GetSwitchValue("proxy-bypass-list"));
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, MissingSettingForManualProxy) {
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "manual");
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, IgnoreNullValueForManualProxy) {
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue proxy;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("proxyType", "manual");
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.SetString("ftpProxy", "localhost:9001");
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.Set("sslProxy", base::Value::CreateNullValue());
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  proxy.Set("noProxy", base::Value::CreateNullValue());
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("proxy", proxy.DeepCopy());
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.switches.GetSize());
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(capabilities.switches.HasSwitch("proxy-server"));
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "ftp=localhost:9001",
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capabilities.switches.GetSwitchValue("proxy-server"));
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LoggingPrefsOk) {
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue logging_prefs;
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging_prefs.SetString("Network", "INFO");
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.Set("loggingPrefs", logging_prefs.DeepCopy());
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(status.IsOk());
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, capabilities.logging_prefs.size());
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(Log::kInfo, capabilities.logging_prefs["Network"]);
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(ParseCapabilities, LoggingPrefsNotDict) {
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Capabilities capabilities;
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue caps;
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  caps.SetString("loggingPrefs", "INFO");
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(status.IsOk());
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(ParseCapabilities, ExcludeSwitches) {
3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Capabilities capabilities;
3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::ListValue exclude_switches;
3423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  exclude_switches.AppendString("switch1");
3433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  exclude_switches.AppendString("switch2");
3443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue caps;
3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  caps.Set("chromeOptions.excludeSwitches", exclude_switches.DeepCopy());
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(2u, capabilities.exclude_switches.size());
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const std::set<std::string>& switches = capabilities.exclude_switches;
3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(switches.find("switch1") != switches.end());
3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(switches.find("switch2") != switches.end());
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(ParseCapabilities, UseExistingBrowser) {
355424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Capabilities capabilities;
356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::DictionaryValue caps;
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caps.SetString("chromeOptions.debuggerAddress", "abc:123");
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Status status = capabilities.Parse(caps);
359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(status.IsOk());
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(capabilities.IsExistingBrowser());
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ("abc", capabilities.debugger_address.host());
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(123, capabilities.debugger_address.port());
363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
364