Home | History | Annotate | Download | only in chromedriver
      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