network_library_unittest.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pk11pub.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/at_exit.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_reader.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/network_library.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/cros/network_library_impl_stub.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/mock_user_manager.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/test_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/network/onc/onc_certificate_importer_impl.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_test_utils.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/nss_util.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/crypto_module.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::AnyNumber;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Have to do a stub here because MOCK can't handle closure arguments.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StubEnrollmentDelegate : public EnrollmentDelegate {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit StubEnrollmentDelegate()
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : did_enroll(false),
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        correct_args(false) {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Enroll(const std::vector<std::string>& uri_list,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::Closure& closure) OVERRIDE {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> expected_uri_list;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_uri_list.push_back("http://youtu.be/dQw4w9WgXcQ");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_uri_list.push_back("chrome-extension://abc/keygen-cert.html");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uri_list == expected_uri_list)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      correct_args = true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_enroll = true;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    closure.Run();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_enroll;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool correct_args;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WifiNetworkConnectCallback(NetworkLibrary* cros, WifiNetwork* wifi) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cros->ConnectToWifiNetwork(wifi, false);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VirtualNetworkConnectCallback(NetworkLibrary* cros, VirtualNetwork* vpn) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros->ConnectToVirtualNetwork(vpn);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetworkLibraryTest, DecodeNonAsciiSSID) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets network name.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname = "SSID TEST";
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname_result = "SSID TEST";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wifi->SetName(wifi_setname);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_setname_result);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Truncates invalid UTF-8
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname2 = "SSID TEST \x01\xff!";
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname2_result = "SSID TEST \xEF\xBF\xBD\xEF\xBF\xBD!";
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wifi->SetName(wifi_setname2);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_setname2_result);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTF8 SSID
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_utf8 = "UTF-8 \u3042\u3044\u3046";
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_utf8_result = "UTF-8 \xE3\x81\x82\xE3\x81\x84\xE3\x81\x86";
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork::TestApi test_wifi(wifi);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_wifi.SetSsid(wifi_utf8);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_utf8_result);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // latin1 SSID -> UTF8 SSID
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_latin1 = "latin-1 \xc0\xcb\xcc\xd6\xfb";
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_latin1_result = "latin-1 \u00c0\u00cb\u00cc\u00d6\u00fb";
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork::TestApi test_wifi(wifi);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_wifi.SetSsid(wifi_latin1);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_latin1_result);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hex SSID
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_hex = "5468697320697320484558205353494421";
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_hex_result = "This is HEX SSID!";
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork::TestApi test_wifi(wifi);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_wifi.SetHexSsid(wifi_hex);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_hex_result);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a stub libcros for testing NetworkLibrary functionality through
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkLibraryStubImpl.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: It would be of little value to test stub functions that simply return
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// predefined values, e.g. ethernet_available(). However, many other functions
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// such as connected_network() return values which are set indirectly and thus
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can test the logic of those setters.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkLibraryStubTest : public ::testing::Test {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkLibraryStubTest() : cros_(NULL) {}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cros_ = static_cast<NetworkLibraryImplStub*>(NetworkLibrary::Get());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(cros_) << "GetNetworkLibrary() Failed!";
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cros_ = NULL;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the ONC from |onc_file| using NetworkLibrary::LoadOncNetworks. Check
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that return value matches |expect_successful_import| and the configuration
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that would be sent to Shill matches |shill_json|.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadOncAndVerifyNetworks(std::string onc_file,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                std::string shill_json,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                onc::ONCSource source,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                bool expect_successful_import) {
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockUserManager* mock_user_manager =
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new ::testing::StrictMock<MockUserManager>;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Takes ownership of |mock_user_manager|.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedUserManagerEnabler user_manager_enabler(mock_user_manager);
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_user_manager->SetActiveUser("madmax@my.domain.com");
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_user_manager, IsUserLoggedIn())
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AnyNumber())
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(Return(true));
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_CALL(*mock_user_manager, Shutdown());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> onc_blob =
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onc::test_utils::ReadTestDictionary(onc_file);
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::ListValue* onc_network_configs;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onc_blob->GetListWithoutPathExpansion(
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onc::toplevel_config::kNetworkConfigurations,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &onc_network_configs);
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(onc_network_configs);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::Value> expected_value =
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        google_apis::test_util::LoadJSONFile(shill_json);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::DictionaryValue* expected_configs;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expected_value->GetAsDictionary(&expected_configs);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cros_->LoadOncNetworks(*onc_network_configs, source);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::map<std::string, base::DictionaryValue*>& configs =
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cros_->GetConfigurations();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_configs->size(), configs.size());
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (base::DictionaryValue::Iterator it(*expected_configs); !it.IsAtEnd();
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         it.Advance()) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::DictionaryValue* expected_config;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      it.value().GetAsDictionary(&expected_config);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::map<std::string, base::DictionaryValue*>::const_iterator entry =
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          configs.find(it.key());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_NE(entry, configs.end());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::DictionaryValue* actual_config = entry->second;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(onc::test_utils::Equals(expected_config, actual_config));
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedStubNetworkLibraryEnabler cros_stub_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkLibraryImplStub* cros_;
200a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CryptoModule> slot_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crypto::ScopedTestNSSDB test_nssdb_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default stub state:
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vpn1: disconnected, L2TP/IPsec + PSK
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vpn2: disconnected, L2TP/IPsec + user cert
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vpn3: disconnected, OpenVpn
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// eth1: connected (active network)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi1: connected
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi2: disconnected
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi3: disconnected, WEP
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi4: disconnected, 8021x
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi5: disconnected
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi6: disconnected
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cellular1: connected, activated, not roaming
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cellular2: disconnected, activated, roaming
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkLibraryAccessors) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up state.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set wifi2->connecting for these tests.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WifiNetwork* wifi2 = cros_->FindWifiNetworkByPath("wifi2");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), wifi2);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Network::TestApi test_wifi2(wifi2);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_wifi2.SetConnecting();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set cellular1->connecting for these tests.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CellularNetwork* cellular1 = cros_->FindCellularNetworkByPath("cellular1");
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cellular1);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Network::TestApi test_cellular1(cellular1);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cellular1.SetConnecting();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ethernet
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const EthernetNetwork*>(NULL),
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->ethernet_network());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("eth1", cros_->ethernet_network()->service_path());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const Network*>(NULL),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->FindNetworkByPath("eth1"));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->ethernet_connected());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cros_->ethernet_connecting());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wifi
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const WifiNetwork*>(NULL), cros_->wifi_network());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("wifi1", cros_->wifi_network()->service_path());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const WifiNetwork*>(NULL),
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->FindWifiNetworkByPath("wifi1"));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->wifi_connected());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cros_->wifi_connecting());  // Only true for active wifi.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(cros_->wifi_networks().size(), 1U);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cellular
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const CellularNetwork*>(NULL),
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->cellular_network());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("cellular1", cros_->cellular_network()->service_path());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const CellularNetwork*>(NULL),
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->FindCellularNetworkByPath("cellular1"));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cros_->cellular_connected());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->cellular_connecting());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(cros_->cellular_networks().size(), 1U);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VPN
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(cros_->virtual_networks().size(), 1U);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Active network and global state
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->Connected());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cros_->active_network());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("eth1", cros_->active_network()->service_path());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cros_->connected_network());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("eth1", cros_->connected_network()->service_path());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "wifi1" is connected, so we do not return "wifi2" for the connecting
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network. There is no conencted cellular network, so "cellular1" is
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned by connecting_network().
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->Connecting());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cros_->connecting_network());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("cellular1", cros_->connecting_network()->service_path());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectWifi) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WifiNetwork* wifi1 = cros_->FindWifiNetworkByPath("wifi1");
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wifi1->connected());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_->DisconnectFromNetwork(wifi1);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wifi1->connected());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_->ConnectToWifiNetwork(wifi1);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wifi1->connected());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectWifiWithCertPattern) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> onc_root =
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      onc::test_utils::ReadTestDictionary("certificate-client.onc");
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* certificates;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  onc_root->GetListWithoutPathExpansion(onc::toplevel_config::kCertificates,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &certificates);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
297558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  onc::CertificateImporterImpl importer;
298558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(importer.ImportCertificates(
299558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      *certificates, onc::ONC_SOURCE_USER_IMPORT, NULL));
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WifiNetwork* wifi = cros_->FindWifiNetworkByPath("wifi_cert_pattern");
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wifi->SetEnrollmentDelegate(enrollment_delegate);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->did_enroll);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->correct_args);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wifi->connected());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(wifi));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wifi->connected());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wifi->AttemptConnection(
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WifiNetworkConnectCallback, cros_, wifi));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wifi->connected());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->did_enroll);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->correct_args);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectVPNWithCertPattern) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> onc_root =
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      onc::test_utils::ReadTestDictionary("certificate-client.onc");
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* certificates;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  onc_root->GetListWithoutPathExpansion(onc::toplevel_config::kCertificates,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &certificates);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
326558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  onc::CertificateImporterImpl importer;
327558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(importer.ImportCertificates(
328558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      *certificates, onc::ONC_SOURCE_USER_IMPORT, NULL));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VirtualNetwork* vpn = cros_->FindVirtualNetworkByPath("vpn_cert_pattern");
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vpn->SetEnrollmentDelegate(enrollment_delegate);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->did_enroll);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->correct_args);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(vpn->connected());
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(vpn));
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(vpn->connected());
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vpn->AttemptConnection(
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&VirtualNetworkConnectCallback, cros_, vpn));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(vpn->connected());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->did_enroll);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->correct_args);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectVPN) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VirtualNetwork* vpn1 = cros_->FindVirtualNetworkByPath("vpn1");
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(vpn1->connected());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_->ConnectToVirtualNetwork(vpn1);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(vpn1->connected());
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("vpn1", cros_->virtual_network()->service_path());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ImportParams {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |onc_file|: Filename of source ONC, relative to
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //             chromeos/test/data/network.
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |shill_file|: Filename of expected Shill config, relative to
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //               chrome/test/data).
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |onc_source|: The source of the ONC.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |expect_import_result|: The expected return value of LoadOncNetworks.
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ImportParams(const std::string& onc_file,
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const std::string& shill_file,
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               onc::ONCSource onc_source,
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               bool expect_import_result = true)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : onc_file(onc_file),
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shill_file(shill_file),
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        onc_source(onc_source),
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expect_import_result(expect_import_result) {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string onc_file, shill_file;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  onc::ONCSource onc_source;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool expect_import_result;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)::std::ostream& operator<<(::std::ostream& os, const ImportParams& params) {
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os << "(" << params.onc_file << ", " << params.shill_file << ", "
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            << onc::GetSourceAsString(params.onc_source) << ", "
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            << (params.expect_import_result ? "valid" : "invalid") << ")";
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LoadOncNetworksTest
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NetworkLibraryStubTest,
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public ::testing::WithParamInterface<ImportParams> {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(LoadOncNetworksTest, VerifyNetworksAndCertificates) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadOncAndVerifyNetworks(GetParam().onc_file,
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           GetParam().shill_file,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           GetParam().onc_source,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           GetParam().expect_import_result);
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadOncNetworksTest,
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadOncNetworksTest,
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ::testing::Values(
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ImportParams("managed_toplevel1_with_cert_pems.onc",
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel1.json",
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ImportParams("managed_toplevel2_with_cert_pems.onc",
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel2.json",
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("managed_toplevel_l2tpipsec.onc",
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel_l2tpipsec.json",
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("managed_toplevel_wifi_peap.onc",
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel_wifi_peap.json",
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_DEVICE_POLICY),
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_open.onc",
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_open.json",
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_DEVICE_POLICY),
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_wep_proxy.onc",
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_wep_proxy.json",
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_wpa_psk.onc",
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_wpa_psk.json",
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_leap.onc",
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_leap.json",
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams(
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            "toplevel_wifi_eap_clientcert_with_cert_pems.onc",
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "chromeos/net/shill_for_toplevel_wifi_eap_clientcert.json",
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            onc::ONC_SOURCE_USER_POLICY),
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ImportParams("toplevel_openvpn_clientcert_with_cert_pems.onc",
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_openvpn_clientcert.json",
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_remove.onc",
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_remove.json",
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY)));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test remembered networks.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test network profiles.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test network devices.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test data plans.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test monitor network / device.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
453