1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/test/chromedriver/capabilities.h" 6 7 #include "base/values.h" 8 #include "chrome/test/chromedriver/chrome/log.h" 9 #include "chrome/test/chromedriver/chrome/status.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 TEST(ParseCapabilities, WithAndroidPackage) { 13 Capabilities capabilities; 14 base::DictionaryValue caps; 15 caps.SetString("chromeOptions.androidPackage", "abc"); 16 Logger log(Log::kError); 17 Status status = capabilities.Parse(caps, &log); 18 ASSERT_TRUE(status.IsOk()); 19 ASSERT_TRUE(capabilities.IsAndroid()); 20 ASSERT_EQ("abc", capabilities.android_package); 21 } 22 23 TEST(ParseCapabilities, EmptyAndroidPackage) { 24 Capabilities capabilities; 25 base::DictionaryValue caps; 26 caps.SetString("chromeOptions.androidPackage", std::string()); 27 Logger log(Log::kError); 28 Status status = capabilities.Parse(caps, &log); 29 ASSERT_FALSE(status.IsOk()); 30 } 31 32 TEST(ParseCapabilities, IllegalAndroidPackage) { 33 Capabilities capabilities; 34 base::DictionaryValue caps; 35 caps.SetInteger("chromeOptions.androidPackage", 123); 36 Logger log(Log::kError); 37 Status status = capabilities.Parse(caps, &log); 38 ASSERT_FALSE(status.IsOk()); 39 } 40 41 TEST(ParseCapabilities, LogPath) { 42 Capabilities capabilities; 43 base::DictionaryValue caps; 44 caps.SetString("chromeOptions.logPath", "path/to/logfile"); 45 Logger log(Log::kError); 46 Status status = capabilities.Parse(caps, &log); 47 ASSERT_TRUE(status.IsOk()); 48 ASSERT_STREQ("path/to/logfile", capabilities.log_path.c_str()); 49 } 50 51 TEST(ParseCapabilities, NoArgs) { 52 Capabilities capabilities; 53 base::ListValue args; 54 ASSERT_TRUE(args.empty()); 55 base::DictionaryValue caps; 56 caps.Set("chromeOptions.args", args.DeepCopy()); 57 Logger log(Log::kError); 58 Status status = capabilities.Parse(caps, &log); 59 ASSERT_TRUE(status.IsOk()); 60 ASSERT_TRUE(capabilities.command.GetSwitches().empty()); 61 } 62 63 TEST(ParseCapabilities, SingleArgWithoutValue) { 64 Capabilities capabilities; 65 base::ListValue args; 66 args.AppendString("enable-nacl"); 67 ASSERT_EQ(1u, args.GetSize()); 68 base::DictionaryValue caps; 69 caps.Set("chromeOptions.args", args.DeepCopy()); 70 Logger log(Log::kError); 71 Status status = capabilities.Parse(caps, &log); 72 ASSERT_TRUE(status.IsOk()); 73 ASSERT_EQ(1u, capabilities.command.GetSwitches().size()); 74 ASSERT_TRUE(capabilities.command.HasSwitch("enable-nacl")); 75 } 76 77 TEST(ParseCapabilities, SingleArgWithValue) { 78 Capabilities capabilities; 79 base::ListValue args; 80 args.AppendString("load-extension=/test/extension"); 81 ASSERT_EQ(1u, args.GetSize()); 82 base::DictionaryValue caps; 83 caps.Set("chromeOptions.args", args.DeepCopy()); 84 Logger log(Log::kError); 85 Status status = capabilities.Parse(caps, &log); 86 ASSERT_TRUE(status.IsOk()); 87 ASSERT_EQ(1u, capabilities.command.GetSwitches().size()); 88 ASSERT_TRUE(capabilities.command.HasSwitch("load-extension")); 89 ASSERT_STREQ( 90 "/test/extension", 91 capabilities.command.GetSwitchValueASCII("load-extension").c_str()); 92 } 93 94 TEST(ParseCapabilities, MultipleArgs) { 95 Capabilities capabilities; 96 base::ListValue args; 97 args.AppendString("arg1"); 98 args.AppendString("arg2=val"); 99 args.AppendString("arg3='a space'"); 100 ASSERT_EQ(3u, args.GetSize()); 101 base::DictionaryValue caps; 102 caps.Set("chromeOptions.args", args.DeepCopy()); 103 Logger log(Log::kError); 104 Status status = capabilities.Parse(caps, &log); 105 ASSERT_TRUE(status.IsOk()); 106 ASSERT_EQ(3u, capabilities.command.GetSwitches().size()); 107 ASSERT_TRUE(capabilities.command.HasSwitch("arg1")); 108 ASSERT_TRUE(capabilities.command.HasSwitch("arg2")); 109 ASSERT_STREQ("val", capabilities.command.GetSwitchValueASCII("arg2").c_str()); 110 ASSERT_TRUE(capabilities.command.HasSwitch("arg3")); 111 ASSERT_STREQ("'a space'", 112 capabilities.command.GetSwitchValueASCII("arg3").c_str()); 113 } 114 115 TEST(ParseCapabilities, Prefs) { 116 Capabilities capabilities; 117 base::DictionaryValue prefs; 118 prefs.SetString("key1", "value1"); 119 prefs.SetString("key2.k", "value2"); 120 base::DictionaryValue caps; 121 caps.Set("chromeOptions.prefs", prefs.DeepCopy()); 122 Logger log(Log::kError); 123 Status status = capabilities.Parse(caps, &log); 124 ASSERT_TRUE(status.IsOk()); 125 ASSERT_TRUE(capabilities.prefs->Equals(&prefs)); 126 } 127 128 TEST(ParseCapabilities, LocalState) { 129 Capabilities capabilities; 130 base::DictionaryValue local_state; 131 local_state.SetString("s1", "v1"); 132 local_state.SetString("s2.s", "v2"); 133 base::DictionaryValue caps; 134 caps.Set("chromeOptions.localState", local_state.DeepCopy()); 135 Logger log(Log::kError); 136 Status status = capabilities.Parse(caps, &log); 137 ASSERT_TRUE(status.IsOk()); 138 ASSERT_TRUE(capabilities.local_state->Equals(&local_state)); 139 } 140 141 TEST(ParseCapabilities, Extensions) { 142 Capabilities capabilities; 143 base::ListValue extensions; 144 extensions.AppendString("ext1"); 145 extensions.AppendString("ext2"); 146 base::DictionaryValue caps; 147 caps.Set("chromeOptions.extensions", extensions.DeepCopy()); 148 Logger log(Log::kError); 149 Status status = capabilities.Parse(caps, &log); 150 ASSERT_TRUE(status.IsOk()); 151 ASSERT_EQ(2u, capabilities.extensions.size()); 152 ASSERT_EQ("ext1", capabilities.extensions[0]); 153 ASSERT_EQ("ext2", capabilities.extensions[1]); 154 } 155 156 TEST(ParseCapabilities, UnrecognizedProxyType) { 157 Capabilities capabilities; 158 base::DictionaryValue proxy; 159 proxy.SetString("proxyType", "unknown proxy type"); 160 base::DictionaryValue caps; 161 caps.Set("proxy", proxy.DeepCopy()); 162 Logger log(Log::kError); 163 Status status = capabilities.Parse(caps, &log); 164 ASSERT_FALSE(status.IsOk()); 165 } 166 167 TEST(ParseCapabilities, IllegalProxyType) { 168 Capabilities capabilities; 169 base::DictionaryValue proxy; 170 proxy.SetInteger("proxyType", 123); 171 base::DictionaryValue caps; 172 caps.Set("proxy", proxy.DeepCopy()); 173 Logger log(Log::kError); 174 Status status = capabilities.Parse(caps, &log); 175 ASSERT_FALSE(status.IsOk()); 176 } 177 178 TEST(ParseCapabilities, DirectProxy) { 179 Capabilities capabilities; 180 base::DictionaryValue proxy; 181 proxy.SetString("proxyType", "DIRECT"); 182 base::DictionaryValue caps; 183 caps.Set("proxy", proxy.DeepCopy()); 184 Logger log(Log::kError); 185 Status status = capabilities.Parse(caps, &log); 186 ASSERT_TRUE(status.IsOk()); 187 ASSERT_EQ(1u, capabilities.command.GetSwitches().size()); 188 ASSERT_TRUE(capabilities.command.HasSwitch("no-proxy-server")); 189 } 190 191 TEST(ParseCapabilities, SystemProxy) { 192 Capabilities capabilities; 193 base::DictionaryValue proxy; 194 proxy.SetString("proxyType", "system"); 195 base::DictionaryValue caps; 196 caps.Set("proxy", proxy.DeepCopy()); 197 Logger log(Log::kError); 198 Status status = capabilities.Parse(caps, &log); 199 ASSERT_TRUE(status.IsOk()); 200 ASSERT_TRUE(capabilities.command.GetSwitches().empty()); 201 } 202 203 TEST(ParseCapabilities, PacProxy) { 204 Capabilities capabilities; 205 base::DictionaryValue proxy; 206 proxy.SetString("proxyType", "PAC"); 207 proxy.SetString("proxyAutoconfigUrl", "test.wpad"); 208 base::DictionaryValue caps; 209 caps.Set("proxy", proxy.DeepCopy()); 210 Logger log(Log::kError); 211 Status status = capabilities.Parse(caps, &log); 212 ASSERT_TRUE(status.IsOk()); 213 ASSERT_EQ(1u, capabilities.command.GetSwitches().size()); 214 ASSERT_STREQ( 215 "test.wpad", 216 capabilities.command.GetSwitchValueASCII("proxy-pac-url").c_str()); 217 } 218 219 TEST(ParseCapabilities, MissingProxyAutoconfigUrl) { 220 Capabilities capabilities; 221 base::DictionaryValue proxy; 222 proxy.SetString("proxyType", "PAC"); 223 proxy.SetString("httpProxy", "http://localhost:8001"); 224 base::DictionaryValue caps; 225 caps.Set("proxy", proxy.DeepCopy()); 226 Logger log(Log::kError); 227 Status status = capabilities.Parse(caps, &log); 228 ASSERT_FALSE(status.IsOk()); 229 } 230 231 TEST(ParseCapabilities, AutodetectProxy) { 232 Capabilities capabilities; 233 base::DictionaryValue proxy; 234 proxy.SetString("proxyType", "autodetect"); 235 base::DictionaryValue caps; 236 caps.Set("proxy", proxy.DeepCopy()); 237 Logger log(Log::kError); 238 Status status = capabilities.Parse(caps, &log); 239 ASSERT_TRUE(status.IsOk()); 240 ASSERT_EQ(1u, capabilities.command.GetSwitches().size()); 241 ASSERT_TRUE(capabilities.command.HasSwitch("proxy-auto-detect")); 242 } 243 244 TEST(ParseCapabilities, ManualProxy) { 245 Capabilities capabilities; 246 base::DictionaryValue proxy; 247 proxy.SetString("proxyType", "manual"); 248 proxy.SetString("ftpProxy", "localhost:9001"); 249 proxy.SetString("httpProxy", "localhost:8001"); 250 proxy.SetString("sslProxy", "localhost:10001"); 251 proxy.SetString("noProxy", "google.com, youtube.com"); 252 base::DictionaryValue caps; 253 caps.Set("proxy", proxy.DeepCopy()); 254 Logger log(Log::kError); 255 Status status = capabilities.Parse(caps, &log); 256 ASSERT_TRUE(status.IsOk()); 257 ASSERT_EQ(2u, capabilities.command.GetSwitches().size()); 258 ASSERT_STREQ( 259 "ftp=localhost:9001;http=localhost:8001;https=localhost:10001", 260 capabilities.command.GetSwitchValueASCII("proxy-server").c_str()); 261 ASSERT_STREQ( 262 "google.com, youtube.com", 263 capabilities.command.GetSwitchValueASCII("proxy-bypass-list").c_str()); 264 } 265 266 TEST(ParseCapabilities, MissingSettingForManualProxy) { 267 Capabilities capabilities; 268 base::DictionaryValue proxy; 269 proxy.SetString("proxyType", "manual"); 270 base::DictionaryValue caps; 271 caps.Set("proxy", proxy.DeepCopy()); 272 Logger log(Log::kError); 273 Status status = capabilities.Parse(caps, &log); 274 ASSERT_FALSE(status.IsOk()); 275 } 276 277 TEST(ParseCapabilities, IgnoreNullValueForManualProxy) { 278 Capabilities capabilities; 279 base::DictionaryValue proxy; 280 proxy.SetString("proxyType", "manual"); 281 proxy.SetString("ftpProxy", "localhost:9001"); 282 proxy.Set("sslProxy", base::Value::CreateNullValue()); 283 proxy.Set("noProxy", base::Value::CreateNullValue()); 284 base::DictionaryValue caps; 285 caps.Set("proxy", proxy.DeepCopy()); 286 Logger log(Log::kError); 287 Status status = capabilities.Parse(caps, &log); 288 ASSERT_TRUE(status.IsOk()); 289 ASSERT_EQ(1u, capabilities.command.GetSwitches().size()); 290 ASSERT_TRUE(capabilities.command.HasSwitch("proxy-server")); 291 ASSERT_STREQ( 292 "ftp=localhost:9001", 293 capabilities.command.GetSwitchValueASCII("proxy-server").c_str()); 294 } 295 296 TEST(ParseCapabilities, LoggingPrefsOk) { 297 Capabilities capabilities; 298 base::DictionaryValue logging_prefs; 299 logging_prefs.SetString("Network", "INFO"); 300 base::DictionaryValue caps; 301 caps.Set("loggingPrefs", logging_prefs.DeepCopy()); 302 Logger log(Log::kError); 303 Status status = capabilities.Parse(caps, &log); 304 ASSERT_TRUE(status.IsOk()); 305 ASSERT_TRUE(capabilities.logging_prefs.get()); 306 ASSERT_EQ(1u, capabilities.logging_prefs->size()); 307 std::string log_level; 308 ASSERT_TRUE(capabilities.logging_prefs->GetString("Network", &log_level)); 309 ASSERT_STREQ("INFO", log_level.c_str()); 310 } 311 312 TEST(ParseCapabilities, LoggingPrefsNotDict) { 313 Capabilities capabilities; 314 base::DictionaryValue caps; 315 caps.SetString("loggingPrefs", "INFO"); 316 Logger log(Log::kError); 317 Status status = capabilities.Parse(caps, &log); 318 ASSERT_FALSE(status.IsOk()); 319 } 320