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"
194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/chromeos/enrollment_dialog_view.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/mock_user_manager.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/google_apis/test_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/network/onc/onc_certificate_importer_impl.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_test_utils.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crypto/nss_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/crypto_module.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ::testing::AnyNumber;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Have to do a stub here because MOCK can't handle closure arguments.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StubEnrollmentDelegate : public EnrollmentDelegate {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit StubEnrollmentDelegate()
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : did_enroll(false),
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        correct_args(false) {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual bool Enroll(const std::vector<std::string>& uri_list,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const base::Closure& closure) OVERRIDE {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> expected_uri_list;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_uri_list.push_back("http://youtu.be/dQw4w9WgXcQ");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_uri_list.push_back("chrome-extension://abc/keygen-cert.html");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (uri_list == expected_uri_list)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      correct_args = true;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    did_enroll = true;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    closure.Run();
574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return true;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_enroll;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool correct_args;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WifiNetworkConnectCallback(NetworkLibrary* cros, WifiNetwork* wifi) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cros->ConnectToWifiNetwork(wifi, false);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VirtualNetworkConnectCallback(NetworkLibrary* cros, VirtualNetwork* vpn) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros->ConnectToVirtualNetwork(vpn);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetworkLibraryTest, DecodeNonAsciiSSID) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets network name.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname = "SSID TEST";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname_result = "SSID TEST";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wifi->SetName(wifi_setname);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_setname_result);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Truncates invalid UTF-8
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname2 = "SSID TEST \x01\xff!";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_setname2_result = "SSID TEST \xEF\xBF\xBD\xEF\xBF\xBD!";
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wifi->SetName(wifi_setname2);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_setname2_result);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTF8 SSID
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_utf8 = "UTF-8 \u3042\u3044\u3046";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_utf8_result = "UTF-8 \xE3\x81\x82\xE3\x81\x84\xE3\x81\x86";
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork::TestApi test_wifi(wifi);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_wifi.SetSsid(wifi_utf8);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_utf8_result);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // latin1 SSID -> UTF8 SSID
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_latin1 = "latin-1 \xc0\xcb\xcc\xd6\xfb";
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_latin1_result = "latin-1 \u00c0\u00cb\u00cc\u00d6\u00fb";
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork::TestApi test_wifi(wifi);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_wifi.SetSsid(wifi_latin1);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_latin1_result);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hex SSID
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_hex = "5468697320697320484558205353494421";
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string wifi_hex_result = "This is HEX SSID!";
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork* wifi = new WifiNetwork("fw");
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WifiNetwork::TestApi test_wifi(wifi);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_wifi.SetHexSsid(wifi_hex);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(wifi->name(), wifi_hex_result);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete wifi;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a stub libcros for testing NetworkLibrary functionality through
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkLibraryStubImpl.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: It would be of little value to test stub functions that simply return
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// predefined values, e.g. ethernet_available(). However, many other functions
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// such as connected_network() return values which are set indirectly and thus
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we can test the logic of those setters.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkLibraryStubTest : public ::testing::Test {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkLibraryStubTest() : cros_(NULL) {}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cros_ = static_cast<NetworkLibraryImplStub*>(NetworkLibrary::Get());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(cros_) << "GetNetworkLibrary() Failed!";
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cros_ = NULL;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the ONC from |onc_file| using NetworkLibrary::LoadOncNetworks. Check
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that return value matches |expect_successful_import| and the configuration
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that would be sent to Shill matches |shill_json|.
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoadOncAndVerifyNetworks(std::string onc_file,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                std::string shill_json,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                onc::ONCSource source,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                bool expect_successful_import) {
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MockUserManager* mock_user_manager =
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new ::testing::StrictMock<MockUserManager>;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Takes ownership of |mock_user_manager|.
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedUserManagerEnabler user_manager_enabler(mock_user_manager);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_user_manager->SetActiveUser("madmax@my.domain.com");
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_user_manager, IsUserLoggedIn())
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .Times(AnyNumber())
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(Return(true));
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_CALL(*mock_user_manager, Shutdown());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> onc_blob =
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onc::test_utils::ReadTestDictionary(onc_file);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::ListValue* onc_network_configs;
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    onc_blob->GetListWithoutPathExpansion(
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        onc::toplevel_config::kNetworkConfigurations,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &onc_network_configs);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(onc_network_configs);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::Value> expected_value =
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        google_apis::test_util::LoadJSONFile(shill_json);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::DictionaryValue* expected_configs;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expected_value->GetAsDictionary(&expected_configs);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cros_->LoadOncNetworks(*onc_network_configs, source);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::map<std::string, base::DictionaryValue*>& configs =
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        cros_->GetConfigurations();
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_configs->size(), configs.size());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (base::DictionaryValue::Iterator it(*expected_configs); !it.IsAtEnd();
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         it.Advance()) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::DictionaryValue* expected_config;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      it.value().GetAsDictionary(&expected_config);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::map<std::string, base::DictionaryValue*>::const_iterator entry =
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          configs.find(it.key());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_NE(entry, configs.end());
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::DictionaryValue* actual_config = entry->second;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(onc::test_utils::Equals(expected_config, actual_config));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ScopedStubNetworkLibraryEnabler cros_stub_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkLibraryImplStub* cros_;
202a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CryptoModule> slot_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  crypto::ScopedTestNSSDB test_nssdb_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default stub state:
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vpn1: disconnected, L2TP/IPsec + PSK
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vpn2: disconnected, L2TP/IPsec + user cert
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vpn3: disconnected, OpenVpn
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// eth1: connected (active network)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi1: connected
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi2: disconnected
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi3: disconnected, WEP
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi4: disconnected, 8021x
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi5: disconnected
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wifi6: disconnected
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cellular1: connected, activated, not roaming
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cellular2: disconnected, activated, roaming
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkLibraryAccessors) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up state.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set wifi2->connecting for these tests.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WifiNetwork* wifi2 = cros_->FindWifiNetworkByPath("wifi2");
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), wifi2);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Network::TestApi test_wifi2(wifi2);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_wifi2.SetConnecting();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set cellular1->connecting for these tests.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CellularNetwork* cellular1 = cros_->FindCellularNetworkByPath("cellular1");
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cellular1);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Network::TestApi test_cellular1(cellular1);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_cellular1.SetConnecting();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ethernet
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const EthernetNetwork*>(NULL),
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->ethernet_network());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("eth1", cros_->ethernet_network()->service_path());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const Network*>(NULL),
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->FindNetworkByPath("eth1"));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->ethernet_connected());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cros_->ethernet_connecting());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wifi
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const WifiNetwork*>(NULL), cros_->wifi_network());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("wifi1", cros_->wifi_network()->service_path());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const WifiNetwork*>(NULL),
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->FindWifiNetworkByPath("wifi1"));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->wifi_connected());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cros_->wifi_connecting());  // Only true for active wifi.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(cros_->wifi_networks().size(), 1U);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cellular
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const CellularNetwork*>(NULL),
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->cellular_network());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("cellular1", cros_->cellular_network()->service_path());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const CellularNetwork*>(NULL),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cros_->FindCellularNetworkByPath("cellular1"));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cros_->cellular_connected());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->cellular_connecting());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(cros_->cellular_networks().size(), 1U);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VPN
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(cros_->virtual_networks().size(), 1U);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Active network and global state
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->Connected());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cros_->active_network());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("eth1", cros_->active_network()->service_path());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cros_->connected_network());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("eth1", cros_->connected_network()->service_path());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "wifi1" is connected, so we do not return "wifi2" for the connecting
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network. There is no conencted cellular network, so "cellular1" is
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned by connecting_network().
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->Connecting());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const Network*>(NULL), cros_->connecting_network());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("cellular1", cros_->connecting_network()->service_path());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectWifi) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WifiNetwork* wifi1 = cros_->FindWifiNetworkByPath("wifi1");
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wifi1->connected());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_->DisconnectFromNetwork(wifi1);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(wifi1->connected());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_->ConnectToWifiNetwork(wifi1);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wifi1->connected());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectWifiWithCertPattern) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> onc_root =
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      onc::test_utils::ReadTestDictionary("certificate-client.onc");
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* certificates;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  onc_root->GetListWithoutPathExpansion(onc::toplevel_config::kCertificates,
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &certificates);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
299558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  onc::CertificateImporterImpl importer;
300558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(importer.ImportCertificates(
301558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      *certificates, onc::ONC_SOURCE_USER_IMPORT, NULL));
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WifiNetwork* wifi = cros_->FindWifiNetworkByPath("wifi_cert_pattern");
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wifi->SetEnrollmentDelegate(enrollment_delegate);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->did_enroll);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->correct_args);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wifi->connected());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(wifi));
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(wifi->connected());
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wifi->AttemptConnection(
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&WifiNetworkConnectCallback, cros_, wifi));
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(wifi->connected());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->did_enroll);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->correct_args);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectVPNWithCertPattern) {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> onc_root =
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      onc::test_utils::ReadTestDictionary("certificate-client.onc");
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* certificates;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  onc_root->GetListWithoutPathExpansion(onc::toplevel_config::kCertificates,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &certificates);
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
328558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  onc::CertificateImporterImpl importer;
329558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_TRUE(importer.ImportCertificates(
330558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      *certificates, onc::ONC_SOURCE_USER_IMPORT, NULL));
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VirtualNetwork* vpn = cros_->FindVirtualNetworkByPath("vpn_cert_pattern");
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vpn->SetEnrollmentDelegate(enrollment_delegate);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->did_enroll);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(enrollment_delegate->correct_args);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(vpn->connected());
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(vpn));
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(vpn->connected());
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  vpn->AttemptConnection(
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&VirtualNetworkConnectCallback, cros_, vpn));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(vpn->connected());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->did_enroll);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(enrollment_delegate->correct_args);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkLibraryStubTest, NetworkConnectVPN) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VirtualNetwork* vpn1 = cros_->FindVirtualNetworkByPath("vpn1");
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(vpn1->connected());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_->ConnectToVirtualNetwork(vpn1);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(vpn1->connected());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("vpn1", cros_->virtual_network()->service_path());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ImportParams {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |onc_file|: Filename of source ONC, relative to
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //             chromeos/test/data/network.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |shill_file|: Filename of expected Shill config, relative to
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //               chrome/test/data).
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |onc_source|: The source of the ONC.
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |expect_import_result|: The expected return value of LoadOncNetworks.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ImportParams(const std::string& onc_file,
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const std::string& shill_file,
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               onc::ONCSource onc_source,
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               bool expect_import_result = true)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : onc_file(onc_file),
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shill_file(shill_file),
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        onc_source(onc_source),
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        expect_import_result(expect_import_result) {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string onc_file, shill_file;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  onc::ONCSource onc_source;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool expect_import_result;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)::std::ostream& operator<<(::std::ostream& os, const ImportParams& params) {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os << "(" << params.onc_file << ", " << params.shill_file << ", "
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            << onc::GetSourceAsString(params.onc_source) << ", "
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            << (params.expect_import_result ? "valid" : "invalid") << ")";
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LoadOncNetworksTest
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public NetworkLibraryStubTest,
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public ::testing::WithParamInterface<ImportParams> {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_P(LoadOncNetworksTest, VerifyNetworksAndCertificates) {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadOncAndVerifyNetworks(GetParam().onc_file,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           GetParam().shill_file,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           GetParam().onc_source,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           GetParam().expect_import_result);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadOncNetworksTest,
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadOncNetworksTest,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ::testing::Values(
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ImportParams("managed_toplevel1_with_cert_pems.onc",
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel1.json",
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ImportParams("managed_toplevel2_with_cert_pems.onc",
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel2.json",
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("managed_toplevel_l2tpipsec.onc",
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel_l2tpipsec.json",
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("managed_toplevel_wifi_peap.onc",
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_managed_toplevel_wifi_peap.json",
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_DEVICE_POLICY),
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_open.onc",
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_open.json",
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_DEVICE_POLICY),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_wep_proxy.onc",
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_wep_proxy.json",
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_wpa_psk.onc",
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_wpa_psk.json",
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_leap.onc",
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_leap.json",
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams(
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            "toplevel_wifi_eap_clientcert_with_cert_pems.onc",
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "chromeos/net/shill_for_toplevel_wifi_eap_clientcert.json",
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            onc::ONC_SOURCE_USER_POLICY),
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ImportParams("toplevel_openvpn_clientcert_with_cert_pems.onc",
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_openvpn_clientcert.json",
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY),
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         ImportParams("toplevel_wifi_remove.onc",
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "chromeos/net/shill_for_toplevel_wifi_remove.json",
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      onc::ONC_SOURCE_USER_POLICY)));
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test remembered networks.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test network profiles.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test network devices.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test data plans.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Test monitor network / device.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
455