| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <cert.h> | 5 #include <cert.h> |
| 6 #include <pk11pub.h> | 6 #include <pk11pub.h> |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/at_exit.h" | 11 #include "base/at_exit.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/file_util.h" | 13 #include "base/file_util.h" |
| 14 #include "base/files/scoped_temp_dir.h" | 14 #include "base/files/scoped_temp_dir.h" |
| 15 #include "base/json/json_reader.h" | 15 #include "base/json/json_reader.h" |
| 16 #include "base/lazy_instance.h" | 16 #include "base/lazy_instance.h" |
| 17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 18 #include "chrome/browser/chromeos/cros/cros_library.h" | 18 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 19 #include "chrome/browser/chromeos/cros/network_library.h" | 19 #include "chrome/browser/chromeos/cros/network_library.h" |
| 20 #include "chrome/browser/chromeos/cros/onc_network_parser.h" | 20 #include "chrome/browser/chromeos/cros/network_library_impl_stub.h" |
| 21 #include "chrome/browser/chromeos/login/mock_user_manager.h" |
| 22 #include "chrome/browser/google_apis/test_util.h" |
| 21 #include "chrome/common/chrome_paths.h" | 23 #include "chrome/common/chrome_paths.h" |
| 22 #include "chromeos/network/onc/onc_certificate_importer.h" | 24 #include "chromeos/network/onc/onc_certificate_importer.h" |
| 23 #include "chromeos/network/onc/onc_constants.h" | 25 #include "chromeos/network/onc/onc_constants.h" |
| 26 #include "chromeos/network/onc/onc_test_utils.h" |
| 24 #include "chromeos/network/onc/onc_utils.h" | 27 #include "chromeos/network/onc/onc_utils.h" |
| 25 #include "crypto/nss_util.h" | 28 #include "crypto/nss_util.h" |
| 26 #include "net/base/crypto_module.h" | 29 #include "net/base/crypto_module.h" |
| 27 #include "net/base/nss_cert_database.h" | 30 #include "net/base/nss_cert_database.h" |
| 28 #include "net/base/x509_certificate.h" | 31 #include "net/base/x509_certificate.h" |
| 29 #include "testing/gmock/include/gmock/gmock.h" | 32 #include "testing/gmock/include/gmock/gmock.h" |
| 30 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 31 | 34 |
| 32 using ::testing::Return; | 35 using ::testing::Return; |
| 36 using ::testing::AtLeast; |
| 33 | 37 |
| 34 namespace chromeos { | 38 namespace chromeos { |
| 35 | 39 |
| 36 namespace { | 40 namespace { |
| 37 | 41 |
| 38 // Have to do a stub here because MOCK can't handle closure arguments. | 42 // Have to do a stub here because MOCK can't handle closure arguments. |
| 39 class StubEnrollmentDelegate : public EnrollmentDelegate { | 43 class StubEnrollmentDelegate : public EnrollmentDelegate { |
| 40 public: | 44 public: |
| 41 explicit StubEnrollmentDelegate() | 45 explicit StubEnrollmentDelegate() |
| 42 : did_enroll(false), | 46 : did_enroll(false), |
| 43 correct_args(false) {} | 47 correct_args(false) {} |
| 44 | 48 |
| 45 void Enroll(const std::vector<std::string>& uri_list, | 49 void Enroll(const std::vector<std::string>& uri_list, |
| 46 const base::Closure& closure) { | 50 const base::Closure& closure) { |
| 47 std::vector<std::string> expected_uri_list; | 51 std::vector<std::string> expected_uri_list; |
| 48 expected_uri_list.push_back("http://youtu.be/dQw4w9WgXcQ"); | 52 expected_uri_list.push_back("http://youtu.be/dQw4w9WgXcQ"); |
| 49 expected_uri_list.push_back("chrome-extension://abc/keygen-cert.html"); | 53 expected_uri_list.push_back("chrome-extension://abc/keygen-cert.html"); |
| 50 if (uri_list == expected_uri_list) | 54 if (uri_list == expected_uri_list) |
| 51 correct_args = true; | 55 correct_args = true; |
| 52 | 56 |
| 53 did_enroll = true; | 57 did_enroll = true; |
| 54 closure.Run(); | 58 closure.Run(); |
| 55 } | 59 } |
| 56 | 60 |
| 57 bool did_enroll; | 61 bool did_enroll; |
| 58 bool correct_args; | 62 bool correct_args; |
| 59 }; | 63 }; |
| 60 | 64 |
| 61 void WifiNetworkConnectCallback(NetworkLibrary* cros, WifiNetwork* wifi) { | 65 void WifiNetworkConnectCallback(NetworkLibrary* cros, WifiNetwork* wifi) { |
| 62 cros->ConnectToWifiNetwork(wifi); | 66 cros->ConnectToWifiNetwork(wifi, false); |
| 63 } | 67 } |
| 64 | 68 |
| 65 void VirtualNetworkConnectCallback(NetworkLibrary* cros, VirtualNetwork* vpn) { | 69 void VirtualNetworkConnectCallback(NetworkLibrary* cros, VirtualNetwork* vpn) { |
| 66 cros->ConnectToVirtualNetwork(vpn); | 70 cros->ConnectToVirtualNetwork(vpn); |
| 67 } | 71 } |
| 68 | 72 |
| 69 } // namespace | 73 } // namespace |
| 70 | 74 |
| 71 TEST(NetworkLibraryTest, DecodeNonAsciiSSID) { | 75 TEST(NetworkLibraryTest, DecodeNonAsciiSSID) { |
| 72 | 76 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 } | 128 } |
| 125 } | 129 } |
| 126 | 130 |
| 127 // Create a stub libcros for testing NetworkLibrary functionality through | 131 // Create a stub libcros for testing NetworkLibrary functionality through |
| 128 // NetworkLibraryStubImpl. | 132 // NetworkLibraryStubImpl. |
| 129 // NOTE: It would be of little value to test stub functions that simply return | 133 // NOTE: It would be of little value to test stub functions that simply return |
| 130 // predefined values, e.g. ethernet_available(). However, many other functions | 134 // predefined values, e.g. ethernet_available(). However, many other functions |
| 131 // such as connected_network() return values which are set indirectly and thus | 135 // such as connected_network() return values which are set indirectly and thus |
| 132 // we can test the logic of those setters. | 136 // we can test the logic of those setters. |
| 133 | 137 |
| 134 class NetworkLibraryStubTest : public testing::Test { | 138 class NetworkLibraryStubTest : public ::testing::Test { |
| 135 public: | 139 public: |
| 136 NetworkLibraryStubTest() : cros_(NULL) {} | 140 NetworkLibraryStubTest() : cros_(NULL) {} |
| 137 | 141 |
| 138 protected: | 142 protected: |
| 139 virtual void SetUp() { | 143 virtual void SetUp() { |
| 140 ASSERT_TRUE(test_nssdb_.is_open()); | 144 ASSERT_TRUE(test_nssdb_.is_open()); |
| 141 | 145 |
| 142 slot_ = net::NSSCertDatabase::GetInstance()->GetPublicModule(); | 146 slot_ = net::NSSCertDatabase::GetInstance()->GetPublicModule(); |
| 143 cros_ = CrosLibrary::Get()->GetNetworkLibrary(); | 147 cros_ = static_cast<NetworkLibraryImplStub*>( |
| 148 CrosLibrary::Get()->GetNetworkLibrary()); |
| 144 ASSERT_TRUE(cros_) << "GetNetworkLibrary() Failed!"; | 149 ASSERT_TRUE(cros_) << "GetNetworkLibrary() Failed!"; |
| 145 | 150 |
| 146 // Test db should be empty at start of test. | 151 // Test db should be empty at start of test. |
| 147 EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size()); | 152 EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size()); |
| 148 } | 153 } |
| 154 |
| 149 virtual void TearDown() { | 155 virtual void TearDown() { |
| 150 cros_ = NULL; | 156 cros_ = NULL; |
| 151 EXPECT_TRUE(CleanupSlotContents(slot_->os_module_handle())); | 157 EXPECT_TRUE(CleanupSlotContents(slot_->os_module_handle())); |
| 152 EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size()); | 158 EXPECT_EQ(0U, ListCertsInSlot(slot_->os_module_handle()).size()); |
| 153 } | 159 } |
| 154 | 160 |
| 155 virtual void GetTestData(const std::string& filename, | 161 // Load the ONC from |onc_file| using NetworkLibrary::LoadOncNetworks. Check |
| 156 scoped_ptr<base::ListValue>* certificates, | 162 // that return value matches |expect_successful_import| and the configuration |
| 157 scoped_ptr<base::ListValue>* network_configs) { | 163 // that would be sent to Shill matches |shill_json|. |
| 158 FilePath path; | 164 void LoadOncAndVerifyNetworks(std::string onc_file, |
| 159 PathService::Get(chrome::DIR_TEST_DATA, &path); | 165 std::string shill_json, |
| 160 path = path.AppendASCII("chromeos").AppendASCII("cros").Append(filename); | 166 onc::ONCSource source, |
| 161 ASSERT_TRUE(file_util::PathExists(path)) | 167 bool expect_successful_import) { |
| 162 << "Couldn't find test data file " << path.value(); | 168 ScopedMockUserManagerEnabler mock_user_manager; |
| 163 std::string contents; | 169 mock_user_manager.user_manager()->SetLoggedInUser("madmax@my.domain.com"); |
| 164 ASSERT_TRUE(file_util::ReadFileToString(path, &contents)) | 170 EXPECT_CALL(*mock_user_manager.user_manager(), IsUserLoggedIn()) |
| 165 << "Unable to read test data file " << path.value(); | 171 .Times(AtLeast(0)) |
| 172 .WillRepeatedly(Return(true)); |
| 166 | 173 |
| 167 scoped_ptr<base::DictionaryValue> root = | 174 std::string onc_blob = |
| 168 onc::ReadDictionaryFromJson(contents); | 175 onc::test_utils::ReadTestData(onc_file); |
| 169 CHECK(root.get() != NULL) << "ONC is not a valid JSON dictionary."; | |
| 170 | 176 |
| 171 base::ListValue* certificates_ptr; | 177 scoped_ptr<base::Value> expected_value = |
| 172 CHECK(root->GetListWithoutPathExpansion(onc::kCertificates, | 178 google_apis::test_util::LoadJSONFile(shill_json); |
| 173 &certificates_ptr)); | 179 base::DictionaryValue* expected_configs; |
| 174 certificates->reset(certificates_ptr->DeepCopy()); | 180 expected_value->GetAsDictionary(&expected_configs); |
| 175 | 181 |
| 176 base::ListValue* network_configs_ptr; | 182 EXPECT_EQ(expect_successful_import, |
| 177 CHECK(root->GetListWithoutPathExpansion(onc::kNetworkConfigurations, | 183 cros_->LoadOncNetworks(onc_blob, "", source, true)); |
| 178 &network_configs_ptr)); | 184 |
| 179 network_configs->reset(network_configs_ptr->DeepCopy()); | 185 const std::map<std::string, base::DictionaryValue*>& configs = |
| 186 cros_->GetConfigurations(); |
| 187 |
| 188 EXPECT_EQ(expected_configs->size(), configs.size()); |
| 189 |
| 190 for (base::DictionaryValue::Iterator it(*expected_configs); it.HasNext(); |
| 191 it.Advance()) { |
| 192 const base::DictionaryValue* expected_config; |
| 193 it.value().GetAsDictionary(&expected_config); |
| 194 |
| 195 std::map<std::string, base::DictionaryValue*>::const_iterator entry = |
| 196 configs.find(it.key()); |
| 197 EXPECT_NE(entry, configs.end()); |
| 198 base::DictionaryValue* actual_config = entry->second; |
| 199 EXPECT_TRUE(onc::test_utils::Equals(expected_config, actual_config)); |
| 200 } |
| 180 } | 201 } |
| 181 | 202 |
| 182 ScopedStubCrosEnabler cros_stub_; | 203 ScopedStubCrosEnabler cros_stub_; |
| 183 NetworkLibrary* cros_; | 204 NetworkLibraryImplStub* cros_; |
| 184 private: | 205 protected: |
| 185 net::CertificateList ListCertsInSlot(PK11SlotInfo* slot) { | 206 net::CertificateList ListCertsInSlot(PK11SlotInfo* slot) { |
| 186 net::CertificateList result; | 207 net::CertificateList result; |
| 187 CERTCertList* cert_list = PK11_ListCertsInSlot(slot); | 208 CERTCertList* cert_list = PK11_ListCertsInSlot(slot); |
| 188 for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); | 209 for (CERTCertListNode* node = CERT_LIST_HEAD(cert_list); |
| 189 !CERT_LIST_END(node, cert_list); | 210 !CERT_LIST_END(node, cert_list); |
| 190 node = CERT_LIST_NEXT(node)) { | 211 node = CERT_LIST_NEXT(node)) { |
| 191 result.push_back(net::X509Certificate::CreateFromHandle( | 212 result.push_back(net::X509Certificate::CreateFromHandle( |
| 192 node->cert, net::X509Certificate::OSCertHandles())); | 213 node->cert, net::X509Certificate::OSCertHandles())); |
| 193 } | 214 } |
| 194 CERT_DestroyCertList(cert_list); | 215 CERT_DestroyCertList(cert_list); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 WifiNetwork* wifi1 = cros_->FindWifiNetworkByPath("wifi1"); | 310 WifiNetwork* wifi1 = cros_->FindWifiNetworkByPath("wifi1"); |
| 290 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1); | 311 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1); |
| 291 EXPECT_TRUE(wifi1->connected()); | 312 EXPECT_TRUE(wifi1->connected()); |
| 292 cros_->DisconnectFromNetwork(wifi1); | 313 cros_->DisconnectFromNetwork(wifi1); |
| 293 EXPECT_FALSE(wifi1->connected()); | 314 EXPECT_FALSE(wifi1->connected()); |
| 294 EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1)); | 315 EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1)); |
| 295 cros_->ConnectToWifiNetwork(wifi1); | 316 cros_->ConnectToWifiNetwork(wifi1); |
| 296 EXPECT_TRUE(wifi1->connected()); | 317 EXPECT_TRUE(wifi1->connected()); |
| 297 } | 318 } |
| 298 | 319 |
| 299 TEST_F(NetworkLibraryStubTest, NetworkConnectOncWifi) { | 320 TEST_F(NetworkLibraryStubTest, NetworkConnectWifiWithCertPattern) { |
| 300 // Import a wireless network via loading an ONC file. | 321 scoped_ptr<base::DictionaryValue> onc_root = |
| 301 scoped_ptr<base::ListValue> network_configs; | 322 onc::test_utils::ReadTestDictionary("toplevel_wifi_eap_clientcert.onc"); |
| 302 scoped_ptr<base::ListValue> certificates; | 323 base::ListValue* certificates; |
| 303 GetTestData("cert-pattern.onc", &certificates, &network_configs); | 324 onc_root->GetListWithoutPathExpansion(onc::kCertificates, &certificates); |
| 304 | 325 |
| 305 onc::CertificateImporter importer(onc::ONC_SOURCE_USER_IMPORT, | 326 onc::CertificateImporter importer(onc::ONC_SOURCE_USER_IMPORT, |
| 306 false /* don't allow webtrust */); | 327 false /* don't allow webtrust */); |
| 307 EXPECT_EQ(onc::CertificateImporter::IMPORT_OK, | 328 ASSERT_EQ(onc::CertificateImporter::IMPORT_OK, |
| 308 importer.ParseAndStoreCertificates(*certificates)); | 329 importer.ParseAndStoreCertificates(*certificates)); |
| 309 | 330 |
| 310 OncNetworkParser parser(*network_configs, | 331 WifiNetwork* wifi = cros_->FindWifiNetworkByPath("wifi_cert_pattern"); |
| 311 onc::ONC_SOURCE_USER_IMPORT); | |
| 312 ASSERT_TRUE(parser.parse_error().empty()); | |
| 313 EXPECT_EQ(1, parser.GetNetworkConfigsSize()); | |
| 314 scoped_ptr<Network> network(parser.ParseNetwork(0, NULL)); | |
| 315 ASSERT_TRUE(network.get()); | |
| 316 EXPECT_EQ(CLIENT_CERT_TYPE_PATTERN, network->client_cert_type()); | |
| 317 | 332 |
| 318 StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate(); | 333 StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate(); |
| 319 | 334 wifi->SetEnrollmentDelegate(enrollment_delegate); |
| 320 network->SetEnrollmentDelegate(enrollment_delegate); | |
| 321 EXPECT_FALSE(enrollment_delegate->did_enroll); | 335 EXPECT_FALSE(enrollment_delegate->did_enroll); |
| 322 EXPECT_FALSE(enrollment_delegate->correct_args); | 336 EXPECT_FALSE(enrollment_delegate->correct_args); |
| 323 WifiNetwork* wifi1 = static_cast<WifiNetwork*>(network.get()); | |
| 324 | 337 |
| 325 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi1); | 338 ASSERT_NE(static_cast<const WifiNetwork*>(NULL), wifi); |
| 326 EXPECT_FALSE(wifi1->connected()); | 339 EXPECT_FALSE(wifi->connected()); |
| 327 EXPECT_TRUE(cros_->CanConnectToNetwork(wifi1)); | 340 EXPECT_TRUE(cros_->CanConnectToNetwork(wifi)); |
| 328 EXPECT_FALSE(wifi1->connected()); | 341 EXPECT_FALSE(wifi->connected()); |
| 329 wifi1->AttemptConnection( | 342 wifi->AttemptConnection( |
| 330 base::Bind(&WifiNetworkConnectCallback, cros_, wifi1)); | 343 base::Bind(&WifiNetworkConnectCallback, cros_, wifi)); |
| 331 EXPECT_TRUE(wifi1->connected()); | 344 EXPECT_TRUE(wifi->connected()); |
| 332 EXPECT_TRUE(enrollment_delegate->did_enroll); | 345 EXPECT_TRUE(enrollment_delegate->did_enroll); |
| 333 EXPECT_TRUE(enrollment_delegate->correct_args); | 346 EXPECT_TRUE(enrollment_delegate->correct_args); |
| 334 } | 347 } |
| 335 | 348 |
| 336 TEST_F(NetworkLibraryStubTest, NetworkConnectOncVPN) { | 349 TEST_F(NetworkLibraryStubTest, NetworkConnectVPNWithCertPattern) { |
| 337 // Import a wireless network via loading an ONC file. | 350 scoped_ptr<base::DictionaryValue> onc_root = |
| 338 scoped_ptr<base::ListValue> network_configs; | 351 onc::test_utils::ReadTestDictionary("toplevel_openvpn_clientcert.onc"); |
| 339 scoped_ptr<base::ListValue> certificates; | 352 base::ListValue* certificates; |
| 340 GetTestData("cert-pattern-vpn.onc", &certificates, &network_configs); | 353 onc_root->GetListWithoutPathExpansion(onc::kCertificates, &certificates); |
| 341 | 354 |
| 342 onc::CertificateImporter importer(onc::ONC_SOURCE_USER_IMPORT, | 355 onc::CertificateImporter importer(onc::ONC_SOURCE_USER_IMPORT, |
| 343 false /* don't allow webtrust */); | 356 false /* don't allow webtrust */); |
| 344 EXPECT_EQ(onc::CertificateImporter::IMPORT_OK, | 357 ASSERT_EQ(onc::CertificateImporter::IMPORT_OK, |
| 345 importer.ParseAndStoreCertificates(*certificates)); | 358 importer.ParseAndStoreCertificates(*certificates)); |
| 346 | 359 |
| 347 OncNetworkParser parser(*network_configs, | 360 VirtualNetwork* vpn = cros_->FindVirtualNetworkByPath("vpn_cert_pattern"); |
| 348 onc::ONC_SOURCE_USER_IMPORT); | |
| 349 ASSERT_TRUE(parser.parse_error().empty()); | |
| 350 EXPECT_EQ(1, parser.GetNetworkConfigsSize()); | |
| 351 scoped_ptr<Network> network(parser.ParseNetwork(0, NULL)); | |
| 352 ASSERT_TRUE(network.get()); | |
| 353 EXPECT_EQ(CLIENT_CERT_TYPE_PATTERN, network->client_cert_type()); | |
| 354 | 361 |
| 355 StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate(); | 362 StubEnrollmentDelegate* enrollment_delegate = new StubEnrollmentDelegate(); |
| 356 | 363 vpn->SetEnrollmentDelegate(enrollment_delegate); |
| 357 network->SetEnrollmentDelegate(enrollment_delegate); | |
| 358 EXPECT_FALSE(enrollment_delegate->did_enroll); | 364 EXPECT_FALSE(enrollment_delegate->did_enroll); |
| 359 EXPECT_FALSE(enrollment_delegate->correct_args); | 365 EXPECT_FALSE(enrollment_delegate->correct_args); |
| 360 VirtualNetwork* vpn1 = static_cast<VirtualNetwork*>(network.get()); | |
| 361 | 366 |
| 362 ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1); | 367 ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), vpn); |
| 363 EXPECT_FALSE(vpn1->connected()); | 368 EXPECT_FALSE(vpn->connected()); |
| 364 EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1)); | 369 EXPECT_TRUE(cros_->CanConnectToNetwork(vpn)); |
| 365 EXPECT_FALSE(vpn1->connected()); | 370 EXPECT_FALSE(vpn->connected()); |
| 366 vpn1->AttemptConnection( | 371 vpn->AttemptConnection( |
| 367 base::Bind(&VirtualNetworkConnectCallback, cros_, vpn1)); | 372 base::Bind(&VirtualNetworkConnectCallback, cros_, vpn)); |
| 368 EXPECT_TRUE(vpn1->connected()); | 373 EXPECT_TRUE(vpn->connected()); |
| 369 EXPECT_TRUE(enrollment_delegate->did_enroll); | 374 EXPECT_TRUE(enrollment_delegate->did_enroll); |
| 370 EXPECT_TRUE(enrollment_delegate->correct_args); | 375 EXPECT_TRUE(enrollment_delegate->correct_args); |
| 371 } | 376 } |
| 372 | 377 |
| 373 TEST_F(NetworkLibraryStubTest, NetworkConnectVPN) { | 378 TEST_F(NetworkLibraryStubTest, NetworkConnectVPN) { |
| 374 VirtualNetwork* vpn1 = cros_->FindVirtualNetworkByPath("vpn1"); | 379 VirtualNetwork* vpn1 = cros_->FindVirtualNetworkByPath("vpn1"); |
| 375 EXPECT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1); | 380 EXPECT_NE(static_cast<const VirtualNetwork*>(NULL), vpn1); |
| 376 EXPECT_FALSE(vpn1->connected()); | 381 EXPECT_FALSE(vpn1->connected()); |
| 377 EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1)); | 382 EXPECT_TRUE(cros_->CanConnectToNetwork(vpn1)); |
| 378 cros_->ConnectToVirtualNetwork(vpn1); | 383 cros_->ConnectToVirtualNetwork(vpn1); |
| 379 EXPECT_TRUE(vpn1->connected()); | 384 EXPECT_TRUE(vpn1->connected()); |
| 380 ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network()); | 385 ASSERT_NE(static_cast<const VirtualNetwork*>(NULL), cros_->virtual_network()); |
| 381 EXPECT_EQ("vpn1", cros_->virtual_network()->service_path()); | 386 EXPECT_EQ("vpn1", cros_->virtual_network()->service_path()); |
| 382 } | 387 } |
| 383 | 388 |
| 389 TEST_F(NetworkLibraryStubTest, LoadOncNetworksWithInvalidConfig) { |
| 390 LoadOncAndVerifyNetworks( |
| 391 "toplevel_partially_invalid.onc", |
| 392 "net/shill_for_toplevel_partially_invalid.json", |
| 393 onc::ONC_SOURCE_USER_POLICY, |
| 394 false /* expect import to fail */); |
| 395 |
| 396 EXPECT_EQ(ListCertsInSlot(slot_->os_module_handle()).size(), 1U); |
| 397 } |
| 398 |
| 399 namespace { |
| 400 |
| 401 struct ImportParams { |
| 402 // |onc_file|: Filename of source ONC, relative to |
| 403 // chromeos/test/data/network. |
| 404 // |shill_file|: Filename of expected Shill config, relative to |
| 405 // chrome/test/data/chromeos). |
| 406 // |onc_source|: The source of the ONC. |
| 407 // |expect_import_result|: The expected return value of LoadOncNetworks. |
| 408 ImportParams(const std::string& onc_file, |
| 409 const std::string& shill_file, |
| 410 onc::ONCSource onc_source, |
| 411 bool expect_import_result = true) |
| 412 : onc_file(onc_file), |
| 413 shill_file(shill_file), |
| 414 onc_source(onc_source), |
| 415 expect_import_result(expect_import_result) { |
| 416 } |
| 417 |
| 418 std::string onc_file, shill_file; |
| 419 onc::ONCSource onc_source; |
| 420 bool expect_import_result; |
| 421 }; |
| 422 |
| 423 ::std::ostream& operator<<(::std::ostream& os, const ImportParams& params) { |
| 424 return os << "(" << params.onc_file << ", " << params.shill_file << ", " |
| 425 << onc::GetSourceAsString(params.onc_source) << ", " |
| 426 << (params.expect_import_result ? "valid" : "invalid") << ")"; |
| 427 } |
| 428 |
| 429 } // namespace |
| 430 |
| 431 class LoadOncNetworksTest |
| 432 : public NetworkLibraryStubTest, |
| 433 public ::testing::WithParamInterface<ImportParams> { |
| 434 }; |
| 435 |
| 436 TEST_P(LoadOncNetworksTest, VerifyNetworksAndCertificates) { |
| 437 LoadOncAndVerifyNetworks(GetParam().onc_file, |
| 438 GetParam().shill_file, |
| 439 GetParam().onc_source, |
| 440 GetParam().expect_import_result); |
| 441 |
| 442 scoped_ptr<base::DictionaryValue> onc_dict = |
| 443 onc::test_utils::ReadTestDictionary(GetParam().onc_file); |
| 444 base::ListValue* onc_certs; |
| 445 onc_dict->GetListWithoutPathExpansion(onc::kCertificates, &onc_certs); |
| 446 |
| 447 EXPECT_EQ(onc_certs->GetSize(), |
| 448 ListCertsInSlot(slot_->os_module_handle()).size()); |
| 449 } |
| 450 |
| 451 INSTANTIATE_TEST_CASE_P( |
| 452 LoadOncNetworksTest, |
| 453 LoadOncNetworksTest, |
| 454 ::testing::Values( |
| 455 ImportParams("managed_toplevel1.onc", |
| 456 "net/shill_for_managed_toplevel1.json", |
| 457 onc::ONC_SOURCE_USER_POLICY), |
| 458 ImportParams("managed_toplevel2.onc", |
| 459 "net/shill_for_managed_toplevel2.json", |
| 460 onc::ONC_SOURCE_USER_POLICY), |
| 461 ImportParams("managed_toplevel_l2tpipsec.onc", |
| 462 "net/shill_for_managed_toplevel_l2tpipsec.json", |
| 463 onc::ONC_SOURCE_USER_POLICY), |
| 464 ImportParams("managed_toplevel_wifi_peap.onc", |
| 465 "net/shill_for_managed_toplevel_wifi_peap.json", |
| 466 onc::ONC_SOURCE_DEVICE_POLICY), |
| 467 ImportParams("toplevel_wifi_open.onc", |
| 468 "net/shill_for_toplevel_wifi_open.json", |
| 469 onc::ONC_SOURCE_DEVICE_POLICY), |
| 470 ImportParams("toplevel_wifi_wep_proxy.onc", |
| 471 "net/shill_for_toplevel_wifi_wep_proxy.json", |
| 472 onc::ONC_SOURCE_USER_POLICY), |
| 473 ImportParams("toplevel_wifi_wpa_psk.onc", |
| 474 "net/shill_for_toplevel_wifi_wpa_psk.json", |
| 475 onc::ONC_SOURCE_USER_POLICY), |
| 476 ImportParams("toplevel_wifi_leap.onc", |
| 477 "net/shill_for_toplevel_wifi_leap.json", |
| 478 onc::ONC_SOURCE_USER_POLICY), |
| 479 ImportParams("toplevel_wifi_eap_clientcert.onc", |
| 480 "net/shill_for_toplevel_wifi_eap_clientcert.json", |
| 481 onc::ONC_SOURCE_USER_POLICY), |
| 482 ImportParams("toplevel_openvpn_clientcert.onc", |
| 483 "net/shill_for_toplevel_openvpn_clientcert.json", |
| 484 onc::ONC_SOURCE_USER_POLICY), |
| 485 ImportParams("toplevel_wifi_remove.onc", |
| 486 "net/shill_for_toplevel_wifi_remove.json", |
| 487 onc::ONC_SOURCE_USER_POLICY), |
| 488 ImportParams("toplevel_with_unknown_fields.onc", |
| 489 "net/shill_for_toplevel_with_unknown_fields.json", |
| 490 onc::ONC_SOURCE_USER_POLICY, |
| 491 false))); |
| 492 |
| 384 // TODO(stevenjb): Test remembered networks. | 493 // TODO(stevenjb): Test remembered networks. |
| 385 | 494 |
| 386 // TODO(stevenjb): Test network profiles. | 495 // TODO(stevenjb): Test network profiles. |
| 387 | 496 |
| 388 // TODO(stevenjb): Test network devices. | 497 // TODO(stevenjb): Test network devices. |
| 389 | 498 |
| 390 // TODO(stevenjb): Test data plans. | 499 // TODO(stevenjb): Test data plans. |
| 391 | 500 |
| 392 // TODO(stevenjb): Test monitor network / device. | 501 // TODO(stevenjb): Test monitor network / device. |
| 393 | 502 |
| 394 } // namespace chromeos | 503 } // namespace chromeos |
| OLD | NEW |