shill: vpn: Enable openvpn logging with VPN scoped logging.

BUG=chromium-os:29566
TEST=unit tests

Change-Id: I28ab9a3ff1260ac14ef04fb9cf53a5418fd7f9bb
Reviewed-on: https://gerrit.chromium.org/gerrit/21035
Commit-Ready: Darin Petkov <petkov@chromium.org>
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Darin Petkov <petkov@chromium.org>
diff --git a/openvpn_driver.cc b/openvpn_driver.cc
index 112e7bc..2422864 100644
--- a/openvpn_driver.cc
+++ b/openvpn_driver.cc
@@ -412,10 +412,8 @@
   options->push_back(tunnel_interface_);
   options->push_back("--dev-type");
   options->push_back("tun");
-  options->push_back("--syslog");
 
-  // TODO(petkov): Enable verbosity based on shill logging options too.
-  AppendValueOption(kOpenVPNVerbProperty, "--verb", options);
+  InitLoggingOptions(options);
 
   AppendValueOption(kVPNMTUProperty, "--mtu", options);
   AppendValueOption(flimflam::kOpenVPNProtoProperty, "--proto", options);
@@ -572,6 +570,19 @@
   return true;
 }
 
+void OpenVPNDriver::InitLoggingOptions(vector<string> *options) {
+  options->push_back("--syslog");
+
+  string verb = args()->LookupString(kOpenVPNVerbProperty, "");
+  if (verb.empty() && SLOG_IS_ON(VPN, 0)) {
+    verb = "3";
+  }
+  if (!verb.empty()) {
+    options->push_back("--verb");
+    options->push_back(verb);
+  }
+}
+
 bool OpenVPNDriver::AppendValueOption(
     const string &property, const string &option, vector<string> *options) {
   string value = args()->LookupString(property, "");
diff --git a/openvpn_driver.h b/openvpn_driver.h
index cf07d79..e73fabd 100644
--- a/openvpn_driver.h
+++ b/openvpn_driver.h
@@ -76,6 +76,7 @@
   FRIEND_TEST(OpenVPNDriverTest, ConnectTunnelFailure);
   FRIEND_TEST(OpenVPNDriverTest, Disconnect);
   FRIEND_TEST(OpenVPNDriverTest, GetRouteOptionEntry);
+  FRIEND_TEST(OpenVPNDriverTest, InitLoggingOptions);
   FRIEND_TEST(OpenVPNDriverTest, InitManagementChannelOptions);
   FRIEND_TEST(OpenVPNDriverTest, InitNSSOptions);
   FRIEND_TEST(OpenVPNDriverTest, InitOptions);
@@ -123,6 +124,7 @@
   void InitPKCS11Options(std::vector<std::string> *options);
   bool InitManagementChannelOptions(
       std::vector<std::string> *options, Error *error);
+  void InitLoggingOptions(std::vector<std::string> *options);
 
   bool SpawnOpenVPN();
 
diff --git a/openvpn_driver_unittest.cc b/openvpn_driver_unittest.cc
index 9e0460c..3513252 100644
--- a/openvpn_driver_unittest.cc
+++ b/openvpn_driver_unittest.cc
@@ -29,6 +29,7 @@
 #include "shill/mock_vpn_service.h"
 #include "shill/nice_mock_control.h"
 #include "shill/rpc_task.h"
+#include "shill/scope_logger.h"
 #include "shill/vpn.h"
 #include "shill/vpn_service.h"
 
@@ -385,6 +386,8 @@
       file_util::ReadFileToString(driver_->tls_auth_file_, &contents));
   EXPECT_EQ(kTLSAuthContents, contents);
   ExpectInFlags(options, "--pkcs11-id", kID);
+  EXPECT_TRUE(std::find(options.begin(), options.end(), "--syslog") !=
+              options.end());
 }
 
 TEST_F(OpenVPNDriverTest, InitNSSOptions) {
@@ -453,6 +456,32 @@
   EXPECT_TRUE(error.IsSuccess());
 }
 
+TEST_F(OpenVPNDriverTest, InitLoggingOptions) {
+  vector<string> options;
+  bool vpn_logging = SLOG_IS_ON(VPN, 0);
+  ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
+  driver_->InitLoggingOptions(&options);
+  ASSERT_EQ(1, options.size());
+  EXPECT_EQ("--syslog", options[0]);
+  ScopeLogger::GetInstance()->EnableScopesByName("+vpn");
+  options.clear();
+  driver_->InitLoggingOptions(&options);
+  ExpectInFlags(options, "--verb", "3");
+  ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
+  SetArg("OpenVPN.Verb", "2");
+  options.clear();
+  driver_->InitLoggingOptions(&options);
+  ExpectInFlags(options, "--verb", "2");
+  ScopeLogger::GetInstance()->EnableScopesByName("+vpn");
+  SetArg("OpenVPN.Verb", "1");
+  options.clear();
+  driver_->InitLoggingOptions(&options);
+  ExpectInFlags(options, "--verb", "1");
+  if (!vpn_logging) {
+    ScopeLogger::GetInstance()->EnableScopesByName("-vpn");
+  }
+}
+
 TEST_F(OpenVPNDriverTest, AppendValueOption) {
   vector<string> options;
   EXPECT_FALSE(