1a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file. 4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/network/network_connection_handler.h" 6a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/bind.h" 8a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 10a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 11a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/shill_manager_client.h" 12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/network/network_configuration_handler.h" 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/network/network_state_handler.h" 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h" 16a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 19a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace { 20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kSuccessResult = "success"; 22a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ConfigureCallback(const dbus::ObjectPath& result) { 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ConfigureErrorCallback(const std::string& error_name, 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& error_message) { 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace 31a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace chromeos { 33a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class NetworkConnectionHandlerTest : public testing::Test { 35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NetworkConnectionHandlerTest() { 37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual ~NetworkConnectionHandlerTest() { 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void SetUp() OVERRIDE { 42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Initialize DBusThreadManager with a stub implementation. 43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DBusThreadManager::InitializeWithStub(); 44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) message_loop_.RunUntilIdle(); 45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface() 46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ->ClearServices(); 47a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) message_loop_.RunUntilIdle(); 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LoginState::Initialize(); 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_state_handler_.reset(NetworkStateHandler::InitializeForTest()); 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_configuration_handler_.reset( 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkConfigurationHandler::InitializeForTest( 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_state_handler_.get())); 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_connection_handler_.reset(new NetworkConnectionHandler); 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(stevenjb): Test integration with CertLoader using a stub or mock. 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch network_connection_handler_->Init(network_state_handler_.get(), 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_configuration_handler_.get()); 57a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 58a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 59a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void TearDown() OVERRIDE { 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_connection_handler_.reset(); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_configuration_handler_.reset(); 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_state_handler_.reset(); 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LoginState::Shutdown(); 64a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DBusThreadManager::Shutdown(); 65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected: 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool Configure(const std::string& json_string) { 69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<base::DictionaryValue> json_dict = 70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) onc::ReadDictionaryFromJson(json_string); 71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!json_dict) { 72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LOG(ERROR) << "Error parsing json: " << json_string; 73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DBusThreadManager::Get()->GetShillManagerClient()->ConfigureService( 76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) *json_dict, 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&ConfigureCallback), 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&ConfigureErrorCallback)); 79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) message_loop_.RunUntilIdle(); 80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 81a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 83a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void Connect(const std::string& service_path) { 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const bool check_error_state = true; 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_connection_handler_->ConnectToNetwork( 86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) service_path, 87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&NetworkConnectionHandlerTest::SuccessCallback, 88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Unretained(this)), 89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&NetworkConnectionHandlerTest::ErrorCallback, 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(this)), 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) check_error_state); 92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) message_loop_.RunUntilIdle(); 93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 94a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void Disconnect(const std::string& service_path) { 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_connection_handler_->DisconnectNetwork( 97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) service_path, 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&NetworkConnectionHandlerTest::SuccessCallback, 99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Unretained(this)), 100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(&NetworkConnectionHandlerTest::ErrorCallback, 101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Unretained(this))); 102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) message_loop_.RunUntilIdle(); 103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 104a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void SuccessCallback() { 106a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result_ = kSuccessResult; 107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void ErrorCallback(const std::string& error_name, 110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<base::DictionaryValue> error_data) { 111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result_ = error_name; 112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string GetResultAndReset() { 115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string result; 116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result.swap(result_); 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return result; 118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string GetServiceStringProperty(const std::string& service_path, 121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string& key) { 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string result; 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::DictionaryValue* properties = 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()-> 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetServiceProperties(service_path); 126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (properties) 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) properties->GetStringWithoutPathExpansion(key, &result); 128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return result; 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<NetworkStateHandler> network_state_handler_; 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<NetworkConfigurationHandler> network_configuration_handler_; 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<NetworkConnectionHandler> network_connection_handler_; 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoopForUI message_loop_; 135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string result_; 136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) private: 138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkConnectionHandlerTest); 139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace { 142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kConfigConnectable = 144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"idle\", " 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) " \"Connectable\": true }"; 146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kConfigConnected = 147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"online\" }"; 148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kConfigConnecting = 149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "{ \"GUID\": \"wifi2\", \"Type\": \"wifi\", \"State\": \"association\" }"; 150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kConfigRequiresPassphrase = 151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "{ \"GUID\": \"wifi3\", \"Type\": \"wifi\", " 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) " \"PassphraseRequired\": true }"; 153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kConfigRequiresActivation = 154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "{ \"GUID\": \"cellular1\", \"Type\": \"cellular\"," 155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " \"Cellular.ActivationState\": \"not-activated\" }"; 156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace 158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectSuccess) { 160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigConnectable)); 161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("wifi0"); 162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(kSuccessResult, GetResultAndReset()); 163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(flimflam::kStateOnline, 164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetServiceStringProperty("wifi0", flimflam::kStateProperty)); 165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Handles basic failure cases. 168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectFailure) { 169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("no-network"); 170f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch EXPECT_EQ(NetworkConnectionHandler::kErrorConfigureFailed, 171f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch GetResultAndReset()); 172a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigConnected)); 174a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("wifi1"); 175a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NetworkConnectionHandler::kErrorConnected, GetResultAndReset()); 176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 177a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigConnecting)); 178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("wifi2"); 179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NetworkConnectionHandler::kErrorConnecting, GetResultAndReset()); 180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 181a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigRequiresPassphrase)); 182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("wifi3"); 183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NetworkConnectionHandler::kErrorPassphraseRequired, 184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetResultAndReset()); 185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigRequiresActivation)); 187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("cellular1"); 188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NetworkConnectionHandler::kErrorActivationRequired, 189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetResultAndReset()); 190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace { 193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* kConfigRequiresCertificate = 195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "{ \"GUID\": \"wifi4\", \"Type\": \"wifi\", \"Connectable\": false," 196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " \"Security\": \"802_1x\"," 197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " \"UIData\": \"{" 198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " \\\"certificate_type\\\": \\\"pattern\\\"," 199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " \\\"certificate_pattern\\\": {" 200a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " \\\"Subject\\\": { \\\"CommonName\\\": \\\"Foo\\\" }" 201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) " } }\" }"; 202a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 203a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace 204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 205a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Handle certificates. TODO(stevenjb): Add certificate stubs to improve 206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// test coverage. 207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(NetworkConnectionHandlerTest, 208a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NetworkConnectionHandlerConnectCertificate) { 209a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigRequiresCertificate)); 210a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("wifi4"); 211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NetworkConnectionHandler::kErrorCertificateRequired, 212a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetResultAndReset()); 213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(NetworkConnectionHandlerTest, 216a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NetworkConnectionHandlerDisconnectSuccess) { 217a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigConnected)); 218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Disconnect("wifi1"); 219a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(kSuccessResult, GetResultAndReset()); 220a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 222a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(NetworkConnectionHandlerTest, 223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NetworkConnectionHandlerDisconnectFailure) { 224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Connect("no-network"); 225f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch EXPECT_EQ(NetworkConnectionHandler::kErrorConfigureFailed, 226f968bfd8e7e7331d11d96f3ef27f3d9212e92c39Ben Murdoch GetResultAndReset()); 227a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(Configure(kConfigConnectable)); 229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Disconnect("wifi0"); 230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset()); 231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace chromeos 234