network_connection_handler_unittest.cc revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
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
3// found in the LICENSE file.
4
5#include "chromeos/network/network_connection_handler.h"
6
7#include "base/bind.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/message_loop.h"
10#include "chromeos/dbus/dbus_thread_manager.h"
11#include "chromeos/dbus/shill_manager_client.h"
12#include "chromeos/dbus/shill_service_client.h"
13#include "chromeos/network/network_configuration_handler.h"
14#include "chromeos/network/network_state_handler.h"
15#include "chromeos/network/onc/onc_utils.h"
16#include "testing/gtest/include/gtest/gtest.h"
17#include "third_party/cros_system_api/dbus/service_constants.h"
18
19namespace {
20
21const char* kSuccessResult = "success";
22
23}  // namespace
24
25namespace chromeos {
26
27class NetworkConnectionHandlerTest : public testing::Test {
28 public:
29  NetworkConnectionHandlerTest() {
30  }
31  virtual ~NetworkConnectionHandlerTest() {
32  }
33
34  virtual void SetUp() OVERRIDE {
35    // Initialize DBusThreadManager with a stub implementation.
36    DBusThreadManager::InitializeWithStub();
37    message_loop_.RunUntilIdle();
38    DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()
39        ->ClearServices();
40    message_loop_.RunUntilIdle();
41    NetworkStateHandler::Initialize();
42    NetworkConfigurationHandler::Initialize();
43    NetworkConnectionHandler::Initialize();
44  }
45
46  virtual void TearDown() OVERRIDE {
47    NetworkConnectionHandler::Shutdown();
48    NetworkConfigurationHandler::Shutdown();
49    NetworkStateHandler::Shutdown();
50    DBusThreadManager::Shutdown();
51  }
52
53 protected:
54  bool Configure(const std::string& json_string) {
55    scoped_ptr<base::DictionaryValue> json_dict =
56        onc::ReadDictionaryFromJson(json_string);
57    if (!json_dict) {
58      LOG(ERROR) << "Error parsing json: " << json_string;
59      return false;
60    }
61    DBusThreadManager::Get()->GetShillManagerClient()->ConfigureService(
62        *json_dict,
63        ObjectPathCallback(), ShillManagerClient::ErrorCallback());
64    message_loop_.RunUntilIdle();
65    return true;
66  }
67
68  void Connect(const std::string& service_path) {
69    NetworkConnectionHandler::Get()->ConnectToNetwork(
70        service_path,
71        base::Bind(&NetworkConnectionHandlerTest::SuccessCallback,
72                   base::Unretained(this)),
73        base::Bind(&NetworkConnectionHandlerTest::ErrorCallback,
74                   base::Unretained(this)));
75    message_loop_.RunUntilIdle();
76  }
77
78  void Disconnect(const std::string& service_path) {
79    NetworkConnectionHandler::Get()->DisconnectNetwork(
80        service_path,
81        base::Bind(&NetworkConnectionHandlerTest::SuccessCallback,
82                   base::Unretained(this)),
83        base::Bind(&NetworkConnectionHandlerTest::ErrorCallback,
84                   base::Unretained(this)));
85    message_loop_.RunUntilIdle();
86  }
87
88  void SuccessCallback() {
89    result_ = kSuccessResult;
90  }
91
92  void ErrorCallback(const std::string& error_name,
93                     scoped_ptr<base::DictionaryValue> error_data) {
94    result_ = error_name;
95  }
96
97  std::string GetResultAndReset() {
98    std::string result;
99    result.swap(result_);
100    return result;
101  }
102
103  std::string GetServiceStringProperty(const std::string& service_path,
104                                       const std::string& key) {
105    std::string result;
106    const base::DictionaryValue* properties =
107        DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()->
108        GetServiceProperties(service_path);
109    if (properties)
110      properties->GetStringWithoutPathExpansion(key, &result);
111    return result;
112  }
113
114  MessageLoopForUI message_loop_;
115  std::string result_;
116
117 private:
118  DISALLOW_COPY_AND_ASSIGN(NetworkConnectionHandlerTest);
119};
120
121namespace {
122
123const char* kConfigConnectable =
124    "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"idle\" }";
125const char* kConfigConnected =
126    "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"online\" }";
127const char* kConfigConnecting =
128    "{ \"GUID\": \"wifi2\", \"Type\": \"wifi\", \"State\": \"association\" }";
129const char* kConfigRequiresPassphrase =
130    "{ \"GUID\": \"wifi3\", \"Type\": \"wifi\", "
131    "\"PassphraseRequired\": true }";
132const char* kConfigRequiresActivation =
133    "{ \"GUID\": \"cellular1\", \"Type\": \"cellular\","
134    "  \"Cellular.ActivationState\": \"not-activated\" }";
135
136}  // namespace
137
138TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectSuccess) {
139  EXPECT_TRUE(Configure(kConfigConnectable));
140  Connect("wifi0");
141  EXPECT_EQ(kSuccessResult, GetResultAndReset());
142  EXPECT_EQ(flimflam::kStateOnline,
143            GetServiceStringProperty("wifi0", flimflam::kStateProperty));
144}
145
146// Handles basic failure cases.
147TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectFailure) {
148  Connect("no-network");
149  EXPECT_EQ(NetworkConnectionHandler::kErrorNotFound, GetResultAndReset());
150
151  EXPECT_TRUE(Configure(kConfigConnected));
152  Connect("wifi1");
153  EXPECT_EQ(NetworkConnectionHandler::kErrorConnected, GetResultAndReset());
154
155  EXPECT_TRUE(Configure(kConfigConnecting));
156  Connect("wifi2");
157  EXPECT_EQ(NetworkConnectionHandler::kErrorConnecting, GetResultAndReset());
158
159  EXPECT_TRUE(Configure(kConfigRequiresPassphrase));
160  Connect("wifi3");
161  EXPECT_EQ(NetworkConnectionHandler::kErrorPassphraseRequired,
162            GetResultAndReset());
163
164  EXPECT_TRUE(Configure(kConfigRequiresActivation));
165  Connect("cellular1");
166  EXPECT_EQ(NetworkConnectionHandler::kErrorActivationRequired,
167            GetResultAndReset());
168}
169
170namespace {
171
172const char* kConfigRequiresCertificate =
173    "{ \"GUID\": \"wifi4\", \"Type\": \"wifi\", \"Connectable\": false,"
174    "  \"Security\": \"802_1x\","
175    "  \"UIData\": \"{"
176    "    \\\"certificate_type\\\": \\\"pattern\\\","
177    "    \\\"certificate_pattern\\\": {"
178    "      \\\"Subject\\\": { \\\"CommonName\\\": \\\"Foo\\\" }"
179    "   } }\" }";
180
181}  // namespace
182
183// Handle certificates. TODO(stevenjb): Add certificate stubs to improve
184// test coverage.
185TEST_F(NetworkConnectionHandlerTest,
186       NetworkConnectionHandlerConnectCertificate) {
187  EXPECT_TRUE(Configure(kConfigRequiresCertificate));
188  Connect("wifi4");
189  EXPECT_EQ(NetworkConnectionHandler::kErrorCertificateRequired,
190            GetResultAndReset());
191}
192
193TEST_F(NetworkConnectionHandlerTest,
194       NetworkConnectionHandlerDisconnectSuccess) {
195  EXPECT_TRUE(Configure(kConfigConnected));
196  Disconnect("wifi1");
197  EXPECT_EQ(kSuccessResult, GetResultAndReset());
198}
199
200TEST_F(NetworkConnectionHandlerTest,
201       NetworkConnectionHandlerDisconnectFailure) {
202  Connect("no-network");
203  EXPECT_EQ(NetworkConnectionHandler::kErrorNotFound, GetResultAndReset());
204
205  EXPECT_TRUE(Configure(kConfigConnectable));
206  Disconnect("wifi0");
207  EXPECT_EQ(NetworkConnectionHandler::kErrorNotConnected, GetResultAndReset());
208}
209
210}  // namespace chromeos
211