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