Index: chromeos/network/network_connection_handler_unittest.cc |
diff --git a/chromeos/network/network_connection_handler_unittest.cc b/chromeos/network/network_connection_handler_unittest.cc |
index 0e991ef6f56034e09e3b0877e72fdf0df425ac2b..ddfa80773f3659ff7f4bd179c06a5f7eca8b4982 100644 |
--- a/chromeos/network/network_connection_handler_unittest.cc |
+++ b/chromeos/network/network_connection_handler_unittest.cc |
@@ -5,14 +5,27 @@ |
#include "chromeos/network/network_connection_handler.h" |
#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/file_util.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
+#include "base/strings/stringprintf.h" |
+#include "chromeos/cert_loader.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
#include "chromeos/dbus/shill_manager_client.h" |
#include "chromeos/dbus/shill_service_client.h" |
#include "chromeos/network/network_configuration_handler.h" |
#include "chromeos/network/network_state_handler.h" |
#include "chromeos/network/onc/onc_utils.h" |
+#include "chromeos/tpm_token_loader.h" |
+#include "crypto/nss_util.h" |
+#include "crypto/nss_util_internal.h" |
+#include "net/base/net_errors.h" |
+#include "net/base/test_data_directory.h" |
+#include "net/cert/nss_cert_database_chromeos.h" |
+#include "net/cert/x509_certificate.h" |
+#include "net/test/cert_test_util.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/cros_system_api/dbus/service_constants.h" |
@@ -33,25 +46,41 @@ namespace chromeos { |
class NetworkConnectionHandlerTest : public testing::Test { |
public: |
- NetworkConnectionHandlerTest() { |
+ NetworkConnectionHandlerTest() : user_("userhash") { |
} |
virtual ~NetworkConnectionHandlerTest() { |
} |
virtual void SetUp() OVERRIDE { |
+ ASSERT_TRUE(user_.constructed_successfully()); |
+ user_.FinishInit(); |
+ |
+ test_nssdb_.reset(new net::NSSCertDatabaseChromeOS( |
+ crypto::GetPublicSlotForChromeOSUser(user_.username_hash()), |
+ crypto::GetPrivateSlotForChromeOSUser( |
+ user_.username_hash(), |
+ base::Callback<void(crypto::ScopedPK11Slot)>()))); |
+ |
+ TPMTokenLoader::InitializeForTest(); |
+ |
+ CertLoader::Initialize(); |
+ CertLoader* cert_loader = CertLoader::Get(); |
+ cert_loader->SetSlowTaskRunnerForTest(message_loop_.message_loop_proxy()); |
+ cert_loader->force_hardware_backed_for_test(); |
+ |
// Initialize DBusThreadManager with a stub implementation. |
DBusThreadManager::InitializeWithStub(); |
- message_loop_.RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface() |
->ClearServices(); |
- message_loop_.RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
LoginState::Initialize(); |
network_state_handler_.reset(NetworkStateHandler::InitializeForTest()); |
network_configuration_handler_.reset( |
NetworkConfigurationHandler::InitializeForTest( |
network_state_handler_.get())); |
+ |
network_connection_handler_.reset(new NetworkConnectionHandler); |
- // TODO(stevenjb): Test integration with CertLoader using a stub or mock. |
network_connection_handler_->Init(network_state_handler_.get(), |
network_configuration_handler_.get()); |
} |
@@ -60,6 +89,8 @@ class NetworkConnectionHandlerTest : public testing::Test { |
network_connection_handler_.reset(); |
network_configuration_handler_.reset(); |
network_state_handler_.reset(); |
+ CertLoader::Shutdown(); |
+ TPMTokenLoader::Shutdown(); |
LoginState::Shutdown(); |
DBusThreadManager::Shutdown(); |
} |
@@ -76,7 +107,7 @@ class NetworkConnectionHandlerTest : public testing::Test { |
*json_dict, |
base::Bind(&ConfigureCallback), |
base::Bind(&ConfigureErrorCallback)); |
- message_loop_.RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
return true; |
} |
@@ -89,7 +120,7 @@ class NetworkConnectionHandlerTest : public testing::Test { |
base::Bind(&NetworkConnectionHandlerTest::ErrorCallback, |
base::Unretained(this)), |
check_error_state); |
- message_loop_.RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
} |
void Disconnect(const std::string& service_path) { |
@@ -99,7 +130,7 @@ class NetworkConnectionHandlerTest : public testing::Test { |
base::Unretained(this)), |
base::Bind(&NetworkConnectionHandlerTest::ErrorCallback, |
base::Unretained(this))); |
- message_loop_.RunUntilIdle(); |
+ base::RunLoop().RunUntilIdle(); |
} |
void SuccessCallback() { |
@@ -128,9 +159,33 @@ class NetworkConnectionHandlerTest : public testing::Test { |
return result; |
} |
+ void StartCertLoader() { |
+ CertLoader::Get()->StartWithNSSDB(test_nssdb_.get()); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ void ImportClientCertAndKey(const std::string& pkcs12_file, |
+ net::NSSCertDatabase* nssdb, |
+ net::CertificateList* loaded_certs) { |
+ std::string pkcs12_data; |
+ base::FilePath pkcs12_path = |
+ net::GetTestCertsDirectory().Append(pkcs12_file); |
+ ASSERT_TRUE(base::ReadFileToString(pkcs12_path, &pkcs12_data)); |
+ |
+ scoped_refptr<net::CryptoModule> module( |
+ net::CryptoModule::CreateFromHandle(nssdb->GetPrivateSlot().get())); |
+ ASSERT_EQ( |
+ net::OK, |
+ nssdb->ImportFromPKCS12(module, pkcs12_data, base::string16(), false, |
+ loaded_certs)); |
+ ASSERT_EQ(1U, loaded_certs->size()); |
+ } |
+ |
scoped_ptr<NetworkStateHandler> network_state_handler_; |
scoped_ptr<NetworkConfigurationHandler> network_configuration_handler_; |
scoped_ptr<NetworkConnectionHandler> network_connection_handler_; |
+ crypto::ScopedTestNSSChromeOSUser user_; |
+ scoped_ptr<net::NSSCertDatabaseChromeOS> test_nssdb_; |
base::MessageLoopForUI message_loop_; |
std::string result_; |
@@ -191,27 +246,70 @@ TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectFailure) { |
namespace { |
-const char* kConfigRequiresCertificate = |
+const char* kConfigRequiresCertificateTemplate = |
"{ \"GUID\": \"wifi4\", \"Type\": \"wifi\", \"Connectable\": false," |
" \"Security\": \"802_1x\"," |
" \"UIData\": \"{" |
" \\\"certificate_type\\\": \\\"pattern\\\"," |
" \\\"certificate_pattern\\\": {" |
- " \\\"Subject\\\": { \\\"CommonName\\\": \\\"Foo\\\" }" |
+ " \\\"Subject\\\": {\\\"CommonName\\\": \\\"%s\\\" }" |
" } }\" }"; |
} // namespace |
-// Handle certificates. TODO(stevenjb): Add certificate stubs to improve |
-// test coverage. |
-TEST_F(NetworkConnectionHandlerTest, |
- NetworkConnectionHandlerConnectCertificate) { |
- EXPECT_TRUE(Configure(kConfigRequiresCertificate)); |
+// Handle certificates. |
+TEST_F(NetworkConnectionHandlerTest, ConnectCertificateMissing) { |
+ StartCertLoader(); |
+ |
+ EXPECT_TRUE(Configure( |
+ base::StringPrintf(kConfigRequiresCertificateTemplate, "unknown"))); |
Connect("wifi4"); |
EXPECT_EQ(NetworkConnectionHandler::kErrorCertificateRequired, |
GetResultAndReset()); |
} |
+TEST_F(NetworkConnectionHandlerTest, ConnectWithCertificateSuccess) { |
+ StartCertLoader(); |
+ |
+ net::CertificateList certs; |
+ ImportClientCertAndKey("websocket_client_cert.p12", |
+ test_nssdb_.get(), |
+ &certs); |
+ |
+ EXPECT_TRUE(Configure( |
+ base::StringPrintf(kConfigRequiresCertificateTemplate, |
+ certs[0]->subject().common_name.c_str()))); |
+ |
+ Connect("wifi4"); |
+ EXPECT_EQ(kSuccessResult, GetResultAndReset()); |
+} |
+ |
+TEST_F(NetworkConnectionHandlerTest, |
+ ConnectWithCertificateRequestedBeforeCertsAreLoaded) { |
+ net::CertificateList certs; |
+ ImportClientCertAndKey("websocket_client_cert.p12", |
+ test_nssdb_.get(), |
+ &certs); |
+ |
+ EXPECT_TRUE(Configure( |
+ base::StringPrintf(kConfigRequiresCertificateTemplate, |
+ certs[0]->subject().common_name.c_str()))); |
+ |
+ Connect("wifi4"); |
+ |
+ // Connect request came before the cert loader loaded certificates, so the |
+ // connect request should have been throttled until the certificates are |
+ // loaded. |
+ EXPECT_EQ("", GetResultAndReset()); |
+ |
+ StartCertLoader(); |
+ |
+ // |StartCertLoader| should have triggered certificate loading. |
+ // When the certificates got loaded, the connection request should have |
+ // proceeded and eventually succeeded. |
+ EXPECT_EQ(kSuccessResult, GetResultAndReset()); |
+} |
+ |
TEST_F(NetworkConnectionHandlerTest, |
NetworkConnectionHandlerDisconnectSuccess) { |
EXPECT_TRUE(Configure(kConfigConnected)); |