| Index: chrome/browser/chromeos/cros/network_library_unittest.cc
|
| diff --git a/chrome/browser/chromeos/cros/network_library_unittest.cc b/chrome/browser/chromeos/cros/network_library_unittest.cc
|
| index c5e8949acde9f06bef39751b94bcbfe3774a2fe7..8365039432dc751861ac6899d9a4f9e4b834b6b0 100644
|
| --- a/chrome/browser/chromeos/cros/network_library_unittest.cc
|
| +++ b/chrome/browser/chromeos/cros/network_library_unittest.cc
|
| @@ -17,10 +17,13 @@
|
| #include "base/path_service.h"
|
| #include "chrome/browser/chromeos/cros/cros_library.h"
|
| #include "chrome/browser/chromeos/cros/network_library.h"
|
| -#include "chrome/browser/chromeos/cros/onc_network_parser.h"
|
| +#include "chrome/browser/chromeos/cros/network_library_impl_stub.h"
|
| +#include "chrome/browser/chromeos/login/mock_user_manager.h"
|
| +#include "chrome/browser/google_apis/test_util.h"
|
| #include "chrome/common/chrome_paths.h"
|
| #include "chromeos/network/onc/onc_certificate_importer.h"
|
| #include "chromeos/network/onc/onc_constants.h"
|
| +#include "chromeos/network/onc/onc_test_utils.h"
|
| #include "chromeos/network/onc/onc_utils.h"
|
| #include "crypto/nss_util.h"
|
| #include "net/base/crypto_module.h"
|
| @@ -30,6 +33,7 @@
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using ::testing::Return;
|
| +using ::testing::AtLeast;
|
|
|
| namespace chromeos {
|
|
|
| @@ -59,7 +63,7 @@ class StubEnrollmentDelegate : public EnrollmentDelegate {
|
| };
|
|
|
| void WifiNetworkConnectCallback(NetworkLibrary* cros, WifiNetwork* wifi) {
|
| - cros->ConnectToWifiNetwork(wifi);
|
| + cros->ConnectToWifiNetwork(wifi, false);
|
| }
|
|
|
| void VirtualNetworkConnectCallback(NetworkLibrary* cros, VirtualNetwork* vpn) {
|
| @@ -131,7 +135,7 @@ TEST(NetworkLibraryTest, DecodeNonAsciiSSID) {
|
| // such as connected_network() return values which are set indirectly and thus
|
| // we can test the logic of those setters.
|
|
|
| -class NetworkLibraryStubTest : public testing::Test {
|
| +class NetworkLibraryStubTest : public ::testing::Test {
|
| public:
|
| NetworkLibraryStubTest() : cros_(NULL) {}
|
|
|
| @@ -140,48 +144,65 @@ class NetworkLibraryStubTest : public testing::Test {
|
| ASSERT_TRUE(test_nssdb_.is_open());
|
|
|
| slot_ = net::NSSCertDatabase::GetInstance()->GetPublicModule();
|
| - cros_ = CrosLibrary::Get()->GetNetworkLibrary();
|
| + cros_ = static_cast<NetworkLibraryImplStub*>(
|
| + CrosLibrary::Get()->GetNetworkLibrary());
|
| ASSERT_TRUE(cros_) << "GetNetworkLibrary() Failed!";
|
|
|
| // Test db should be empty at start of test.
|
| EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size());
|
| }
|
| +
|
| virtual void TearDown() {
|
| cros_ = NULL;
|
| EXPECT_TRUE(CleanupSlotContents(slot_->os_module_handle()));
|
| EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size());
|
| }
|
|
|
| - virtual void GetTestData(const std::string& filename,
|
| - scoped_ptr<base::ListValue>* certificates,
|
| - scoped_ptr<base::ListValue>* network_configs) {
|
| - FilePath path;
|
| - PathService::Get(chrome::DIR_TEST_DATA, &path);
|
| - path = path.AppendASCII("chromeos").AppendASCII("cros").Append(filename);
|
| - ASSERT_TRUE(file_util::PathExists(path))
|
| - << "Couldn't find test data file " << path.value();
|
| - std::string contents;
|
| - ASSERT_TRUE(file_util::ReadFileToString(path, &contents))
|
| - << "Unable to read test data file " << path.value();
|
| -
|
| - scoped_ptr<base::DictionaryValue> root =
|
| - onc::ReadDictionaryFromJson(contents);
|
| - CHECK(root.get() != NULL) << "ONC is not a valid JSON dictionary.";
|
| -
|
| - base::ListValue* certificates_ptr;
|
| - CHECK(root->GetListWithoutPathExpansion(onc::kCertificates,
|
| - &certificates_ptr));
|
| - certificates->reset(certificates_ptr->DeepCopy());
|
| -
|
| - base::ListValue* network_configs_ptr;
|
| - CHECK(root->GetListWithoutPathExpansion(onc::kNetworkConfigurations,
|
| - &network_configs_ptr));
|
| - network_configs->reset(network_configs_ptr->DeepCopy());
|
| + // Load the ONC from |onc_file| using NetworkLibrary::LoadOncNetworks. Check
|
| + // that return value matches |expect_successful_import| and the configuration
|
| + // that would be sent to Shill matches |shill_json|.
|
| + void LoadOncAndVerifyNetworks(std::string onc_file,
|
| + std::string shill_json,
|
| + onc::ONCSource source,
|
| + bool expect_successful_import) {
|
| + ScopedMockUserManagerEnabler mock_user_manager;
|
| + mock_user_manager.user_manager()->SetLoggedInUser("madmax@my.domain.com");
|
| + EXPECT_CALL(*mock_user_manager.user_manager(), IsUserLoggedIn())
|
| + .Times(AtLeast(0))
|
| + .WillRepeatedly(Return(true));
|
| +
|
| + std::string onc_blob =
|
| + onc::test_utils::ReadTestData(onc_file);
|
| +
|
| + scoped_ptr<base::Value> expected_value =
|
| + google_apis::test_util::LoadJSONFile(shill_json);
|
| + base::DictionaryValue* expected_configs;
|
| + expected_value->GetAsDictionary(&expected_configs);
|
| +
|
| + EXPECT_EQ(expect_successful_import,
|
| + cros_->LoadOncNetworks(onc_blob, "", source, true));
|
| +
|
| + const std::map<std::string, base::DictionaryValue*>& configs =
|
| + cros_->GetConfigurations();
|
| +
|
| + EXPECT_EQ(expected_configs->size(), configs.size());
|
| +
|
| + for (base::DictionaryValue::Iterator it(*expected_configs); it.HasNext();
|
| + it.Advance()) {
|
| + const base::DictionaryValue* expected_config;
|
| + it.value().GetAsDictionary(&expected_config);
|
| +
|
| + std::map<std::string, base::DictionaryValue*>::const_iterator entry =
|
| + configs.find(it.key());
|
| + EXPECT_NE(entry, configs.end());
|
| + base::DictionaryValue* actual_config = entry->second;
|
| + EXPECT_TRUE(onc::test_utils::Equals(expected_config, actual_config));
|
| + }
|
| }
|
|
|
| ScopedStubCrosEnabler cros_stub_;
|
| - NetworkLibrary* cros_;
|
| - private:
|
| + NetworkLibraryImplStub* cros_;
|
| + protected:
|
| net::CertificateList ListCertsInSlot(PK11SlotInfo* slot) {
|
| net::CertificateList result;
|
| CERTCertList* cert_list = PK11_ListCertsInSlot(slot);
|
| @@ -296,76 +317,60 @@ TEST_F(NetworkLibraryStubTest, NetworkConnectWifi) {
|
| EXPECT_TRUE(wifi1->connected());
|
| }
|
|
|
| -TEST_F(NetworkLibraryStubTest, NetworkConnectOncWifi) {
|
| - // Import a wireless network via loading an ONC file.
|
| - scoped_ptr<base::ListValue> network_configs;
|
| - scoped_ptr<base::ListValue> certificates;
|
| - GetTestData("cert-pattern.onc", &certificates, &network_configs);
|
| +TEST_F(NetworkLibraryStubTest, NetworkConnectWifiWithCertPattern) {
|
| + scoped_ptr<base::DictionaryValue> onc_root =
|
| + onc::test_utils::ReadTestDictionary("toplevel_wifi_eap_clientcert.onc");
|
| + base::ListValue* certificates;
|
| + onc_root->GetListWithoutPathExpansion(onc::kCertificates, &certificates);
|
|
|
| onc::CertificateImporter importer(onc::ONC_SOURCE_USER_IMPORT,
|
| false /* don't allow webtrust */);
|
| - EXPECT_EQ(onc::CertificateImporter::IMPORT_OK,
|
| + ASSERT_EQ(onc::CertificateImporter::IMPORT_OK,
|
| importer.ParseAndStoreCertificates(*certificates));
|
|
|
| - OncNetworkParser parser(*network_configs,
|
| - onc::ONC_SOURCE_USER_IMPORT);
|
| - ASSERT_TRUE(parser.parse_error().empty());
|
| - EXPECT_EQ(1, parser.GetNetworkConfigsSize());
|
| - scoped_ptr<Network> network(parser.ParseNetwork(0, NULL));
|
| - ASSERT_TRUE(network.get());
|
| - EXPECT_EQ(CLIENT_CERT_TYPE_PATTERN, network->client_cert_type());
|
| + WifiNetwork* wifi = cros_->FindWifiNetworkByPath("wifi_cert_pattern");
|
|
|
| StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
|
| -
|
| - network->SetEnrollmentDelegate(enrollment_delegate);
|
| + wifi->SetEnrollmentDelegate(enrollment_delegate);
|
| EXPECT_FALSE(enrollment_delegate->did_enroll);
|
| EXPECT_FALSE(enrollment_delegate->correct_args);
|
| - WifiNetwork* wifi1 = static_cast<WifiNetwork*>(network.get());
|
|
|
| - ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1);
|
| - EXPECT_FALSE(wifi1->connected());
|
| - EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1));
|
| - EXPECT_FALSE(wifi1->connected());
|
| - wifi1->AttemptConnection(
|
| - base::Bind(&WifiNetworkConnectCallback, cros_, wifi1));
|
| - EXPECT_TRUE(wifi1->connected());
|
| + ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi);
|
| + EXPECT_FALSE(wifi->connected());
|
| + EXPECT_TRUE(cros_->CanConnectToNetwork(wifi));
|
| + EXPECT_FALSE(wifi->connected());
|
| + wifi->AttemptConnection(
|
| + base::Bind(&WifiNetworkConnectCallback, cros_, wifi));
|
| + EXPECT_TRUE(wifi->connected());
|
| EXPECT_TRUE(enrollment_delegate->did_enroll);
|
| EXPECT_TRUE(enrollment_delegate->correct_args);
|
| }
|
|
|
| -TEST_F(NetworkLibraryStubTest, NetworkConnectOncVPN) {
|
| - // Import a wireless network via loading an ONC file.
|
| - scoped_ptr<base::ListValue> network_configs;
|
| - scoped_ptr<base::ListValue> certificates;
|
| - GetTestData("cert-pattern-vpn.onc", &certificates, &network_configs);
|
| +TEST_F(NetworkLibraryStubTest, NetworkConnectVPNWithCertPattern) {
|
| + scoped_ptr<base::DictionaryValue> onc_root =
|
| + onc::test_utils::ReadTestDictionary("toplevel_openvpn_clientcert.onc");
|
| + base::ListValue* certificates;
|
| + onc_root->GetListWithoutPathExpansion(onc::kCertificates, &certificates);
|
|
|
| onc::CertificateImporter importer(onc::ONC_SOURCE_USER_IMPORT,
|
| false /* don't allow webtrust */);
|
| - EXPECT_EQ(onc::CertificateImporter::IMPORT_OK,
|
| + ASSERT_EQ(onc::CertificateImporter::IMPORT_OK,
|
| importer.ParseAndStoreCertificates(*certificates));
|
|
|
| - OncNetworkParser parser(*network_configs,
|
| - onc::ONC_SOURCE_USER_IMPORT);
|
| - ASSERT_TRUE(parser.parse_error().empty());
|
| - EXPECT_EQ(1, parser.GetNetworkConfigsSize());
|
| - scoped_ptr<Network> network(parser.ParseNetwork(0, NULL));
|
| - ASSERT_TRUE(network.get());
|
| - EXPECT_EQ(CLIENT_CERT_TYPE_PATTERN, network->client_cert_type());
|
| + VirtualNetwork* vpn = cros_->FindVirtualNetworkByPath("vpn_cert_pattern");
|
|
|
| StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate();
|
| -
|
| - network->SetEnrollmentDelegate(enrollment_delegate);
|
| + vpn->SetEnrollmentDelegate(enrollment_delegate);
|
| EXPECT_FALSE(enrollment_delegate->did_enroll);
|
| EXPECT_FALSE(enrollment_delegate->correct_args);
|
| - VirtualNetwork* vpn1 = static_cast<VirtualNetwork*>(network.get());
|
|
|
| - ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1);
|
| - EXPECT_FALSE(vpn1->connected());
|
| - EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1));
|
| - EXPECT_FALSE(vpn1->connected());
|
| - vpn1->AttemptConnection(
|
| - base::Bind(&VirtualNetworkConnectCallback, cros_, vpn1));
|
| - EXPECT_TRUE(vpn1->connected());
|
| + ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn);
|
| + EXPECT_FALSE(vpn->connected());
|
| + EXPECT_TRUE(cros_->CanConnectToNetwork(vpn));
|
| + EXPECT_FALSE(vpn->connected());
|
| + vpn->AttemptConnection(
|
| + base::Bind(&VirtualNetworkConnectCallback, cros_, vpn));
|
| + EXPECT_TRUE(vpn->connected());
|
| EXPECT_TRUE(enrollment_delegate->did_enroll);
|
| EXPECT_TRUE(enrollment_delegate->correct_args);
|
| }
|
| @@ -381,6 +386,110 @@ TEST_F(NetworkLibraryStubTest, NetworkConnectVPN) {
|
| EXPECT_EQ("vpn1", cros_->virtual_network()->service_path());
|
| }
|
|
|
| +TEST_F(NetworkLibraryStubTest, LoadOncNetworksWithInvalidConfig) {
|
| + LoadOncAndVerifyNetworks(
|
| + "toplevel_partially_invalid.onc",
|
| + "net/shill_for_toplevel_partially_invalid.json",
|
| + onc::ONC_SOURCE_USER_POLICY,
|
| + false /* expect import to fail */);
|
| +
|
| + EXPECT_EQ(ListCertsInSlot(slot_->os_module_handle()).size(), 1U);
|
| +}
|
| +
|
| +namespace {
|
| +
|
| +struct ImportParams {
|
| + // |onc_file|: Filename of source ONC, relative to
|
| + // chromeos/test/data/network.
|
| + // |shill_file|: Filename of expected Shill config, relative to
|
| + // chrome/test/data/chromeos).
|
| + // |onc_source|: The source of the ONC.
|
| + // |expect_import_result|: The expected return value of LoadOncNetworks.
|
| + ImportParams(const std::string& onc_file,
|
| + const std::string& shill_file,
|
| + onc::ONCSource onc_source,
|
| + bool expect_import_result = true)
|
| + : onc_file(onc_file),
|
| + shill_file(shill_file),
|
| + onc_source(onc_source),
|
| + expect_import_result(expect_import_result) {
|
| + }
|
| +
|
| + std::string onc_file, shill_file;
|
| + onc::ONCSource onc_source;
|
| + bool expect_import_result;
|
| +};
|
| +
|
| +::std::ostream& operator<<(::std::ostream& os, const ImportParams& params) {
|
| + return os << "(" << params.onc_file << ", " << params.shill_file << ", "
|
| + << onc::GetSourceAsString(params.onc_source) << ", "
|
| + << (params.expect_import_result ? "valid" : "invalid") << ")";
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class LoadOncNetworksTest
|
| + : public NetworkLibraryStubTest,
|
| + public ::testing::WithParamInterface<ImportParams> {
|
| +};
|
| +
|
| +TEST_P(LoadOncNetworksTest, VerifyNetworksAndCertificates) {
|
| + LoadOncAndVerifyNetworks(GetParam().onc_file,
|
| + GetParam().shill_file,
|
| + GetParam().onc_source,
|
| + GetParam().expect_import_result);
|
| +
|
| + scoped_ptr<base::DictionaryValue> onc_dict =
|
| + onc::test_utils::ReadTestDictionary(GetParam().onc_file);
|
| + base::ListValue* onc_certs;
|
| + onc_dict->GetListWithoutPathExpansion(onc::kCertificates, &onc_certs);
|
| +
|
| + EXPECT_EQ(onc_certs->GetSize(),
|
| + ListCertsInSlot(slot_->os_module_handle()).size());
|
| +}
|
| +
|
| +INSTANTIATE_TEST_CASE_P(
|
| + LoadOncNetworksTest,
|
| + LoadOncNetworksTest,
|
| + ::testing::Values(
|
| + ImportParams("managed_toplevel1.onc",
|
| + "net/shill_for_managed_toplevel1.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("managed_toplevel2.onc",
|
| + "net/shill_for_managed_toplevel2.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("managed_toplevel_l2tpipsec.onc",
|
| + "net/shill_for_managed_toplevel_l2tpipsec.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("managed_toplevel_wifi_peap.onc",
|
| + "net/shill_for_managed_toplevel_wifi_peap.json",
|
| + onc::ONC_SOURCE_DEVICE_POLICY),
|
| + ImportParams("toplevel_wifi_open.onc",
|
| + "net/shill_for_toplevel_wifi_open.json",
|
| + onc::ONC_SOURCE_DEVICE_POLICY),
|
| + ImportParams("toplevel_wifi_wep_proxy.onc",
|
| + "net/shill_for_toplevel_wifi_wep_proxy.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("toplevel_wifi_wpa_psk.onc",
|
| + "net/shill_for_toplevel_wifi_wpa_psk.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("toplevel_wifi_leap.onc",
|
| + "net/shill_for_toplevel_wifi_leap.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("toplevel_wifi_eap_clientcert.onc",
|
| + "net/shill_for_toplevel_wifi_eap_clientcert.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("toplevel_openvpn_clientcert.onc",
|
| + "net/shill_for_toplevel_openvpn_clientcert.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("toplevel_wifi_remove.onc",
|
| + "net/shill_for_toplevel_wifi_remove.json",
|
| + onc::ONC_SOURCE_USER_POLICY),
|
| + ImportParams("toplevel_with_unknown_fields.onc",
|
| + "net/shill_for_toplevel_with_unknown_fields.json",
|
| + onc::ONC_SOURCE_USER_POLICY,
|
| + false)));
|
| +
|
| // TODO(stevenjb): Test remembered networks.
|
|
|
| // TODO(stevenjb): Test network profiles.
|
|
|